mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 06:01:53 +02:00
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: Clark Wang <xiaoning.wang@nxp.com> Signed-off-by: Wei Fang <wei.fang@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a52201fb9c
commit
b4bfd0a904
|
|
@ -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;
|
||||
err = enetc_int_vector_init(priv, i, v_tx_rings);
|
||||
if (err)
|
||||
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);
|
||||
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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user