net: ethernet: ti: cpsw: adjust cpsw fifos depth for fullduplex flow control
authorGrygorii Strashko <grygorii.strashko@ti.com>
Mon, 8 May 2017 19:21:21 +0000 (14:21 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 8 May 2017 21:33:19 +0000 (17:33 -0400)
When users set flow control using ethtool the bits are set properly in the
CPGMAC_SL MACCONTROL register, but the FIFO depth in the respective Port n
Maximum FIFO Blocks (Pn_MAX_BLKS) registers remains set to the minimum size
reset value. When receive flow control is enabled on a port, the port's
associated FIFO block allocation must be adjusted. The port RX allocation
must increase to accommodate the flow control runout. The TRM recommends
numbers of 5 or 6.

Hence, apply required Port FIFO configuration to
Pn_MAX_BLKS.Pn_TX_MAX_BLKS=0xF and Pn_MAX_BLKS.Pn_RX_MAX_BLKS=0x5 during
interface initialization.

Cc: Schuyler Patton <spatton@ti.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/cpsw.c

index fa674a8bda0c8ff43d19699fefdd0ba718e75c90..f4d7aec5047953559b46755f694cabc191c304f9 100644 (file)
@@ -287,6 +287,10 @@ struct cpsw_ss_regs {
 /* Bit definitions for the CPSW1_TS_SEQ_LTYPE register */
 #define CPSW_V1_SEQ_ID_OFS_SHIFT       16
 
+#define CPSW_MAX_BLKS_TX               15
+#define CPSW_MAX_BLKS_TX_SHIFT         4
+#define CPSW_MAX_BLKS_RX               5
+
 struct cpsw_host_regs {
        u32     max_blks;
        u32     blk_cnt;
@@ -1278,11 +1282,23 @@ static void cpsw_slave_open(struct cpsw_slave *slave, struct cpsw_priv *priv)
        switch (cpsw->version) {
        case CPSW_VERSION_1:
                slave_write(slave, TX_PRIORITY_MAPPING, CPSW1_TX_PRI_MAP);
+               /* Increase RX FIFO size to 5 for supporting fullduplex
+                * flow control mode
+                */
+               slave_write(slave,
+                           (CPSW_MAX_BLKS_TX << CPSW_MAX_BLKS_TX_SHIFT) |
+                           CPSW_MAX_BLKS_RX, CPSW1_MAX_BLKS);
                break;
        case CPSW_VERSION_2:
        case CPSW_VERSION_3:
        case CPSW_VERSION_4:
                slave_write(slave, TX_PRIORITY_MAPPING, CPSW2_TX_PRI_MAP);
+               /* Increase RX FIFO size to 5 for supporting fullduplex
+                * flow control mode
+                */
+               slave_write(slave,
+                           (CPSW_MAX_BLKS_TX << CPSW_MAX_BLKS_TX_SHIFT) |
+                           CPSW_MAX_BLKS_RX, CPSW2_MAX_BLKS);
                break;
        }