improve routing/nat performance for devices using the marvell 88e6060 switch
authorFelix Fietkau <nbd@openwrt.org>
Tue, 28 Oct 2008 17:54:22 +0000 (17:54 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Tue, 28 Oct 2008 17:54:22 +0000 (17:54 +0000)
SVN-Revision: 13060

target/linux/atheros/patches-2.6.26/200-ar2313_enable_mvswitch.patch
target/linux/atheros/patches-2.6.27/200-ar2313_enable_mvswitch.patch
target/linux/generic-2.6/files/drivers/net/phy/mvswitch.c
target/linux/generic-2.6/patches-2.6.26/630-phy_packets.patch
target/linux/generic-2.6/patches-2.6.27/630-phy_packets.patch

index 752b07f89ceb3347b3a8e7fd6c7c82cba9c194aa..4711ef6f5a35c57fee0d99f59c3112e6170da9e9 100644 (file)
@@ -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;
 +                              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;
index 3868939cd64ad106d854de545b9e9fe751f68201..4711ef6f5a35c57fee0d99f59c3112e6170da9e9 100644 (file)
@@ -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;
 +                              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);
        }
  
index 78e5afe9bd4ac3a0f90da2c7b6a935e113b01d40..f5a292a80d5611aa2929b269e568cbc950f936bf 100644 (file)
@@ -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;
index f1c1580e0df92022cf64a0333521e2dce088f580..a561bb29c1bdd54cc29e7ef60fd7f35a91e4e33b 100644 (file)
@@ -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)
  
index 4fe135791303710eca4831ecc023c230b723da46..a561bb29c1bdd54cc29e7ef60fd7f35a91e4e33b 100644 (file)
@@ -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);
 +       */
 +      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 */