mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-07 13:53:24 +00:00
net: wwan: t7xx: Un-embed dummy device
Embedding net_device into structures prohibits the usage of flexible arrays in the net_device structure. For more details, see the discussion at [1]. Un-embed the net_device from the private struct by converting it into a pointer. Then use the leverage the new alloc_netdev_dummy() helper to allocate and initialize dummy devices. [1] https://lore.kernel.org/all/20240229225910.79e224cf@kernel.org/ Signed-off-by: Breno Leitao <leitao@debian.org> Link: https://lore.kernel.org/r/20240424161108.3397057-1-leitao@debian.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
9ac7f79735
commit
c984f374ae
@ -253,22 +253,27 @@ static void t7xx_ccmni_wwan_setup(struct net_device *dev)
|
||||
dev->netdev_ops = &ccmni_netdev_ops;
|
||||
}
|
||||
|
||||
static void t7xx_init_netdev_napi(struct t7xx_ccmni_ctrl *ctlb)
|
||||
static int t7xx_init_netdev_napi(struct t7xx_ccmni_ctrl *ctlb)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* one HW, but shared with multiple net devices,
|
||||
* so add a dummy device for NAPI.
|
||||
*/
|
||||
init_dummy_netdev(&ctlb->dummy_dev);
|
||||
ctlb->dummy_dev = alloc_netdev_dummy(0);
|
||||
if (!ctlb->dummy_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
atomic_set(&ctlb->napi_usr_refcnt, 0);
|
||||
ctlb->is_napi_en = false;
|
||||
|
||||
for (i = 0; i < RXQ_NUM; i++) {
|
||||
ctlb->napi[i] = &ctlb->hif_ctrl->rxq[i].napi;
|
||||
netif_napi_add_weight(&ctlb->dummy_dev, ctlb->napi[i], t7xx_dpmaif_napi_rx_poll,
|
||||
netif_napi_add_weight(ctlb->dummy_dev, ctlb->napi[i], t7xx_dpmaif_napi_rx_poll,
|
||||
NIC_NAPI_POLL_BUDGET);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void t7xx_uninit_netdev_napi(struct t7xx_ccmni_ctrl *ctlb)
|
||||
@ -279,6 +284,7 @@ static void t7xx_uninit_netdev_napi(struct t7xx_ccmni_ctrl *ctlb)
|
||||
netif_napi_del(ctlb->napi[i]);
|
||||
ctlb->napi[i] = NULL;
|
||||
}
|
||||
free_netdev(ctlb->dummy_dev);
|
||||
}
|
||||
|
||||
static int t7xx_ccmni_wwan_newlink(void *ctxt, struct net_device *dev, u32 if_id,
|
||||
@ -480,6 +486,7 @@ int t7xx_ccmni_init(struct t7xx_pci_dev *t7xx_dev)
|
||||
{
|
||||
struct device *dev = &t7xx_dev->pdev->dev;
|
||||
struct t7xx_ccmni_ctrl *ctlb;
|
||||
int ret;
|
||||
|
||||
ctlb = devm_kzalloc(dev, sizeof(*ctlb), GFP_KERNEL);
|
||||
if (!ctlb)
|
||||
@ -495,7 +502,12 @@ int t7xx_ccmni_init(struct t7xx_pci_dev *t7xx_dev)
|
||||
if (!ctlb->hif_ctrl)
|
||||
return -ENOMEM;
|
||||
|
||||
t7xx_init_netdev_napi(ctlb);
|
||||
ret = t7xx_init_netdev_napi(ctlb);
|
||||
if (ret) {
|
||||
t7xx_dpmaif_hif_exit(ctlb->hif_ctrl);
|
||||
return ret;
|
||||
}
|
||||
|
||||
init_md_status_notifier(t7xx_dev);
|
||||
return 0;
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ struct t7xx_ccmni_ctrl {
|
||||
unsigned int md_sta;
|
||||
struct t7xx_fsm_notifier md_status_notify;
|
||||
bool wwan_is_registered;
|
||||
struct net_device dummy_dev;
|
||||
struct net_device *dummy_dev;
|
||||
struct napi_struct *napi[RXQ_NUM];
|
||||
atomic_t napi_usr_refcnt;
|
||||
bool is_napi_en;
|
||||
|
Loading…
Reference in New Issue
Block a user