net: bgmac: Fix errant feature flag check
[cascardo/linux.git] / drivers / net / ethernet / broadcom / bgmac.c
index c4751ec..856379c 100644 (file)
@@ -932,7 +932,8 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
                        et_swtype <<= 4;
                        sw_type = et_swtype;
                } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_EPHYRMII) {
-                       sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
+                       sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RMII |
+                                 BGMAC_CHIPCTL_1_SW_TYPE_EPHYRMII;
                } else if (bgmac->feature_flags & BGMAC_FEAT_SW_TYPE_RGMII) {
                        sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII |
                                  BGMAC_CHIPCTL_1_SW_TYPE_RGMII;
@@ -940,6 +941,27 @@ static void bgmac_chip_reset(struct bgmac *bgmac)
                bgmac_cco_ctl_maskset(bgmac, 1, ~(BGMAC_CHIPCTL_1_IF_TYPE_MASK |
                                                  BGMAC_CHIPCTL_1_SW_TYPE_MASK),
                                      sw_type);
+       } else if (bgmac->feature_flags & BGMAC_FEAT_CC4_IF_SW_TYPE) {
+               u32 sw_type = BGMAC_CHIPCTL_4_IF_TYPE_MII |
+                             BGMAC_CHIPCTL_4_SW_TYPE_EPHY;
+               u8 et_swtype = 0;
+               char buf[4];
+
+               if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) {
+                       if (kstrtou8(buf, 0, &et_swtype))
+                               dev_err(bgmac->dev, "Failed to parse et_swtype (%s)\n",
+                                       buf);
+                       sw_type = (et_swtype & 0x0f) << 12;
+               } else if (bgmac->feature_flags & BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII) {
+                       sw_type = BGMAC_CHIPCTL_4_IF_TYPE_RGMII |
+                                 BGMAC_CHIPCTL_4_SW_TYPE_RGMII;
+               }
+               bgmac_cco_ctl_maskset(bgmac, 4, ~(BGMAC_CHIPCTL_4_IF_TYPE_MASK |
+                                                 BGMAC_CHIPCTL_4_SW_TYPE_MASK),
+                                     sw_type);
+       } else if (bgmac->feature_flags & BGMAC_FEAT_CC7_IF_TYPE_RGMII) {
+               bgmac_cco_ctl_maskset(bgmac, 7, ~BGMAC_CHIPCTL_7_IF_TYPE_MASK,
+                                     BGMAC_CHIPCTL_7_IF_TYPE_RGMII);
        }
 
        if (iost & BGMAC_BCMA_IOST_ATTACHED && !bgmac->has_robosw)
@@ -1024,7 +1046,7 @@ static void bgmac_enable(struct bgmac *bgmac)
 
        mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
                BGMAC_DS_MM_SHIFT;
-       if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0)
+       if (!(bgmac->feature_flags & BGMAC_FEAT_CLKCTLST) || mode != 0)
                bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
        if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2)
                bgmac_cco_ctl_maskset(bgmac, 1, ~0,
@@ -1467,6 +1489,10 @@ int bgmac_enet_probe(struct bgmac *info)
         */
        bgmac_clk_enable(bgmac, 0);
 
+       /* This seems to be fixing IRQ by assigning OOB #6 to the core */
+       if (bgmac->feature_flags & BGMAC_FEAT_IRQ_ID_OOB_6)
+               bgmac_idm_write(bgmac, BCMA_OOB_SEL_OUT_A30, 0x86);
+
        bgmac_chip_reset(bgmac);
 
        err = bgmac_dma_alloc(bgmac);