Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f03b865491c2f30f2a4d77cdafc69c978ceb38a0
Commit:     f03b865491c2f30f2a4d77cdafc69c978ceb38a0
Parent:     5ac5d616327bdbdf632bdf4dc9ae09477f79b6b3
Author:     Stephen Hemminger <[EMAIL PROTECTED]>
AuthorDate: Wed Nov 28 14:27:03 2007 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Jan 28 15:04:18 2008 -0800

    sky2: align IP header on Rx if possible
    
    The sky2 driver was not aligning the IP header on receive buffers.
    This workaround is only needed on hardware with broken FIFO, newer chips
    without FIFO can just DMA to unaligned address.
    
    Signed-off-by: Stephen Hemminger <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
---
 drivers/net/sky2.c |   33 ++++++++++++++++++++-------------
 1 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
index bc15940..30e567a 100644
--- a/drivers/net/sky2.c
+++ b/drivers/net/sky2.c
@@ -64,7 +64,6 @@
 #define RX_LE_BYTES            (RX_LE_SIZE*sizeof(struct sky2_rx_le))
 #define RX_MAX_PENDING         (RX_LE_SIZE/6 - 2)
 #define RX_DEF_PENDING         RX_MAX_PENDING
-#define RX_SKB_ALIGN           8
 
 #define TX_RING_SIZE           512
 #define TX_DEF_PENDING         (TX_RING_SIZE - 1)
@@ -1174,24 +1173,32 @@ static void sky2_vlan_rx_register(struct net_device 
*dev, struct vlan_group *grp
 /*
  * Allocate an skb for receiving. If the MTU is large enough
  * make the skb non-linear with a fragment list of pages.
- *
- * It appears the hardware has a bug in the FIFO logic that
- * cause it to hang if the FIFO gets overrun and the receive buffer
- * is not 64 byte aligned. The buffer returned from netdev_alloc_skb is
- * aligned except if slab debugging is enabled.
  */
 static struct sk_buff *sky2_rx_alloc(struct sky2_port *sky2)
 {
        struct sk_buff *skb;
-       unsigned long p;
        int i;
 
-       skb = netdev_alloc_skb(sky2->netdev, sky2->rx_data_size + RX_SKB_ALIGN);
-       if (!skb)
-               goto nomem;
-
-       p = (unsigned long) skb->data;
-       skb_reserve(skb, ALIGN(p, RX_SKB_ALIGN) - p);
+       if (sky2->hw->flags & SKY2_HW_FIFO_HANG_CHECK) {
+               unsigned char *start;
+               /*
+                * Workaround for a bug in FIFO that cause hang
+                * if the FIFO if the receive buffer is not 64 byte aligned.
+                * The buffer returned from netdev_alloc_skb is
+                * aligned except if slab debugging is enabled.
+                */
+               skb = netdev_alloc_skb(sky2->netdev, sky2->rx_data_size + 8);
+               if (!skb)
+                       goto nomem;
+               start = PTR_ALIGN(skb->data, 8);
+               skb_reserve(skb, start - skb->data);
+       } else {
+               skb = netdev_alloc_skb(sky2->netdev,
+                                      sky2->rx_data_size + NET_IP_ALIGN);
+               if (!skb)
+                       goto nomem;
+               skb_reserve(skb, NET_IP_ALIGN);
+       }
 
        for (i = 0; i < sky2->rx_nfrags; i++) {
                struct page *page = alloc_page(GFP_ATOMIC);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to