net: enetc: extract enetc_int_vector_init/destroy() from enetc_alloc_msix()
authorClark Wang <xiaoning.wang@nxp.com>
Wed, 30 Oct 2024 09:39:20 +0000 (17:39 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 Nov 2024 10:03:51 +0000 (10:03 +0000)
Extract enetc_int_vector_init() and enetc_int_vector_destroy() from
enetc_alloc_msix() so that the code is more concise and readable.

Signed-off-by: Clark Wang <xiaoning.wang@nxp.com>
Signed-off-by: Wei Fang <wei.fang@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/enetc/enetc.c

index 05dedea6185aa8284b3068d6abaf4e3a01b8cff9..0c7554157006a532d55ad49a3f4a083fad3ee79d 100644 (file)
@@ -2995,6 +2995,92 @@ int enetc_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
 }
 EXPORT_SYMBOL_GPL(enetc_ioctl);
 
+static int enetc_int_vector_init(struct enetc_ndev_priv *priv, int i,
+                                int v_tx_rings)
+{
+       struct enetc_int_vector *v;
+       struct enetc_bdr *bdr;
+       int j, err;
+
+       v = kzalloc(struct_size(v, tx_ring, v_tx_rings), GFP_KERNEL);
+       if (!v)
+               return -ENOMEM;
+
+       priv->int_vector[i] = v;
+       bdr = &v->rx_ring;
+       bdr->index = i;
+       bdr->ndev = priv->ndev;
+       bdr->dev = priv->dev;
+       bdr->bd_count = priv->rx_bd_count;
+       bdr->buffer_offset = ENETC_RXB_PAD;
+       priv->rx_ring[i] = bdr;
+
+       err = xdp_rxq_info_reg(&bdr->xdp.rxq, priv->ndev, i, 0);
+       if (err)
+               goto free_vector;
+
+       err = xdp_rxq_info_reg_mem_model(&bdr->xdp.rxq, MEM_TYPE_PAGE_SHARED,
+                                        NULL);
+       if (err) {
+               xdp_rxq_info_unreg(&bdr->xdp.rxq);
+               goto free_vector;
+       }
+
+       /* init defaults for adaptive IC */
+       if (priv->ic_mode & ENETC_IC_RX_ADAPTIVE) {
+               v->rx_ictt = 0x1;
+               v->rx_dim_en = true;
+       }
+
+       INIT_WORK(&v->rx_dim.work, enetc_rx_dim_work);
+       netif_napi_add(priv->ndev, &v->napi, enetc_poll);
+       v->count_tx_rings = v_tx_rings;
+
+       for (j = 0; j < v_tx_rings; j++) {
+               int idx;
+
+               /* default tx ring mapping policy */
+               idx = priv->bdr_int_num * j + i;
+               __set_bit(idx, &v->tx_rings_map);
+               bdr = &v->tx_ring[j];
+               bdr->index = idx;
+               bdr->ndev = priv->ndev;
+               bdr->dev = priv->dev;
+               bdr->bd_count = priv->tx_bd_count;
+               priv->tx_ring[idx] = bdr;
+       }
+
+       return 0;
+
+free_vector:
+       priv->rx_ring[i] = NULL;
+       priv->int_vector[i] = NULL;
+       kfree(v);
+
+       return err;
+}
+
+static void enetc_int_vector_destroy(struct enetc_ndev_priv *priv, int i)
+{
+       struct enetc_int_vector *v = priv->int_vector[i];
+       struct enetc_bdr *rx_ring = &v->rx_ring;
+       int j, tx_ring_index;
+
+       xdp_rxq_info_unreg_mem_model(&rx_ring->xdp.rxq);
+       xdp_rxq_info_unreg(&rx_ring->xdp.rxq);
+       netif_napi_del(&v->napi);
+       cancel_work_sync(&v->rx_dim.work);
+
+       for (j = 0; j < v->count_tx_rings; j++) {
+               tx_ring_index = priv->bdr_int_num * j + i;
+               priv->tx_ring[tx_ring_index] = NULL;
+       }
+
+       priv->rx_ring[i] = NULL;
+       priv->int_vector[i] = NULL;
+       kfree(v);
+}
+
 int enetc_alloc_msix(struct enetc_ndev_priv *priv)
 {
        struct pci_dev *pdev = priv->si->pdev;
@@ -3017,62 +3103,9 @@ int enetc_alloc_msix(struct enetc_ndev_priv *priv)
        v_tx_rings = priv->num_tx_rings / priv->bdr_int_num;
 
        for (i = 0; i < priv->bdr_int_num; i++) {
-               struct enetc_int_vector *v;
-               struct enetc_bdr *bdr;
-               int j;
-
-               v = kzalloc(struct_size(v, tx_ring, v_tx_rings), GFP_KERNEL);
-               if (!v) {
-                       err = -ENOMEM;
-                       goto fail;
-               }
-
-               priv->int_vector[i] = v;
-
-               bdr = &v->rx_ring;
-               bdr->index = i;
-               bdr->ndev = priv->ndev;
-               bdr->dev = priv->dev;
-               bdr->bd_count = priv->rx_bd_count;
-               bdr->buffer_offset = ENETC_RXB_PAD;
-               priv->rx_ring[i] = bdr;
-
-               err = xdp_rxq_info_reg(&bdr->xdp.rxq, priv->ndev, i, 0);
-               if (err) {
-                       kfree(v);
-                       goto fail;
-               }
-
-               err = xdp_rxq_info_reg_mem_model(&bdr->xdp.rxq,
-                                                MEM_TYPE_PAGE_SHARED, NULL);
-               if (err) {
-                       xdp_rxq_info_unreg(&bdr->xdp.rxq);
-                       kfree(v);
+               err = enetc_int_vector_init(priv, i, v_tx_rings);
+               if (err)
                        goto fail;
-               }
-
-               /* init defaults for adaptive IC */
-               if (priv->ic_mode & ENETC_IC_RX_ADAPTIVE) {
-                       v->rx_ictt = 0x1;
-                       v->rx_dim_en = true;
-               }
-               INIT_WORK(&v->rx_dim.work, enetc_rx_dim_work);
-               netif_napi_add(priv->ndev, &v->napi, enetc_poll);
-               v->count_tx_rings = v_tx_rings;
-
-               for (j = 0; j < v_tx_rings; j++) {
-                       int idx;
-
-                       /* default tx ring mapping policy */
-                       idx = priv->bdr_int_num * j + i;
-                       __set_bit(idx, &v->tx_rings_map);
-                       bdr = &v->tx_ring[j];
-                       bdr->index = idx;
-                       bdr->ndev = priv->ndev;
-                       bdr->dev = priv->dev;
-                       bdr->bd_count = priv->tx_bd_count;
-                       priv->tx_ring[idx] = bdr;
-               }
        }
 
        num_stack_tx_queues = enetc_num_stack_tx_queues(priv);
@@ -3092,16 +3125,8 @@ int enetc_alloc_msix(struct enetc_ndev_priv *priv)
        return 0;
 
 fail:
-       while (i--) {
-               struct enetc_int_vector *v = priv->int_vector[i];
-               struct enetc_bdr *rx_ring = &v->rx_ring;
-
-               xdp_rxq_info_unreg_mem_model(&rx_ring->xdp.rxq);
-               xdp_rxq_info_unreg(&rx_ring->xdp.rxq);
-               netif_napi_del(&v->napi);
-               cancel_work_sync(&v->rx_dim.work);
-               kfree(v);
-       }
+       while (i--)
+               enetc_int_vector_destroy(priv, i);
 
        pci_free_irq_vectors(pdev);
 
@@ -3113,26 +3138,8 @@ void enetc_free_msix(struct enetc_ndev_priv *priv)
 {
        int i;
 
-       for (i = 0; i < priv->bdr_int_num; i++) {
-               struct enetc_int_vector *v = priv->int_vector[i];
-               struct enetc_bdr *rx_ring = &v->rx_ring;
-
-               xdp_rxq_info_unreg_mem_model(&rx_ring->xdp.rxq);
-               xdp_rxq_info_unreg(&rx_ring->xdp.rxq);
-               netif_napi_del(&v->napi);
-               cancel_work_sync(&v->rx_dim.work);
-       }
-
-       for (i = 0; i < priv->num_rx_rings; i++)
-               priv->rx_ring[i] = NULL;
-
-       for (i = 0; i < priv->num_tx_rings; i++)
-               priv->tx_ring[i] = NULL;
-
-       for (i = 0; i < priv->bdr_int_num; i++) {
-               kfree(priv->int_vector[i]);
-               priv->int_vector[i] = NULL;
-       }
+       for (i = 0; i < priv->bdr_int_num; i++)
+               enetc_int_vector_destroy(priv, i);
 
        /* disable all MSIX for this device */
        pci_free_irq_vectors(priv->si->pdev);