Commit bca592ea authored by Breno Leitao's avatar Breno Leitao Committed by David S. Miller
Browse files

wifi: ath11k: allocate dummy net_device dynamically

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 struct ath11k_ext_irq_grp by converting it
into a pointer. Then use the leverage alloc_netdev() to allocate the
net_device object at ath11k_ahb_config_ext_irq() for ahb, and
ath11k_pcic_ext_irq_config() for pcic.

The free of the device occurs at ath11k_ahb_free_ext_irq() for the ahb
case, and ath11k_pcic_free_ext_irq() for the pcic case.

[1] https://lore.kernel.org/all/20240229225910.79e224cf@kernel.org/



Signed-off-by: default avatarBreno Leitao <leitao@debian.org>
Tested-by: default avatarKalle Valo <kvalo@kernel.org>
Acked-by: default avatarKalle Valo <kvalo@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 57738dab
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -442,6 +442,7 @@ static void ath11k_ahb_free_ext_irq(struct ath11k_base *ab)
			free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp);

		netif_napi_del(&irq_grp->napi);
		free_netdev(irq_grp->napi_ndev);
	}
}

@@ -533,8 +534,12 @@ static int ath11k_ahb_config_ext_irq(struct ath11k_base *ab)

		irq_grp->ab = ab;
		irq_grp->grp_id = i;
		init_dummy_netdev(&irq_grp->napi_ndev);
		netif_napi_add(&irq_grp->napi_ndev, &irq_grp->napi,

		irq_grp->napi_ndev = alloc_netdev_dummy(0);
		if (!irq_grp->napi_ndev)
			return -ENOMEM;

		netif_napi_add(irq_grp->napi_ndev, &irq_grp->napi,
			       ath11k_ahb_ext_grp_napi_poll);

		for (j = 0; j < ATH11K_EXT_IRQ_NUM_MAX; j++) {
+1 −1
Original line number Diff line number Diff line
@@ -174,7 +174,7 @@ struct ath11k_ext_irq_grp {
	u64 timestamp;
	bool napi_enabled;
	struct napi_struct napi;
	struct net_device napi_ndev;
	struct net_device *napi_ndev;
};

enum ath11k_smbios_cc_type {
+17 −4
Original line number Diff line number Diff line
@@ -316,6 +316,7 @@ static void ath11k_pcic_free_ext_irq(struct ath11k_base *ab)
			free_irq(ab->irq_num[irq_grp->irqs[j]], irq_grp);

		netif_napi_del(&irq_grp->napi);
		free_netdev(irq_grp->napi_ndev);
	}
}

@@ -558,7 +559,7 @@ ath11k_pcic_get_msi_irq(struct ath11k_base *ab, unsigned int vector)

static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab)
{
	int i, j, ret, num_vectors = 0;
	int i, j, n, ret, num_vectors = 0;
	u32 user_base_data = 0, base_vector = 0;
	unsigned long irq_flags;

@@ -578,8 +579,11 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab)

		irq_grp->ab = ab;
		irq_grp->grp_id = i;
		init_dummy_netdev(&irq_grp->napi_ndev);
		netif_napi_add(&irq_grp->napi_ndev, &irq_grp->napi,
		irq_grp->napi_ndev = alloc_netdev_dummy(0);
		if (!irq_grp->napi_ndev)
			return -ENOMEM;

		netif_napi_add(irq_grp->napi_ndev, &irq_grp->napi,
			       ath11k_pcic_ext_grp_napi_poll);

		if (ab->hw_params.ring_mask->tx[i] ||
@@ -601,8 +605,13 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab)
			int vector = (i % num_vectors) + base_vector;
			int irq = ath11k_pcic_get_msi_irq(ab, vector);

			if (irq < 0)
			if (irq < 0) {
				for (n = 0; n <= i; n++) {
					irq_grp = &ab->ext_irq_grp[n];
					free_netdev(irq_grp->napi_ndev);
				}
				return irq;
			}

			ab->irq_num[irq_idx] = irq;

@@ -615,6 +624,10 @@ static int ath11k_pcic_ext_irq_config(struct ath11k_base *ab)
			if (ret) {
				ath11k_err(ab, "failed request irq %d: %d\n",
					   vector, ret);
				for (n = 0; n <= i; n++) {
					irq_grp = &ab->ext_irq_grp[n];
					free_netdev(irq_grp->napi_ndev);
				}
				return ret;
			}
		}