aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd.h3
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h3
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c17
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c51
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c6
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h4
6 files changed, 41 insertions, 43 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
index d848bb934b7d..51d775412907 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h
@@ -735,6 +735,9 @@ extern int brcmf_c_host_event(struct brcmf_pub *drvr, int *idx,
735 void *pktdata, struct brcmf_event_msg *, 735 void *pktdata, struct brcmf_event_msg *,
736 void **data_ptr); 736 void **data_ptr);
737 737
738extern int brcmf_net_attach(struct brcmf_if *ifp);
739extern struct brcmf_if *brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
740 char *name, u8 *mac_addr);
738extern void brcmf_del_if(struct brcmf_pub *drvr, int ifidx); 741extern void brcmf_del_if(struct brcmf_pub *drvr, int ifidx);
739 742
740extern void brcmf_c_pktfilter_offload_set(struct brcmf_pub *drvr, char *arg); 743extern void brcmf_c_pktfilter_offload_set(struct brcmf_pub *drvr, char *arg);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index ba42e4ec1cf7..265580f5b270 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@ -111,9 +111,6 @@ extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp,
111 111
112extern int brcmf_bus_start(struct device *dev); 112extern int brcmf_bus_start(struct device *dev);
113 113
114extern int brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
115 char *name, u8 *mac_addr);
116
117#ifdef CONFIG_BRCMFMAC_SDIO 114#ifdef CONFIG_BRCMFMAC_SDIO
118extern void brcmf_sdio_exit(void); 115extern void brcmf_sdio_exit(void);
119extern void brcmf_sdio_init(void); 116extern void brcmf_sdio_init(void);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c
index bc6279184c7e..28b3eed1834f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c
@@ -444,6 +444,7 @@ brcmf_c_host_event(struct brcmf_pub *drvr, int *ifidx, void *pktdata,
444 /* check whether packet is a BRCM event pkt */ 444 /* check whether packet is a BRCM event pkt */
445 struct brcmf_event *pvt_data = (struct brcmf_event *) pktdata; 445 struct brcmf_event *pvt_data = (struct brcmf_event *) pktdata;
446 struct brcmf_if_event *ifevent; 446 struct brcmf_if_event *ifevent;
447 struct brcmf_if *ifp;
447 char *event_data; 448 char *event_data;
448 u32 type, status; 449 u32 type, status;
449 u16 flags; 450 u16 flags;
@@ -479,13 +480,17 @@ brcmf_c_host_event(struct brcmf_pub *drvr, int *ifidx, void *pktdata,
479 brcmf_dbg(TRACE, "if event\n"); 480 brcmf_dbg(TRACE, "if event\n");
480 481
481 if (ifevent->ifidx > 0 && ifevent->ifidx < BRCMF_MAX_IFS) { 482 if (ifevent->ifidx > 0 && ifevent->ifidx < BRCMF_MAX_IFS) {
482 if (ifevent->action == BRCMF_E_IF_ADD) 483 if (ifevent->action == BRCMF_E_IF_ADD) {
483 brcmf_add_if(drvr->dev, 484 ifp = brcmf_add_if(drvr->dev, ifevent->ifidx,
484 ifevent->ifidx, ifevent->bssidx, 485 ifevent->bssidx,
485 event->ifname, 486 event->ifname,
486 pvt_data->eth.h_dest); 487 pvt_data->eth.h_dest);
487 else 488 if (IS_ERR(ifp))
489 return PTR_ERR(ifp);
490 brcmf_net_attach(ifp);
491 } else {
488 brcmf_del_if(drvr, ifevent->ifidx); 492 brcmf_del_if(drvr, ifevent->ifidx);
493 }
489 } else { 494 } else {
490 brcmf_dbg(ERROR, "Invalid ifidx %d for %s\n", 495 brcmf_dbg(ERROR, "Invalid ifidx %d for %s\n",
491 ifevent->ifidx, event->ifname); 496 ifevent->ifidx, event->ifname);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index f603032d3d09..b1f26b53fa27 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -779,7 +779,7 @@ static const struct net_device_ops brcmf_netdev_ops_pri = {
779 .ndo_set_rx_mode = brcmf_netdev_set_multicast_list 779 .ndo_set_rx_mode = brcmf_netdev_set_multicast_list
780}; 780};
781 781
782static int brcmf_net_attach(struct brcmf_if *ifp) 782int brcmf_net_attach(struct brcmf_if *ifp)
783{ 783{
784 struct brcmf_pub *drvr = ifp->drvr; 784 struct brcmf_pub *drvr = ifp->drvr;
785 struct net_device *ndev; 785 struct net_device *ndev;
@@ -813,15 +813,6 @@ static int brcmf_net_attach(struct brcmf_if *ifp)
813 813
814 memcpy(ndev->dev_addr, temp_addr, ETH_ALEN); 814 memcpy(ndev->dev_addr, temp_addr, ETH_ALEN);
815 815
816 /* attach to cfg80211 for primary interface */
817 if (!ifp->idx) {
818 drvr->config = brcmf_cfg80211_attach(ndev, drvr->dev, drvr);
819 if (drvr->config == NULL) {
820 brcmf_dbg(ERROR, "wl_cfg80211_attach failed\n");
821 goto fail;
822 }
823 }
824
825 if (register_netdev(ndev) != 0) { 816 if (register_netdev(ndev) != 0) {
826 brcmf_dbg(ERROR, "couldn't register the net device\n"); 817 brcmf_dbg(ERROR, "couldn't register the net device\n");
827 goto fail; 818 goto fail;
@@ -833,12 +824,12 @@ static int brcmf_net_attach(struct brcmf_if *ifp)
833 824
834fail: 825fail:
835 ndev->netdev_ops = NULL; 826 ndev->netdev_ops = NULL;
827 free_netdev(ndev);
836 return -EBADE; 828 return -EBADE;
837} 829}
838 830
839int 831struct brcmf_if *brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
840brcmf_add_if(struct device *dev, int ifidx, s32 bssidx, 832 char *name, u8 *mac_addr)
841 char *name, u8 *mac_addr)
842{ 833{
843 struct brcmf_if *ifp; 834 struct brcmf_if *ifp;
844 struct net_device *ndev; 835 struct net_device *ndev;
@@ -865,7 +856,7 @@ brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
865 ndev = alloc_netdev(sizeof(struct brcmf_if), name, ether_setup); 856 ndev = alloc_netdev(sizeof(struct brcmf_if), name, ether_setup);
866 if (!ndev) { 857 if (!ndev) {
867 brcmf_dbg(ERROR, "OOM - alloc_netdev\n"); 858 brcmf_dbg(ERROR, "OOM - alloc_netdev\n");
868 return -ENOMEM; 859 return ERR_PTR(-ENOMEM);
869 } 860 }
870 861
871 ifp = netdev_priv(ndev); 862 ifp = netdev_priv(ndev);
@@ -877,17 +868,10 @@ brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
877 if (mac_addr != NULL) 868 if (mac_addr != NULL)
878 memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN); 869 memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN);
879 870
880 if (brcmf_net_attach(ifp)) {
881 brcmf_dbg(ERROR, "brcmf_net_attach failed");
882 free_netdev(ifp->ndev);
883 drvr->iflist[ifidx] = NULL;
884 return -EOPNOTSUPP;
885 }
886
887 brcmf_dbg(TRACE, " ==== pid:%x, net_device for if:%s created ===\n", 871 brcmf_dbg(TRACE, " ==== pid:%x, net_device for if:%s created ===\n",
888 current->pid, ifp->ndev->name); 872 current->pid, ifp->ndev->name);
889 873
890 return 0; 874 return ifp;
891} 875}
892 876
893void brcmf_del_if(struct brcmf_pub *drvr, int ifidx) 877void brcmf_del_if(struct brcmf_pub *drvr, int ifidx)
@@ -970,6 +954,7 @@ int brcmf_bus_start(struct device *dev)
970 char iovbuf[BRCMF_EVENTING_MASK_LEN + 12]; 954 char iovbuf[BRCMF_EVENTING_MASK_LEN + 12];
971 struct brcmf_bus *bus_if = dev_get_drvdata(dev); 955 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
972 struct brcmf_pub *drvr = bus_if->drvr; 956 struct brcmf_pub *drvr = bus_if->drvr;
957 struct brcmf_if *ifp;
973 958
974 brcmf_dbg(TRACE, "\n"); 959 brcmf_dbg(TRACE, "\n");
975 960
@@ -1006,21 +991,31 @@ int brcmf_bus_start(struct device *dev)
1006 setbit(drvr->eventmask, BRCMF_E_SCAN_COMPLETE); 991 setbit(drvr->eventmask, BRCMF_E_SCAN_COMPLETE);
1007 setbit(drvr->eventmask, BRCMF_E_IF); 992 setbit(drvr->eventmask, BRCMF_E_IF);
1008 993
1009/* enable dongle roaming event */
1010
1011 drvr->pktfilter_count = 1;
1012 /* Setup filter to allow only unicast */ 994 /* Setup filter to allow only unicast */
995 drvr->pktfilter_count = 1;
1013 drvr->pktfilter[0] = "100 0 0 0 0x01 0x00"; 996 drvr->pktfilter[0] = "100 0 0 0 0x01 0x00";
1014 997
998 /* add primary networking interface */
999 ifp = brcmf_add_if(dev, 0, 0, "wlan%d", drvr->mac);
1000 if (IS_ERR(ifp))
1001 return PTR_ERR(ifp);
1002
1015 /* Bus is ready, do any protocol initialization */ 1003 /* Bus is ready, do any protocol initialization */
1016 ret = brcmf_proto_init(drvr); 1004 ret = brcmf_proto_init(drvr);
1017 if (ret < 0) 1005 if (ret < 0)
1018 return ret; 1006 return ret;
1019 1007
1020 /* add primary networking interface */ 1008 drvr->config = brcmf_cfg80211_attach(drvr);
1021 ret = brcmf_add_if(dev, 0, 0, "wlan%d", drvr->mac); 1009 if (drvr->config == NULL)
1022 if (ret < 0) 1010 return -ENOMEM;
1011
1012 ret = brcmf_net_attach(ifp);
1013 if (ret < 0) {
1014 brcmf_dbg(ERROR, "brcmf_net_attach failed");
1015 drvr->iflist[0] = NULL;
1023 return ret; 1016 return ret;
1017 }
1018
1024 1019
1025 /* signal bus ready */ 1020 /* signal bus ready */
1026 bus_if->state = BRCMF_BUS_DATA; 1021 bus_if->state = BRCMF_BUS_DATA;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 24f5580e6e7a..30e9c127f9c1 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -4939,10 +4939,10 @@ static void wl_deinit_priv(struct brcmf_cfg80211_info *cfg)
4939 brcmf_deinit_priv_mem(cfg); 4939 brcmf_deinit_priv_mem(cfg);
4940} 4940}
4941 4941
4942struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct net_device *ndev, 4942struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr)
4943 struct device *busdev,
4944 struct brcmf_pub *drvr)
4945{ 4943{
4944 struct net_device *ndev = drvr->iflist[0]->ndev;
4945 struct device *busdev = drvr->dev;
4946 struct wireless_dev *wdev; 4946 struct wireless_dev *wdev;
4947 struct brcmf_cfg80211_info *cfg; 4947 struct brcmf_cfg80211_info *cfg;
4948 s32 err = 0; 4948 s32 err = 0;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
index 71ced174748a..191262578e02 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
@@ -500,9 +500,7 @@ brcmf_cfg80211_connect_info *cfg_to_conn(struct brcmf_cfg80211_info *cfg)
500 return &cfg->conn_info; 500 return &cfg->conn_info;
501} 501}
502 502
503struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct net_device *ndev, 503struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr);
504 struct device *busdev,
505 struct brcmf_pub *drvr);
506void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg); 504void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg);
507 505
508/* event handler from dongle */ 506/* event handler from dongle */