123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 |
- From db791eb2970bad193b1dc95a4461b222dd22cb64 Mon Sep 17 00:00:00 2001
- From: Jon Mason <jon.mason@broadcom.com>
- Date: Thu, 7 Jul 2016 19:08:56 -0400
- Subject: [PATCH 4/5] 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>
- ---
- drivers/net/ethernet/broadcom/bgmac.c | 167 ++++++++++++++++++++++++----------
- drivers/net/ethernet/broadcom/bgmac.h | 21 ++++-
- 2 files changed, 140 insertions(+), 48 deletions(-)
- --- a/drivers/net/ethernet/broadcom/bgmac.c
- +++ b/drivers/net/ethernet/broadcom/bgmac.c
- @@ -109,7 +109,7 @@ static void bgmac_dma_tx_enable(struct b
- u32 ctl;
-
- ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_CTL);
- - if (bgmac->core->id.rev >= 4) {
- + if (bgmac->feature_flags & BGMAC_FEAT_TX_MASK_SETUP) {
- ctl &= ~BGMAC_DMA_TX_BL_MASK;
- ctl |= BGMAC_DMA_TX_BL_128 << BGMAC_DMA_TX_BL_SHIFT;
-
- @@ -335,7 +335,7 @@ static void bgmac_dma_rx_enable(struct b
- /* preserve ONLY bits 16-17 from current hardware value */
- ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
-
- - if (bgmac->core->id.rev >= 4) {
- + if (bgmac->feature_flags & BGMAC_FEAT_RX_MASK_SETUP) {
- ctl &= ~BGMAC_DMA_RX_BL_MASK;
- ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT;
-
- @@ -773,14 +773,20 @@ static void bgmac_cmdcfg_maskset(struct
- {
- u32 cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
- u32 new_val = (cmdcfg & mask) | set;
- + u32 cmdcfg_sr;
-
- - bgmac_set(bgmac, BGMAC_CMDCFG, BGMAC_CMDCFG_SR(bgmac->core->id.rev));
- + if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
- + cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
- + else
- + cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
- +
- + bgmac_set(bgmac, BGMAC_CMDCFG, cmdcfg_sr);
- udelay(2);
-
- if (new_val != cmdcfg || force)
- bgmac_write(bgmac, BGMAC_CMDCFG, new_val);
-
- - bgmac_mask(bgmac, BGMAC_CMDCFG, ~BGMAC_CMDCFG_SR(bgmac->core->id.rev));
- + bgmac_mask(bgmac, BGMAC_CMDCFG, ~cmdcfg_sr);
- udelay(2);
- }
-
- @@ -809,7 +815,7 @@ static void bgmac_chip_stats_update(stru
- {
- int i;
-
- - if (bgmac->core->id.id != BCMA_CORE_4706_MAC_GBIT) {
- + if (!(bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB)) {
- for (i = 0; i < BGMAC_NUM_MIB_TX_REGS; i++)
- bgmac->mib_tx_regs[i] =
- bgmac_read(bgmac,
- @@ -828,7 +834,7 @@ static void bgmac_clear_mib(struct bgmac
- {
- int i;
-
- - if (bgmac->core->id.id == BCMA_CORE_4706_MAC_GBIT)
- + if (bgmac->feature_flags & BGMAC_FEAT_NO_CLR_MIB)
- return;
-
- bgmac_set(bgmac, BGMAC_DEV_CTL, BGMAC_DC_MROR);
- @@ -871,9 +877,8 @@ static void bgmac_mac_speed(struct bgmac
- static void bgmac_miiconfig(struct bgmac *bgmac)
- {
- struct bcma_device *core = bgmac->core;
- - u8 imode;
-
- - if (bgmac_is_bcm4707_family(bgmac)) {
- + if (bgmac->feature_flags & BGMAC_FEAT_FORCE_SPEED_2500) {
- bcma_awrite32(core, BCMA_IOCTL,
- bcma_aread32(core, BCMA_IOCTL) | 0x40 |
- BGMAC_BCMA_IOCTL_SW_CLKEN);
- @@ -881,6 +886,8 @@ static void bgmac_miiconfig(struct bgmac
- bgmac->mac_duplex = DUPLEX_FULL;
- bgmac_mac_speed(bgmac);
- } else {
- + u8 imode;
- +
- imode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) &
- BGMAC_DS_MM_MASK) >> BGMAC_DS_MM_SHIFT;
- if (imode == 0 || imode == 1) {
- @@ -895,9 +902,7 @@ static void bgmac_miiconfig(struct bgmac
- static void bgmac_chip_reset(struct bgmac *bgmac)
- {
- struct bcma_device *core = bgmac->core;
- - struct bcma_bus *bus = core->bus;
- - struct bcma_chipinfo *ci = &bus->chipinfo;
- - u32 flags;
- + u32 cmdcfg_sr;
- u32 iost;
- int i;
-
- @@ -920,15 +925,12 @@ static void bgmac_chip_reset(struct bgma
- }
-
- iost = bcma_aread32(core, BCMA_IOST);
- - if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
- - (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
- - (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188))
- + if (bgmac->feature_flags & BGMAC_FEAT_IOST_ATTACHED)
- iost &= ~BGMAC_BCMA_IOST_ATTACHED;
-
- /* 3GMAC: for BCM4707 & BCM47094, only do core reset at bgmac_probe() */
- - if (ci->id != BCMA_CHIP_ID_BCM4707 &&
- - ci->id != BCMA_CHIP_ID_BCM47094) {
- - flags = 0;
- + if (!(bgmac->feature_flags & BGMAC_FEAT_NO_RESET)) {
- + u32 flags = 0;
- if (iost & BGMAC_BCMA_IOST_ATTACHED) {
- flags = BGMAC_BCMA_IOCTL_SW_CLKEN;
- if (!bgmac->has_robosw)
- @@ -938,7 +940,7 @@ static void bgmac_chip_reset(struct bgma
- }
-
- /* Request Misc PLL for corerev > 2 */
- - if (core->id.rev > 2 && !bgmac_is_bcm4707_family(bgmac)) {
- + if (bgmac->feature_flags & BGMAC_FEAT_MISC_PLL_REQ) {
- bgmac_set(bgmac, BCMA_CLKCTLST,
- BGMAC_BCMA_CLKCTLST_MISC_PLL_REQ);
- bgmac_wait_value(bgmac->core, BCMA_CLKCTLST,
- @@ -947,9 +949,7 @@ static void bgmac_chip_reset(struct bgma
- 1000);
- }
-
- - if (ci->id == BCMA_CHIP_ID_BCM5357 ||
- - ci->id == BCMA_CHIP_ID_BCM4749 ||
- - ci->id == BCMA_CHIP_ID_BCM53572) {
- + if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_PHY) {
- struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc;
- u8 et_swtype = 0;
- u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY |
- @@ -963,11 +963,9 @@ static void bgmac_chip_reset(struct bgma
- et_swtype &= 0x0f;
- et_swtype <<= 4;
- sw_type = et_swtype;
- - } else if (ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM5358) {
- + } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_EPHYRMII) {
- sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
- - } else if ((ci->id == BCMA_CHIP_ID_BCM5357 && ci->pkg == BCMA_PKG_ID_BCM47186) ||
- - (ci->id == BCMA_CHIP_ID_BCM4749 && ci->pkg == 10) ||
- - (ci->id == BCMA_CHIP_ID_BCM53572 && ci->pkg == BCMA_PKG_ID_BCM47188)) {
- + } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_RGMII) {
- sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
- BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
- }
- @@ -987,6 +985,11 @@ static void bgmac_chip_reset(struct bgma
- * BGMAC_CMDCFG is read _after_ putting chip in a reset. So it has to
- * be keps until taking MAC out of the reset.
- */
- + if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
- + cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
- + else
- + cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
- +
- bgmac_cmdcfg_maskset(bgmac,
- ~(BGMAC_CMDCFG_TE |
- BGMAC_CMDCFG_RE |
- @@ -1004,13 +1007,13 @@ static void bgmac_chip_reset(struct bgma
- BGMAC_CMDCFG_PROM |
- BGMAC_CMDCFG_NLC |
- BGMAC_CMDCFG_CFE |
- - BGMAC_CMDCFG_SR(core->id.rev),
- + cmdcfg_sr,
- false);
- bgmac->mac_speed = SPEED_UNKNOWN;
- bgmac->mac_duplex = DUPLEX_UNKNOWN;
-
- bgmac_clear_mib(bgmac);
- - if (core->id.id == BCMA_CORE_4706_MAC_GBIT)
- + if (bgmac->feature_flags & BGMAC_FEAT_CMN_PHY_CTL)
- bcma_maskset32(bgmac->cmn, BCMA_GMAC_CMN_PHY_CTL, ~0,
- BCMA_GMAC_CMN_PC_MTE);
- else
- @@ -1036,46 +1039,48 @@ static void bgmac_chip_intrs_off(struct
- /* http://bcm-v4.sipsolutions.net/mac-gbit/gmac/gmac_enable */
- static void bgmac_enable(struct bgmac *bgmac)
- {
- - struct bcma_chipinfo *ci = &bgmac->core->bus->chipinfo;
- + u32 cmdcfg_sr;
- u32 cmdcfg;
- u32 mode;
- - u32 rxq_ctl;
- - u32 fl_ctl;
- - u16 bp_clk;
- - u8 mdp;
- +
- + if (bgmac->feature_flags & BGMAC_FEAT_CMDCFG_SR_REV4)
- + cmdcfg_sr = BGMAC_CMDCFG_SR_REV4;
- + else
- + cmdcfg_sr = BGMAC_CMDCFG_SR_REV0;
-
- cmdcfg = bgmac_read(bgmac, BGMAC_CMDCFG);
- bgmac_cmdcfg_maskset(bgmac, ~(BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE),
- - BGMAC_CMDCFG_SR(bgmac->core->id.rev), true);
- + cmdcfg_sr, true);
- udelay(2);
- cmdcfg |= BGMAC_CMDCFG_TE | BGMAC_CMDCFG_RE;
- bgmac_write(bgmac, BGMAC_CMDCFG, cmdcfg);
-
- mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
- BGMAC_DS_MM_SHIFT;
- - if (ci->id != BCMA_CHIP_ID_BCM47162 || mode != 0)
- + if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0)
- bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
- - if (ci->id == BCMA_CHIP_ID_BCM47162 && mode == 2)
- + if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2)
- bcma_chipco_chipctl_maskset(&bgmac->core->bus->drv_cc, 1, ~0,
- BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
-
- - switch (ci->id) {
- - case BCMA_CHIP_ID_BCM5357:
- - case BCMA_CHIP_ID_BCM4749:
- - case BCMA_CHIP_ID_BCM53572:
- - case BCMA_CHIP_ID_BCM4716:
- - case BCMA_CHIP_ID_BCM47162:
- - fl_ctl = 0x03cb04cb;
- - if (ci->id == BCMA_CHIP_ID_BCM5357 ||
- - ci->id == BCMA_CHIP_ID_BCM4749 ||
- - ci->id == BCMA_CHIP_ID_BCM53572)
- + if (bgmac->feature_flags & (BGMAC_FEAT_FLW_CTRL1 |
- + BGMAC_FEAT_FLW_CTRL2)) {
- + u32 fl_ctl;
- +
- + if (bgmac->feature_flags & BGMAC_FEAT_FLW_CTRL1)
- fl_ctl = 0x2300e1;
- + else
- + fl_ctl = 0x03cb04cb;
- +
- bgmac_write(bgmac, BGMAC_FLOW_CTL_THRESH, fl_ctl);
- bgmac_write(bgmac, BGMAC_PAUSE_CTL, 0x27fff);
- - break;
- }
-
- - if (!bgmac_is_bcm4707_family(bgmac)) {
- + if (bgmac->feature_flags & BGMAC_FEAT_SET_RXQ_CLK) {
- + u32 rxq_ctl;
- + u16 bp_clk;
- + u8 mdp;
- +
- 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) /
- @@ -1607,6 +1612,74 @@ static int bgmac_probe(struct bcma_devic
- if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM)
- dev_warn(bgmac->dev, "Support for ADMtek ethernet switch not implemented\n");
-
- + /* Feature Flags */
- + switch (core->bus->chipinfo.id) {
- + case BCMA_CHIP_ID_BCM5357:
- + bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
- + bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
- + bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
- + bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
- + if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47186) {
- + bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
- + bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
- + }
- + if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM5358)
- + bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_EPHYRMII;
- + break;
- + case BCMA_CHIP_ID_BCM53572:
- + bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
- + bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
- + bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
- + bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
- + if (core->bus->chipinfo.pkg == BCMA_PKG_ID_BCM47188) {
- + bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
- + bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
- + }
- + break;
- + case BCMA_CHIP_ID_BCM4749:
- + bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
- + bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
- + bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL1;
- + bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_PHY;
- + if (core->bus->chipinfo.pkg == 10) {
- + bgmac->feature_flags |= BGMAC_FEAT_SW_TYPE_RGMII;
- + bgmac->feature_flags |= BGMAC_FEAT_IOST_ATTACHED;
- + }
- + break;
- + case BCMA_CHIP_ID_BCM4716:
- + bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
- + /* fallthrough */
- + case BCMA_CHIP_ID_BCM47162:
- + bgmac->feature_flags |= BGMAC_FEAT_FLW_CTRL2;
- + bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
- + break;
- + /* bcm4707_family */
- + case BCMA_CHIP_ID_BCM4707:
- + case BCMA_CHIP_ID_BCM47094:
- + case BCMA_CHIP_ID_BCM53018:
- + bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
- + bgmac->feature_flags |= BGMAC_FEAT_NO_RESET;
- + bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500;
- + break;
- + default:
- + bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
- + bgmac->feature_flags |= BGMAC_FEAT_SET_RXQ_CLK;
- + }
- +
- + if (!bgmac_is_bcm4707_family(bgmac) && core->id.rev > 2)
- + bgmac->feature_flags |= BGMAC_FEAT_MISC_PLL_REQ;
- +
- + if (core->id.id == BCMA_CORE_4706_MAC_GBIT) {
- + bgmac->feature_flags |= BGMAC_FEAT_CMN_PHY_CTL;
- + bgmac->feature_flags |= BGMAC_FEAT_NO_CLR_MIB;
- + }
- +
- + if (core->id.rev >= 4) {
- + bgmac->feature_flags |= BGMAC_FEAT_CMDCFG_SR_REV4;
- + bgmac->feature_flags |= BGMAC_FEAT_TX_MASK_SETUP;
- + bgmac->feature_flags |= BGMAC_FEAT_RX_MASK_SETUP;
- + }
- +
- netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT);
-
- if (!bgmac_is_bcm4707_family(bgmac)) {
- --- a/drivers/net/ethernet/broadcom/bgmac.h
- +++ b/drivers/net/ethernet/broadcom/bgmac.h
- @@ -190,7 +190,6 @@
- #define BGMAC_CMDCFG_HD_SHIFT 10
- #define BGMAC_CMDCFG_SR_REV0 0x00000800 /* Set to reset mode, for core rev 0-3 */
- #define BGMAC_CMDCFG_SR_REV4 0x00002000 /* Set to reset mode, for core rev >= 4 */
- -#define BGMAC_CMDCFG_SR(rev) ((rev >= 4) ? BGMAC_CMDCFG_SR_REV4 : BGMAC_CMDCFG_SR_REV0)
- #define BGMAC_CMDCFG_ML 0x00008000 /* Set to activate mac loopback mode */
- #define BGMAC_CMDCFG_AE 0x00400000
- #define BGMAC_CMDCFG_CFE 0x00800000
- @@ -376,6 +375,24 @@
-
- #define ETHER_MAX_LEN 1518
-
- +/* Feature Flags */
- +#define BGMAC_FEAT_TX_MASK_SETUP BIT(0)
- +#define BGMAC_FEAT_RX_MASK_SETUP BIT(1)
- +#define BGMAC_FEAT_IOST_ATTACHED BIT(2)
- +#define BGMAC_FEAT_NO_RESET BIT(3)
- +#define BGMAC_FEAT_MISC_PLL_REQ BIT(4)
- +#define BGMAC_FEAT_SW_TYPE_PHY BIT(5)
- +#define BGMAC_FEAT_SW_TYPE_EPHYRMII BIT(6)
- +#define BGMAC_FEAT_SW_TYPE_RGMII BIT(7)
- +#define BGMAC_FEAT_CMN_PHY_CTL BIT(8)
- +#define BGMAC_FEAT_FLW_CTRL1 BIT(9)
- +#define BGMAC_FEAT_FLW_CTRL2 BIT(10)
- +#define BGMAC_FEAT_SET_RXQ_CLK BIT(11)
- +#define BGMAC_FEAT_CLKCTLST BIT(12)
- +#define BGMAC_FEAT_NO_CLR_MIB BIT(13)
- +#define BGMAC_FEAT_FORCE_SPEED_2500 BIT(14)
- +#define BGMAC_FEAT_CMDCFG_SR_REV4 BIT(15)
- +
- struct bgmac_slot_info {
- union {
- struct sk_buff *skb;
- @@ -430,6 +447,8 @@ struct bgmac {
-
- struct device *dev;
- struct device *dma_dev;
- + u32 feature_flags;
- +
- struct net_device *net_dev;
- struct napi_struct napi;
- struct mii_bus *mii_bus;
|