Skip to content

Commit db791eb

Browse files
Jon Masondavem330
authored andcommitted
net: ethernet: bgmac: convert to feature flags
The bgmac driver is using the bcma provides device ID and revision, as well as the SoC ID and package, to determine which features are necessary to enable, reset, etc in the driver. In anticipation of removing the bcma requirement for this driver, these must be changed to not reference that struct. In place of that, each "feature" has been given a flag, and the flags are enabled for their respective device and SoC. Signed-off-by: Jon Mason <jon.mason@broadcom.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Tested-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 55954f3 commit db791eb

File tree

2 files changed

+140
-48
lines changed

2 files changed

+140
-48
lines changed

drivers/net/ethernet/broadcom/bgmac.c

Lines changed: 120 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ static void bgmac_dma_tx_enable(struct bgmac *bgmac,
109109
u32 ctl;
110110

111111
ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL);
112-
if (bgmac->core->id.rev >= 4) {
112+
if (bgmac->feature_flags & BGMAC_FEAT_TX_MASK_SETUP) {
113113
ctl &= ~BGMAC_DMA_TX_BL_MASK;
114114
ctl |= BGMAC_DMA_TX_BL_128 << BGMAC_DMA_TX_BL_SHIFT;
115115

@@ -331,7 +331,7 @@ static void bgmac_dma_rx_enable(struct bgmac *bgmac,
331331
u32 ctl;
332332

333333
ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL);
334-
if (bgmac->core->id.rev >= 4) {
334+
if (bgmac->feature_flags & BGMAC_FEAT_RX_MASK_SETUP) {
335335
ctl &= ~BGMAC_DMA_RX_BL_MASK;
336336
ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT;
337337

@@ -769,14 +769,20 @@ static void bgmac_cmdcfg_maskset(struct bgmac *bgmac, u32 mask, u32 set,
769769
{
770770
u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
771771
u32 new_val = (cmdcfg & mask) | set;
772+
u32 cmdcfg_sr;
772773

773-
bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR(bgmac->core->id.rev));
774+
if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
775+
cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
776+
else
777+
cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
778+
779+
bgmac_set(bgmac, BGMAC_CMDCFG, cmdcfg_sr);
774780
udelay(2);
775781

776782
if (new_val != cmdcfg || force)
777783
bgmac_write(bgmac, BGMAC_CMDCFG, new_val);
778784

779-
bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR(bgmac->core->id.rev));
785+
bgmac_mask(bgmac, BGMAC_CMDCFG, ~cmdcfg_sr);
780786
udelay(2);
781787
}
782788

@@ -805,7 +811,7 @@ static void bgmac_chip_stats_update(struct bgmac *bgmac)
805811
{
806812
int i;
807813

808-
if (bgmac->core->id.id != BCMA_CORE_4706_MAC_GBIT) {
814+
if (!(bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB)) {
809815
for (i = 0; i < BGMAC_NUM_MIB_TX_REGS; i++)
810816
bgmac->mib_tx_regs[i] =
811817
bgmac_read(bgmac,
@@ -824,7 +830,7 @@ static void bgmac_clear_mib(struct bgmac *bgmac)
824830
{
825831
int i;
826832

827-
if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT)
833+
if (bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB)
828834
return;
829835

830836
bgmac_set(bgmac, BGMAC_DEV_CTL, BGMAC_DC_MROR);
@@ -867,16 +873,17 @@ static void bgmac_mac_speed(struct bgmac *bgmac)
867873
static void bgmac_miiconfig(struct bgmac *bgmac)
868874
{
869875
struct bcma_device *core = bgmac->core;
870-
u8 imode;
871876

872-
if (bgmac_is_bcm4707_family(bgmac)) {
877+
if (bgmac->feature_flags & BGMAC_FEAT_FORCE_SPEED_2500) {
873878
bcma_awrite32(core, BCMA_IOCTL,
874879
bcma_aread32(core, BCMA_IOCTL) | 0x40 |
875880
BGMAC_BCMA_IOCTL_SW_CLKEN);
876881
bgmac->mac_speed = SPEED_2500;
877882
bgmac->mac_duplex = DUPLEX_FULL;
878883
bgmac_mac_speed(bgmac);
879884
} else {
885+
u8 imode;
886+
880887
imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
881888
BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
882889
if (imode == 0 || imode == 1) {
@@ -891,9 +898,7 @@ static void bgmac_miiconfig(struct bgmac *bgmac)
891898
static void bgmac_chip_reset(struct bgmac *bgmac)
892899
{
893900
struct bcma_device *core = bgmac->core;
894-
struct bcma_bus *bus = core->bus;
895-
struct bcma_chipinfo *ci = &bus->chipinfo;
896-
u32 flags;
901+
u32 cmdcfg_sr;
897902
u32 iost;
898903
int i;
899904

@@ -916,15 +921,12 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
916921
}
917922

918923
iost = bcma_aread32(core, BCMA_IOST);
919-
if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
920-
(ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
921-
(ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
924+
if (bgmac->feature_flags & BGMAC_FEAT_IOST_ATTACHED)
922925
iost &= ~BGMAC_BCMA_IOST_ATTACHED;
923926

924927
/* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
925-
if (ci->id != BCMA_CHIP_ID_BCM4707 &&
926-
ci->id != BCMA_CHIP_ID_BCM47094) {
927-
flags = 0;
928+
if (!(bgmac->feature_flags & BGMAC_FEAT_NO_RESET)) {
929+
u32 flags = 0;
928930
if (iost & BGMAC_BCMA_IOST_ATTACHED) {
929931
flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
930932
if (!bgmac->has_robosw)
@@ -934,7 +936,7 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
934936
}
935937

936938
/* Request Misc PLL for corerev > 2 */
937-
if (core->id.rev > 2 && !bgmac_is_bcm4707_family(bgmac)) {
939+
if (bgmac->feature_flags & BGMAC_FEAT_MISC_PLL_REQ) {
938940
bgmac_set(bgmac, BCMA_CLKCTLST,
939941
BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
940942
bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
@@ -943,9 +945,7 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
943945
1000);
944946
}
945947

946-
if (ci->id == BCMA_CHIP_ID_BCM5357 ||
947-
ci->id == BCMA_CHIP_ID_BCM4749 ||
948-
ci->id == BCMA_CHIP_ID_BCM53572) {
948+
if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_PHY) {
949949
struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
950950
u8 et_swtype = 0;
951951
u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
@@ -959,11 +959,9 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
959959
et_swtype &= 0x0f;
960960
et_swtype <<= 4;
961961
sw_type = et_swtype;
962-
} else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358) {
962+
} else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_EPHYRMII) {
963963
sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
964-
} else if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
965-
(ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
966-
(ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) {
964+
} else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_RGMII) {
967965
sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
968966
BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
969967
}
@@ -983,6 +981,11 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
983981
* BGMAC_CMDCFG is read _after_ putting chip in a reset. So it has to
984982
* be keps until taking MAC out of the reset.
985983
*/
984+
if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
985+
cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
986+
else
987+
cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
988+
986989
bgmac_cmdcfg_maskset(bgmac,
987990
~(BGMAC_CMDCFG_TE |
988991
BGMAC_CMDCFG_RE |
@@ -1000,13 +1003,13 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
10001003
BGMAC_CMDCFG_PROM |
10011004
BGMAC_CMDCFG_NLC |
10021005
BGMAC_CMDCFG_CFE |
1003-
BGMAC_CMDCFG_SR(core->id.rev),
1006+
cmdcfg_sr,
10041007
false);
10051008
bgmac->mac_speed = SPEED_UNKNOWN;
10061009
bgmac->mac_duplex = DUPLEX_UNKNOWN;
10071010

10081011
bgmac_clear_mib(bgmac);
1009-
if (core->id.id == BCMA_CORE_4706_MAC_GBIT)
1012+
if (bgmac->feature_flags & BGMAC_FEAT_CMN_PHY_CTL)
10101013
bcma_maskset32(bgmac->cmn, BCMA_GMAC_CMN_PHY_CTL, ~0,
10111014
BCMA_GMAC_CMN_PC_MTE);
10121015
else
@@ -1032,46 +1035,48 @@ static void bgmac_chip_intrs_off(struct bgmac *bgmac)
10321035
/* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_enable */
10331036
static void bgmac_enable(struct bgmac *bgmac)
10341037
{
1035-
struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
1038+
u32 cmdcfg_sr;
10361039
u32 cmdcfg;
10371040
u32 mode;
1038-
u32 rxq_ctl;
1039-
u32 fl_ctl;
1040-
u16 bp_clk;
1041-
u8 mdp;
1041+
1042+
if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
1043+
cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
1044+
else
1045+
cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
10421046

10431047
cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
10441048
bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE),
1045-
BGMAC_CMDCFG_SR(bgmac->core->id.rev), true);
1049+
cmdcfg_sr, true);
10461050
udelay(2);
10471051
cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE;
10481052
bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg);
10491053

10501054
mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
10511055
BGMAC_DS_MM_SHIFT;
1052-
if (ci->id != BCMA_CHIP_ID_BCM47162 || mode != 0)
1056+
if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0)
10531057
bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
1054-
if (ci->id == BCMA_CHIP_ID_BCM47162 && mode == 2)
1058+
if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2)
10551059
bcma_chipco_chipctl_maskset(&bgmac->core->bus->drv_cc, 1, ~0,
10561060
BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
10571061

1058-
switch (ci->id) {
1059-
case BCMA_CHIP_ID_BCM5357:
1060-
case BCMA_CHIP_ID_BCM4749:
1061-
case BCMA_CHIP_ID_BCM53572:
1062-
case BCMA_CHIP_ID_BCM4716:
1063-
case BCMA_CHIP_ID_BCM47162:
1064-
fl_ctl = 0x03cb04cb;
1065-
if (ci->id == BCMA_CHIP_ID_BCM5357 ||
1066-
ci->id == BCMA_CHIP_ID_BCM4749 ||
1067-
ci->id == BCMA_CHIP_ID_BCM53572)
1062+
if (bgmac->feature_flags & (BGMAC_FEAT_FLW_CTRL1 |
1063+
BGMAC_FEAT_FLW_CTRL2)) {
1064+
u32 fl_ctl;
1065+
1066+
if (bgmac->feature_flags & BGMAC_FEAT_FLW_CTRL1)
10681067
fl_ctl = 0x2300e1;
1068+
else
1069+
fl_ctl = 0x03cb04cb;
1070+
10691071
bgmac_write(bgmac, BGMAC_FLOW_CTL_THRESH, fl_ctl);
10701072
bgmac_write(bgmac, BGMAC_PAUSE_CTL, 0x27fff);
1071-
break;
10721073
}
10731074

1074-
if (!bgmac_is_bcm4707_family(bgmac)) {
1075+
if (bgmac->feature_flags & BGMAC_FEAT_SET_RXQ_CLK) {
1076+
u32 rxq_ctl;
1077+
u16 bp_clk;
1078+
u8 mdp;
1079+
10751080
rxq_ctl = bgmac_read(bgmac, BGMAC_RXQ_CTL);
10761081
rxq_ctl &= ~BGMAC_RXQ_CTL_MDP_MASK;
10771082
bp_clk = bcma_pmu_get_bus_clock(&bgmac->core->bus->drv_cc) /
@@ -1587,6 +1592,74 @@ static int bgmac_probe(struct bcma_device *core)
15871592
if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
15881593
dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
15891594

1595+
/* Feature Flags */
1596+
switch (core->bus->chipinfo.id) {
1597+
case BCMA_CHIP_ID_BCM5357:
1598+
bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
1599+
bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
1600+
bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
1601+
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
1602+
if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47186) {
1603+
bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
1604+
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
1605+
}
1606+
if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM5358)
1607+
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
1608+
break;
1609+
case BCMA_CHIP_ID_BCM53572:
1610+
bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
1611+
bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
1612+
bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
1613+
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
1614+
if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47188) {
1615+
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
1616+
bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
1617+
}
1618+
break;
1619+
case BCMA_CHIP_ID_BCM4749:
1620+
bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
1621+
bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
1622+
bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
1623+
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
1624+
if (core->bus->chipinfo.pkg == 10) {
1625+
bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
1626+
bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
1627+
}
1628+
break;
1629+
case BCMA_CHIP_ID_BCM4716:
1630+
bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
1631+
/* fallthrough */
1632+
case BCMA_CHIP_ID_BCM47162:
1633+
bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL2;
1634+
bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
1635+
break;
1636+
/* bcm4707_family */
1637+
case BCMA_CHIP_ID_BCM4707:
1638+
case BCMA_CHIP_ID_BCM47094:
1639+
case BCMA_CHIP_ID_BCM53018:
1640+
bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
1641+
bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
1642+
bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
1643+
break;
1644+
default:
1645+
bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
1646+
bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
1647+
}
1648+
1649+
if (!bgmac_is_bcm4707_family(bgmac) && core->id.rev > 2)
1650+
bgmac->feature_flags |= BGMAC_FEAT_MISC_PLL_REQ;
1651+
1652+
if (core->id.id == BCMA_CORE_4706_MAC_GBIT) {
1653+
bgmac->feature_flags |= BGMAC_FEAT_CMN_PHY_CTL;
1654+
bgmac->feature_flags |= BGMAC_FEAT_NO_CLR_MIB;
1655+
}
1656+
1657+
if (core->id.rev >= 4) {
1658+
bgmac->feature_flags |= BGMAC_FEAT_CMDCFG_SR_REV4;
1659+
bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
1660+
bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
1661+
}
1662+
15901663
netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
15911664

15921665
if (!bgmac_is_bcm4707_family(bgmac)) {

drivers/net/ethernet/broadcom/bgmac.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,6 @@
190190
#define BGMAC_CMDCFG_HD_SHIFT 10
191191
#define BGMAC_CMDCFG_SR_REV0 0x00000800 /* Set to reset mode, for core rev 0-3 */
192192
#define BGMAC_CMDCFG_SR_REV4 0x00002000 /* Set to reset mode, for core rev >= 4 */
193-
#define BGMAC_CMDCFG_SR(rev) ((rev >= 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
194193
#define BGMAC_CMDCFG_ML 0x00008000 /* Set to activate mac loopback mode */
195194
#define BGMAC_CMDCFG_AE 0x00400000
196195
#define BGMAC_CMDCFG_CFE 0x00800000
@@ -376,6 +375,24 @@
376375

377376
#define ETHER_MAX_LEN 1518
378377

378+
/* Feature Flags */
379+
#define BGMAC_FEAT_TX_MASK_SETUP BIT(0)
380+
#define BGMAC_FEAT_RX_MASK_SETUP BIT(1)
381+
#define BGMAC_FEAT_IOST_ATTACHED BIT(2)
382+
#define BGMAC_FEAT_NO_RESET BIT(3)
383+
#define BGMAC_FEAT_MISC_PLL_REQ BIT(4)
384+
#define BGMAC_FEAT_SW_TYPE_PHY BIT(5)
385+
#define BGMAC_FEAT_SW_TYPE_EPHYRMII BIT(6)
386+
#define BGMAC_FEAT_SW_TYPE_RGMII BIT(7)
387+
#define BGMAC_FEAT_CMN_PHY_CTL BIT(8)
388+
#define BGMAC_FEAT_FLW_CTRL1 BIT(9)
389+
#define BGMAC_FEAT_FLW_CTRL2 BIT(10)
390+
#define BGMAC_FEAT_SET_RXQ_CLK BIT(11)
391+
#define BGMAC_FEAT_CLKCTLST BIT(12)
392+
#define BGMAC_FEAT_NO_CLR_MIB BIT(13)
393+
#define BGMAC_FEAT_FORCE_SPEED_2500 BIT(14)
394+
#define BGMAC_FEAT_CMDCFG_SR_REV4 BIT(15)
395+
379396
struct bgmac_slot_info {
380397
union {
381398
struct sk_buff *skb;
@@ -430,6 +447,8 @@ struct bgmac {
430447

431448
struct device *dev;
432449
struct device *dma_dev;
450+
u32 feature_flags;
451+
433452
struct net_device *net_dev;
434453
struct napi_struct napi;
435454
struct mii_bus *mii_bus;

0 commit comments

Comments
 (0)