Skip to content

Commit bd329e1

Browse files
bmorkdavem330
authored andcommitted
net: cdc_ncm: do not bind to NCM compatible MBIM devices
The MBIM specification allows a MBIM device to disguise itself as NCM for backwards compatibility, using additional altsettings with different subclass (control) or protocol (data): C:* #Ifs= 2 Cfg#= 1 Atr=80 MxPwr=100mA I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0d Prot=00 Driver=cdc_mbim E: Ad=81(I) Atr=03(Int.) MxPS= 64 Ivl=7ms I:* If#= 0 Alt= 1 #EPs= 1 Cls=02(comm.) Sub=0e Prot=00 Driver=cdc_mbim E: Ad=81(I) Atr=03(Int.) MxPS= 64 Ivl=7ms I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=01 Driver=cdc_mbim I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=01 Driver=cdc_mbim E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms I:* If#= 1 Alt= 2 #EPs= 2 Cls=0a(data ) Sub=00 Prot=02 Driver=cdc_mbim E: Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms If the MBIM driver is enabled then that should have priority for devices providing such a NCM 1.0 backward compatibility mode. Signed-off-by: Bjørn Mork <[email protected]> Signed-off-by: Greg Suarez <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9084ccf commit bd329e1

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

drivers/net/usb/cdc_ncm.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,33 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
563563
{
564564
int ret;
565565

566+
/* The MBIM spec defines a NCM compatible default altsetting,
567+
* which we may have matched:
568+
*
569+
* "Functions that implement both NCM 1.0 and MBIM (an
570+
* “NCM/MBIM function”) according to this recommendation
571+
* shall provide two alternate settings for the
572+
* Communication Interface. Alternate setting 0, and the
573+
* associated class and endpoint descriptors, shall be
574+
* constructed according to the rules given for the
575+
* Communication Interface in section 5 of [USBNCM10].
576+
* Alternate setting 1, and the associated class and
577+
* endpoint descriptors, shall be constructed according to
578+
* the rules given in section 6 (USB Device Model) of this
579+
* specification."
580+
*
581+
* Do not bind to such interfaces, allowing cdc_mbim to handle
582+
* them
583+
*/
584+
#if IS_ENABLED(CONFIG_USB_NET_CDC_MBIM)
585+
if ((intf->num_altsetting == 2) &&
586+
!usb_set_interface(dev->udev,
587+
intf->cur_altsetting->desc.bInterfaceNumber,
588+
CDC_NCM_COMM_ALTSETTING_MBIM) &&
589+
cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting))
590+
return -ENODEV;
591+
#endif
592+
566593
/* NCM data altsetting is always 1 */
567594
ret = cdc_ncm_bind_common(dev, intf, 1);
568595

0 commit comments

Comments
 (0)