improve routing/nat performance for devices using the marvell 88e6060 switch
[openwrt.git] / target / linux / atheros / patches-2.6.27 / 200-ar2313_enable_mvswitch.patch
index 3868939..4711ef6 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);
        }