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

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

brcmfmac: rework driver initialization in brcmf_bus_start()



In brcmf_bus_start() a number of settings are sent to the device. For
this functions are used that bypass the common firmware interface.
By reordering the code in brcmf_bus_start() this bypass can be removed.

Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarFranky Lin <frankyl@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 1d4fd8d7
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -735,6 +735,9 @@ extern int brcmf_c_host_event(struct brcmf_pub *drvr, int *idx,
			      void *pktdata, struct brcmf_event_msg *,
			      void *pktdata, struct brcmf_event_msg *,
			      void **data_ptr);
			      void **data_ptr);


extern int brcmf_net_attach(struct brcmf_if *ifp);
extern struct brcmf_if *brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
				     char *name, u8 *mac_addr);
extern void brcmf_del_if(struct brcmf_pub *drvr, int ifidx);
extern void brcmf_del_if(struct brcmf_pub *drvr, int ifidx);


extern void brcmf_c_pktfilter_offload_set(struct brcmf_pub *drvr, char *arg);
extern void brcmf_c_pktfilter_offload_set(struct brcmf_pub *drvr, char *arg);
+0 −3
Original line number Original line Diff line number Diff line
@@ -111,9 +111,6 @@ extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp,


extern int brcmf_bus_start(struct device *dev);
extern int brcmf_bus_start(struct device *dev);


extern int brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
			char *name, u8 *mac_addr);

