aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/usb/cdc_ncm.h
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2015-12-23 13:42:43 +0100
committerDavid S. Miller <davem@davemloft.net>2015-12-23 22:52:08 -0500
commit1dfddff5fcd869fcab0c52fafae099dfa435a935 (patch)
treeb0c5d35d7cd42c16f8364f4028a9313cc1eb6666 /include/linux/usb/cdc_ncm.h
parentgeneve: initialize needed_headroom (diff)
downloadlinux-dev-1dfddff5fcd869fcab0c52fafae099dfa435a935.tar.xz
linux-dev-1dfddff5fcd869fcab0c52fafae099dfa435a935.zip
net: cdc_ncm: avoid changing RX/TX buffers on MTU changes
NCM buffer sizes are negotiated with the device independently of the network device MTU. The RX buffers are allocated by the usbnet framework based on the rx_urb_size value set by cdc_ncm. A single RX buffer can hold a number of MTU sized packets. The default usbnet change_mtu ndo only modifies rx_urb_size if it is equal to hard_mtu. And the cdc_ncm driver will set rx_urb_size and hard_mtu independently of each other, based on dwNtbInMaxSize and dwNtbOutMaxSize respectively. It was therefore assumed that usbnet_change_mtu() would never touch rx_urb_size. This failed to consider the case where dwNtbInMaxSize and dwNtbOutMaxSize happens to be equal. Fix by implementing an NCM specific change_mtu ndo, modifying the netdev MTU without touching the buffer size settings. Signed-off-by: Bjørn Mork <bjorn@mork.no> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/linux/usb/cdc_ncm.h')
-rw-r--r--include/linux/usb/cdc_ncm.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h
index 1f6526c76ee8..3a375d07d0dc 100644
--- a/include/linux/usb/cdc_ncm.h
+++ b/include/linux/usb/cdc_ncm.h
@@ -138,6 +138,7 @@ struct cdc_ncm_ctx {
};
u8 cdc_ncm_select_altsetting(struct usb_interface *intf);
+int cdc_ncm_change_mtu(struct net_device *net, int new_mtu);
int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting, int drvflags);
void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf);
struct sk_buff *cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign);