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>
This commit is contained in:
parent
1e271c9564
commit
1d4fd8d78f
6 changed files with 39 additions and 25 deletions
|
@ -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 {
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
|
|
||||||
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 @@
|
||||||
#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 @@ fail:
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue