Commit b4bfd0a9 authored by Clark Wang's avatar Clark Wang Committed by David S. Miller
Browse files

net: enetc: extract enetc_int_vector_init/destroy() from enetc_alloc_msix()



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: default avatarClark Wang <xiaoning.wang@nxp.com>
Signed-off-by: default avatarWei Fang <wei.fang@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a52201fb
Loading
Loading
Loading
Loading
+92 −85
Original line number Diff line number Diff line
@@ -2995,40 +2995,18 @@ int enetc_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
}
EXPORT_SYMBOL_GPL(enetc_ioctl);

int enetc_alloc_msix(struct enetc_ndev_priv *priv)
static int enetc_int_vector_init(struct enetc_ndev_priv *priv, int i,
				 int v_tx_rings)
{
	struct pci_dev *pdev = priv->si->pdev;
	int num_stack_tx_queues;
	int first_xdp_tx_ring;
	int i, n, err, nvec;
	int v_tx_rings;

	nvec = ENETC_BDR_INT_BASE_IDX + priv->bdr_int_num;
	/* allocate MSIX for both messaging and Rx/Tx interrupts */
	n = pci_alloc_irq_vectors(pdev, nvec, nvec, PCI_IRQ_MSIX);

	if (n < 0)
		return n;

	if (n != nvec)
		return -EPERM;

	/* # of tx rings per int vector */
	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;
	int j, err;

	v = kzalloc(struct_size(v, tx_ring, v_tx_rings), GFP_KERNEL);
		if (!v) {
			err = -ENOMEM;
			goto fail;
		}
	if (!v)
		return -ENOMEM;

	priv->int_vector[i] = v;

	bdr = &v->rx_ring;
	bdr->index = i;
	bdr->ndev = priv->ndev;
@@ -3038,17 +3016,14 @@ int enetc_alloc_msix(struct enetc_ndev_priv *priv)
	priv->rx_ring[i] = bdr;

	err = xdp_rxq_info_reg(&bdr->xdp.rxq, priv->ndev, i, 0);
		if (err) {
			kfree(v);
			goto fail;
		}
	if (err)
		goto free_vector;

		err = xdp_rxq_info_reg_mem_model(&bdr->xdp.rxq,
						 MEM_TYPE_PAGE_SHARED, NULL);
	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);
			goto fail;
		goto free_vector;
	}

	/* init defaults for adaptive IC */
@@ -3056,6 +3031,7 @@ int enetc_alloc_msix(struct enetc_ndev_priv *priv)
		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;
@@ -3073,6 +3049,63 @@ int enetc_alloc_msix(struct enetc_ndev_priv *priv)
		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;
	int num_stack_tx_queues;
	int first_xdp_tx_ring;
	int i, n, err, nvec;
	int v_tx_rings;

	nvec = ENETC_BDR_INT_BASE_IDX + priv->bdr_int_num;
	/* allocate MSIX for both messaging and Rx/Tx interrupts */
	n = pci_alloc_irq_vectors(pdev, nvec, nvec, PCI_IRQ_MSIX);

	if (n < 0)
		return n;

	if (n != nvec)
		return -EPERM;

	/* # of tx rings per int vector */
	v_tx_rings = priv->num_tx_rings / priv->bdr_int_num;

	for (i = 0; i < priv->bdr_int_num; i++) {
		err = enetc_int_vector_init(priv, i, v_tx_rings);
		if (err)
			goto fail;
	}

	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);