net: sparx5: ops out certain FDMA functions
authorDaniel Machon <daniel.machon@microchip.com>
Mon, 13 Jan 2025 19:36:08 +0000 (20:36 +0100)
committerJakub Kicinski <kuba@kernel.org>
Wed, 15 Jan 2025 22:13:33 +0000 (14:13 -0800)
We are going to implement the RX  and TX paths a bit differently on
lan969x and therefore need to introduce new ops for FDMA functions:
init, deinit, xmit and poll. Assign the Sparx5 equivalents for these and
update the code throughout. Also add a 'struct net_device' argument to
the xmit() function, as we will be needing that for lan969x.

Reviewed-by: Steen Hegelund <Steen.Hegelund@microchip.com>
Signed-off-by: Daniel Machon <daniel.machon@microchip.com>
Link: https://patch.msgid.link/20250113-sparx5-lan969x-switch-driver-5-v2-4-c468f02fd623@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/microchip/sparx5/sparx5_fdma.c
drivers/net/ethernet/microchip/sparx5/sparx5_main.c
drivers/net/ethernet/microchip/sparx5/sparx5_main.h
drivers/net/ethernet/microchip/sparx5/sparx5_packet.c

index fdae62f557ced656fccde34b535657d9c36ec28c..f435ac38ea8e0b3217eba501e0d2cbe4eb8c735b 100644 (file)
@@ -183,7 +183,7 @@ static bool sparx5_fdma_rx_get_frame(struct sparx5 *sparx5, struct sparx5_rx *rx
        return true;
 }
 
-static int sparx5_fdma_napi_callback(struct napi_struct *napi, int weight)
+int sparx5_fdma_napi_callback(struct napi_struct *napi, int weight)
 {
        struct sparx5_rx *rx = container_of(napi, struct sparx5_rx, napi);
        struct sparx5 *sparx5 = container_of(rx, struct sparx5, rx);
@@ -213,7 +213,8 @@ static int sparx5_fdma_napi_callback(struct napi_struct *napi, int weight)
        return counter;
 }
 
