Commit 1d4fd8d7 authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville

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: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarFranky Lin <frankyl@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 1e271c95
...@@ -677,20 +677,9 @@ struct brcmf_pub { ...@@ -677,20 +677,9 @@ struct brcmf_pub {
#endif #endif
}; };
/* struct brcmf_if - Interface control information struct bcmevent_name {
* uint event;
* @drvr: back pointer to brcmf_pub const char *name;
* @ndev: interface net device pointer
* @stats: net device statistics
* @idx: iface idx in dongle
* @mac_addr: assigned MAC address
*/
struct brcmf_if {
struct brcmf_pub *drvr;
struct net_device *ndev;
struct net_device_stats stats;
int idx;
u8 mac_addr[ETH_ALEN];
}; };
struct brcmf_if_event { struct brcmf_if_event {
...@@ -700,11 +689,31 @@ struct brcmf_if_event { ...@@ -700,11 +689,31 @@ struct brcmf_if_event {
u8 bssidx; u8 bssidx;
}; };
struct bcmevent_name { /**
uint event; * struct brcmf_if - interface control information.
const char *name; *
* @drvr: points to device related information.
* @ndev: associated network device.
* @stats: interface specific network statistics.
* @idx: interface index in device firmware.
* @bssidx: index of bss associated with this interface.
* @mac_addr: assigned mac address.
*/
struct brcmf_if {
struct brcmf_pub *drvr;
struct net_device *ndev;
struct net_device_stats stats;
int idx;
s32 bssidx;
u8 mac_addr[ETH_ALEN];
}; };
static inline s32 brcmf_ndev_bssidx(struct net_device *ndev)
{
struct brcmf_if *ifp = netdev_priv(ndev);
return ifp->bssidx;
}
extern const struct bcmevent_name bcmevent_names[]; extern const struct bcmevent_name bcmevent_names[];
extern uint brcmf_c_mkiovar(char *name, char *data, uint datalen, extern uint brcmf_c_mkiovar(char *name, char *data, uint datalen,
......
...@@ -111,7 +111,7 @@ extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, ...@@ -111,7 +111,7 @@ extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp,
extern int brcmf_bus_start(struct device *dev); extern int brcmf_bus_start(struct device *dev);
extern int brcmf_add_if(struct device *dev, int ifidx, extern int brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
char *name, u8 *mac_addr); char *name, u8 *mac_addr);
#ifdef CONFIG_BRCMFMAC_SDIO #ifdef CONFIG_BRCMFMAC_SDIO
......
...@@ -480,7 +480,8 @@ brcmf_c_host_event(struct brcmf_pub *drvr, int *ifidx, void *pktdata, ...@@ -480,7 +480,8 @@ brcmf_c_host_event(struct brcmf_pub *drvr, int *ifidx, void *pktdata,
if (ifevent->ifidx > 0 && ifevent->ifidx < BRCMF_MAX_IFS) { if (ifevent->ifidx > 0 && ifevent->ifidx < BRCMF_MAX_IFS) {
if (ifevent->action == BRCMF_E_IF_ADD) if (ifevent->action == BRCMF_E_IF_ADD)
brcmf_add_if(drvr->dev, ifevent->ifidx, brcmf_add_if(drvr->dev,
ifevent->ifidx, ifevent->bssidx,
event->ifname, event->ifname,
pvt_data->eth.h_dest); pvt_data->eth.h_dest);
else else
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/if_ether.h> #include <linux/if_ether.h>
#include <linux/if.h> #include <linux/if.h>
#include <linux/netdevice.h>
#include <linux/ieee80211.h> #include <linux/ieee80211.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
......
...@@ -837,7 +837,8 @@ static int brcmf_net_attach(struct brcmf_if *ifp) ...@@ -837,7 +837,8 @@ static int brcmf_net_attach(struct brcmf_if *ifp)
} }
int int
brcmf_add_if(struct device *dev, int ifidx, char *name, u8 *mac_addr) brcmf_add_if(struct device *dev, int ifidx, s32 bssidx,
char *name, u8 *mac_addr)
{ {
struct brcmf_if *ifp; struct brcmf_if *ifp;
struct net_device *ndev; struct net_device *ndev;
...@@ -872,6 +873,7 @@ brcmf_add_if(struct device *dev, int ifidx, char *name, u8 *mac_addr) ...@@ -872,6 +873,7 @@ brcmf_add_if(struct device *dev, int ifidx, char *name, u8 *mac_addr)
ifp->drvr = drvr; ifp->drvr = drvr;
drvr->iflist[ifidx] = ifp; drvr->iflist[ifidx] = ifp;
ifp->idx = ifidx; ifp->idx = ifidx;
ifp->bssidx = bssidx;
if (mac_addr != NULL) if (mac_addr != NULL)
memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN); memcpy(&ifp->mac_addr, mac_addr, ETH_ALEN);
...@@ -1002,6 +1004,7 @@ int brcmf_bus_start(struct device *dev) ...@@ -1002,6 +1004,7 @@ int brcmf_bus_start(struct device *dev)
setbit(drvr->eventmask, BRCMF_E_TXFAIL); setbit(drvr->eventmask, BRCMF_E_TXFAIL);
setbit(drvr->eventmask, BRCMF_E_JOIN_START); setbit(drvr->eventmask, BRCMF_E_JOIN_START);
setbit(drvr->eventmask, BRCMF_E_SCAN_COMPLETE); setbit(drvr->eventmask, BRCMF_E_SCAN_COMPLETE);
setbit(drvr->eventmask, BRCMF_E_IF);
/* enable dongle roaming event */ /* enable dongle roaming event */
...@@ -1015,7 +1018,7 @@ int brcmf_bus_start(struct device *dev) ...@@ -1015,7 +1018,7 @@ int brcmf_bus_start(struct device *dev)
return ret; return ret;
/* add primary networking interface */ /* add primary networking interface */
ret = brcmf_add_if(dev, 0, "wlan%d", drvr->mac); ret = brcmf_add_if(dev, 0, 0, "wlan%d", drvr->mac);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -3769,7 +3769,7 @@ brcmf_vndr_ie(u8 *iebuf, s32 pktflag, u8 *ie_ptr, u32 ie_len, s8 *add_del_cmd) ...@@ -3769,7 +3769,7 @@ brcmf_vndr_ie(u8 *iebuf, s32 pktflag, u8 *ie_ptr, u32 ie_len, s8 *add_del_cmd)
static s32 static s32
brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg,
struct net_device *ndev, s32 bssidx, s32 pktflag, struct net_device *ndev, s32 pktflag,
u8 *vndr_ie_buf, u32 vndr_ie_len) u8 *vndr_ie_buf, u32 vndr_ie_len)
{ {
s32 err = 0; s32 err = 0;
...@@ -3785,6 +3785,7 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, ...@@ -3785,6 +3785,7 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg,
struct parsed_vndr_ies new_vndr_ies; struct parsed_vndr_ies new_vndr_ies;
struct parsed_vndr_ie_info *vndrie_info; struct parsed_vndr_ie_info *vndrie_info;
s32 i; s32 i;
s32 bssidx = brcmf_ndev_bssidx(ndev);
u8 *ptr; u8 *ptr;
int remained_buf_len; int remained_buf_len;
...@@ -3811,7 +3812,6 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg, ...@@ -3811,7 +3812,6 @@ brcmf_set_management_ie(struct brcmf_cfg80211_info *cfg,
WL_ERR("not suitable type\n"); WL_ERR("not suitable type\n");
goto exit; goto exit;
} }
bssidx = 0;
} else { } else {
err = -EPERM; err = -EPERM;
WL_ERR("not suitable type\n"); WL_ERR("not suitable type\n");
...@@ -4023,7 +4023,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, ...@@ -4023,7 +4023,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
cfg->ap_info->security_mode = false; cfg->ap_info->security_mode = false;
} }
/* Set Beacon IEs to FW */ /* Set Beacon IEs to FW */
err = brcmf_set_management_ie(cfg, ndev, bssidx, err = brcmf_set_management_ie(cfg, ndev,
VNDR_IE_BEACON_FLAG, VNDR_IE_BEACON_FLAG,
(u8 *)settings->beacon.tail, (u8 *)settings->beacon.tail,
settings->beacon.tail_len); settings->beacon.tail_len);
...@@ -4033,7 +4033,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, ...@@ -4033,7 +4033,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
WL_TRACE("Applied Vndr IEs for Beacon\n"); WL_TRACE("Applied Vndr IEs for Beacon\n");
/* Set Probe Response IEs to FW */ /* Set Probe Response IEs to FW */
err = brcmf_set_management_ie(cfg, ndev, bssidx, err = brcmf_set_management_ie(cfg, ndev,
VNDR_IE_PRBRSP_FLAG, VNDR_IE_PRBRSP_FLAG,
(u8 *)settings->beacon.proberesp_ies, (u8 *)settings->beacon.proberesp_ies,
settings->beacon.proberesp_ies_len); settings->beacon.proberesp_ies_len);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment