From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [2/2] usb: gadget: f_ncm: Add OS descriptor support From: Romain Izard Message-Id: <20190416140732.21941-2-romain.izard.pro@gmail.com> Date: Tue, 16 Apr 2019 16:07:32 +0200 To: Felipe Balbi , Greg Kroah-Hartman , Andrzej Pietrasiewicz Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Romain Izard List-ID: VG8gYmUgYWJsZSB0byB1c2UgdGhlIGRlZmF1bHQgVVNCIGNsYXNzIGRyaXZlcnMgYXZhaWxhYmxl IGluIE1pY3Jvc29mdApXaW5kb3dzLCB3ZSBuZWVkIHRvIGFkZCBPUyBkZXNjcmlwdG9ycyB0byB0 aGUgZXhwb3J0ZWQgVVNCIGdhZGdldCB0bwp0ZWxsIHRoZSBPUyB0aGF0IHdlIGFyZSBjb21wYXRp YmxlIHdpdGggdGhlIGJ1aWx0LWluIGRyaXZlcnMuCgpDb3B5IHRoZSBPUyBkZXNjcmlwdG9yIHN1 cHBvcnQgZnJvbSBmX3JuZGlzIGludG8gZl9uY20uIEFzIGEgcmVzdWx0LAp1c2luZyB0aGUgV0lO TkNNIGNvbXBhdGlibGUgSUQsIHRoZSBVc2JOY20gZHJpdmVyIGlzIGxvYWRlZCBvbgplbnVtZXJh dGlvbiB3aXRob3V0IHRoZSBuZWVkIGZvciBhIGN1c3RvbSBkcml2ZXIgb3IgaW5mIGZpbGUuCgpT aWduZWQtb2ZmLWJ5OiBSb21haW4gSXphcmQgPHJvbWFpbi5pemFyZC5wcm9AZ21haWwuY29tPgot LS0KIGRyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX25jbS5jIHwgNDcgKysrKysrKysrKysr KysrKysrKysrKysrKysrLS0KIGRyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X25jbS5oIHwg IDMgKysKIDIgZmlsZXMgY2hhbmdlZCwgNDcgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9uY20uYyBiL2RyaXZl cnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX25jbS5jCmluZGV4IGQ1YzQ3ZTdhN2Y2MS4uMmQ2ZTc2 ZTRjZmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9uY20uYwor KysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9uY20uYwpAQCAtMjMsNiArMjMsNyBA QAogI2luY2x1ZGUgInVfZXRoZXIuaCIKICNpbmNsdWRlICJ1X2V0aGVyX2NvbmZpZ2ZzLmgiCiAj aW5jbHVkZSAidV9uY20uaCIKKyNpbmNsdWRlICJjb25maWdmcy5oIgogCiAvKgogICogVGhpcyBm dW5jdGlvbiBpcyBhICJDREMgTmV0d29yayBDb250cm9sIE1vZGVsIiAoQ0RDIE5DTSkgRXRoZXJu ZXQgbGluay4KQEAgLTEzOTEsNiArMTM5MiwxNiBAQCBzdGF0aWMgaW50IG5jbV9iaW5kKHN0cnVj dCB1c2JfY29uZmlndXJhdGlvbiAqYywgc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKIAkJcmV0dXJu IC1FSU5WQUw7CiAKIAluY21fb3B0cyA9IGNvbnRhaW5lcl9vZihmLT5maSwgc3RydWN0IGZfbmNt X29wdHMsIGZ1bmNfaW5zdCk7CisKKwlpZiAoY2Rldi0+dXNlX29zX3N0cmluZykgeworCQlmLT5v c19kZXNjX3RhYmxlID0ga3phbGxvYyhzaXplb2YoKmYtPm9zX2Rlc2NfdGFibGUpLAorCQkJCQkg ICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmLT5vc19kZXNjX3RhYmxlKQorCQkJcmV0dXJuIC1FTk9N RU07CisJCWYtPm9zX2Rlc2NfbiA9IDE7CisJCWYtPm9zX2Rlc2NfdGFibGVbMF0ub3NfZGVzYyA9 ICZuY21fb3B0cy0+bmNtX29zX2Rlc2M7CisJfQorCiAJLyoKIAkgKiBpbiBkcml2ZXJzL3VzYi9n YWRnZXQvY29uZmlnZnMuYzpjb25maWdmc19jb21wb3NpdGVfYmluZCgpCiAJICogY29uZmlndXJh dGlvbnMgYXJlIGJvdW5kIGluIHNlcXVlbmNlIHdpdGggbGlzdF9mb3JfZWFjaF9lbnRyeSwKQEAg LTE0MDQsMTMgKzE0MTUsMTUgQEAgc3RhdGljIGludCBuY21fYmluZChzdHJ1Y3QgdXNiX2NvbmZp Z3VyYXRpb24gKmMsIHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCiAJCXN0YXR1cyA9IGdldGhlcl9y ZWdpc3Rlcl9uZXRkZXYobmNtX29wdHMtPm5ldCk7CiAJCW11dGV4X3VubG9jaygmbmNtX29wdHMt PmxvY2spOwogCQlpZiAoc3RhdHVzKQotCQkJcmV0dXJuIHN0YXR1czsKKwkJCWdvdG8gZmFpbDsK IAkJbmNtX29wdHMtPmJvdW5kID0gdHJ1ZTsKIAl9CiAJdXMgPSB1c2JfZ3N0cmluZ3NfYXR0YWNo KGNkZXYsIG5jbV9zdHJpbmdzLAogCQkJCSBBUlJBWV9TSVpFKG5jbV9zdHJpbmdfZGVmcykpOwot CWlmIChJU19FUlIodXMpKQotCQlyZXR1cm4gUFRSX0VSUih1cyk7CisJaWYgKElTX0VSUih1cykp IHsKKwkJc3RhdHVzID0gUFRSX0VSUih1cyk7CisJCWdvdG8gZmFpbDsKKwl9CiAJbmNtX2NvbnRy b2xfaW50Zi5pSW50ZXJmYWNlID0gdXNbU1RSSU5HX0NUUkxfSURYXS5pZDsKIAluY21fZGF0YV9u b3BfaW50Zi5pSW50ZXJmYWNlID0gdXNbU1RSSU5HX0RBVEFfSURYXS5pZDsKIAluY21fZGF0YV9p bnRmLmlJbnRlcmZhY2UgPSB1c1tTVFJJTkdfREFUQV9JRFhdLmlkOwpAQCAtMTQyNyw2ICsxNDQw LDEwIEBAIHN0YXRpYyBpbnQgbmNtX2JpbmQoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLCBz dHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQogCW5jbV9jb250cm9sX2ludGYuYkludGVyZmFjZU51bWJl ciA9IHN0YXR1czsKIAluY21fdW5pb25fZGVzYy5iTWFzdGVySW50ZXJmYWNlMCA9IHN0YXR1czsK IAorCWlmIChjZGV2LT51c2Vfb3Nfc3RyaW5nKQorCQlmLT5vc19kZXNjX3RhYmxlWzBdLmlmX2lk ID0KKwkJCW5jbV9pYWRfZGVzYy5iRmlyc3RJbnRlcmZhY2U7CisKIAlzdGF0dXMgPSB1c2JfaW50 ZXJmYWNlX2lkKGMsIGYpOwogCWlmIChzdGF0dXMgPCAwKQogCQlnb3RvIGZhaWw7CkBAIC0xNTA2 LDYgKzE1MjMsOSBAQCBzdGF0aWMgaW50IG5jbV9iaW5kKHN0cnVjdCB1c2JfY29uZmlndXJhdGlv biAqYywgc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKIAlyZXR1cm4gMDsKIAogZmFpbDoKKwlrZnJl ZShmLT5vc19kZXNjX3RhYmxlKTsKKwlmLT5vc19kZXNjX24gPSAwOworCiAJaWYgKG5jbS0+bm90 aWZ5X3JlcSkgewogCQlrZnJlZShuY20tPm5vdGlmeV9yZXEtPmJ1Zik7CiAJCXVzYl9lcF9mcmVl X3JlcXVlc3QobmNtLT5ub3RpZnksIG5jbS0+bm90aWZ5X3JlcSk7CkBAIC0xNTYwLDE2ICsxNTgw LDIyIEBAIHN0YXRpYyB2b2lkIG5jbV9mcmVlX2luc3Qoc3RydWN0IHVzYl9mdW5jdGlvbl9pbnN0 YW5jZSAqZikKIAkJZ2V0aGVyX2NsZWFudXAobmV0ZGV2X3ByaXYob3B0cy0+bmV0KSk7CiAJZWxz ZQogCQlmcmVlX25ldGRldihvcHRzLT5uZXQpOworCWtmcmVlKG9wdHMtPm5jbV9pbnRlcmZfZ3Jv dXApOwogCWtmcmVlKG9wdHMpOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9mdW5jdGlvbl9pbnN0 YW5jZSAqbmNtX2FsbG9jX2luc3Qodm9pZCkKIHsKIAlzdHJ1Y3QgZl9uY21fb3B0cyAqb3B0czsK KwlzdHJ1Y3QgdXNiX29zX2Rlc2MgKmRlc2NzWzFdOworCWNoYXIgKm5hbWVzWzFdOworCXN0cnVj dCBjb25maWdfZ3JvdXAgKm5jbV9pbnRlcmZfZ3JvdXA7CiAKIAlvcHRzID0ga3phbGxvYyhzaXpl b2YoKm9wdHMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW9wdHMpCiAJCXJldHVybiBFUlJfUFRSKC1F Tk9NRU0pOworCW9wdHMtPm5jbV9vc19kZXNjLmV4dF9jb21wYXRfaWQgPSBvcHRzLT5uY21fZXh0 X2NvbXBhdF9pZDsKKwogCW11dGV4X2luaXQoJm9wdHMtPmxvY2spOwogCW9wdHMtPmZ1bmNfaW5z dC5mcmVlX2Z1bmNfaW5zdCA9IG5jbV9mcmVlX2luc3Q7CiAJb3B0cy0+bmV0ID0gZ2V0aGVyX3Nl dHVwX2RlZmF1bHQoKTsKQEAgLTE1NzgsOCArMTYwNCwyMCBAQCBzdGF0aWMgc3RydWN0IHVzYl9m dW5jdGlvbl9pbnN0YW5jZSAqbmNtX2FsbG9jX2luc3Qodm9pZCkKIAkJa2ZyZWUob3B0cyk7CiAJ CXJldHVybiBFUlJfQ0FTVChuZXQpOwogCX0KKwlJTklUX0xJU1RfSEVBRCgmb3B0cy0+bmNtX29z X2Rlc2MuZXh0X3Byb3ApOworCisJZGVzY3NbMF0gPSAmb3B0cy0+bmNtX29zX2Rlc2M7CisJbmFt ZXNbMF0gPSAibmNtIjsKIAogCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmb3B0cy0+ZnVu Y19pbnN0Lmdyb3VwLCAiIiwgJm5jbV9mdW5jX3R5cGUpOworCW5jbV9pbnRlcmZfZ3JvdXAgPQor CQl1c2Jfb3NfZGVzY19wcmVwYXJlX2ludGVyZl9kaXIoJm9wdHMtPmZ1bmNfaW5zdC5ncm91cCwg MSwgZGVzY3MsCisJCQkJCSAgICAgICBuYW1lcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIo bmNtX2ludGVyZl9ncm91cCkpIHsKKwkJbmNtX2ZyZWVfaW5zdCgmb3B0cy0+ZnVuY19pbnN0KTsK KwkJcmV0dXJuIEVSUl9DQVNUKG5jbV9pbnRlcmZfZ3JvdXApOworCX0KKwlvcHRzLT5uY21faW50 ZXJmX2dyb3VwID0gbmNtX2ludGVyZl9ncm91cDsKIAogCXJldHVybiAmb3B0cy0+ZnVuY19pbnN0 OwogfQpAQCAtMTYwNSw2ICsxNjQzLDkgQEAgc3RhdGljIHZvaWQgbmNtX3VuYmluZChzdHJ1Y3Qg dXNiX2NvbmZpZ3VyYXRpb24gKmMsIHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCiAKIAlocnRpbWVy X2NhbmNlbCgmbmNtLT50YXNrX3RpbWVyKTsKIAorCWtmcmVlKGYtPm9zX2Rlc2NfdGFibGUpOwor CWYtPm9zX2Rlc2NfbiA9IDA7CisKIAluY21fc3RyaW5nX2RlZnNbMF0uaWQgPSAwOwogCXVzYl9m cmVlX2FsbF9kZXNjcmlwdG9ycyhmKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0 L2Z1bmN0aW9uL3VfbmNtLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9uY20uaApp bmRleCBkNDgzZTQ1YzBmNzcuLjcwZGEzMjAxYTFkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Iv Z2FkZ2V0L2Z1bmN0aW9uL3VfbmNtLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9u L3VfbmNtLmgKQEAgLTIwLDYgKzIwLDkgQEAgc3RydWN0IGZfbmNtX29wdHMgewogCXN0cnVjdCBu ZXRfZGV2aWNlCQkqbmV0OwogCWJvb2wJCQkJYm91bmQ7CiAKKwlzdHJ1Y3QgY29uZmlnX2dyb3Vw CQkqbmNtX2ludGVyZl9ncm91cDsKKwlzdHJ1Y3QgdXNiX29zX2Rlc2MJCW5jbV9vc19kZXNjOwor CWNoYXIJCQkJbmNtX2V4dF9jb21wYXRfaWRbMTZdOwogCS8qCiAJICogUmVhZC93cml0ZSBhY2Nl c3MgdG8gY29uZmlnZnMgYXR0cmlidXRlcyBpcyBoYW5kbGVkIGJ5IGNvbmZpZ2ZzLgogCSAqCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4D990C10F14 for ; Tue, 16 Apr 2019 14:07:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 10477223C0 for ; Tue, 16 Apr 2019 14:07:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Qio959Zi" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729066AbfDPOHy (ORCPT ); Tue, 16 Apr 2019 10:07:54 -0400 Received: from mail-wr1-f68.google.com ([209.85.221.68]:34045 "EHLO mail-wr1-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726713AbfDPOHx (ORCPT ); Tue, 16 Apr 2019 10:07:53 -0400 Received: by mail-wr1-f68.google.com with SMTP id p10so27304156wrq.1; Tue, 16 Apr 2019 07:07:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=+HY91w5f+9s/uMWknBV9UYHwFztj3VHolQha5X2UoMo=; b=Qio959ZiEBsMV5cgyIL2Qrz7WLWDgXeDQwsbiGUGy+2xJTIG3a78Ic+Czz10YgM57Y ZgXi9xHjuOtBmSWkoZl68+gxA2uZkFr23Hb93WwFWpih+K+eEoB9B3re0Mh96Jyax5tw 9uczqVpHHU5Ka4bd8MGXqCayDf8ZtIIrXh9FJvKnME+rGC37mKX1EZ/i4ttS7TGgXPx1 w8xQousk+zZPlqledwVBFB1y0Ttpum1E+LO+1A6wsZaB87PgktBlBbAONku5YNi8y7QA XdIlBqvUcdKKQKZSD1iT40EpEG8fUEHynFuYNinLTV9uN9eY23T7Nth8xvqOtKeBQov5 oaUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=+HY91w5f+9s/uMWknBV9UYHwFztj3VHolQha5X2UoMo=; b=DF44tSfPtwnHAKsiczppUKQIiOb64l5Qw6zAM2rWjPzMVIMPDcYisYKDFrKWNFLhh7 y/4oCP7/1rTAa2dDEMC4iNJ0HC9BlxEObye8rAYq4Q9HnTssmH+v1VObFNIoakWLBF9Q B1p/t0pS3cgfE5orY8eiehRcC8jMkgbzN2NNBoiXkvaDftm5EEcsd1ZO3uXBFXCKED3i 1khEmuq2oAtD7Gab9ulSKnT+ozCQLf8JhbiZtOoHebp9/a6dyOVXFXUx81/1T0wa8+lM /qXi372GgzXD7EDpJGQpuPS4z9uRPQqyKt/VySjXVgx48beWL5/uMp6YpW7sXm13tX+B 6DXQ== X-Gm-Message-State: APjAAAVCN6n04m1nX883L8zC6j6+PP+19TtosuDfMyWF9Ft2Agf+b4mk thB7kjyNcUm/WqB3BHDh4nk= X-Google-Smtp-Source: APXvYqwQUpN2z/xMJdGlvthSFTSeOI6pMVEPRSldxsbz2UKDArc7VW0qrmFuFAu9dAkuqezWDHaGBw== X-Received: by 2002:adf:ed8f:: with SMTP id c15mr28853326wro.144.1555423670848; Tue, 16 Apr 2019 07:07:50 -0700 (PDT) Received: from 5WDYG62.mdi (static-css-cqn-143221.business.bouyguestelecom.com. [176.149.143.221]) by smtp.gmail.com with ESMTPSA id v192sm24008494wme.24.2019.04.16.07.07.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 16 Apr 2019 07:07:49 -0700 (PDT) From: Romain Izard To: Felipe Balbi , Greg Kroah-Hartman , Andrzej Pietrasiewicz Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Romain Izard Subject: [PATCH 2/2] usb: gadget: f_ncm: Add OS descriptor support Date: Tue, 16 Apr 2019 16:07:32 +0200 Message-Id: <20190416140732.21941-2-romain.izard.pro@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190416140732.21941-1-romain.izard.pro@gmail.com> References: <20190416140732.21941-1-romain.izard.pro@gmail.com> Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Message-ID: <20190416140732.uHgMtht61Ao5JifjTmrBoIMcpN2qGCgCZPICSWeuUDQ@z> To be able to use the default USB class drivers available in Microsoft Windows, we need to add OS descriptors to the exported USB gadget to tell the OS that we are compatible with the built-in drivers. Copy the OS descriptor support from f_rndis into f_ncm. As a result, using the WINNCM compatible ID, the UsbNcm driver is loaded on enumeration without the need for a custom driver or inf file. Signed-off-by: Romain Izard --- drivers/usb/gadget/function/f_ncm.c | 47 +++++++++++++++++++++++++++-- drivers/usb/gadget/function/u_ncm.h | 3 ++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/drivers/usb/gadget/function/f_ncm.c b/drivers/usb/gadget/function/f_ncm.c index d5c47e7a7f61..2d6e76e4cffa 100644 --- a/drivers/usb/gadget/function/f_ncm.c +++ b/drivers/usb/gadget/function/f_ncm.c @@ -23,6 +23,7 @@ #include "u_ether.h" #include "u_ether_configfs.h" #include "u_ncm.h" +#include "configfs.h" /* * This function is a "CDC Network Control Model" (CDC NCM) Ethernet link. @@ -1391,6 +1392,16 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) return -EINVAL; ncm_opts = container_of(f->fi, struct f_ncm_opts, func_inst); + + if (cdev->use_os_string) { + f->os_desc_table = kzalloc(sizeof(*f->os_desc_table), + GFP_KERNEL); + if (!f->os_desc_table) + return -ENOMEM; + f->os_desc_n = 1; + f->os_desc_table[0].os_desc = &ncm_opts->ncm_os_desc; + } + /* * in drivers/usb/gadget/configfs.c:configfs_composite_bind() * configurations are bound in sequence with list_for_each_entry, @@ -1404,13 +1415,15 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) status = gether_register_netdev(ncm_opts->net); mutex_unlock(&ncm_opts->lock); if (status) - return status; + goto fail; ncm_opts->bound = true; } us = usb_gstrings_attach(cdev, ncm_strings, ARRAY_SIZE(ncm_string_defs)); - if (IS_ERR(us)) - return PTR_ERR(us); + if (IS_ERR(us)) { + status = PTR_ERR(us); + goto fail; + } ncm_control_intf.iInterface = us[STRING_CTRL_IDX].id; ncm_data_nop_intf.iInterface = us[STRING_DATA_IDX].id; ncm_data_intf.iInterface = us[STRING_DATA_IDX].id; @@ -1427,6 +1440,10 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) ncm_control_intf.bInterfaceNumber = status; ncm_union_desc.bMasterInterface0 = status; + if (cdev->use_os_string) + f->os_desc_table[0].if_id = + ncm_iad_desc.bFirstInterface; + status = usb_interface_id(c, f); if (status < 0) goto fail; @@ -1506,6 +1523,9 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) return 0; fail: + kfree(f->os_desc_table); + f->os_desc_n = 0; + if (ncm->notify_req) { kfree(ncm->notify_req->buf); usb_ep_free_request(ncm->notify, ncm->notify_req); @@ -1560,16 +1580,22 @@ static void ncm_free_inst(struct usb_function_instance *f) gether_cleanup(netdev_priv(opts->net)); else free_netdev(opts->net); + kfree(opts->ncm_interf_group); kfree(opts); } static struct usb_function_instance *ncm_alloc_inst(void) { struct f_ncm_opts *opts; + struct usb_os_desc *descs[1]; + char *names[1]; + struct config_group *ncm_interf_group; opts = kzalloc(sizeof(*opts), GFP_KERNEL); if (!opts) return ERR_PTR(-ENOMEM); + opts->ncm_os_desc.ext_compat_id = opts->ncm_ext_compat_id; + mutex_init(&opts->lock); opts->func_inst.free_func_inst = ncm_free_inst; opts->net = gether_setup_default(); @@ -1578,8 +1604,20 @@ static struct usb_function_instance *ncm_alloc_inst(void) kfree(opts); return ERR_CAST(net); } + INIT_LIST_HEAD(&opts->ncm_os_desc.ext_prop); + + descs[0] = &opts->ncm_os_desc; + names[0] = "ncm"; config_group_init_type_name(&opts->func_inst.group, "", &ncm_func_type); + ncm_interf_group = + usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs, + names, THIS_MODULE); + if (IS_ERR(ncm_interf_group)) { + ncm_free_inst(&opts->func_inst); + return ERR_CAST(ncm_interf_group); + } + opts->ncm_interf_group = ncm_interf_group; return &opts->func_inst; } @@ -1605,6 +1643,9 @@ static void ncm_unbind(struct usb_configuration *c, struct usb_function *f) hrtimer_cancel(&ncm->task_timer); + kfree(f->os_desc_table); + f->os_desc_n = 0; + ncm_string_defs[0].id = 0; usb_free_all_descriptors(f); diff --git a/drivers/usb/gadget/function/u_ncm.h b/drivers/usb/gadget/function/u_ncm.h index d483e45c0f77..70da3201a1d0 100644 --- a/drivers/usb/gadget/function/u_ncm.h +++ b/drivers/usb/gadget/function/u_ncm.h @@ -20,6 +20,9 @@ struct f_ncm_opts { struct net_device *net; bool bound; + struct config_group *ncm_interf_group; + struct usb_os_desc ncm_os_desc; + char ncm_ext_compat_id[16]; /* * Read/write access to configfs attributes is handled by configfs. * -- 2.17.1