These are some hackish patches to make the Ethernet driver work somehow on this arm core. The flash driver is not working, so we removed the nvram reading, this should be changed after we have a flash driver. The mdelay(1) is a ugly workaround for this arm chip, this seams to be a dma problem. The PHY says it is not connected by default, just ignore it. --- a/drivers/net/ethernet/broadcom/Kconfig +++ b/drivers/net/ethernet/broadcom/Kconfig @@ -132,7 +132,7 @@ config BNX2X_SRIOV config BGMAC tristate "BCMA bus GBit core support" - depends on BCMA_HOST_SOC && HAS_DMA && BCM47XX + depends on BCMA_HOST_SOC && HAS_DMA select PHYLIB ---help--- This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus. --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c @@ -17,7 +17,11 @@ #include #include #include +#ifdef CONFIG_BCM47XX #include +#else +#define bcm47xx_nvram_getenv(a, b, c) -1 +#endif static const struct bcma_device_id bgmac_bcma_tbl[] = { BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_4706_MAC_GBIT, BCMA_ANY_REV, BCMA_ANY_CLASS), @@ -165,6 +169,10 @@ static netdev_tx_t bgmac_dma_tx_add(stru netdev_sent_queue(net_dev, skb->len); + if (bgmac->core->bus->chipinfo.id == BCMA_CHIP_ID_BCM4707 || + bgmac->core->bus->chipinfo.id == BCMA_CHIP_ID_BCM53018) + mdelay(1); + wmb(); /* Increase ring->end to point empty slot. We tell hardware the first @@ -1438,7 +1446,7 @@ static int bgmac_probe(struct bcma_devic int err; /* We don't support 2nd, 3rd, ... units, SPROM has to be adjusted */ - if (core->core_unit > 1) { + if (core->core_unit > 0) { pr_err("Unsupported core_unit %d\n", core->core_unit); return -ENOTSUPP; } @@ -1534,8 +1542,7 @@ static int bgmac_probe(struct bcma_devic /* TODO: reset the external phy. Specs are needed */ bgmac_phy_reset(bgmac); - bgmac->has_robosw = !!(core->bus->sprom.boardflags_lo & - BGMAC_BFL_ENETROBO); + bgmac->has_robosw = 1; if (bgmac->has_robosw) bgmac_warn(bgmac, "Support for Roboswitch not implemented\n"); --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -814,7 +814,7 @@ int genphy_update_link(struct phy_device return status; if ((status & BMSR_LSTATUS) == 0) - phydev->link = 0; + phydev->link = 1; else phydev->link = 1;