Commit 0dd87266 authored by John Efstathiades's avatar John Efstathiades Committed by David S. Miller

lan78xx: Remove hardware-specific header update

Remove hardware-specific header length adjustment as it is no longer
required. It also breaks generic receive offload (GRO) processing of
received TCP frames that results in a TCP ACK being sent for each
received frame.
Signed-off-by: default avatarJohn Efstathiades <john.efstathiades@pebblebay.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9d2da721
...@@ -67,7 +67,6 @@ ...@@ -67,7 +67,6 @@
#define DEFAULT_TSO_CSUM_ENABLE (true) #define DEFAULT_TSO_CSUM_ENABLE (true)
#define DEFAULT_VLAN_FILTER_ENABLE (true) #define DEFAULT_VLAN_FILTER_ENABLE (true)
#define DEFAULT_VLAN_RX_OFFLOAD (true) #define DEFAULT_VLAN_RX_OFFLOAD (true)
#define TX_OVERHEAD (8)
#define TX_ALIGNMENT (4) #define TX_ALIGNMENT (4)
#define RXW_PADDING 2 #define RXW_PADDING 2
...@@ -120,6 +119,10 @@ ...@@ -120,6 +119,10 @@
#define TX_SKB_MIN_LEN (TX_CMD_LEN + ETH_HLEN) #define TX_SKB_MIN_LEN (TX_CMD_LEN + ETH_HLEN)
#define LAN78XX_TSO_SIZE(dev) ((dev)->tx_urb_size - TX_SKB_MIN_LEN) #define LAN78XX_TSO_SIZE(dev) ((dev)->tx_urb_size - TX_SKB_MIN_LEN)
#define RX_CMD_LEN 10
#define RX_SKB_MIN_LEN (RX_CMD_LEN + ETH_HLEN)
#define RX_MAX_FRAME_LEN(mtu) ((mtu) + ETH_HLEN + VLAN_HLEN)
/* USB related defines */ /* USB related defines */
#define BULK_IN_PIPE 1 #define BULK_IN_PIPE 1
#define BULK_OUT_PIPE 2 #define BULK_OUT_PIPE 2
...@@ -440,8 +443,6 @@ struct lan78xx_net { ...@@ -440,8 +443,6 @@ struct lan78xx_net {
struct mutex phy_mutex; /* for phy access */ struct mutex phy_mutex; /* for phy access */
unsigned int pipe_in, pipe_out, pipe_intr; unsigned int pipe_in, pipe_out, pipe_intr;
u32 hard_mtu; /* count any extra framing */
unsigned int bulk_in_delay; unsigned int bulk_in_delay;
unsigned int burst_cap; unsigned int burst_cap;
...@@ -2536,37 +2537,24 @@ static int unlink_urbs(struct lan78xx_net *dev, struct sk_buff_head *q) ...@@ -2536,37 +2537,24 @@ static int unlink_urbs(struct lan78xx_net *dev, struct sk_buff_head *q)
static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu) static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu)
{ {
struct lan78xx_net *dev = netdev_priv(netdev); struct lan78xx_net *dev = netdev_priv(netdev);
int ll_mtu = new_mtu + netdev->hard_header_len; int max_frame_len = RX_MAX_FRAME_LEN(new_mtu);
int old_hard_mtu = dev->hard_mtu;
int old_rx_urb_size = dev->rx_urb_size;
int ret; int ret;
/* no second zero-length packet read wanted after mtu-sized packets */ /* no second zero-length packet read wanted after mtu-sized packets */
if ((ll_mtu % dev->maxpacket) == 0) if ((max_frame_len % dev->maxpacket) == 0)
return -EDOM; return -EDOM;
ret = usb_autopm_get_interface(dev->intf); ret = usb_autopm_get_interface(dev->intf);
if (ret < 0) if (ret < 0)
return ret; return ret;
lan78xx_set_rx_max_frame_length(dev, new_mtu + VLAN_ETH_HLEN); ret = lan78xx_set_rx_max_frame_length(dev, max_frame_len);
if (!ret)
netdev->mtu = new_mtu; netdev->mtu = new_mtu;
dev->hard_mtu = netdev->mtu + netdev->hard_header_len;
if (dev->rx_urb_size == old_hard_mtu) {
dev->rx_urb_size = dev->hard_mtu;
if (dev->rx_urb_size > old_rx_urb_size) {
if (netif_running(dev->net)) {
unlink_urbs(dev, &dev->rxq);
tasklet_schedule(&dev->bh);
}
}
}
usb_autopm_put_interface(dev->intf); usb_autopm_put_interface(dev->intf);
return 0; return ret;
} }
static int lan78xx_set_mac_addr(struct net_device *netdev, void *p) static int lan78xx_set_mac_addr(struct net_device *netdev, void *p)
...@@ -3084,7 +3072,7 @@ static int lan78xx_reset(struct lan78xx_net *dev) ...@@ -3084,7 +3072,7 @@ static int lan78xx_reset(struct lan78xx_net *dev)
return ret; return ret;
ret = lan78xx_set_rx_max_frame_length(dev, ret = lan78xx_set_rx_max_frame_length(dev,
dev->net->mtu + VLAN_ETH_HLEN); RX_MAX_FRAME_LEN(dev->net->mtu));
return ret; return ret;
} }
...@@ -3489,9 +3477,6 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf) ...@@ -3489,9 +3477,6 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf)
goto out1; goto out1;
} }
dev->net->hard_header_len += TX_OVERHEAD;
dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
/* Init all registers */ /* Init all registers */
ret = lan78xx_reset(dev); ret = lan78xx_reset(dev);
if (ret) { if (ret) {
...@@ -3592,7 +3577,7 @@ static void lan78xx_skb_return(struct lan78xx_net *dev, struct sk_buff *skb) ...@@ -3592,7 +3577,7 @@ static void lan78xx_skb_return(struct lan78xx_net *dev, struct sk_buff *skb)
static int lan78xx_rx(struct lan78xx_net *dev, struct sk_buff *skb) static int lan78xx_rx(struct lan78xx_net *dev, struct sk_buff *skb)
{ {
if (skb->len < dev->net->hard_header_len) if (skb->len < RX_SKB_MIN_LEN)
return 0; return 0;
while (skb->len > 0) { while (skb->len > 0) {
...@@ -3699,7 +3684,7 @@ static void rx_complete(struct urb *urb) ...@@ -3699,7 +3684,7 @@ static void rx_complete(struct urb *urb)
switch (urb_status) { switch (urb_status) {
case 0: case 0:
if (skb->len < dev->net->hard_header_len) { if (skb->len < RX_SKB_MIN_LEN) {
state = rx_cleanup; state = rx_cleanup;
dev->net->stats.rx_errors++; dev->net->stats.rx_errors++;
dev->net->stats.rx_length_errors++; dev->net->stats.rx_length_errors++;
...@@ -4343,6 +4328,9 @@ static int lan78xx_probe(struct usb_interface *intf, ...@@ -4343,6 +4328,9 @@ static int lan78xx_probe(struct usb_interface *intf,
if (ret < 0) if (ret < 0)
goto out3; goto out3;
/* MTU range: 68 - 9000 */
netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
netif_set_gso_max_size(netdev, LAN78XX_TSO_SIZE(dev)); netif_set_gso_max_size(netdev, LAN78XX_TSO_SIZE(dev));
tasklet_setup(&dev->bh, lan78xx_bh); tasklet_setup(&dev->bh, lan78xx_bh);
...@@ -4390,13 +4378,6 @@ static int lan78xx_probe(struct usb_interface *intf, ...@@ -4390,13 +4378,6 @@ static int lan78xx_probe(struct usb_interface *intf,
if (ret < 0) if (ret < 0)
goto out4; goto out4;
if (netdev->mtu > (dev->hard_mtu - netdev->hard_header_len))
netdev->mtu = dev->hard_mtu - netdev->hard_header_len;
/* MTU range: 68 - 9000 */
netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER);
period = ep_intr->desc.bInterval; period = ep_intr->desc.bInterval;
maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0); maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0);
buf = kmalloc(maxp, GFP_KERNEL); buf = kmalloc(maxp, GFP_KERNEL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment