Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9df4d542 authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville
Browse files

brcmfmac: use custom destructor callback for all netdevice interfaces



The destructor for net devices was set to free_netdev() to get rid
of it and the private data. The private data refers to a brcmf_if
instance, but indirectly it also refers to brcmf_cfg80211_vif which
holds the wdev. This is freed as well by using a new custom destructor
called brcmf_cfg80211_free_netdev().

Reviewed-by: default avatarHante Meuleman <meuleman@broadcom.com>
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent e1479951
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -702,7 +702,7 @@ int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked)

	brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name);

	ndev->destructor = free_netdev;
	ndev->destructor = brcmf_cfg80211_free_netdev;
	return 0;

fail:
+0 −19
Original line number Diff line number Diff line
@@ -2240,23 +2240,6 @@ static void brcmf_p2p_delete_p2pdev(struct brcmf_p2p_info *p2p,
	brcmf_free_vif(vif);
}

/**
 * brcmf_p2p_free_p2p_if() - free up net device related data.
 *
 * @ndev: net device that needs to be freed.
 */
static void brcmf_p2p_free_p2p_if(struct net_device *ndev)
{
	struct brcmf_cfg80211_vif *vif;
	struct brcmf_if *ifp;

	ifp = netdev_priv(ndev);
	vif = ifp->vif;

	brcmf_free_vif(vif);
	free_netdev(ifp->ndev);
}

/**
 * brcmf_p2p_add_vif() - create a new P2P virtual interface.
 *
@@ -2334,8 +2317,6 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
		brcmf_err("Registering netdevice failed\n");
		goto fail;
	}
	/* override destructor */
	ifp->ndev->destructor = brcmf_p2p_free_p2p_if;

	cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif;
	/* Disable firmware roaming for P2P interface  */
+12 −0
Original line number Diff line number Diff line
@@ -4385,6 +4385,18 @@ void brcmf_free_vif(struct brcmf_cfg80211_vif *vif)
	kfree(vif);
}

void brcmf_cfg80211_free_netdev(struct net_device *ndev)
{
	struct brcmf_cfg80211_vif *vif;
	struct brcmf_if *ifp;

	ifp = netdev_priv(ndev);
	vif = ifp->vif;

	brcmf_free_vif(vif);
	free_netdev(ndev);
}

static bool brcmf_is_linkup(const struct brcmf_event_msg *e)
{
	u32 event = e->event_code;
+1 −0
Original line number Diff line number Diff line
@@ -505,5 +505,6 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
				bool fw_abort);
void brcmf_set_mpc(struct brcmf_if *ndev, int mpc);
void brcmf_abort_scanning(struct brcmf_cfg80211_info *cfg);
void brcmf_cfg80211_free_netdev(struct net_device *ndev);

#endif				/* _wl_cfg80211_h_ */