]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
tg3: Detect APE enabled devs earlier
authorMatt Carlson <mcarlson@broadcom.com>
Wed, 13 Jul 2011 09:27:27 +0000 (09:27 +0000)
committerJoe Jin <joe.jin@oracle.com>
Tue, 15 May 2012 08:21:18 +0000 (16:21 +0800)
The following patch will require the driver to communicate with the APE
much sooner than before.  This patch make sure the APE registers are
memory mapped and that the ENABLE_APE bit is set before the first use.

Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit c9cab24e954867a03ab833ea3b4c0e6e607eb0d6)

Signed-off-by: Joe Jin <joe.jin@oracle.com>
drivers/net/tg3.c

index 47ffe8b9ce9d16297bae59a85c8adc245b622d77..6a9ecf8799be14256fce8873afd4879a0093637a 100644 (file)
@@ -13365,10 +13365,15 @@ static void __devinit tg3_read_fw_ver(struct tg3 *tp)
        else
                return;
 
-       if (!tg3_flag(tp, ENABLE_ASF) || tg3_flag(tp, ENABLE_APE) || vpd_vers)
+       if (vpd_vers)
                goto done;
 
-       tg3_read_mgmtfw_ver(tp);
+       if (tg3_flag(tp, ENABLE_APE)) {
+               if (tg3_flag(tp, ENABLE_ASF))
+                       tg3_read_dash_ver(tp);
+       } else if (tg3_flag(tp, ENABLE_ASF)) {
+               tg3_read_mgmtfw_ver(tp);
+       }
 
 done:
        tp->fw_ver[TG3_VER_SIZE - 1] = 0;
@@ -13890,6 +13895,8 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
                                 PCISTATE_ALLOW_APE_PSPACE_WR;
                pci_write_config_dword(tp->pdev, TG3PCI_PCISTATE,
                                       pci_state_reg);
+
+               tg3_ape_lock_init(tp);
        }
 
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5784 ||
@@ -15002,6 +15009,24 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
                goto err_out_free_dev;
        }
 
+       if (tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761 ||
+           tp->pdev->device == PCI_DEVICE_ID_TIGON3_5761E ||
+           tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761S ||
+           tp->pdev->device == TG3PCI_DEVICE_TIGON3_5761SE ||
+           tp->pdev->device == TG3PCI_DEVICE_TIGON3_5717 ||
+           tp->pdev->device == TG3PCI_DEVICE_TIGON3_5718 ||
+           tp->pdev->device == TG3PCI_DEVICE_TIGON3_5719 ||
+           tp->pdev->device == TG3PCI_DEVICE_TIGON3_5720) {
+               tg3_flag_set(tp, ENABLE_APE);
+               tp->aperegs = pci_ioremap_bar(pdev, BAR_2);
+               if (!tp->aperegs) {
+                       dev_err(&pdev->dev,
+                               "Cannot map APE registers, aborting\n");
+                       err = -ENOMEM;
+                       goto err_out_iounmap;
+               }
+       }
+
        tp->rx_pending = TG3_DEF_RX_RING_PENDING;
        tp->rx_jumbo_pending = TG3_DEF_RX_JUMBO_RING_PENDING;
 
@@ -15014,7 +15039,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
        if (err) {
                dev_err(&pdev->dev,
                        "Problem fetching invariants of chip, aborting\n");
-               goto err_out_iounmap;
+               goto err_out_apeunmap;
        }
 
        /* The EPB bridge inside 5714, 5715, and 5780 and any
@@ -15043,7 +15068,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
                        if (err < 0) {
                                dev_err(&pdev->dev, "Unable to obtain 64 bit "
                                        "DMA for consistent allocations\n");
-                               goto err_out_iounmap;
+                               goto err_out_apeunmap;
                        }
                }
        }
@@ -15052,7 +15077,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
                if (err) {
                        dev_err(&pdev->dev,
                                "No usable DMA configuration, aborting\n");
-                       goto err_out_iounmap;
+                       goto err_out_apeunmap;
                }
        }
 
@@ -15117,22 +15142,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
        if (err) {
                dev_err(&pdev->dev,
                        "Could not obtain valid ethernet address, aborting\n");
-               goto err_out_iounmap;
-       }
-
-       if (tg3_flag(tp, ENABLE_APE)) {
-               tp->aperegs = pci_ioremap_bar(pdev, BAR_2);
-               if (!tp->aperegs) {
-                       dev_err(&pdev->dev,
-                               "Cannot map APE registers, aborting\n");
-                       err = -ENOMEM;
-                       goto err_out_iounmap;
-               }
-
-               tg3_ape_lock_init(tp);
-
-               if (tg3_flag(tp, ENABLE_ASF))
-                       tg3_read_dash_ver(tp);
+               goto err_out_apeunmap;
        }
 
        /*