drivers: net: vsc9953: Do not configure disabled ports
authorCodrin Ciubotariu <codrin.ciubotariu@nxp.com>
Mon, 14 Mar 2016 11:46:52 +0000 (13:46 +0200)
committerYork Sun <york.sun@nxp.com>
Wed, 6 Apr 2016 15:34:18 +0000 (08:34 -0700)
Some SerDes protocols might not enable all l2switch ports. In this case,
these ports should not be configured to perform Rx/Tx operations.
This also fixes an issue when flooded frames were also switched to
disabled ports and frames start to accumulate, consuming memory
and eventually causing head-of-line blocking for other frames.

Signed-off-by: Codrin Ciubotariu <codrin.ciubotariu@nxp.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Reviewed-by: York Sun <york.sun@nxp.com>
drivers/net/vsc9953.c

index 44afe14051566e62800b9cc5f8b70bf9f3bb6494..4b3b8119677814153abcd76427eff6ad703ed089 100644 (file)
@@ -2525,6 +2525,9 @@ void vsc9953_init(bd_t *bis)
                if (vsc9953_port_init(i))
                        printf("Failed to initialize l2switch port %d\n", i);
 
+               if (!vsc9953_l2sw.port[i].enabled)
+                       continue;
+
                /* Enable VSC9953 GMII Ports Port ID 0 - 7 */
                if (VSC9953_INTERNAL_PORT_CHECK(i)) {
                        out_le32(&l2ana_reg->pfc[i].pfc_cfg,
@@ -2537,6 +2540,11 @@ void vsc9953_init(bd_t *bis)
                        out_le32(&l2sys_reg->pause_cfg.mac_fc_cfg[i],
                                 VSC9953_MAC_FC_CFG);
                }
+
+               l2dev_gmii_reg = (struct vsc9953_dev_gmii *)
+                                (VSC9953_OFFSET + VSC9953_DEV_GMII_OFFSET +
+                                T1040_SWITCH_GMII_DEV_OFFSET * i);
+
                out_le32(&l2dev_gmii_reg->port_mode.clock_cfg,
                         VSC9953_CLOCK_CFG);
                out_le32(&l2dev_gmii_reg->mac_cfg_status.mac_ena_cfg,
@@ -2559,10 +2567,6 @@ void vsc9953_init(bd_t *bis)
                /* WAIT FOR 2 us*/
                udelay(2);
 
-               l2dev_gmii_reg = (struct vsc9953_dev_gmii *)(
-                               (char *)l2dev_gmii_reg
-                               + T1040_SWITCH_GMII_DEV_OFFSET);
-
                /* Initialize Lynx PHY Wrappers */
                phy_addr = 0;
                if (vsc9953_l2sw.port[i].enet_if ==