#ifdef CONFIG_BRCMFMAC_SDIO
#ifdef CONFIG_BRCMFMAC_SDIO
extern void brcmf_sdio_exit(void);
extern void brcmf_sdio_exit(void);
extern void brcmf_sdio_init(void);
extern void brcmf_sdio_init(void);
+11 −6
Original line number Original line Diff line number Diff line
@@ -444,6 +444,7 @@ brcmf_c_host_event(struct brcmf_pub *drvr, int *ifidx, void *pktdata,
	/* check whether packet is a BRCM event pkt */
	/* check whether packet is a BRCM event pkt */
	struct brcmf_event *pvt_data = (struct brcmf_event *) pktdata;
	struct brcmf_event *pvt_data = (struct brcmf_event *) pktdata;
	struct brcmf_if_event *ifevent;
	struct brcmf_if_event *ifevent;
	struct brcmf_if *ifp;
	char *event_data;
	char *event_data;
	u32 type, status;
	u32 type, status;
	u16 flags;
	u16 flags;
@@ -479,13 +480,17 @@ brcmf_c_host_event(struct brcmf_pub *drvr, int *ifidx, void *pktdata,
		brcmf_dbg(TRACE, "if event\n");
		brcmf_dbg(TRACE, "if event\n");


		if (ifevent->ifidx > 0 && ifevent->ifidx < BRCMF_MAX_IFS) {
		if (ifevent->ifidx > 0 && ifevent->ifidx < BRCMF_MAX_IFS) {
			if (ifevent->action == BRCMF_E_IF_ADD)
			if (ifevent->action == BRCMF_E_IF_ADD) {
				brcmf_add_if(drvr->dev,
				ifp = brcmf_add_if(drvr->dev, ifevent->ifidx,
					     ifevent->ifidx, ifevent->bssidx,
						   ifevent->bssidx,
						   event->ifname,
						   event->ifname,
						   pvt_data->eth.h_dest);
						   pvt_data->eth.h_dest);
			else
				if (IS_ERR(ifp))
					return PTR_ERR(ifp);
				brcmf_net_attach(ifp);
			} else {
				brcmf_del_if(drvr, ifevent->ifidx);
				brcmf_del_if(drvr, ifevent->ifidx);
			}
		} else {
		} else {
			brcmf_dbg(ERROR, "Invalid ifidx %d for %s\n",
			brcmf_dbg(ERROR, "Invalid ifidx %d for %s\n",
				  ifevent->ifidx, event->ifname);
				  ifevent->ifidx, event->ifname);
+23 −28
Original line number Original line Diff line number Diff line
@@ -779,7 +779,7 @@ static const struct net_device_ops brcmf_netdev_ops_pri = {
	.ndo_set_rx_mode = brcmf_netdev_set_multicast_list
	.ndo_set_rx_mode = brcmf_netdev_set_multicast_list
};
};


static int brcmf_net_attach(struct brcmf_if *ifp)
int brcmf_net_attach(struct brcmf_if *ifp)
{
{
	struct brcmf_pub *drvr = ifp->drvr;
	struct brcmf_pub *drvr = ifp->drvr;
	struct net_device *ndev;
	struct net_device *ndev;
@@ -813,15 +813,6 @@ static int brcmf_net_attach(struct brcmf_if *ifp)


	memcpy(ndev->dev_addr, temp_addr, ETH_ALEN);
	memcpy(ndev->dev_addr, temp_addr, ETH_ALEN);


	/* attach to cfg80211 for primary interface */
	if (!ifp->idx) {
		drvr->config = brcmf_cfg80211_attach(ndev, drvr->dev, drvr);
		if (drvr->config == NULL) {
			brcmf_dbg(ERROR, "wl_cfg80211_attach failed\n");
			goto fail;
		}
	}

	if (register_netdev(ndev) != 0) {
	if (register_netdev(ndev) != 0) {
		brcmf_dbg(ERROR, "couldn't register the net device\n");
		brcmf_dbg(ERROR, "couldn't register the net device\n");
		goto fail;
		goto fail;
@@ -833,11 +824,11 @@ static int brcmf_net_attach(struct brcmf_if *ifp)


fail:
fail:
	ndev->netdev_ops = NULL;
	ndev->netdev_ops = NULL;
	free_netdev(ndev);
	return -EBADE;
	return -EBADE;
}
}


int
struct brcmf_if *brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
			      char *name, u8 *mac_addr)
			      char *name, u8 *mac_addr)
{
{
	struct brcmf_if *ifp;
	struct brcmf_if *ifp;
@@ -865,7 +856,7 @@ brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
	ndev = alloc_netdev(sizeof(struct brcmf_if), name, ether_setup);
	ndev = alloc_netdev(sizeof(struct brcmf_if), name, ether_setup);
	if (!ndev) {
	if (!ndev) {
		brcmf_dbg(ERROR, "OOM - alloc_netdev\n");
		brcmf_dbg(ERROR, "OOM - alloc_netdev\n");
		return -ENOMEM;
		return ERR_PTR(-ENOMEM);
	}
	}


	ifp = netdev_priv(ndev);
	ifp = netdev_priv(ndev);
@@ -877,17 +868,10 @@ brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
	if (mac_addr != NULL)
	if (mac_addr != NULL)
		memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN);
		memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN);


	if (brcmf_net_attach(ifp)) {
		brcmf_dbg(ERROR, "brcmf_net_attach failed");
		free_netdev(ifp->ndev);
		drvr->iflist[ifidx] = NULL;
		return -EOPNOTSUPP;
	}

	brcmf_dbg(TRACE, " ==== pid:%x, net_device for if:%s created ===\n",
	brcmf_dbg(TRACE, " ==== pid:%x, net_device for if:%s created ===\n",
		  current->pid, ifp->ndev->name);
		  current->pid, ifp->ndev->name);


	return 0;
	return ifp;
}
}


void brcmf_del_if(struct brcmf_pub *drvr, int ifidx)
void brcmf_del_if(struct brcmf_pub *drvr, int ifidx)
@@ -970,6 +954,7 @@ int brcmf_bus_start(struct device *dev)
	char iovbuf[BRCMF_EVENTING_MASK_LEN + 12];
	char iovbuf[BRCMF_EVENTING_MASK_LEN + 12];
	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
	struct brcmf_pub *drvr = bus_if->drvr;
	struct brcmf_pub *drvr = bus_if->drvr;
	struct brcmf_if *ifp;


	brcmf_dbg(TRACE, "\n");
	brcmf_dbg(TRACE, "\n");


@@ -1006,21 +991,31 @@ int brcmf_bus_start(struct device *dev)
	setbit(drvr->eventmask, BRCMF_E_SCAN_COMPLETE);
	setbit(drvr->eventmask, BRCMF_E_SCAN_COMPLETE);
	setbit(drvr->eventmask, BRCMF_E_IF);
	setbit(drvr->eventmask, BRCMF_E_IF);


/* enable dongle roaming event */

	drvr->pktfilter_count = 1;
	/* Setup filter to allow only unicast */
	/* Setup filter to allow only unicast */
	drvr->pktfilter_count = 1;
	drvr->pktfilter[0] = "100 0 0 0 0x01 0x00";
	drvr->pktfilter[0] = "100 0 0 0 0x01 0x00";


	/* add primary networking interface */
	ifp = brcmf_add_if(dev, 0, 0, "wlan%d", drvr->mac);
	if (IS_ERR(ifp))
		return PTR_ERR(ifp);

	/* Bus is ready, do any protocol initialization */
	/* Bus is ready, do any protocol initialization */
	ret = brcmf_proto_init(drvr);
	ret = brcmf_proto_init(drvr);
	if (ret < 0)
	if (ret < 0)
		return ret;
		return ret;


	/* add primary networking interface */
	drvr->config = brcmf_cfg80211_attach(drvr);
	ret = brcmf_add_if(dev, 0, 0, "wlan%d", drvr->mac);
	if (drvr->config == NULL)
	if (ret < 0)
		return -ENOMEM;

	ret = brcmf_net_attach(ifp);
	if (ret < 0) {
		brcmf_dbg(ERROR, "brcmf_net_attach failed");
		drvr->iflist[0] = NULL;
		return ret;
		return ret;
	}



	/* signal bus ready */
	/* signal bus ready */
	bus_if->state = BRCMF_BUS_DATA;
	bus_if->state = BRCMF_BUS_DATA;
+3 −3
Original line number Original line Diff line number Diff line
@@ -4939,10 +4939,10 @@ static void wl_deinit_priv(struct brcmf_cfg80211_info *cfg)
	brcmf_deinit_priv_mem(cfg);
	brcmf_deinit_priv_mem(cfg);
}
}


struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct net_device *ndev,
struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr)
						  struct device *busdev,
						  struct brcmf_pub *drvr)
{
{
	struct net_device *ndev = drvr->iflist[0]->ndev;
	struct device *busdev = drvr->dev;
	struct wireless_dev *wdev;
	struct wireless_dev *wdev;
	struct brcmf_cfg80211_info *cfg;
	struct brcmf_cfg80211_info *cfg;
	s32 err = 0;
	s32 err = 0;
Loading