Commit 4c51e536 authored by Steve Glendinning's avatar Steve Glendinning Committed by David S. Miller

smsc75xx: fix jumbo frame support

This patch enables RX of jumbo frames for LAN7500.

Previously the driver would transmit jumbo frames succesfully but
would drop received jumbo frames (incrementing the interface errors
count).

With this patch applied the device can succesfully receive jumbo
frames up to MTU 9000 (9014 bytes on the wire including ethernet
header).
Signed-off-by: default avatarSteve Glendinning <steve.glendinning@shawell.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 50eab050
...@@ -914,8 +914,12 @@ static int smsc75xx_set_rx_max_frame_length(struct usbnet *dev, int size) ...@@ -914,8 +914,12 @@ static int smsc75xx_set_rx_max_frame_length(struct usbnet *dev, int size)
static int smsc75xx_change_mtu(struct net_device *netdev, int new_mtu) static int smsc75xx_change_mtu(struct net_device *netdev, int new_mtu)
{ {
struct usbnet *dev = netdev_priv(netdev); struct usbnet *dev = netdev_priv(netdev);
int ret;
if (new_mtu > MAX_SINGLE_PACKET_SIZE)
return -EINVAL;
int ret = smsc75xx_set_rx_max_frame_length(dev, new_mtu); ret = smsc75xx_set_rx_max_frame_length(dev, new_mtu + ETH_HLEN);
if (ret < 0) { if (ret < 0) {
netdev_warn(dev->net, "Failed to set mac rx frame length\n"); netdev_warn(dev->net, "Failed to set mac rx frame length\n");
return ret; return ret;
...@@ -1324,7 +1328,7 @@ static int smsc75xx_reset(struct usbnet *dev) ...@@ -1324,7 +1328,7 @@ static int smsc75xx_reset(struct usbnet *dev)
netif_dbg(dev, ifup, dev->net, "FCT_TX_CTL set to 0x%08x\n", buf); netif_dbg(dev, ifup, dev->net, "FCT_TX_CTL set to 0x%08x\n", buf);
ret = smsc75xx_set_rx_max_frame_length(dev, 1514); ret = smsc75xx_set_rx_max_frame_length(dev, dev->net->mtu + ETH_HLEN);
if (ret < 0) { if (ret < 0) {
netdev_warn(dev->net, "Failed to set max rx frame length\n"); netdev_warn(dev->net, "Failed to set max rx frame length\n");
return ret; return ret;
...@@ -2134,8 +2138,8 @@ static int smsc75xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb) ...@@ -2134,8 +2138,8 @@ static int smsc75xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
else if (rx_cmd_a & (RX_CMD_A_LONG | RX_CMD_A_RUNT)) else if (rx_cmd_a & (RX_CMD_A_LONG | RX_CMD_A_RUNT))
dev->net->stats.rx_frame_errors++; dev->net->stats.rx_frame_errors++;
} else { } else {
/* ETH_FRAME_LEN + 4(CRC) + 2(COE) + 4(Vlan) */ /* MAX_SINGLE_PACKET_SIZE + 4(CRC) + 2(COE) + 4(Vlan) */
if (unlikely(size > (ETH_FRAME_LEN + 12))) { if (unlikely(size > (MAX_SINGLE_PACKET_SIZE + ETH_HLEN + 12))) {
netif_dbg(dev, rx_err, dev->net, netif_dbg(dev, rx_err, dev->net,
"size err rx_cmd_a=0x%08x\n", "size err rx_cmd_a=0x%08x\n",
rx_cmd_a); rx_cmd_a);
......
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