1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-08-21 07:07:08 +03:00

ixp4xx add jumboframe fixes by Ted Hess (#5746)

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@17396 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
nbd 2009-08-25 12:05:47 +00:00
parent 18ac347ebb
commit 995c77809b
2 changed files with 23 additions and 19 deletions

View File

@ -1,15 +1,15 @@
--- a/drivers/net/arm/ixp4xx_eth.c --- a/drivers/net/arm/ixp4xx_eth.c
+++ b/drivers/net/arm/ixp4xx_eth.c +++ b/drivers/net/arm/ixp4xx_eth.c
@@ -54,7 +54,7 @@ @@ -53,7 +53,7 @@
#define POOL_ALLOC_SIZE (sizeof(struct desc) * (RX_DESCS + TX_DESCS)) #define POOL_ALLOC_SIZE (sizeof(struct desc) * (RX_DESCS + TX_DESCS))
#define REGS_SIZE 0x1000 #define REGS_SIZE 0x1000
-#define MAX_MRU 1536 /* 0x600 */ -#define MAX_MRU 1536 /* 0x600 */
+#define MAX_MRU 16384 +#define MAX_MRU (16320 - ETH_HLEN - ETH_FCS_LEN)
#define RX_BUFF_SIZE ALIGN((NET_IP_ALIGN) + MAX_MRU, 4) #define RX_BUFF_SIZE ALIGN((NET_IP_ALIGN) + MAX_MRU, 4)
#define NAPI_WEIGHT 16 #define NAPI_WEIGHT 16
@@ -1011,6 +1011,30 @@ static void destroy_queues(struct port * @@ -927,6 +927,32 @@
} }
} }
@ -17,6 +17,8 @@
+{ +{
+ struct port *port; + struct port *port;
+ struct msg msg; + struct msg msg;
+ /* adjust for ethernet headers */
+ int framesize = mtu + ETH_HLEN + ETH_FCS_LEN;
+ +
+ port = netdev_priv(dev); + port = netdev_priv(dev);
+ +
@ -25,11 +27,11 @@
+ msg.eth_id = port->id; + msg.eth_id = port->id;
+ +
+ /* max rx/tx 64 byte blocks */ + /* max rx/tx 64 byte blocks */
+ msg.byte2 = ((mtu + 63) / 64) << 8; + msg.byte2 = ((framesize + 63) / 64) << 8;
+ msg.byte3 = ((mtu + 63) / 64) << 8; + msg.byte3 = ((framesize + 63) / 64) << 8;
+ +
+ msg.byte4 = msg.byte6 = mtu >> 8; + msg.byte4 = msg.byte6 = framesize >> 8;
+ msg.byte5 = msg.byte7 = mtu & 0xff; + msg.byte5 = msg.byte7 = framesize & 0xff;
+ +
+ if (npe_send_recv_message(port->npe, &msg, "ETH_SET_MAX_FRAME_LENGTH")) + if (npe_send_recv_message(port->npe, &msg, "ETH_SET_MAX_FRAME_LENGTH"))
+ return -EIO; + return -EIO;
@ -40,7 +42,7 @@
static int eth_open(struct net_device *dev) static int eth_open(struct net_device *dev)
{ {
struct port *port = netdev_priv(dev); struct port *port = netdev_priv(dev);
@@ -1061,6 +1085,8 @@ static int eth_open(struct net_device *d @@ -976,6 +1002,8 @@
if (npe_send_recv_message(port->npe, &msg, "ETH_SET_FIREWALL_MODE")) if (npe_send_recv_message(port->npe, &msg, "ETH_SET_FIREWALL_MODE"))
return -EIO; return -EIO;
@ -49,8 +51,8 @@
if ((err = request_queues(port)) != 0) if ((err = request_queues(port)) != 0)
return err; return err;
@@ -1238,6 +1264,24 @@ static void eth_init_mii(struct net_devi @@ -1119,6 +1147,24 @@
return 0;
} }
+static int eth_change_mtu(struct net_device *dev, int mtu) +static int eth_change_mtu(struct net_device *dev, int mtu)
@ -74,7 +76,7 @@
static int __devinit eth_init_one(struct platform_device *pdev) static int __devinit eth_init_one(struct platform_device *pdev)
{ {
struct port *port; struct port *port;
@@ -1272,6 +1316,7 @@ static int __devinit eth_init_one(struct @@ -1153,6 +1199,7 @@
goto err_free; goto err_free;
} }

View File

@ -5,11 +5,11 @@
#define POOL_ALLOC_SIZE (sizeof(struct desc) * (RX_DESCS + TX_DESCS)) #define POOL_ALLOC_SIZE (sizeof(struct desc) * (RX_DESCS + TX_DESCS))
#define REGS_SIZE 0x1000 #define REGS_SIZE 0x1000
-#define MAX_MRU 1536 /* 0x600 */ -#define MAX_MRU 1536 /* 0x600 */
+#define MAX_MRU 16384 +#define MAX_MRU (16320 - ETH_HLEN - ETH_FCS_LEN)
#define RX_BUFF_SIZE ALIGN((NET_IP_ALIGN) + MAX_MRU, 4) #define RX_BUFF_SIZE ALIGN((NET_IP_ALIGN) + MAX_MRU, 4)
#define NAPI_WEIGHT 16 #define NAPI_WEIGHT 16
@@ -1066,6 +1066,30 @@ static void destroy_queues(struct port * @@ -943,6 +943,32 @@
} }
} }
@ -17,6 +17,8 @@
+{ +{
+ struct port *port; + struct port *port;
+ struct msg msg; + struct msg msg;
+ /* adjust for ethernet headers */
+ int framesize = mtu + ETH_HLEN + ETH_FCS_LEN;
+ +
+ port = netdev_priv(dev); + port = netdev_priv(dev);
+ +
@ -25,11 +27,11 @@
+ msg.eth_id = port->id; + msg.eth_id = port->id;
+ +
+ /* max rx/tx 64 byte blocks */ + /* max rx/tx 64 byte blocks */
+ msg.byte2 = ((mtu + 63) / 64) << 8; + msg.byte2 = ((framesize + 63) / 64) << 8;
+ msg.byte3 = ((mtu + 63) / 64) << 8; + msg.byte3 = ((framesize + 63) / 64) << 8;
+ +
+ msg.byte4 = msg.byte6 = mtu >> 8; + msg.byte4 = msg.byte6 = framesize >> 8;
+ msg.byte5 = msg.byte7 = mtu & 0xff; + msg.byte5 = msg.byte7 = framesize & 0xff;
+ +
+ if (npe_send_recv_message(port->npe, &msg, "ETH_SET_MAX_FRAME_LENGTH")) + if (npe_send_recv_message(port->npe, &msg, "ETH_SET_MAX_FRAME_LENGTH"))
+ return -EIO; + return -EIO;
@ -40,7 +42,7 @@
static int eth_open(struct net_device *dev) static int eth_open(struct net_device *dev)
{ {
struct port *port = netdev_priv(dev); struct port *port = netdev_priv(dev);
@@ -1117,6 +1141,8 @@ static int eth_open(struct net_device *d @@ -994,6 +1020,8 @@
if (npe_send_recv_message(port->npe, &msg, "ETH_SET_FIREWALL_MODE")) if (npe_send_recv_message(port->npe, &msg, "ETH_SET_FIREWALL_MODE"))
return -EIO; return -EIO;
@ -49,7 +51,7 @@
if ((err = request_queues(port)) != 0) if ((err = request_queues(port)) != 0)
return err; return err;
@@ -1256,7 +1282,26 @@ static int eth_close(struct net_device * @@ -1134,7 +1162,26 @@
return 0; return 0;
} }