Commit c984f374 authored by Breno Leitao's avatar Breno Leitao Committed by Jakub Kicinski

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: default avatarBreno Leitao <leitao@debian.org>
Link: https://lore.kernel.org/r/20240424161108.3397057-1-leitao@debian.orgSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 9ac7f797
...@@ -253,22 +253,27 @@ static void t7xx_ccmni_wwan_setup(struct net_device *dev) ...@@ -253,22 +253,27 @@ static void t7xx_ccmni_wwan_setup(struct net_device *dev)
dev->netdev_ops = &ccmni_netdev_ops; 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; int i;
/* one HW, but shared with multiple net devices, /* one HW, but shared with multiple net devices,
* so add a dummy device for NAPI. * 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); atomic_set(&ctlb->napi_usr_refcnt, 0);
ctlb->is_napi_en = false; ctlb->is_napi_en = false;
for (i = 0; i < RXQ_NUM; i++) { for (i = 0; i < RXQ_NUM; i++) {
ctlb->napi[i] = &ctlb->hif_ctrl->rxq[i].napi; 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); NIC_NAPI_POLL_BUDGET);
} }
return 0;
} }
static void t7xx_uninit_netdev_napi(struct t7xx_ccmni_ctrl *ctlb) 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) ...@@ -279,6 +284,7 @@ static void t7xx_uninit_netdev_napi(struct t7xx_ccmni_ctrl *ctlb)
netif_napi_del(ctlb->napi[i]); netif_napi_del(ctlb->napi[i]);
ctlb->napi[i] = NULL; ctlb->napi[i] = NULL;
} }
free_netdev(ctlb->dummy_dev);
} }
static int t7xx_ccmni_wwan_newlink(void *ctxt, struct net_device *dev, u32 if_id, 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) ...@@ -480,6 +486,7 @@ int t7xx_ccmni_init(struct t7xx_pci_dev *t7xx_dev)
{ {
struct device *dev = &t7xx_dev->pdev->dev; struct device *dev = &t7xx_dev->pdev->dev;
struct t7xx_ccmni_ctrl *ctlb; struct t7xx_ccmni_ctrl *ctlb;
int ret;
ctlb = devm_kzalloc(dev, sizeof(*ctlb), GFP_KERNEL); ctlb = devm_kzalloc(dev, sizeof(*ctlb), GFP_KERNEL);
if (!ctlb) if (!ctlb)
...@@ -495,7 +502,12 @@ int t7xx_ccmni_init(struct t7xx_pci_dev *t7xx_dev) ...@@ -495,7 +502,12 @@ int t7xx_ccmni_init(struct t7xx_pci_dev *t7xx_dev)
if (!ctlb->hif_ctrl) if (!ctlb->hif_ctrl)
return -ENOMEM; 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); init_md_status_notifier(t7xx_dev);
return 0; return 0;
} }
......
...@@ -48,7 +48,7 @@ struct t7xx_ccmni_ctrl { ...@@ -48,7 +48,7 @@ struct t7xx_ccmni_ctrl {
unsigned int md_sta; unsigned int md_sta;
struct t7xx_fsm_notifier md_status_notify; struct t7xx_fsm_notifier md_status_notify;
bool wwan_is_registered; bool wwan_is_registered;
struct net_device dummy_dev; struct net_device *dummy_dev;
struct napi_struct *napi[RXQ_NUM]; struct napi_struct *napi[RXQ_NUM];
atomic_t napi_usr_refcnt; atomic_t napi_usr_refcnt;
bool is_napi_en; bool is_napi_en;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment