bgmac: reset all cores on Northstar SoC
authorHauke Mehrtens <hauke@hauke-m.de>
Sun, 5 Jan 2014 00:10:46 +0000 (01:10 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 5 Jan 2014 01:25:19 +0000 (20:25 -0500)
On the Northstar SoC (BCM4707 and BCM53018) we have to enable all GMAC
cores when we just want to use on. We iterate over all the cores and
activate them.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Acked-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bgmac.c

index 88ec69e86d2f37faedd10c3f6739194f51fb03ce..2cdacb852e81a98713fed0ab2d57f5d466268cce 100644 (file)
@@ -1446,6 +1446,27 @@ static int bgmac_probe(struct bcma_device *core)
 
        bgmac_chip_reset(bgmac);
 
+       /* For Northstar, we have to take all GMAC core out of reset */
+       if (core->id.id == BCMA_CHIP_ID_BCM4707 ||
+           core->id.id == BCMA_CHIP_ID_BCM53018) {
+               struct bcma_device *ns_core;
+               int ns_gmac;
+
+               /* Northstar has 4 GMAC cores */
+               for (ns_gmac = 0; ns_gmac < 4; ns_gmac++) {
+                       /* As northstar requirement, we have to reset all GAMCs
+                        * before accessing one. bgmac_chip_reset() call
+                        * bcma_core_enable() for this core. Then the other
+                        * three GAMCs didn't reset.  We do it here.
+                        */
+                       ns_core = bcma_find_core_unit(core->bus,
+                                                     BCMA_CORE_MAC_GBIT,
+                                                     ns_gmac);
+                       if (ns_core && !bcma_core_is_enabled(ns_core))
+                               bcma_core_enable(ns_core, 0);
+               }
+       }
+
        err = bgmac_dma_alloc(bgmac);
        if (err) {
                bgmac_err(bgmac, "Unable to alloc memory for DMA\n");