tg3: Set initial carrier state to off.
[pandora-kernel.git] / drivers / net / ethernet / broadcom / tg3.c
index b1b3bc0..3829321 100644 (file)
@@ -332,6 +332,7 @@ static DEFINE_PCI_DEVICE_TABLE(tg3_pci_tbl) = {
        {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5719)},
        {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5720)},
        {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57762)},
+       {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_57766)},
        {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5762)},
        {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5725)},
        {PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, TG3PCI_DEVICE_TIGON3_5727)},
@@ -9179,7 +9180,14 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
                }
 
                if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_57765_AX) {
-                       u32 grc_mode = tr32(GRC_MODE);
+                       u32 grc_mode;
+
+                       /* Fix transmit hangs */
+                       val = tr32(TG3_CPMU_PADRNG_CTL);
+                       val |= TG3_CPMU_PADRNG_CTL_RDIV2;
+                       tw32(TG3_CPMU_PADRNG_CTL, val);
+
+                       grc_mode = tr32(GRC_MODE);
 
                        /* Access the lower 1K of DL PCIE block registers. */
                        val = grc_mode & ~GRC_MODE_PCIE_PORT_MASK;
@@ -9492,6 +9500,14 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
        if (tg3_flag(tp, PCI_EXPRESS))
                rdmac_mode |= RDMAC_MODE_FIFO_LONG_BURST;
 
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57766) {
+               tp->dma_limit = 0;
+               if (tp->dev->mtu <= ETH_DATA_LEN) {
+                       rdmac_mode |= RDMAC_MODE_JMB_2K_MMRR;
+                       tp->dma_limit = TG3_TX_BD_DMA_MAX_2K;
+               }
+       }
+
        if (tg3_flag(tp, HW_TSO_1) ||
            tg3_flag(tp, HW_TSO_2) ||
            tg3_flag(tp, HW_TSO_3))
@@ -13867,7 +13883,8 @@ static void tg3_get_5720_nvram_info(struct tg3 *tp)
                        tp->nvram_size = TG3_NVRAM_SIZE_1MB;
                        break;
                default:
-                       tp->nvram_size = TG3_NVRAM_SIZE_128KB;
+                       if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5762)
+                               tp->nvram_size = TG3_NVRAM_SIZE_128KB;
                        break;
                }
                break;
@@ -13913,7 +13930,8 @@ static void tg3_get_5720_nvram_info(struct tg3 *tp)
                        tp->nvram_size = TG3_NVRAM_SIZE_1MB;
                        break;
                default:
-                       tp->nvram_size = TG3_NVRAM_SIZE_128KB;
+                       if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5762)
+                               tp->nvram_size = TG3_NVRAM_SIZE_128KB;
                        break;
                }
                break;
@@ -14498,7 +14516,7 @@ static int tg3_phy_probe(struct tg3 *tp)
            (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5719 ||
             GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5720 ||
             GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5762 ||
-            (tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 &&
+            (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5717 &&
              tp->pci_chip_rev_id != CHIPREV_ID_5717_A0) ||
             (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57765 &&
              tp->pci_chip_rev_id != CHIPREV_ID_57765_A0)))
@@ -16884,6 +16902,8 @@ static int tg3_init_one(struct pci_dev *pdev,
 
        tg3_timer_init(tp);
 
+       tg3_carrier_off(tp);
+
        err = register_netdev(dev);
        if (err) {
                dev_err(&pdev->dev, "Cannot register net device, aborting\n");