Skip to content

Commit 0dd8726

Browse files
jefstathdavem330
authored andcommitted
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: John Efstathiades <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9d2da72 commit 0dd8726

File tree

1 file changed

+16
-35
lines changed

1 file changed

+16
-35
lines changed

drivers/net/usb/lan78xx.c

Lines changed: 16 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
#define DEFAULT_TSO_CSUM_ENABLE (true)
6868
#define DEFAULT_VLAN_FILTER_ENABLE (true)
6969
#define DEFAULT_VLAN_RX_OFFLOAD (true)
70-
#define TX_OVERHEAD (8)
7170
#define TX_ALIGNMENT (4)
7271
#define RXW_PADDING 2
7372

@@ -120,6 +119,10 @@
120119
#define TX_SKB_MIN_LEN (TX_CMD_LEN + ETH_HLEN)
121120
#define LAN78XX_TSO_SIZE(dev) ((dev)->tx_urb_size - TX_SKB_MIN_LEN)
122121

122+
#define RX_CMD_LEN 10
123+
#define RX_SKB_MIN_LEN (RX_CMD_LEN + ETH_HLEN)
124+
#define RX_MAX_FRAME_LEN(mtu) ((mtu) + ETH_HLEN + VLAN_HLEN)
125+
123126
/* USB related defines */
124127
#define BULK_IN_PIPE 1
125128
#define BULK_OUT_PIPE 2
@@ -440,8 +443,6 @@ struct lan78xx_net {
440443
struct mutex phy_mutex; /* for phy access */
441444
unsigned int pipe_in, pipe_out, pipe_intr;
442445

443-
u32 hard_mtu; /* count any extra framing */
444-
445446
unsigned int bulk_in_delay;
446447
unsigned int burst_cap;
447448

@@ -2536,37 +2537,24 @@ static int unlink_urbs(struct lan78xx_net *dev, struct sk_buff_head *q)
25362537
static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu)
25372538
{
25382539
struct lan78xx_net *dev = netdev_priv(netdev);
2539-
int ll_mtu = new_mtu + netdev->hard_header_len;
2540-
int old_hard_mtu = dev->hard_mtu;
2541-
int old_rx_urb_size = dev->rx_urb_size;
2540+
int max_frame_len = RX_MAX_FRAME_LEN(new_mtu);
25422541
int ret;
25432542

25442543
/* no second zero-length packet read wanted after mtu-sized packets */
2545-
if ((ll_mtu % dev->maxpacket) == 0)
2544+
if ((max_frame_len % dev->maxpacket) == 0)
25462545
return -EDOM;
25472546

25482547
ret = usb_autopm_get_interface(dev->intf);
25492548
if (ret < 0)
25502549
return ret;
25512550

2552-
lan78xx_set_rx_max_frame_length(dev, new_mtu + VLAN_ETH_HLEN);
2553-
2554-
netdev->mtu = new_mtu;
2555-
2556-
dev->hard_mtu = netdev->mtu + netdev->hard_header_len;
2557-
if (dev->rx_urb_size == old_hard_mtu) {
2558-
dev->rx_urb_size = dev->hard_mtu;
2559-
if (dev->rx_urb_size > old_rx_urb_size) {
2560-
if (netif_running(dev->net)) {
2561-
unlink_urbs(dev, &dev->rxq);
2562-
tasklet_schedule(&dev->bh);
2563-
}
2564-
}
2565-
}
2551+
ret = lan78xx_set_rx_max_frame_length(dev, max_frame_len);
2552+
if (!ret)
2553+
netdev->mtu = new_mtu;
25662554

25672555
usb_autopm_put_interface(dev->intf);
25682556

2569-
return 0;
2557+
return ret;
25702558
}
25712559

25722560
static int lan78xx_set_mac_addr(struct net_device *netdev, void *p)
@@ -3084,7 +3072,7 @@ static int lan78xx_reset(struct lan78xx_net *dev)
30843072
return ret;
30853073

30863074
ret = lan78xx_set_rx_max_frame_length(dev,
3087-
dev->net->mtu + VLAN_ETH_HLEN);
3075+
RX_MAX_FRAME_LEN(dev->net->mtu));
30883076

30893077
return ret;
30903078
}
@@ -3489,9 +3477,6 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf)
34893477
goto out1;
34903478
}
34913479

3492-
dev->net->hard_header_len += TX_OVERHEAD;
3493-
dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len;
3494-
34953480
/* Init all registers */
34963481
ret = lan78xx_reset(dev);
34973482
if (ret) {
@@ -3592,7 +3577,7 @@ static void lan78xx_skb_return(struct lan78xx_net *dev, struct sk_buff *skb)
35923577

35933578
static int lan78xx_rx(struct lan78xx_net *dev, struct sk_buff *skb)
35943579
{
3595-
if (skb->len < dev->net->hard_header_len)
3580+
if (skb->len < RX_SKB_MIN_LEN)
35963581
return 0;
35973582

35983583
while (skb->len > 0) {
@@ -3699,7 +3684,7 @@ static void rx_complete(struct urb *urb)
36993684

37003685
switch (urb_status) {
37013686
case 0:
3702-
if (skb->len < dev->net->hard_header_len) {
3687+
if (skb->len < RX_SKB_MIN_LEN) {
37033688
state = rx_cleanup;
37043689
dev->net->stats.rx_errors++;
37053690
dev->net->stats.rx_length_errors++;
@@ -4343,6 +4328,9 @@ static int lan78xx_probe(struct usb_interface *intf,
43434328
if (ret < 0)
43444329
goto out3;
43454330

4331+
/* MTU range: 68 - 9000 */
4332+
netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
4333+
43464334
netif_set_gso_max_size(netdev, LAN78XX_TSO_SIZE(dev));
43474335

43484336
tasklet_setup(&dev->bh, lan78xx_bh);
@@ -4390,13 +4378,6 @@ static int lan78xx_probe(struct usb_interface *intf,
43904378
if (ret < 0)
43914379
goto out4;
43924380

4393-
if (netdev->mtu > (dev->hard_mtu - netdev->hard_header_len))
4394-
netdev->mtu = dev->hard_mtu - netdev->hard_header_len;
4395-
4396-
/* MTU range: 68 - 9000 */
4397-
netdev->max_mtu = MAX_SINGLE_PACKET_SIZE;
4398-
netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER);
4399-
44004381
period = ep_intr->desc.bInterval;
44014382
maxp = usb_maxpacket(dev->udev, dev->pipe_intr, 0);
44024383
buf = kmalloc(maxp, GFP_KERNEL);

0 commit comments

Comments
 (0)