2013-07-28 22:13:52 +00:00
|
|
|
bgmac: add supprot for BCM4707
|
2013-07-28 21:20:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
|
|
|
---
|
|
|
|
drivers/net/ethernet/broadcom/bgmac.c | 56 +++++++++++++++++++++++----------
|
|
|
|
drivers/net/ethernet/broadcom/bgmac.h | 2 ++
|
|
|
|
2 files changed, 42 insertions(+), 16 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/net/ethernet/broadcom/bgmac.c
|
|
|
|
+++ b/drivers/net/ethernet/broadcom/bgmac.c
|
2013-10-02 22:24:01 +00:00
|
|
|
@@ -868,6 +868,8 @@ static void bgmac_speed(struct bgmac *bg
|
2013-07-28 21:20:15 +00:00
|
|
|
set |= BGMAC_CMDCFG_ES_100;
|
|
|
|
if (speed & BGMAC_SPEED_1000)
|
|
|
|
set |= BGMAC_CMDCFG_ES_1000;
|
|
|
|
+ if (speed & BGMAC_SPEED_2500)
|
|
|
|
+ set |= BGMAC_CMDCFG_ES_2500;
|
|
|
|
if (!bgmac->full_duplex)
|
|
|
|
set |= BGMAC_CMDCFG_HD;
|
|
|
|
bgmac_cmdcfg_maskset(bgmac, mask, set, true);
|
2013-10-02 22:24:01 +00:00
|
|
|
@@ -875,13 +877,28 @@ static void bgmac_speed(struct bgmac *bg
|
2013-07-28 21:20:15 +00:00
|
|
|
|
|
|
|
static void bgmac_miiconfig(struct bgmac *bgmac)
|
|
|
|
{
|
|
|
|
- u8 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
|
|
|
|
- BGMAC_DS_MM_SHIFT;
|
|
|
|
- if (imode == 0 || imode == 1) {
|
|
|
|
- if (bgmac->autoneg)
|
|
|
|
- bgmac_speed(bgmac, BGMAC_SPEED_100);
|
|
|
|
- else
|
|
|
|
+ struct bcma_device *core = bgmac->core;
|
|
|
|
+ struct bcma_chipinfo *ci = &core->bus->chipinfo;
|
|
|
|
+
|
|
|
|
+ if (ci->id != BCMA_CHIP_ID_BCM4707 &&
|
|
|
|
+ ci->id != BCMA_CHIP_ID_BCM53018) {
|
|
|
|
+ if (bgmac->autoneg) {
|
|
|
|
+ bcma_awrite32(core, BCMA_IOCTL,
|
|
|
|
+ bcma_aread32(core, BCMA_IOCTL) | 0x44);
|
|
|
|
+
|
|
|
|
+ bgmac_speed(bgmac, BGMAC_SPEED_2500);
|
|
|
|
+ } else {
|
|
|
|
bgmac_speed(bgmac, bgmac->speed);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ u8 imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
|
|
|
|
+ BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
|
|
|
|
+ if (imode == 0 || imode == 1) {
|
|
|
|
+ if (bgmac->autoneg)
|
|
|
|
+ bgmac_speed(bgmac, BGMAC_SPEED_100);
|
|
|
|
+ else
|
|
|
|
+ bgmac_speed(bgmac, bgmac->speed);
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-10-02 22:24:01 +00:00
|
|
|
@@ -927,7 +944,8 @@ static void bgmac_chip_reset(struct bgma
|
2013-07-28 21:20:15 +00:00
|
|
|
|
|
|
|
bcma_core_enable(core, flags);
|
|
|
|
|
|
|
|
- if (core->id.rev > 2) {
|
|
|
|
+ if (core->id.rev > 2 && ci->id != BCMA_CHIP_ID_BCM4707 &&
|
|
|
|
+ ci->id != BCMA_CHIP_ID_BCM53018) {
|
|
|
|
bgmac_set(bgmac, BCMA_CLKCTLST, 1 << 8);
|
|
|
|
bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 1 << 24, 1 << 24,
|
|
|
|
1000);
|
2013-10-02 22:24:01 +00:00
|
|
|
@@ -948,10 +966,13 @@ static void bgmac_chip_reset(struct bgma
|
2013-07-28 21:20:15 +00:00
|
|
|
et_swtype &= 0x0f;
|
|
|
|
et_swtype <<= 4;
|
|
|
|
sw_type = et_swtype;
|
|
|
|
- } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == 9) {
|
|
|
|
+ } else if (ci->id == BCMA_CHIP_ID_BCM5357 &&
|
|
|
|
+ ci->pkg == BCMA_PKG_ID_BCM5358) {
|
|
|
|
sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
|
|
|
|
- } else if ((ci->id != BCMA_CHIP_ID_BCM53572 && ci->pkg == 10) ||
|
|
|
|
- (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == 9)) {
|
|
|
|
+ } else if ((ci->id != BCMA_CHIP_ID_BCM53572 &&
|
|
|
|
+ ci->pkg == BCMA_PKG_ID_BCM47186) ||
|
|
|
|
+ (ci->id == BCMA_CHIP_ID_BCM53572 &&
|
|
|
|
+ ci->pkg == BCMA_PKG_ID_BCM47188)) {
|
|
|
|
sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
|
|
|
|
BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
|
|
|
|
}
|
2013-10-02 22:24:01 +00:00
|
|
|
@@ -1058,12 +1079,15 @@ static void bgmac_enable(struct bgmac *b
|
2013-07-28 21:20:15 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
- rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
|
|
|
|
- rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
|
|
|
|
- bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / 1000000;
|
|
|
|
- mdp = (bp_clk * 128 / 1000) - 3;
|
|
|
|
- rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
|
|
|
|
- bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
|
|
|
|
+ if (ci->id != BCMA_CHIP_ID_BCM4707 &&
|
|
|
|
+ ci->id != BCMA_CHIP_ID_BCM53018) {
|
|
|
|
+ rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
|
|
|
|
+ rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
|
|
|
|
+ bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) / 1000000;
|
|
|
|
+ mdp = (bp_clk * 128 / 1000) - 3;
|
|
|
|
+ rxq_ctl |= (mdp << BGMAC_RXQ_CTL_MDP_SHIFT);
|
|
|
|
+ bgmac_write(bgmac, BGMAC_RXQ_CTL, rxq_ctl);
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
|
|
|
|
/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/chipinit */
|
|
|
|
--- a/drivers/net/ethernet/broadcom/bgmac.h
|
|
|
|
+++ b/drivers/net/ethernet/broadcom/bgmac.h
|
|
|
|
@@ -185,6 +185,7 @@
|
|
|
|
#define BGMAC_CMDCFG_ES_10 0x00000000
|
|
|
|
#define BGMAC_CMDCFG_ES_100 0x00000004
|
|
|
|
#define BGMAC_CMDCFG_ES_1000 0x00000008
|
|
|
|
+#define BGMAC_CMDCFG_ES_2500 0x0000000C
|
|
|
|
#define BGMAC_CMDCFG_PROM 0x00000010 /* Set to activate promiscuous mode */
|
|
|
|
#define BGMAC_CMDCFG_PAD_EN 0x00000020
|
|
|
|
#define BGMAC_CMDCFG_CF 0x00000040
|
|
|
|
@@ -345,6 +346,7 @@
|
|
|
|
#define BGMAC_SPEED_10 0x0001
|
|
|
|
#define BGMAC_SPEED_100 0x0002
|
|
|
|
#define BGMAC_SPEED_1000 0x0004
|
|
|
|
+#define BGMAC_SPEED_2500 0x0008
|
|
|
|
|
|
|
|
#define BGMAC_WEIGHT 64
|
|
|
|
|