diff options
author | Arend van Spriel <arend@broadcom.com> | 2012-10-22 13:36:19 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-10-29 15:28:22 -0400 |
commit | 1d4fd8d78f465cebe2502671588f75ba2f758cfa (patch) | |
tree | 7269d4d4cfd8e074462f76305e2bf35309c2c7ff /drivers/net/wireless/brcm80211 | |
parent | 1e271c9564132d9b5906819d7c62fbb5669ae8e9 (diff) |
brcmfmac: extend struct brcmf_if with bssidx field
When the firmware notifies the driver about adding a new interface
it also provides an index for the bss associated with this interface.
This index will be needed for upcoming features like peer-to-peer.
By adding this index in struct brcmf_if it is easy to obtain as this
will be associated with the net_device private data.
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/wireless/brcm80211')
6 files changed, 39 insertions, 25 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h index faa81efbfbbb..d848bb934b7d 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd.h | |||
@@ -677,20 +677,9 @@ struct brcmf_pub { | |||
677 | #endif | 677 | #endif |
678 | }; | 678 | }; |
679 | 679 | ||
680 | /* struct brcmf_if - Interface control information | 680 | struct bcmevent_name { |
681 | * | 681 | uint event; |
682 | * @drvr: back pointer to brcmf_pub | 682 | const char *name; |
683 | * @ndev: interface net device pointer | ||
684 | * @stats: net device statistics | ||
685 | * @idx: iface idx in dongle | ||
686 | * @mac_addr: assigned MAC address | ||
687 | */ | ||
688 | struct brcmf_if { | ||
689 | struct brcmf_pub *drvr; | ||
690 | struct net_device *ndev; | ||
691 | struct net_device_stats stats; | ||
692 | int idx; | ||
693 | u8 mac_addr[ETH_ALEN]; | ||
694 | }; | 683 | }; |
695 | 684 | ||
696 | struct brcmf_if_event { | 685 | struct brcmf_if_event { |
@@ -700,11 +689,31 @@ struct brcmf_if_event { | |||
700 | u8 bssidx; | 689 | u8 bssidx; |
701 | }; | 690 | }; |
702 | 691 | ||
703 | struct bcmevent_name { | 692 | /** |
704 | uint event; | 693 | * struct brcmf_if - interface control information. |
705 | const char *name; | 694 | * |
695 | * @drvr: points to device related information. | ||
696 | * @ndev: associated network device. | ||
697 | * @stats: interface specific network statistics. | ||
698 | * @idx: interface index in device firmware. | ||
699 | * @bssidx: index of bss associated with this interface. | ||
700 | * @mac_addr: assigned mac address. | ||
701 | */ | ||
702 | struct brcmf_if { | ||
703 | struct brcmf_pub *drvr; | ||
704 | struct net_device *ndev; | ||
705 | struct net_device_stats stats; | ||
706 | int idx; | ||
707 | s32 bssidx; | ||
708 | u8 mac_addr[ETH_ALEN]; | ||
706 | }; | 709 | }; |
707 | 710 | ||
711 | static inline s32 brcmf_ndev_bssidx(struct net_device *ndev) | ||
712 | { | ||
713 | struct brcmf_if *ifp = netdev_priv(ndev); | ||
714 | return ifp->bssidx; | ||
715 | } | ||
716 | |||
708 | extern const struct bcmevent_name bcmevent_names[]; | 717 | extern const struct bcmevent_name bcmevent_names[]; |
709 | 718 | ||
710 | extern uint brcmf_c_mkiovar(char *name, char *data, uint datalen, | 719 | extern uint brcmf_c_mkiovar(char *name, char *data, uint datalen, |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h index 9b8ee19ea55d..ba42e4ec1cf7 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h | |||
@@ -111,7 +111,7 @@ 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, | 114 | extern int brcmf_add_if(struct device *dev, int ifidx, s32 bssidx, |
115 | char *name, u8 *mac_addr); | 115 | char *name, u8 *mac_addr); |
116 | 116 | ||
117 | #ifdef CONFIG_BRCMFMAC_SDIO | 117 | #ifdef CONFIG_BRCMFMAC_SDIO |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c index aa4f719a51a9..bc6279184c7e 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c | |||
@@ -480,7 +480,8 @@ brcmf_c_host_event(struct brcmf_pub *drvr, int *ifidx, void *pktdata, | |||
480 | 480 | ||
481 | if (ifevent->ifidx > 0 && ifevent->ifidx < BRCMF_MAX_IFS) { | 481 | if (ifevent->ifidx > 0 && ifevent->ifidx < BRCMF_MAX_IFS) { |
482 | if (ifevent->action == BRCMF_E_IF_ADD) | 482 | if (ifevent->action == BRCMF_E_IF_ADD) |
483 | brcmf_add_if(drvr->dev, ifevent->ifidx, | 483 | brcmf_add_if(drvr->dev, |
484 | ifevent->ifidx, ifevent->bssidx, | ||
484 | event->ifname, | 485 | event->ifname, |
485 | pvt_data->eth.h_dest); | 486 | pvt_data->eth.h_dest); |
486 | else | 487 | else |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c index fa08058aadaa..862d2acb7a16 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/debugfs.h> | 16 | #include <linux/debugfs.h> |
17 | #include <linux/if_ether.h> | 17 | #include <linux/if_ether.h> |
18 | #include <linux/if.h> | 18 | #include <linux/if.h> |
19 | #include <linux/netdevice.h> | ||
19 | #include <linux/ieee80211.h> | 20 | #include <linux/ieee80211.h> |
20 | #include <linux/module.h> | 21 | #include <linux/module.h> |
21 | #include <linux/netdevice.h> | 22 | #include <linux/netdevice.h> |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c index c524b04efe5a..f603032d3d09 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c | |||
@@ -837,7 +837,8 @@ fail: | |||
837 | } | 837 | } |
838 | 838 | ||
839 | int | 839 | int |
840 | brcmf_add_if(struct device *dev, int ifidx, char *name, u8 *mac_addr) | 840 | brcmf_add_if(struct device *dev, int ifidx, s32 bssidx, |
841 | char *name, u8 *mac_addr) | ||
841 | { | 842 | { |
842 | struct brcmf_if *ifp; | 843 | struct brcmf_if *ifp; |
843 | struct net_device *ndev; | 844 | struct net_device *ndev; |
@@ -872,6 +873,7 @@ brcmf_add_if(struct device *dev, int ifidx, char *name, u8 *mac_addr) | |||
872 | ifp->drvr = drvr; | 873 | ifp->drvr = drvr; |
873 | drvr->iflist[ifidx] = ifp; | 874 | drvr->iflist[ifidx] = ifp; |
874 | ifp->idx = ifidx; | 875 | ifp->idx = ifidx; |
876 | ifp->bssidx = bssidx; | ||
875 | if (mac_addr != NULL) | 877 | if (mac_addr != NULL) |
876 | memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN); | 878 | memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN); |
877 | 879 | ||
@@ -1002,6 +1004,7 @@ int brcmf_bus_start(struct device *dev) | |||
1002 | setbit(drvr->eventmask, BRCMF_E_TXFAIL); | 1004 | setbit(drvr->eventmask, BRCMF_E_TXFAIL); |
1003 | setbit(drvr->eventmask, BRCMF_E_JOIN_START); | 1005 | setbit(drvr->eventmask, BRCMF_E_JOIN_START); |
1004 | setbit(drvr->eventmask, BRCMF_E_SCAN_COMPLETE); | 1006 | setbit(drvr->eventmask, BRCMF_E_SCAN_COMPLETE); |
1007 | setbit(drvr->eventmask, BRCMF_E_IF); | ||
1005 | 1008 | ||
1006 | /* enable dongle roaming event */ | 1009 | /* enable dongle roaming event */ |
1007 | 1010 | ||
@@ -1015,7 +1018,7 @@ int brcmf_bus_start(struct device *dev) | |||
1015 | return ret; | 1018 | return ret; |
1016 | 1019 | ||
1017 | /* add primary networking interface */ | 1020 | /* add primary networking interface */ |
1018 | ret = brcmf_add_if(dev, 0, "wlan%d", drvr->mac); | 1021 | ret = brcmf_add_if(dev, 0, 0, "wlan%d", drvr->mac); |
1019 | if (ret < 0) | 1022 | if (ret < 0) |
1020 | return ret; | 1023 | return ret; |
1021 | 1024 | ||
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index d354b2afe541..24f5580e6e7a 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |||
@@ -3769,7 +3769,7 @@ brcmf_vndr_ie(u8 *iebuf, s32 pktflag, u8 *ie_ptr, u32 ie_len, s8 *add_del_cmd) | |||
3769 | 3769 | ||
3770 | static s32 | 3770 | static s32 |
3771 | brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, | 3771 | brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, |
3772 | struct net_device *ndev, s32 bssidx, s32 pktflag, | 3772 | struct net_device *ndev, s32 pktflag, |
3773 | u8 *vndr_ie_buf, u32 vndr_ie_len) | 3773 | u8 *vndr_ie_buf, u32 vndr_ie_len) |
3774 | { | 3774 | { |
3775 | s32 err = 0; | 3775 | s32 err = 0; |
@@ -3785,6 +3785,7 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, | |||
3785 | struct parsed_vndr_ies new_vndr_ies; | 3785 | struct parsed_vndr_ies new_vndr_ies; |
3786 | struct parsed_vndr_ie_info *vndrie_info; | 3786 | struct parsed_vndr_ie_info *vndrie_info; |
3787 | s32 i; | 3787 | s32 i; |
3788 | s32 bssidx = brcmf_ndev_bssidx(ndev); | ||
3788 | u8 *ptr; | 3789 | u8 *ptr; |
3789 | int remained_buf_len; | 3790 | int remained_buf_len; |
3790 | 3791 | ||
@@ -3811,7 +3812,6 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, | |||
3811 | WL_ERR("not suitable type\n"); | 3812 | WL_ERR("not suitable type\n"); |
3812 | goto exit; | 3813 | goto exit; |
3813 | } | 3814 | } |
3814 | bssidx = 0; | ||
3815 | } else { | 3815 | } else { |
3816 | err = -EPERM; | 3816 | err = -EPERM; |
3817 | WL_ERR("not suitable type\n"); | 3817 | WL_ERR("not suitable type\n"); |
@@ -4023,7 +4023,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, | |||
4023 | cfg->ap_info->security_mode = false; | 4023 | cfg->ap_info->security_mode = false; |
4024 | } | 4024 | } |
4025 | /* Set Beacon IEs to FW */ | 4025 | /* Set Beacon IEs to FW */ |
4026 | err = brcmf_set_management_ie(cfg, ndev, bssidx, | 4026 | err = brcmf_set_management_ie(cfg, ndev, |
4027 | VNDR_IE_BEACON_FLAG, | 4027 | VNDR_IE_BEACON_FLAG, |
4028 | (u8 *)settings->beacon.tail, | 4028 | (u8 *)settings->beacon.tail, |
4029 | settings->beacon.tail_len); | 4029 | settings->beacon.tail_len); |
@@ -4033,7 +4033,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, | |||
4033 | WL_TRACE("Applied Vndr IEs for Beacon\n"); | 4033 | WL_TRACE("Applied Vndr IEs for Beacon\n"); |
4034 | 4034 | ||
4035 | /* Set Probe Response IEs to FW */ | 4035 | /* Set Probe Response IEs to FW */ |
4036 | err = brcmf_set_management_ie(cfg, ndev, bssidx, | 4036 | err = brcmf_set_management_ie(cfg, ndev, |
4037 | VNDR_IE_PRBRSP_FLAG, | 4037 | VNDR_IE_PRBRSP_FLAG, |
4038 | (u8 *)settings->beacon.proberesp_ies, | 4038 | (u8 *)settings->beacon.proberesp_ies, |
4039 | settings->beacon.proberesp_ies_len); | 4039 | settings->beacon.proberesp_ies_len); |