diff options
author | Arend van Spriel <arend@broadcom.com> | 2012-10-22 13:36:20 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-10-29 15:28:23 -0400 |
commit | 1ed9baf0f12168c8ba2410fd9ccd578f7867c564 (patch) | |
tree | b40cc04031ac437fe4dfdbf9ab7f1cb96cb6d481 /drivers/net | |
parent | 1d4fd8d78f465cebe2502671588f75ba2f758cfa (diff) |
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: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
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 | ||
738 | extern int brcmf_net_attach(struct brcmf_if *ifp); | ||
739 | extern struct brcmf_if *brcmf_add_if(struct device *dev, int ifidx, s32 bssidx, | ||
740 | char *name, u8 *mac_addr); | ||
738 | extern void brcmf_del_if(struct brcmf_pub *drvr, int ifidx); | 741 | extern void brcmf_del_if(struct brcmf_pub *drvr, int ifidx); |
739 | 742 | ||
740 | extern void brcmf_c_pktfilter_offload_set(struct brcmf_pub *drvr, char *arg); | 743 | extern 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 | ||
112 | extern int brcmf_bus_start(struct device *dev); | 112 | extern int brcmf_bus_start(struct device *dev); |
113 | 113 | ||
114 | extern 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 |
118 | extern void brcmf_sdio_exit(void); | 115 | extern void brcmf_sdio_exit(void); |
119 | extern void brcmf_sdio_init(void); | 116 | extern 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 | ||
782 | static int brcmf_net_attach(struct brcmf_if *ifp) | 782 | int 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 | ||
834 | fail: | 825 | fail: |
835 | ndev->netdev_ops = NULL; | 826 | ndev->netdev_ops = NULL; |
827 | free_netdev(ndev); | ||
836 | return -EBADE; | 828 | return -EBADE; |
837 | } | 829 | } |
838 | 830 | ||
839 | int | 831 | struct brcmf_if *brcmf_add_if(struct device *dev, int ifidx, s32 bssidx, |
840 | brcmf_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 | ||
893 | void brcmf_del_if(struct brcmf_pub *drvr, int ifidx) | 877 | void 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 | ||
4942 | struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct net_device *ndev, | 4942 | struct 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 | ||
503 | struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct net_device *ndev, | 503 | struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr); |
504 | struct device *busdev, | ||
505 | struct brcmf_pub *drvr); | ||
506 | void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg); | 504 | void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg); |
507 | 505 | ||
508 | /* event handler from dongle */ | 506 | /* event handler from dongle */ |