Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.6.25.2 /drivers/net/tg3.c

Filename:/drivers/net/tg3.c
Lines Added:48
Lines Deleted:4
Also changed in: (Previous) 2.6.25-git20  2.6.25-git19  2.6.25.1  2.6.25-git18  2.6.25-git17  2.6.25-git16 
(Following) 2.6.25.3  2.6.25.4  2.6.25.5  2.6.25.6  2.6.25.7  2.6.25.8 

Location
[  2.6.25.2
  [  drivers
    [  net
       o  tg3.c

Patch

diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 96043c5..bc4c62b 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -64,8 +64,8 @@
 
 #define DRV_MODULE_NAME      "tg3"
 #define PFX DRV_MODULE_NAME   ": "
-#define DRV_MODULE_VERSION   "3.90"
-#define DRV_MODULE_RELDATE   "April 12, 2008"
+#define DRV_MODULE_VERSION   "3.91"
+#define DRV_MODULE_RELDATE   "April 18, 2008"
 
 #define TG3_DEF_MAC_MODE   0
 #define TG3_DEF_RX_MODE      0
@@ -4135,11 +4135,21 @@ static int tigon3_dma_hwbug_workaround(struct tg3 *tp, struct sk_buff *skb,
                    u32 last_plus_one, u32 *start,
                    u32 base_flags, u32 mss)
 {
-   struct sk_buff *new_skb = skb_copy(skb, GFP_ATOMIC);
+   struct sk_buff *new_skb;
    dma_addr_t new_addr = 0;
    u32 entry = *start;
    int i, ret = 0;
 
+   if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5701)
+      new_skb = skb_copy(skb, GFP_ATOMIC);
+   else {
+      int more_headroom = 4 - ((unsigned long)skb->data & 3);
+
+      new_skb = skb_copy_expand(skb,
+                 skb_headroom(skb) + more_headroom,
+                 skb_tailroom(skb), GFP_ATOMIC);
+   }
+
    if (!new_skb) {
       ret = -1;
    } else {
@@ -4462,7 +4472,9 @@ static int tg3_start_xmit_dma_bug(struct sk_buff *skb, struct net_device *dev)
 
    would_hit_hwbug = 0;
 
-   if (tg3_4g_overflow_test(mapping, len))
+   if (tp->tg3_flags3 & TG3_FLG3_5701_DMA_BUG)
+      would_hit_hwbug = 1;
+   else if (tg3_4g_overflow_test(mapping, len))
       would_hit_hwbug = 1;
 
    tg3_set_txd(tp, entry, mapping, len, base_flags,
@@ -11339,6 +11351,38 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
       }
    }
 
+   if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5701)) {
+      static struct tg3_dev_id {
+         u32   vendor;
+         u32   device;
+      } bridge_chipsets[] = {
+         { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0 },
+         { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1 },
+         { },
+      };
+      struct tg3_dev_id *pci_id = &bridge_chipsets[0];
+      struct pci_dev *bridge = NULL;
+
+      while (pci_id->vendor != 0) {
+         bridge = pci_get_device(pci_id->vendor,
+                  pci_id->device,
+                  bridge);
+         if (!bridge) {
+            pci_id++;
+            continue;
+         }
+         if (bridge->subordinate &&
+             (bridge->subordinate->number <=
+              tp->pdev->bus->number) &&
+             (bridge->subordinate->subordinate >=
+              tp->pdev->bus->number)) {
+            tp->tg3_flags3 |= TG3_FLG3_5701_DMA_BUG;
+            pci_dev_put(bridge);
+            break;
+         }
+      }
+   }
+
    /* The EPB bridge inside 5714, 5715, and 5780 cannot support
     * DMA addresses > 40-bit. This bridge may have other additional
     * 57xx devices behind it in some 4-port NIC designs for example.


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.