net: mscc: ocelot: extend watermark encoding function
authorMaxim Kochetkov <fido_max@inbox.ru>
Mon, 13 Jul 2020 16:57:08 +0000 (19:57 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 14 Jul 2020 00:40:02 +0000 (17:40 -0700)
The ocelot_wm_encode function deals with setting thresholds for pause
frame start and stop. In Ocelot and Felix the register layout is the
same, but for Seville, it isn't. The easiest way to accommodate Seville
hardware configuration is to introduce a function pointer for setting
this up.

Signed-off-by: Maxim Kochetkov <fido_max@inbox.ru>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/ocelot/felix_vsc9959.c
drivers/net/ethernet/mscc/ocelot.c
drivers/net/ethernet/mscc/ocelot_vsc7514.c
include/soc/mscc/ocelot.h

index fea482ad92c7a36999890d84b87a7aa56da963c2..7e8a994556703dd8fdd6a284a46bf77ff3587e79 100644 (file)
@@ -1149,8 +1149,21 @@ static int vsc9959_prevalidate_phy_mode(struct ocelot *ocelot, int port,
        }
 }
 
+/* Watermark encode
+ * Bit 8:   Unit; 0:1, 1:16
+ * Bit 7-0: Value to be multiplied with unit
+ */
+static u16 vsc9959_wm_enc(u16 value)
+{
+       if (value >= BIT(8))
+               return BIT(8) | (value / 16);
+
+       return value;
+}
+
 static const struct ocelot_ops vsc9959_ops = {
        .reset                  = vsc9959_reset,
+       .wm_enc                 = vsc9959_wm_enc,
 };
 
 static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot)
index 4d5222fa3397db43c8b61d8c191f62be680a0c69..f2d94b026d88066715e94e1bbeb420f0bc93dc12 100644 (file)
@@ -309,18 +309,6 @@ static void ocelot_vlan_init(struct ocelot *ocelot)
        }
 }
 
-/* Watermark encode
- * Bit 8:   Unit; 0:1, 1:16
- * Bit 7-0: Value to be multiplied with unit
- */
-static u16 ocelot_wm_enc(u16 value)
-{
-       if (value >= BIT(8))
-               return BIT(8) | (value / 16);
-
-       return value;
-}
-
 void ocelot_adjust_link(struct ocelot *ocelot, int port,
                        struct phy_device *phydev)
 {
@@ -1284,9 +1272,9 @@ void ocelot_port_set_maxlen(struct ocelot *ocelot, int port, size_t sdu)
        /* Tail dropping watermark */
        atop_wm = (ocelot->shared_queue_sz - 9 * maxlen) /
                   OCELOT_BUFFER_CELL_SZ;
-       ocelot_write_rix(ocelot, ocelot_wm_enc(9 * maxlen),
+       ocelot_write_rix(ocelot, ocelot->ops->wm_enc(9 * maxlen),
                         SYS_ATOP, port);
-       ocelot_write(ocelot, ocelot_wm_enc(atop_wm), SYS_ATOP_TOT_CFG);
+       ocelot_write(ocelot, ocelot->ops->wm_enc(atop_wm), SYS_ATOP_TOT_CFG);
 }
 EXPORT_SYMBOL(ocelot_port_set_maxlen);
 
index e9cbfbed1fc61b53beab2f517ce6365ea924f014..0ead1ef11c6c9e124dcbf6c5a0a6c175223d1a25 100644 (file)
@@ -739,8 +739,21 @@ static int ocelot_reset(struct ocelot *ocelot)
        return 0;
 }
 
+/* Watermark encode
+ * Bit 8:   Unit; 0:1, 1:16
+ * Bit 7-0: Value to be multiplied with unit
+ */
+static u16 ocelot_wm_enc(u16 value)
+{
+       if (value >= BIT(8))
+               return BIT(8) | (value / 16);
+
+       return value;
+}
+
 static const struct ocelot_ops ocelot_ops = {
        .reset                  = ocelot_reset,
+       .wm_enc                 = ocelot_wm_enc,
 };
 
 static const struct vcap_field vsc7514_vcap_is2_keys[] = {
index 71bb92bcfdf7420c6bf78b323335c523c504b6a7..da369b12005f892e95376b2ab76fc79d64d02efe 100644 (file)
@@ -541,6 +541,7 @@ struct ocelot;
 
 struct ocelot_ops {
        int (*reset)(struct ocelot *ocelot);
+       u16 (*wm_enc)(u16 value);
 };
 
 struct ocelot_vcap_block {