aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2012-10-22 13:36:19 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-10-29 15:28:22 -0400
commit1d4fd8d78f465cebe2502671588f75ba2f758cfa (patch)
tree7269d4d4cfd8e074462f76305e2bf35309c2c7ff /drivers/net/wireless/brcm80211
parent1e271c9564132d9b5906819d7c62fbb5669ae8e9 (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')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd.h43
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c3
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_dbg.c1
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c7
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c8
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 680struct 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 */
688struct 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
696struct brcmf_if_event { 685struct brcmf_if_event {
@@ -700,11 +689,31 @@ struct brcmf_if_event {
700 u8 bssidx; 689 u8 bssidx;
701}; 690};
702 691
703struct 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 */
702struct 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
711static inline s32 brcmf_ndev_bssidx(struct net_device *ndev)
712{
713 struct brcmf_if *ifp = netdev_priv(ndev);
714 return ifp->bssidx;
715}
716
708extern const struct bcmevent_name bcmevent_names[]; 717extern const struct bcmevent_name bcmevent_names[];
709 718
710extern uint brcmf_c_mkiovar(char *name, char *data, uint datalen, 719extern 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
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, 114extern 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
839int 839int
840brcmf_add_if(struct device *dev, int ifidx, char *name, u8 *mac_addr) 840brcmf_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
3770static s32 3770static s32
3771brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, 3771brcmf_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);