CDC_NCM adding support IFF_NOARP for buggy device
PATCH 1/1 CDC_NCM adding support IFF_NOARP for buggy device
Signed-off-by Wei Shuai <[email protected]>
--- drivers/net/usb/cdc_ncm.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)
drivers/net/usb/cdc_ncm.c +15 -0
@@ -545,6 +545,7 @@ EXPORT_SYMBOL_GPL(cdc_ncm_unbind);static int cdc_ncm_bind (struct usbnet *dev,struct usb_interface *intf) {int ret; +struct usb_device *udev =interface_to_usbdev (intf);/* The MBIM spec defines a NCM compatible default altsetting, * which we may have matched:
@@ -572,6 +573,10 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf) cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting)) return -ENODEV;#endif +/* this buggy device cannot do ARP */ +if ( (le16_to_cpu (udev->descriptor.idVendor) ==0xAAAA ) ) { + dev->net->flags |=IFF_NOARP ; + }/* NCM data altsetting is always 1 */ ret =cdc_ncm_bind_common (dev, intf,1 );
@@ -1186,6 +1191,16 @@ static const struct usb_device_id cdc_devs[] = { .driver_info = (unsigned long) &wwan_info, }, +/* buggy device cannot send ARP */ + { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_VENDOR, + .idVendor = 0xAAAA, + .bInterfaceClass = USB_CLASS_COMM, + .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM, + .bInterfaceProtocol = USB_CDC_PROTO_NONE, + .driver_info = (unsigned long) &wwan_info, + }, +/* Huawei NCM devices disguised as vendor specific */ { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x16), .driver_info = (unsigned long)&wwan_info,
Signature · 1 line
1.7.6.5
On Thursday 10 January 2013 21:59:28 Wei Shuai wrote:
Hi,
I am afraid this is done in an unclean manner.
Quoted 13 lines
drivers/net/usb/cdc_ncm.c +1
-0@@ -545,6 +545,7 @@ EXPORT_SYMBOL_GPL(cdc_ncm_unbind);static int cdc_ncm_bind (struct usbnet *dev,struct usb_interface *intf) {int ret; +struct usb_device *udev =interface_to_usbdev (intf);/* The MBIM spec defines a NCM compatible default altsetting, * which we may have matched:
drivers/net/usb/cdc_ncm.c static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf) · line 578
Quoted 6 lines
drivers/net/usb/cdc_ncm.c +3
-0@@ -572,6 +573,10 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf) cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting)) return -ENODEV;#endif +/* this buggy device cannot do ARP */ +if ( (le16_to_cpu (udev->descriptor.idVendor) ==0xAAAA ) ) { + dev->net->flags |=IFF_NOARP ;
So either you do a check here ...
Quoted 6 lines
drivers/net/usb/cdc_ncm.c +1
-0+ }/* NCM data altsetting is always 1 */ ret =cdc_ncm_bind_common (dev, intf,1 );@@ -1186,6 +1191,16 @@ static const struct usb_device_id cdc_devs[] = { .driver_info = (unsigned long) &wwan_info,
drivers/net/usb/cdc_ncm.c static const struct usb_device_id cdc_devs[] = { · line 1201
Quoted 10 lines
drivers/net/usb/cdc_ncm.c +8
-0}, +/* buggy device cannot send ARP */ + { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_VENDOR, + .idVendor = 0xAAAA, + .bInterfaceClass = USB_CLASS_COMM, + .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM, + .bInterfaceProtocol = USB_CDC_PROTO_NONE, + .driver_info = (unsigned long) &wwan_info,
... or you define a matching id here and give it a flag in driver_info
But not both.
Regards
Oliver
Hello.
Quoted 9 lines · Wei Shuai
Signed-off-by Wei Shuai <[email protected]>--- drivers/net/usb/cdc_ncm.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-)drivers/net/usb/cdc_ncm.c +0
-0
[...]
drivers/net/usb/cdc_ncm.c static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf) · line 577
Quoted 6 lines
drivers/net/usb/cdc_ncm.c +2
-0@@ -572,6 +573,10 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf) cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting)) return -ENODEV;#endif +/* this buggy device cannot do ARP */ +if ( (le16_to_cpu (udev->descriptor.idVendor) ==0xAAAA ) ) {
Please run the patch thru scripts/checkpatch.pl and resubmit.
WBR, Sergei