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

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.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 9ac7f797
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -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;
}
+1 −1
Original line number Diff line number Diff line
@@ -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;