mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
usbnet: fix alignment for frames with no ethernet header
[ Upstream commita4abd7a80a
] The qmi_wwan minidriver support a 'raw-ip' mode where frames are received without any ethernet header. This causes alignment issues because the skbs allocated by usbnet are "IP aligned". Fix by allowing minidrivers to disable the additional alignment offset. This is implemented using a per-device flag, since the same minidriver also supports 'ethernet' mode. Fixes:32f7adf633
("net: qmi_wwan: support "raw IP" mode") Reported-and-tested-by: Jay Foster <jay@systech.com> Signed-off-by: Bjørn Mork <bjorn@mork.no> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
f8e5ef4ea8
commit
bea712a8a5
3 changed files with 7 additions and 1 deletions
|
@ -261,9 +261,11 @@ static void qmi_wwan_netdev_setup(struct net_device *net)
|
|||
net->hard_header_len = 0;
|
||||
net->addr_len = 0;
|
||||
net->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
|
||||
set_bit(EVENT_NO_IP_ALIGN, &dev->flags);
|
||||
netdev_dbg(net, "mode: raw IP\n");
|
||||
} else if (!net->header_ops) { /* don't bother if already set */
|
||||
ether_setup(net);
|
||||
clear_bit(EVENT_NO_IP_ALIGN, &dev->flags);
|
||||
netdev_dbg(net, "mode: Ethernet\n");
|
||||
}
|
||||
|
||||
|
|
|
@ -484,7 +484,10 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
|
|||
return -ENOLINK;
|
||||
}
|
||||
|
||||
skb = __netdev_alloc_skb_ip_align(dev->net, size, flags);
|
||||
if (test_bit(EVENT_NO_IP_ALIGN, &dev->flags))
|
||||
skb = __netdev_alloc_skb(dev->net, size, flags);
|
||||
else
|
||||
skb = __netdev_alloc_skb_ip_align(dev->net, size, flags);
|
||||
if (!skb) {
|
||||
netif_dbg(dev, rx_err, dev->net, "no rx skb\n");
|
||||
usbnet_defer_kevent (dev, EVENT_RX_MEMORY);
|
||||
|
|
|
@ -81,6 +81,7 @@ struct usbnet {
|
|||
# define EVENT_RX_KILL 10
|
||||
# define EVENT_LINK_CHANGE 11
|
||||
# define EVENT_SET_RX_MODE 12
|
||||
# define EVENT_NO_IP_ALIGN 13
|
||||
};
|
||||
|
||||
static inline struct usb_driver *driver_of(struct usb_interface *intf)
|
||||
|
|
Loading…
Reference in a new issue