]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/cavium/thunder/thunder_bgx.c
Merge tag 'powerpc-4.11-2' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
[karo-tx-linux.git] / drivers / net / ethernet / cavium / thunder / thunder_bgx.c
index 1e4695270da6cc422c441542783a0ae24dd943a6..4c8e8cf730bbc2ee1d488d42d9d42163d442fb75 100644 (file)
@@ -978,17 +978,15 @@ static void bgx_print_qlm_mode(struct bgx *bgx, u8 lmacid)
        struct device *dev = &bgx->pdev->dev;
        struct lmac *lmac;
        char str[20];
-       u8 dlm;
 
-       if (lmacid > bgx->max_lmac)
+       if (!bgx->is_dlm && lmacid)
                return;
 
        lmac = &bgx->lmac[lmacid];
-       dlm = (lmacid / 2) + (bgx->bgx_id * 2);
        if (!bgx->is_dlm)
                sprintf(str, "BGX%d QLM mode", bgx->bgx_id);
        else
-               sprintf(str, "BGX%d DLM%d mode", bgx->bgx_id, dlm);
+               sprintf(str, "BGX%d LMAC%d mode", bgx->bgx_id, lmacid);
 
        switch (lmac->lmac_type) {
        case BGX_MODE_SGMII:
@@ -1074,7 +1072,6 @@ static void lmac_set_training(struct bgx *bgx, struct lmac *lmac, int lmacid)
 static void bgx_set_lmac_config(struct bgx *bgx, u8 idx)
 {
        struct lmac *lmac;
-       struct lmac *olmac;
        u64 cmr_cfg;
        u8 lmac_type;
        u8 lane_to_sds;
@@ -1094,62 +1091,26 @@ static void bgx_set_lmac_config(struct bgx *bgx, u8 idx)
                return;
        }
 
-       /* On 81xx BGX can be split across 2 DLMs
-        * firmware programs lmac_type of LMAC0 and LMAC2
+       /* For DLMs or SLMs on 80/81/83xx so many lane configurations
+        * are possible and vary across boards. Also Kernel doesn't have
+        * any way to identify board type/info and since firmware does,
+        * just take lmac type and serdes lane config as is.
         */
-       if ((idx == 0) || (idx == 2)) {
-               cmr_cfg = bgx_reg_read(bgx, idx, BGX_CMRX_CFG);
-               lmac_type = (u8)((cmr_cfg >> 8) & 0x07);
-               lane_to_sds = (u8)(cmr_cfg & 0xFF);
-               /* Check if config is not reset value */
-               if ((lmac_type == 0) && (lane_to_sds == 0xE4))
-                       lmac->lmac_type = BGX_MODE_INVALID;
-               else
-                       lmac->lmac_type = lmac_type;
-               lmac_set_training(bgx, lmac, lmac->lmacid);
-               lmac_set_lane2sds(bgx, lmac);
-
-               olmac = &bgx->lmac[idx + 1];
-               /*  Check if other LMAC on the same DLM is already configured by
-                *  firmware, if so use the same config or else set as same, as
-                *  that of LMAC 0/2.
-                *  This check is needed as on 80xx only one lane of each of the
-                *  DLM of BGX0 is used, so have to rely on firmware for
-                *  distingushing 80xx from 81xx.
-                */
-               cmr_cfg = bgx_reg_read(bgx, idx + 1, BGX_CMRX_CFG);
-               lmac_type = (u8)((cmr_cfg >> 8) & 0x07);
-               lane_to_sds = (u8)(cmr_cfg & 0xFF);
-               if ((lmac_type == 0) && (lane_to_sds == 0xE4)) {
-                       olmac->lmac_type = lmac->lmac_type;
-                       lmac_set_lane2sds(bgx, olmac);
-               } else {
-                       olmac->lmac_type = lmac_type;
-                       olmac->lane_to_sds = lane_to_sds;
-               }
-               lmac_set_training(bgx, olmac, olmac->lmacid);
-       }
-}
-
-static bool is_dlm0_in_bgx_mode(struct bgx *bgx)
-{
-       struct lmac *lmac;
-
-       if (!bgx->is_dlm)
-               return true;
-
-       lmac = &bgx->lmac[0];
-       if (lmac->lmac_type == BGX_MODE_INVALID)
-               return false;
-
-       return true;
+       cmr_cfg = bgx_reg_read(bgx, idx, BGX_CMRX_CFG);
+       lmac_type = (u8)((cmr_cfg >> 8) & 0x07);
+       lane_to_sds = (u8)(cmr_cfg & 0xFF);
+       /* Check if config is reset value */
+       if ((lmac_type == 0) && (lane_to_sds == 0xE4))
+               lmac->lmac_type = BGX_MODE_INVALID;
+       else
+               lmac->lmac_type = lmac_type;
+       lmac->lane_to_sds = lane_to_sds;
+       lmac_set_training(bgx, lmac, lmac->lmacid);
 }
 
 static void bgx_get_qlm_mode(struct bgx *bgx)
 {
        struct lmac *lmac;
-       struct lmac *lmac01;
-       struct lmac *lmac23;
        u8  idx;
 
        /* Init all LMAC's type to invalid */
@@ -1165,29 +1126,9 @@ static void bgx_get_qlm_mode(struct bgx *bgx)
        if (bgx->lmac_count > bgx->max_lmac)
                bgx->lmac_count = bgx->max_lmac;
 
-       for (idx = 0; idx < bgx->max_lmac; idx++)
-               bgx_set_lmac_config(bgx, idx);
-
-       if (!bgx->is_dlm || bgx->is_rgx) {
-               bgx_print_qlm_mode(bgx, 0);
-               return;
-       }
-
-       if (bgx->lmac_count) {
-               bgx_print_qlm_mode(bgx, 0);
-               bgx_print_qlm_mode(bgx, 2);
-       }
-
-       /* If DLM0 is not in BGX mode then LMAC0/1 have
-        * to be configured with serdes lanes of DLM1
-        */
-       if (is_dlm0_in_bgx_mode(bgx) || (bgx->lmac_count > 2))
-               return;
        for (idx = 0; idx < bgx->lmac_count; idx++) {
-               lmac01 = &bgx->lmac[idx];
-               lmac23 = &bgx->lmac[idx + 2];
-               lmac01->lmac_type = lmac23->lmac_type;
-               lmac01->lane_to_sds = lmac23->lane_to_sds;
+               bgx_set_lmac_config(bgx, idx);
+               bgx_print_qlm_mode(bgx, idx);
        }
 }