-int sparx5_fdma_xmit(struct sparx5 *sparx5, u32 *ifh, struct sk_buff *skb)
+int sparx5_fdma_xmit(struct sparx5 *sparx5, u32 *ifh, struct sk_buff *skb,
+                    struct net_device *dev)
 {
        struct sparx5_tx *tx = &sparx5->tx;
        struct fdma *fdma = &tx->fdma;
@@ -450,12 +451,13 @@ static u32 sparx5_fdma_port_ctrl(struct sparx5 *sparx5)
 
 int sparx5_fdma_start(struct sparx5 *sparx5)
 {
+       const struct sparx5_ops *ops = sparx5->data->ops;
        struct sparx5_rx *rx = &sparx5->rx;
        struct sparx5_tx *tx = &sparx5->tx;
 
        netif_napi_add_weight(rx->ndev,
                              &rx->napi,
-                             sparx5_fdma_napi_callback,
+                             ops->fdma_poll,
                              FDMA_WEIGHT);
 
        napi_enable(&rx->napi);
index a60f6a166522814feb08d68d1d58b77879e1f257..6a0e5b83ecd077171dacbb3e25bdc129df082381 100644 (file)
@@ -793,7 +793,7 @@ static int sparx5_start(struct sparx5 *sparx5)
                                               0,
                                               "sparx5-fdma", sparx5);
                if (!err) {
-                       err = sparx5_fdma_init(sparx5);
+                       err = ops->fdma_init(sparx5);
                        if (!err)
                                sparx5_fdma_start(sparx5);
                }
@@ -1030,6 +1030,7 @@ cleanup_pnode:
 static void mchp_sparx5_remove(struct platform_device *pdev)
 {
        struct sparx5 *sparx5 = platform_get_drvdata(pdev);
+       const struct sparx5_ops *ops = sparx5->data->ops;
 
        debugfs_remove_recursive(sparx5->debugfs_root);
        if (sparx5->xtr_irq) {
@@ -1041,7 +1042,7 @@ static void mchp_sparx5_remove(struct platform_device *pdev)
                sparx5->fdma_irq = -ENXIO;
        }
        sparx5_ptp_deinit(sparx5);
-       sparx5_fdma_stop(sparx5);
+       ops->fdma_deinit(sparx5);
        sparx5_cleanup_ports(sparx5);
        sparx5_vcap_destroy(sparx5);
        /* Unregister netdevs */
@@ -1096,6 +1097,10 @@ static const struct sparx5_ops sparx5_ops = {
        .set_port_mux            = &sparx5_port_mux_set,
        .ptp_irq_handler         = &sparx5_ptp_irq_handler,
        .dsm_calendar_calc       = &sparx5_dsm_calendar_calc,
+       .fdma_init               = &sparx5_fdma_init,
+       .fdma_deinit             = &sparx5_fdma_deinit,
+       .fdma_poll               = &sparx5_fdma_napi_callback,
+       .fdma_xmit               = &sparx5_fdma_xmit,
 };
 
 static const struct sparx5_match_data sparx5_desc = {
index 7433a77204cdb546f473aa1973e14859d1581d23..62f5e5420f8348f74649aab3622f42821add0954 100644 (file)
@@ -326,6 +326,11 @@ struct sparx5_ops {
                                 struct sparx5_calendar_data *data);
        int (*port_config_rgmii)(struct sparx5_port *port,
                                 struct sparx5_port_config *conf);
+       int (*fdma_init)(struct sparx5 *sparx5);
+       int (*fdma_deinit)(struct sparx5 *sparx5);
+       int (*fdma_poll)(struct napi_struct *napi, int weight);
+       int (*fdma_xmit)(struct sparx5 *sparx5, u32 *ifh, struct sk_buff *skb,
+                        struct net_device *dev);
 };
 
 struct sparx5_main_io_resource {
@@ -440,7 +445,9 @@ int sparx5_fdma_init(struct sparx5 *sparx5);
 int sparx5_fdma_deinit(struct sparx5 *sparx5);
 int sparx5_fdma_start(struct sparx5 *sparx5);
 int sparx5_fdma_stop(struct sparx5 *sparx5);
-int sparx5_fdma_xmit(struct sparx5 *sparx5, u32 *ifh, struct sk_buff *skb);
+int sparx5_fdma_napi_callback(struct napi_struct *napi, int weight);
+int sparx5_fdma_xmit(struct sparx5 *sparx5, u32 *ifh, struct sk_buff *skb,
+                    struct net_device *dev);
 irqreturn_t sparx5_fdma_handler(int irq, void *args);
 
 /* sparx5_mactable.c */
index b6f635d85820f5ba2474eed811180f05801c30a9..f39cf01dee0f57ffecaeaa7342cde134a5a58bbc 100644 (file)
@@ -232,9 +232,12 @@ netdev_tx_t sparx5_port_xmit_impl(struct sk_buff *skb, struct net_device *dev)
        struct net_device_stats *stats = &dev->stats;
        struct sparx5_port *port = netdev_priv(dev);
        struct sparx5 *sparx5 = port->sparx5;
+       const struct sparx5_ops *ops;
        u32 ifh[IFH_LEN];
        netdev_tx_t ret;
 
+       ops = sparx5->data->ops;
+
        memset(ifh, 0, IFH_LEN * 4);
        sparx5_set_port_ifh(sparx5, ifh, port->portno);
 
@@ -254,7 +257,7 @@ netdev_tx_t sparx5_port_xmit_impl(struct sk_buff *skb, struct net_device *dev)
        skb_tx_timestamp(skb);
        spin_lock(&sparx5->tx_lock);
        if (sparx5->fdma_irq > 0)
-               ret = sparx5_fdma_xmit(sparx5, ifh, skb);
+               ret = ops->fdma_xmit(sparx5, ifh, skb, dev);
        else
                ret = sparx5_inject(sparx5, ifh, skb, dev);
        spin_unlock(&sparx5->tx_lock);