Skip to content

Commit b4bfd0a

Browse files
wangxiaoningnxpdavem330
authored andcommitted
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 <[email protected]> Signed-off-by: Wei Fang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a52201f commit b4bfd0a

File tree

1 file changed

+92
-85
lines changed
  • drivers/net/ethernet/freescale/enetc

1 file changed

+92
-85
lines changed

drivers/net/ethernet/freescale/enetc/enetc.c

Lines changed: 92 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -2995,6 +2995,92 @@ int enetc_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
29952995
}
29962996
EXPORT_SYMBOL_GPL(enetc_ioctl);
29972997

2998+
static int enetc_int_vector_init(struct enetc_ndev_priv *priv, int i,
2999+
int v_tx_rings)
3000+
{
3001+
struct enetc_int_vector *v;
3002+
struct enetc_bdr *bdr;
3003+
int j, err;
3004+
3005+
v = kzalloc(struct_size(v, tx_ring, v_tx_rings), GFP_KERNEL);
3006+
if (!v)
3007+
return -ENOMEM;
3008+
3009+
priv->int_vector[i] = v;
3010+
bdr = &v->rx_ring;
3011+
bdr->index = i;
3012+
bdr->ndev = priv->ndev;
3013+
bdr->dev = priv->dev;
3014+
bdr->bd_count = priv->rx_bd_count;
3015+
bdr->buffer_offset = ENETC_RXB_PAD;
3016+
priv->rx_ring[i] = bdr;
3017+
3018+
err = xdp_rxq_info_reg(&bdr->xdp.rxq, priv->ndev, i, 0);
3019+
if (err)
3020+
goto free_vector;
3021+
3022+
err = xdp_rxq_info_reg_mem_model(&bdr->xdp.rxq, MEM_TYPE_PAGE_SHARED,
3023+
NULL);
3024+
if (err) {
3025+
xdp_rxq_info_unreg(&bdr->xdp.rxq);
3026+
goto free_vector;
3027+
}
3028+
3029+
/* init defaults for adaptive IC */
3030+
if (priv->ic_mode & ENETC_IC_RX_ADAPTIVE) {
3031+
v->rx_ictt = 0x1;
3032+
v->rx_dim_en = true;
3033+
}
3034+
3035+
INIT_WORK(&v->rx_dim.work, enetc_rx_dim_work);
3036+
netif_napi_add(priv->ndev, &v->napi, enetc_poll);
3037+
v->count_tx_rings = v_tx_rings;
3038+
3039+
for (j = 0; j < v_tx_rings; j++) {
3040+
int idx;
3041+
3042+
/* default tx ring mapping policy */
3043+
idx = priv->bdr_int_num * j + i;
3044+
__set_bit(idx, &v->tx_rings_map);
3045+
bdr = &v->tx_ring[j];
3046+
bdr->index = idx;
3047+
bdr->ndev = priv->ndev;
3048+
bdr->dev = priv->dev;
3049+
bdr->bd_count = priv->tx_bd_count;
3050+
priv->tx_ring[idx] = bdr;
3051+
}
3052+
3053+
return 0;
3054+
3055+
free_vector:
3056+
priv->rx_ring[i] = NULL;
3057+
priv->int_vector[i] = NULL;
3058+
kfree(v);
3059+
3060+
return err;
3061+
}
3062+
3063+
static void enetc_int_vector_destroy(struct enetc_ndev_priv *priv, int i)
3064+
{
3065+
struct enetc_int_vector *v = priv->int_vector[i];
3066+
struct enetc_bdr *rx_ring = &v->rx_ring;
3067+
int j, tx_ring_index;
3068+
3069+
xdp_rxq_info_unreg_mem_model(&rx_ring->xdp.rxq);
3070+
xdp_rxq_info_unreg(&rx_ring->xdp.rxq);
3071+
netif_napi_del(&v->napi);
3072+
cancel_work_sync(&v->rx_dim.work);
3073+
3074+
for (j = 0; j < v->count_tx_rings; j++) {
3075+
tx_ring_index = priv->bdr_int_num * j + i;
3076+
priv->tx_ring[tx_ring_index] = NULL;
3077+
}
3078+
3079+
priv->rx_ring[i] = NULL;
3080+
priv->int_vector[i] = NULL;
3081+
kfree(v);
3082+
}
3083+
29983084
int enetc_alloc_msix(struct enetc_ndev_priv *priv)
29993085
{
30003086
struct pci_dev *pdev = priv->si->pdev;
@@ -3017,62 +3103,9 @@ int enetc_alloc_msix(struct enetc_ndev_priv *priv)
30173103
v_tx_rings = priv->num_tx_rings / priv->bdr_int_num;
30183104

30193105
for (i = 0; i < priv->bdr_int_num; i++) {
3020-
struct enetc_int_vector *v;
3021-
struct enetc_bdr *bdr;
3022-
int j;
3023-
3024-
v = kzalloc(struct_size(v, tx_ring, v_tx_rings), GFP_KERNEL);
3025-
if (!v) {
3026-
err = -ENOMEM;
3027-
goto fail;
3028-
}
3029-
3030-
priv->int_vector[i] = v;
3031-
3032-
bdr = &v->rx_ring;
3033-
bdr->index = i;
3034-
bdr->ndev = priv->ndev;
3035-
bdr->dev = priv->dev;
3036-
bdr->bd_count = priv->rx_bd_count;
3037-
bdr->buffer_offset = ENETC_RXB_PAD;
3038-
priv->rx_ring[i] = bdr;
3039-
3040-
err = xdp_rxq_info_reg(&bdr->xdp.rxq, priv->ndev, i, 0);
3041-
if (err) {
3042-
kfree(v);
3043-
goto fail;
3044-
}
3045-
3046-
err = xdp_rxq_info_reg_mem_model(&bdr->xdp.rxq,
3047-
MEM_TYPE_PAGE_SHARED, NULL);
3048-
if (err) {
3049-
xdp_rxq_info_unreg(&bdr->xdp.rxq);
3050-
kfree(v);
3106+
err = enetc_int_vector_init(priv, i, v_tx_rings);
3107+
if (err)
30513108
goto fail;
3052-
}
3053-
3054-
/* init defaults for adaptive IC */
3055-
if (priv->ic_mode & ENETC_IC_RX_ADAPTIVE) {
3056-
v->rx_ictt = 0x1;
3057-
v->rx_dim_en = true;
3058-
}
3059-
INIT_WORK(&v->rx_dim.work, enetc_rx_dim_work);
3060-
netif_napi_add(priv->ndev, &v->napi, enetc_poll);
3061-
v->count_tx_rings = v_tx_rings;
3062-
3063-
for (j = 0; j < v_tx_rings; j++) {
3064-
int idx;
3065-
3066-
/* default tx ring mapping policy */
3067-
idx = priv->bdr_int_num * j + i;
3068-
__set_bit(idx, &v->tx_rings_map);
3069-
bdr = &v->tx_ring[j];
3070-
bdr->index = idx;
3071-
bdr->ndev = priv->ndev;
3072-
bdr->dev = priv->dev;
3073-
bdr->bd_count = priv->tx_bd_count;
3074-
priv->tx_ring[idx] = bdr;
3075-
}
30763109
}
30773110

30783111
num_stack_tx_queues = enetc_num_stack_tx_queues(priv);
@@ -3092,16 +3125,8 @@ int enetc_alloc_msix(struct enetc_ndev_priv *priv)
30923125
return 0;
30933126

30943127
fail:
3095-
while (i--) {
3096-
struct enetc_int_vector *v = priv->int_vector[i];
3097-
struct enetc_bdr *rx_ring = &v->rx_ring;
3098-
3099-
xdp_rxq_info_unreg_mem_model(&rx_ring->xdp.rxq);
3100-
xdp_rxq_info_unreg(&rx_ring->xdp.rxq);
3101-
netif_napi_del(&v->napi);
3102-
cancel_work_sync(&v->rx_dim.work);
3103-
kfree(v);
3104-
}
3128+
while (i--)
3129+
enetc_int_vector_destroy(priv, i);
31053130

31063131
pci_free_irq_vectors(pdev);
31073132

@@ -3113,26 +3138,8 @@ void enetc_free_msix(struct enetc_ndev_priv *priv)
31133138
{
31143139
int i;
31153140

3116-
for (i = 0; i < priv->bdr_int_num; i++) {
3117-
struct enetc_int_vector *v = priv->int_vector[i];
3118-
struct enetc_bdr *rx_ring = &v->rx_ring;
3119-
3120-
xdp_rxq_info_unreg_mem_model(&rx_ring->xdp.rxq);
3121-
xdp_rxq_info_unreg(&rx_ring->xdp.rxq);
3122-
netif_napi_del(&v->napi);
3123-
cancel_work_sync(&v->rx_dim.work);
3124-
}
3125-
3126-
for (i = 0; i < priv->num_rx_rings; i++)
3127-
priv->rx_ring[i] = NULL;
3128-
3129-
for (i = 0; i < priv->num_tx_rings; i++)
3130-
priv->tx_ring[i] = NULL;
3131-
3132-
for (i = 0; i < priv->bdr_int_num; i++) {
3133-
kfree(priv->int_vector[i]);
3134-
priv->int_vector[i] = NULL;
3135-
}
3141+
for (i = 0; i < priv->bdr_int_num; i++)
3142+
enetc_int_vector_destroy(priv, i);
31363143

31373144
/* disable all MSIX for this device */
31383145
pci_free_irq_vectors(priv->si->pdev);

0 commit comments

Comments
 (0)