Просмотр исходного кода

improve routing/nat performance for devices using the marvell 88e6060 switch

SVN-Revision: 13060
Felix Fietkau 17 лет назад
Родитель
Сommit
d1b986bd54

+ 39 - 3
target/linux/atheros/patches-2.6.26/200-ar2313_enable_mvswitch.patch

@@ -1,6 +1,33 @@
 --- a/drivers/net/ar2313/ar2313.c
 +++ b/drivers/net/ar2313/ar2313.c
-@@ -953,9 +953,9 @@
+@@ -834,6 +834,7 @@ static void ar2313_load_rx_ring(struct n
+ 	for (i = 0; i < nr_bufs; i++) {
+ 		struct sk_buff *skb;
+ 		ar2313_descr_t *rd;
++		int offset = RX_OFFSET;
+ 
+ 		if (sp->rx_skb[idx]) {
+ #if DEBUG_RX
+@@ -855,7 +856,9 @@ static void ar2313_load_rx_ring(struct n
+ 		 * Make sure IP header starts on a fresh cache line.
+ 		 */
+ 		skb->dev = dev;
+-		skb_reserve(skb, RX_OFFSET);
++		if (sp->phy_dev)
++			offset += sp->phy_dev->pkt_align;
++		skb_reserve(skb, offset);
+ 		sp->rx_skb[idx] = skb;
+ 
+ 		rd = (ar2313_descr_t *) & sp->rx_ring[idx];
+@@ -946,6 +949,7 @@ static int ar2313_rx_int(struct net_devi
+ 			/* alloc new buffer. */
+ 			skb_new = dev_alloc_skb(AR2313_BUFSIZE + RX_OFFSET + 128);
+ 			if (skb_new != NULL) {
++				int offset;
+ 
+ 				skb = sp->rx_skb[idx];
+ 				/* set skb */
+@@ -953,13 +957,17 @@ static int ar2313_rx_int(struct net_devi
  						((status >> DMA_RX_LEN_SHIFT) & 0x3fff) - CRC_LEN);
  
  				dev->stats.rx_bytes += skb->len;
@@ -11,8 +38,17 @@
 +				sp->rx(skb);
  
  				skb_new->dev = dev;
++
  				/* 16 bit align */
-@@ -1370,6 +1370,8 @@
+-				skb_reserve(skb_new, RX_OFFSET + 32);
++				offset = RX_OFFSET + 32;
++				if (sp->phy_dev)
++					offset += sp->phy_dev->pkt_align;
++				skb_reserve(skb_new, offset);
+ 				/* reset descriptor's curr_addr */
+ 				rxdesc->addr = virt_to_phys(skb_new->data);
+ 
+@@ -1370,6 +1378,8 @@ static int mdiobus_probe (struct net_dev
  		return PTR_ERR(phydev);
  	}
  
@@ -23,7 +59,7 @@
  		| SUPPORTED_10baseT_Full
 --- a/drivers/net/ar2313/ar2313.h
 +++ b/drivers/net/ar2313/ar2313.h
-@@ -107,6 +107,8 @@
+@@ -107,6 +107,8 @@ typedef struct {
   */
  struct ar2313_private {
  	struct net_device *dev;

+ 38 - 2
target/linux/atheros/patches-2.6.27/200-ar2313_enable_mvswitch.patch

@@ -1,6 +1,33 @@
 --- a/drivers/net/ar2313/ar2313.c
 +++ b/drivers/net/ar2313/ar2313.c
-@@ -953,9 +953,9 @@ static int ar2313_rx_int(struct net_devi
+@@ -834,6 +834,7 @@ static void ar2313_load_rx_ring(struct n
+ 	for (i = 0; i < nr_bufs; i++) {
+ 		struct sk_buff *skb;
+ 		ar2313_descr_t *rd;
++		int offset = RX_OFFSET;
+ 
+ 		if (sp->rx_skb[idx]) {
+ #if DEBUG_RX
+@@ -855,7 +856,9 @@ static void ar2313_load_rx_ring(struct n
+ 		 * Make sure IP header starts on a fresh cache line.
+ 		 */
+ 		skb->dev = dev;
+-		skb_reserve(skb, RX_OFFSET);
++		if (sp->phy_dev)
++			offset += sp->phy_dev->pkt_align;
++		skb_reserve(skb, offset);
+ 		sp->rx_skb[idx] = skb;
+ 
+ 		rd = (ar2313_descr_t *) & sp->rx_ring[idx];
+@@ -946,6 +949,7 @@ static int ar2313_rx_int(struct net_devi
+ 			/* alloc new buffer. */
+ 			skb_new = dev_alloc_skb(AR2313_BUFSIZE + RX_OFFSET + 128);
+ 			if (skb_new != NULL) {
++				int offset;
+ 
+ 				skb = sp->rx_skb[idx];
+ 				/* set skb */
+@@ -953,13 +957,17 @@ static int ar2313_rx_int(struct net_devi
  						((status >> DMA_RX_LEN_SHIFT) & 0x3fff) - CRC_LEN);
  
  				dev->stats.rx_bytes += skb->len;
@@ -11,8 +38,17 @@
 +				sp->rx(skb);
  
  				skb_new->dev = dev;
++
  				/* 16 bit align */
-@@ -1370,6 +1370,8 @@ static int mdiobus_probe (struct net_dev
+-				skb_reserve(skb_new, RX_OFFSET + 32);
++				offset = RX_OFFSET + 32;
++				if (sp->phy_dev)
++					offset += sp->phy_dev->pkt_align;
++				skb_reserve(skb_new, offset);
+ 				/* reset descriptor's curr_addr */
+ 				rxdesc->addr = virt_to_phys(skb_new->data);
+ 
+@@ -1370,6 +1378,8 @@ static int mdiobus_probe (struct net_dev
  		return PTR_ERR(phydev);
  	}
  

+ 1 - 0
target/linux/generic-2.6/files/drivers/net/phy/mvswitch.c

@@ -338,6 +338,7 @@ mvswitch_config_init(struct phy_device *pdev)
 	);
 
 	/* hook into the tx function */
+	pdev->pkt_align = 2;
 	priv->hardstart = dev->hard_start_xmit;
 	pdev->netif_receive_skb = mvswitch_netif_receive_skb;
 	pdev->netif_rx = mvswitch_netif_rx;

+ 4 - 1
target/linux/generic-2.6/patches-2.6.26/630-phy_packets.patch

@@ -30,7 +30,7 @@
  
 --- a/include/linux/phy.h
 +++ b/include/linux/phy.h
-@@ -309,6 +309,17 @@
+@@ -309,6 +309,20 @@
  	void (*adjust_link)(struct net_device *dev);
  
  	void (*adjust_state)(struct net_device *dev);
@@ -45,6 +45,9 @@
 +	 */
 +	int (*netif_receive_skb)(struct sk_buff *skb);
 +	int (*netif_rx)(struct sk_buff *skb);
++
++	/* alignment offset for packets */
++	int pkt_align;
  };
  #define to_phy_device(d) container_of(d, struct phy_device, dev)
  

+ 7 - 4
target/linux/generic-2.6/patches-2.6.27/630-phy_packets.patch

@@ -1,6 +1,6 @@
 --- a/drivers/net/phy/phy_device.c
 +++ b/drivers/net/phy/phy_device.c
-@@ -143,6 +143,18 @@ int phy_scan_fixups(struct phy_device *p
+@@ -143,6 +143,18 @@
  }
  EXPORT_SYMBOL(phy_scan_fixups);
  
@@ -19,7 +19,7 @@
  struct phy_device* phy_device_create(struct mii_bus *bus, int addr, int phy_id)
  {
  	struct phy_device *dev;
-@@ -168,6 +180,8 @@ struct phy_device* phy_device_create(str
+@@ -168,6 +180,8 @@
  	dev->bus = bus;
  
  	dev->state = PHY_DOWN;
@@ -30,7 +30,7 @@
  
 --- a/include/linux/phy.h
 +++ b/include/linux/phy.h
-@@ -309,6 +309,17 @@ struct phy_device {
+@@ -309,6 +309,20 @@
  	void (*adjust_link)(struct net_device *dev);
  
  	void (*adjust_state)(struct net_device *dev);
@@ -45,12 +45,15 @@
 +	 */
 +	int (*netif_receive_skb)(struct sk_buff *skb);
 +	int (*netif_rx)(struct sk_buff *skb);
++
++	/* alignment offset for packets */
++	int pkt_align;
  };
  #define to_phy_device(d) container_of(d, struct phy_device, dev)
  
 --- a/include/linux/netdevice.h
 +++ b/include/linux/netdevice.h
-@@ -613,6 +613,7 @@ struct net_device
+@@ -613,6 +613,7 @@
  	void			*ax25_ptr;	/* AX.25 specific data */
  	struct wireless_dev	*ieee80211_ptr;	/* IEEE 802.11 specific data,
  						   assign before registering */