diff options
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c')
| -rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c | 127 | 
1 files changed, 68 insertions, 59 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c index 2a1e5ae0c40..8933f9b31a9 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c @@ -799,6 +799,7 @@ static int brcmf_netdev_open(struct net_device *ndev)  	struct brcmf_bus *bus_if = drvr->bus_if;  	u32 toe_ol;  	s32 ret = 0; +	uint up = 0;  	brcmf_dbg(TRACE, "ifidx %d\n", ifp->idx); @@ -822,6 +823,10 @@ static int brcmf_netdev_open(struct net_device *ndev)  			drvr->iflist[ifp->idx]->ndev->features &=  				~NETIF_F_IP_CSUM;  	} + +	/* make sure RF is ready for work */ +	brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_UP, (char *)&up, sizeof(up)); +  	/* Allow transmit calls */  	netif_start_queue(ndev);  	drvr->bus_if->drvr_up = true; @@ -843,6 +848,63 @@ static const struct net_device_ops brcmf_netdev_ops_pri = {  	.ndo_set_rx_mode = brcmf_netdev_set_multicast_list  }; +static int brcmf_net_attach(struct brcmf_if *ifp) +{ +	struct brcmf_pub *drvr = ifp->drvr; +	struct net_device *ndev; +	u8 temp_addr[ETH_ALEN]; + +	brcmf_dbg(TRACE, "ifidx %d\n", ifp->idx); + +	ndev = drvr->iflist[ifp->idx]->ndev; +	ndev->netdev_ops = &brcmf_netdev_ops_pri; + +	/* +	 * determine mac address to use +	 */ +	if (is_valid_ether_addr(ifp->mac_addr)) +		memcpy(temp_addr, ifp->mac_addr, ETH_ALEN); +	else +		memcpy(temp_addr, drvr->mac, ETH_ALEN); + +	if (ifp->idx == 1) { +		brcmf_dbg(TRACE, "ACCESS POINT MAC:\n"); +		/*  ACCESSPOINT INTERFACE CASE */ +		temp_addr[0] |= 0X02;	/* set bit 2 , +			 - Locally Administered address  */ + +	} +	ndev->hard_header_len = ETH_HLEN + drvr->hdrlen; +	ndev->ethtool_ops = &brcmf_ethtool_ops; + +	drvr->rxsz = ndev->mtu + ndev->hard_header_len + +			      drvr->hdrlen; + +	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) { +		brcmf_dbg(ERROR, "couldn't register the net device\n"); +		goto fail; +	} + +	brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name); + +	return 0; + +fail: +	ndev->netdev_ops = NULL; +	return -EBADE; +} +  int  brcmf_add_if(struct device *dev, int ifidx, char *name, u8 *mac_addr)  { @@ -882,7 +944,7 @@ brcmf_add_if(struct device *dev, int ifidx, char *name, u8 *mac_addr)  	if (mac_addr != NULL)  		memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN); -	if (brcmf_net_attach(drvr, ifp->idx)) { +	if (brcmf_net_attach(ifp)) {  		brcmf_dbg(ERROR, "brcmf_net_attach failed");  		free_netdev(ifp->ndev);  		drvr->iflist[ifidx] = NULL; @@ -1016,69 +1078,16 @@ int brcmf_bus_start(struct device *dev)  	if (ret < 0)  		return ret; +	/* add primary networking interface */ +	ret = brcmf_add_if(dev, 0, "wlan%d", drvr->mac); +	if (ret < 0) +		return ret; +  	/* signal bus ready */  	bus_if->state = BRCMF_BUS_DATA;  	return 0;  } -int brcmf_net_attach(struct brcmf_pub *drvr, int ifidx) -{ -	struct net_device *ndev; -	u8 temp_addr[ETH_ALEN] = { -		0x00, 0x90, 0x4c, 0x11, 0x22, 0x33}; - -	brcmf_dbg(TRACE, "ifidx %d\n", ifidx); - -	ndev = drvr->iflist[ifidx]->ndev; -	ndev->netdev_ops = &brcmf_netdev_ops_pri; - -	/* -	 * We have to use the primary MAC for virtual interfaces -	 */ -	if (ifidx != 0) { -		/* for virtual interfaces use the primary MAC  */ -		memcpy(temp_addr, drvr->mac, ETH_ALEN); - -	} - -	if (ifidx == 1) { -		brcmf_dbg(TRACE, "ACCESS POINT MAC:\n"); -		/*  ACCESSPOINT INTERFACE CASE */ -		temp_addr[0] |= 0X02;	/* set bit 2 , -			 - Locally Administered address  */ - -	} -	ndev->hard_header_len = ETH_HLEN + drvr->hdrlen; -	ndev->ethtool_ops = &brcmf_ethtool_ops; - -	drvr->rxsz = ndev->mtu + ndev->hard_header_len + -			      drvr->hdrlen; - -	memcpy(ndev->dev_addr, temp_addr, ETH_ALEN); - -	/* attach to cfg80211 for primary interface */ -	if (!ifidx) { -		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) { -		brcmf_dbg(ERROR, "couldn't register the net device\n"); -		goto fail; -	} - -	brcmf_dbg(INFO, "%s: Broadcom Dongle Host Driver\n", ndev->name); - -	return 0; - -fail: -	ndev->netdev_ops = NULL; -	return -EBADE; -} -  static void brcmf_bus_detach(struct brcmf_pub *drvr)  {  	brcmf_dbg(TRACE, "Enter\n");  |