diff options
author | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-08-01 21:29:05 +0000 |
---|---|---|
committer | nbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2009-08-01 21:29:05 +0000 |
commit | 796fe1dcd740f8ad3bd512b0d0eb9da07e4882de (patch) | |
tree | e4eaf4909e1dc9fe848139989806a05422a905ee /target | |
parent | 6f02f68928e9176839e5e08a15e1e8cb2f69e037 (diff) |
ixp4xx: add support for jumbo frames to the ethernet driver
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@17083 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target')
-rw-r--r-- | target/linux/ixp4xx/patches-2.6.28/304-ixp4xx_eth_jumboframe.patch | 84 | ||||
-rw-r--r-- | target/linux/ixp4xx/patches-2.6.30/304-ixp4xx_eth_jumboframe.patch | 78 |
2 files changed, 162 insertions, 0 deletions
diff --git a/target/linux/ixp4xx/patches-2.6.28/304-ixp4xx_eth_jumboframe.patch b/target/linux/ixp4xx/patches-2.6.28/304-ixp4xx_eth_jumboframe.patch new file mode 100644 index 000000000..ba2ac840a --- /dev/null +++ b/target/linux/ixp4xx/patches-2.6.28/304-ixp4xx_eth_jumboframe.patch @@ -0,0 +1,84 @@ +--- a/drivers/net/arm/ixp4xx_eth.c ++++ b/drivers/net/arm/ixp4xx_eth.c +@@ -54,7 +54,7 @@ + + #define POOL_ALLOC_SIZE (sizeof(struct desc) * (RX_DESCS + TX_DESCS)) + #define REGS_SIZE 0x1000 +-#define MAX_MRU 1536 /* 0x600 */ ++#define MAX_MRU 16384 + #define RX_BUFF_SIZE ALIGN((NET_IP_ALIGN) + MAX_MRU, 4) + + #define NAPI_WEIGHT 16 +@@ -1011,6 +1011,30 @@ static void destroy_queues(struct port * + } + } + ++static int eth_do_change_mtu(struct net_device *dev, int mtu) ++{ ++ struct port *port; ++ struct msg msg; ++ ++ port = netdev_priv(dev); ++ ++ memset(&msg, 0, sizeof(msg)); ++ msg.cmd = NPE_SETMAXFRAMELENGTHS; ++ msg.eth_id = port->id; ++ ++ /* max rx/tx 64 byte blocks */ ++ msg.byte2 = ((mtu + 63) / 64) << 8; ++ msg.byte3 = ((mtu + 63) / 64) << 8; ++ ++ msg.byte4 = msg.byte6 = mtu >> 8; ++ msg.byte5 = msg.byte7 = mtu & 0xff; ++ ++ if (npe_send_recv_message(port->npe, &msg, "ETH_SET_MAX_FRAME_LENGTH")) ++ return -EIO; ++ ++ return 0; ++} ++ + static int eth_open(struct net_device *dev) + { + struct port *port = netdev_priv(dev); +@@ -1061,6 +1085,8 @@ static int eth_open(struct net_device *d + if (npe_send_recv_message(port->npe, &msg, "ETH_SET_FIREWALL_MODE")) + return -EIO; + ++ eth_do_change_mtu(dev, dev->mtu); ++ + if ((err = request_queues(port)) != 0) + return err; + +@@ -1238,6 +1264,24 @@ static void eth_init_mii(struct net_devi + + } + ++static int eth_change_mtu(struct net_device *dev, int mtu) ++{ ++ int ret; ++ ++ if (mtu > MAX_MRU) ++ return -EINVAL; ++ ++ if (dev->flags & IFF_UP) { ++ ret = eth_do_change_mtu(dev, mtu); ++ if (ret < 0) ++ return ret; ++ } ++ ++ dev->mtu = mtu; ++ ++ return 0; ++} ++ + static int __devinit eth_init_one(struct platform_device *pdev) + { + struct port *port; +@@ -1272,6 +1316,7 @@ static int __devinit eth_init_one(struct + goto err_free; + } + ++ dev->change_mtu = eth_change_mtu; + dev->open = eth_open; + dev->hard_start_xmit = eth_xmit; + dev->stop = eth_close; diff --git a/target/linux/ixp4xx/patches-2.6.30/304-ixp4xx_eth_jumboframe.patch b/target/linux/ixp4xx/patches-2.6.30/304-ixp4xx_eth_jumboframe.patch new file mode 100644 index 000000000..21e8f45e5 --- /dev/null +++ b/target/linux/ixp4xx/patches-2.6.30/304-ixp4xx_eth_jumboframe.patch @@ -0,0 +1,78 @@ +--- a/drivers/net/arm/ixp4xx_eth.c ++++ b/drivers/net/arm/ixp4xx_eth.c +@@ -52,7 +52,7 @@ + + #define POOL_ALLOC_SIZE (sizeof(struct desc) * (RX_DESCS + TX_DESCS)) + #define REGS_SIZE 0x1000 +-#define MAX_MRU 1536 /* 0x600 */ ++#define MAX_MRU 16384 + #define RX_BUFF_SIZE ALIGN((NET_IP_ALIGN) + MAX_MRU, 4) + + #define NAPI_WEIGHT 16 +@@ -1066,6 +1066,30 @@ static void destroy_queues(struct port * + } + } + ++static int eth_do_change_mtu(struct net_device *dev, int mtu) ++{ ++ struct port *port; ++ struct msg msg; ++ ++ port = netdev_priv(dev); ++ ++ memset(&msg, 0, sizeof(msg)); ++ msg.cmd = NPE_SETMAXFRAMELENGTHS; ++ msg.eth_id = port->id; ++ ++ /* max rx/tx 64 byte blocks */ ++ msg.byte2 = ((mtu + 63) / 64) << 8; ++ msg.byte3 = ((mtu + 63) / 64) << 8; ++ ++ msg.byte4 = msg.byte6 = mtu >> 8; ++ msg.byte5 = msg.byte7 = mtu & 0xff; ++ ++ if (npe_send_recv_message(port->npe, &msg, "ETH_SET_MAX_FRAME_LENGTH")) ++ return -EIO; ++ ++ return 0; ++} ++ + static int eth_open(struct net_device *dev) + { + struct port *port = netdev_priv(dev); +@@ -1117,6 +1141,8 @@ static int eth_open(struct net_device *d + if (npe_send_recv_message(port->npe, &msg, "ETH_SET_FIREWALL_MODE")) + return -EIO; + ++ eth_do_change_mtu(dev, dev->mtu); ++ + if ((err = request_queues(port)) != 0) + return err; + +@@ -1256,7 +1282,26 @@ static int eth_close(struct net_device * + return 0; + } + ++static int ixp_eth_change_mtu(struct net_device *dev, int mtu) ++{ ++ int ret; ++ ++ if (mtu > MAX_MRU) ++ return -EINVAL; ++ ++ if (dev->flags & IFF_UP) { ++ ret = eth_do_change_mtu(dev, mtu); ++ if (ret < 0) ++ return ret; ++ } ++ ++ dev->mtu = mtu; ++ ++ return 0; ++} ++ + static const struct net_device_ops ixp4xx_netdev_ops = { ++ .ndo_change_mtu = ixp_eth_change_mtu, + .ndo_open = eth_open, + .ndo_stop = eth_close, + .ndo_start_xmit = eth_xmit, |