Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
The UDP offload conflict is dealt with by simply taking what is in net-next where we have removed all of the UFO handling code entirely. The TCP conflict was a case of local variables in a function being removed from both net and net-next. In netvsc we had an assignment right next to where a missing set of u64 stats sync object inits were added. Signed-off-by: David S. Miller <davem@davemloft.net>
这个提交包含在:
@@ -209,6 +209,7 @@ void asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value,
|
||||
int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
|
||||
struct asix_rx_fixup_info *rx);
|
||||
int asix_rx_fixup_common(struct usbnet *dev, struct sk_buff *skb);
|
||||
void asix_rx_fixup_common_free(struct asix_common_private *dp);
|
||||
|
||||
struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
||||
gfp_t flags);
|
||||
|
@@ -75,6 +75,27 @@ void asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index,
|
||||
value, index, data, size);
|
||||
}
|
||||
|
||||
static void reset_asix_rx_fixup_info(struct asix_rx_fixup_info *rx)
|
||||
{
|
||||
/* Reset the variables that have a lifetime outside of
|
||||
* asix_rx_fixup_internal() so that future processing starts from a
|
||||
* known set of initial conditions.
|
||||
*/
|
||||
|
||||
if (rx->ax_skb) {
|
||||
/* Discard any incomplete Ethernet frame in the netdev buffer */
|
||||
kfree_skb(rx->ax_skb);
|
||||
rx->ax_skb = NULL;
|
||||
}
|
||||
|
||||
/* Assume the Data header 32-bit word is at the start of the current
|
||||
* or next URB socket buffer so reset all the state variables.
|
||||
*/
|
||||
rx->remaining = 0;
|
||||
rx->split_head = false;
|
||||
rx->header = 0;
|
||||
}
|
||||
|
||||
int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
|
||||
struct asix_rx_fixup_info *rx)
|
||||
{
|
||||
@@ -99,15 +120,7 @@ int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
|
||||
if (size != ((~rx->header >> 16) & 0x7ff)) {
|
||||
netdev_err(dev->net, "asix_rx_fixup() Data Header synchronisation was lost, remaining %d\n",
|
||||
rx->remaining);
|
||||
if (rx->ax_skb) {
|
||||
kfree_skb(rx->ax_skb);
|
||||
rx->ax_skb = NULL;
|
||||
/* Discard the incomplete netdev Ethernet frame
|
||||
* and assume the Data header is at the start of
|
||||
* the current URB socket buffer.
|
||||
*/
|
||||
}
|
||||
rx->remaining = 0;
|
||||
reset_asix_rx_fixup_info(rx);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,11 +152,13 @@ int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
|
||||
if (size != ((~rx->header >> 16) & 0x7ff)) {
|
||||
netdev_err(dev->net, "asix_rx_fixup() Bad Header Length 0x%x, offset %d\n",
|
||||
rx->header, offset);
|
||||
reset_asix_rx_fixup_info(rx);
|
||||
return 0;
|
||||
}
|
||||
if (size > dev->net->mtu + ETH_HLEN + VLAN_HLEN) {
|
||||
netdev_dbg(dev->net, "asix_rx_fixup() Bad RX Length %d\n",
|
||||
size);
|
||||
reset_asix_rx_fixup_info(rx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -168,8 +183,10 @@ int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
|
||||
if (rx->ax_skb) {
|
||||
skb_put_data(rx->ax_skb, skb->data + offset,
|
||||
copy_length);
|
||||
if (!rx->remaining)
|
||||
if (!rx->remaining) {
|
||||
usbnet_skb_return(dev, rx->ax_skb);
|
||||
rx->ax_skb = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
offset += (copy_length + 1) & 0xfffe;
|
||||
@@ -178,6 +195,7 @@ int asix_rx_fixup_internal(struct usbnet *dev, struct sk_buff *skb,
|
||||
if (skb->len != offset) {
|
||||
netdev_err(dev->net, "asix_rx_fixup() Bad SKB Length %d, %d\n",
|
||||
skb->len, offset);
|
||||
reset_asix_rx_fixup_info(rx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -192,6 +210,21 @@ int asix_rx_fixup_common(struct usbnet *dev, struct sk_buff *skb)
|
||||
return asix_rx_fixup_internal(dev, skb, rx);
|
||||
}
|
||||
|
||||
void asix_rx_fixup_common_free(struct asix_common_private *dp)
|
||||
{
|
||||
struct asix_rx_fixup_info *rx;
|
||||
|
||||
if (!dp)
|
||||
return;
|
||||
|
||||
rx = &dp->rx_fixup_info;
|
||||
|
||||
if (rx->ax_skb) {
|
||||
kfree_skb(rx->ax_skb);
|
||||
rx->ax_skb = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
||||
gfp_t flags)
|
||||
{
|
||||
|
@@ -764,6 +764,7 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
|
||||
static void ax88772_unbind(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
asix_rx_fixup_common_free(dev->driver_priv);
|
||||
kfree(dev->driver_priv);
|
||||
}
|
||||
|
||||
|
@@ -2367,9 +2367,6 @@ static int lan78xx_reset(struct lan78xx_net *dev)
|
||||
/* Init LTM */
|
||||
lan78xx_init_ltm(dev);
|
||||
|
||||
dev->net->hard_header_len += TX_OVERHEAD;
|
||||
dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
|
||||
|
||||
if (dev->udev->speed == USB_SPEED_SUPER) {
|
||||
buf = DEFAULT_BURST_CAP_SIZE / SS_USB_PKT_SIZE;
|
||||
dev->rx_urb_size = DEFAULT_BURST_CAP_SIZE;
|
||||
@@ -2855,16 +2852,19 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf)
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev->net->hard_header_len += TX_OVERHEAD;
|
||||
dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
|
||||
|
||||
/* Init all registers */
|
||||
ret = lan78xx_reset(dev);
|
||||
|
||||
lan78xx_mdio_init(dev);
|
||||
ret = lan78xx_mdio_init(dev);
|
||||
|
||||
dev->net->flags |= IFF_MULTICAST;
|
||||
|
||||
pdata->wol = WAKE_MAGIC;
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void lan78xx_unbind(struct lan78xx_net *dev, struct usb_interface *intf)
|
||||
@@ -3525,11 +3525,11 @@ static int lan78xx_probe(struct usb_interface *intf,
|
||||
udev = interface_to_usbdev(intf);
|
||||
udev = usb_get_dev(udev);
|
||||
|
||||
ret = -ENOMEM;
|
||||
netdev = alloc_etherdev(sizeof(struct lan78xx_net));
|
||||
if (!netdev) {
|
||||
dev_err(&intf->dev, "Error: OOM\n");
|
||||
goto out1;
|
||||
dev_err(&intf->dev, "Error: OOM\n");
|
||||
ret = -ENOMEM;
|
||||
goto out1;
|
||||
}
|
||||
|
||||
/* netdev_printk() needs this */
|
||||
@@ -3610,7 +3610,7 @@ static int lan78xx_probe(struct usb_interface *intf,
|
||||
ret = register_netdev(netdev);
|
||||
if (ret != 0) {
|
||||
netif_err(dev, probe, netdev, "couldn't register the device\n");
|
||||
goto out2;
|
||||
goto out3;
|
||||
}
|
||||
|
||||
usb_set_intfdata(intf, dev);
|
||||
|
@@ -1175,6 +1175,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */
|
||||
{QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */
|
||||
{QMI_FIXED_INTF(0x2001, 0x7e35, 4)}, /* D-Link DWM-222 */
|
||||
{QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */
|
||||
{QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */
|
||||
{QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */
|
||||
|
在新工单中引用
屏蔽一个用户