--- zzzz-none-000/linux-2.6.39.4/drivers/net/usb/cdc_ncm.c 2011-08-03 19:43:28.000000000 +0000 +++ puma6-arm-6490-729/linux-2.6.39.4/drivers/net/usb/cdc_ncm.c 2021-11-10 13:23:10.000000000 +0000 @@ -148,6 +148,19 @@ USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE), .driver_info = (unsigned long)&cdc_ncm_info, }, + + /* AVM/WK Patch from Kernel 3.10 */ + /* Huawei NCM devices disguised as vendor specific */ + { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x16), + .driver_info = (unsigned long)&cdc_ncm_info, + }, + { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x46), + .driver_info = (unsigned long)&cdc_ncm_info, + }, + { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, 0xff, 0x02, 0x76), + .driver_info = (unsigned long)&cdc_ncm_info, + }, + { }, }; @@ -1099,12 +1112,11 @@ break; } else { - skb = skb_clone(skb_in, GFP_ATOMIC); + /* create a fresh copy to reduce truesize */ + skb = netdev_alloc_skb_ip_align(dev->net, temp); if (!skb) goto error; - skb->len = temp; - skb->data = ((u8 *)skb_in->data) + offset; - skb_set_tail_pointer(skb, temp); + memcpy(skb_put(skb, temp), skb_in->data + offset, temp); usbnet_skb_return(dev, skb); } }