@@ -451,7 +451,7 @@ static const struct ethtool_ops cdc_ncm_ethtool_ops = {
451
451
.nway_reset = usbnet_nway_reset ,
452
452
};
453
453
454
- static int cdc_ncm_bind (struct usbnet * dev , struct usb_interface * intf )
454
+ static int cdc_ncm_bind_common (struct usbnet * dev , struct usb_interface * intf , u8 data_altsetting )
455
455
{
456
456
struct cdc_ncm_ctx * ctx ;
457
457
struct usb_driver * driver ;
@@ -525,6 +525,13 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
525
525
ctx -> func_desc = (const struct usb_cdc_ncm_desc * )buf ;
526
526
break ;
527
527
528
+ case USB_CDC_MBIM_TYPE :
529
+ if (buf [0 ] < sizeof (* (ctx -> mbim_desc )))
530
+ break ;
531
+
532
+ ctx -> mbim_desc = (const struct usb_cdc_mbim_desc * )buf ;
533
+ break ;
534
+
528
535
default :
529
536
break ;
530
537
}
@@ -537,7 +544,7 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
537
544
538
545
/* check if we got everything */
539
546
if ((ctx -> control == NULL ) || (ctx -> data == NULL ) ||
540
- (ctx -> ether_desc == NULL ) || (ctx -> control != intf ))
547
+ ((! ctx -> mbim_desc ) && (( ctx -> ether_desc == NULL ) || (ctx -> control != intf )) ))
541
548
goto error ;
542
549
543
550
/* claim interfaces, if any */
@@ -557,7 +564,7 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
557
564
goto error2 ;
558
565
559
566
/* configure data interface */
560
- temp = usb_set_interface (dev -> udev , iface_no , 1 );
567
+ temp = usb_set_interface (dev -> udev , iface_no , data_altsetting );
561
568
if (temp )
562
569
goto error2 ;
563
570
@@ -574,11 +581,13 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
574
581
usb_set_intfdata (ctx -> control , dev );
575
582
usb_set_intfdata (ctx -> intf , dev );
576
583
577
- temp = usbnet_get_ethernet_addr (dev , ctx -> ether_desc -> iMACAddress );
578
- if (temp )
579
- goto error2 ;
584
+ if (ctx -> ether_desc ) {
585
+ temp = usbnet_get_ethernet_addr (dev , ctx -> ether_desc -> iMACAddress );
586
+ if (temp )
587
+ goto error2 ;
588
+ dev_info (& dev -> udev -> dev , "MAC-Address: %pM\n" , dev -> net -> dev_addr );
589
+ }
580
590
581
- dev_info (& dev -> udev -> dev , "MAC-Address: %pM\n" , dev -> net -> dev_addr );
582
591
583
592
dev -> in = usb_rcvbulkpipe (dev -> udev ,
584
593
ctx -> in_ep -> desc .bEndpointAddress & USB_ENDPOINT_NUMBER_MASK );
@@ -587,13 +596,6 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
587
596
dev -> status = ctx -> status_ep ;
588
597
dev -> rx_urb_size = ctx -> rx_max ;
589
598
590
- /*
591
- * We should get an event when network connection is "connected" or
592
- * "disconnected". Set network connection in "disconnected" state
593
- * (carrier is OFF) during attach, so the IP network stack does not
594
- * start IPv6 negotiation and more.
595
- */
596
- netif_carrier_off (dev -> net );
597
599
ctx -> tx_speed = ctx -> rx_speed = 0 ;
598
600
return 0 ;
599
601
@@ -639,6 +641,23 @@ static void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf)
639
641
cdc_ncm_free (ctx );
640
642
}
641
643
644
+ static int cdc_ncm_bind (struct usbnet * dev , struct usb_interface * intf )
645
+ {
646
+ int ret ;
647
+
648
+ /* NCM data altsetting is always 1 */
649
+ ret = cdc_ncm_bind_common (dev , intf , 1 );
650
+
651
+ /*
652
+ * We should get an event when network connection is "connected" or
653
+ * "disconnected". Set network connection in "disconnected" state
654
+ * (carrier is OFF) during attach, so the IP network stack does not
655
+ * start IPv6 negotiation and more.
656
+ */
657
+ netif_carrier_off (dev -> net );
658
+ return ret ;
659
+ }
660
+
642
661
static void cdc_ncm_zero_fill (u8 * ptr , u32 first , u32 end , u32 max )
643
662
{
644
663
if (first >= max )
0 commit comments