You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.9 KiB
93 lines
2.9 KiB
![]()
9 years ago
|
From: Arend van Spriel <arend@broadcom.com>
|
||
|
Date: Wed, 26 Aug 2015 22:15:00 +0200
|
||
|
Subject: [PATCH] brcmfmac: add mapping for interface index to bsscfg
|
||
|
index
|
||
|
|
||
|
Because the P2P Device interface in firmware uses the same interface
|
||
|
index as the primary interface we use the bsscfg index as index in the
|
||
|
struct brcmf_pub::iflist. However, in the data path we get the interface
|
||
|
index and not the bsscfg index. So we need a mapping of interface index
|
||
|
to bsscfg index, which can be determined upon handle adding the interface.
|
||
|
|
||
|
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
|
||
|
Reviewed-by: Franky (Zhenhui) Lin <frankyl@broadcom.com>
|
||
|
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
|
||
|
Signed-off-by: Arend van Spriel <arend@broadcom.com>
|
||
|
---
|
||
|
|
||
|
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
|
||
|
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
|
||
|
@@ -85,21 +85,20 @@ char *brcmf_ifname(struct brcmf_pub *drv
|
||
|
|
||
|
struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx)
|
||
|
{
|
||
|
+ struct brcmf_if *ifp;
|
||
|
+ s32 bssidx;
|
||
|
+
|
||
|
if (ifidx < 0 || ifidx >= BRCMF_MAX_IFS) {
|
||
|
brcmf_err("ifidx %d out of range\n", ifidx);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
- /* The ifidx is the idx to map to matching netdev/ifp. When receiving
|
||
|
- * events this is easy because it contains the bssidx which maps
|
||
|
- * 1-on-1 to the netdev/ifp. But for data frames the ifidx is rcvd.
|
||
|
- * bssidx 1 is used for p2p0 and no data can be received or
|
||
|
- * transmitted on it. Therefor bssidx is ifidx + 1 if ifidx > 0
|
||
|
- */
|
||
|
- if (ifidx)
|
||
|
- ifidx++;
|
||
|
+ ifp = NULL;
|
||
|
+ bssidx = drvr->if2bss[ifidx];
|
||
|
+ if (bssidx >= 0)
|
||
|
+ ifp = drvr->iflist[bssidx];
|
||
|
|
||
|
- return drvr->iflist[ifidx];
|
||
|
+ return ifp;
|
||
|
}
|
||
|
|
||
|
static void _brcmf_set_multicast_list(struct work_struct *work)
|
||
|
@@ -831,6 +830,8 @@ struct brcmf_if *brcmf_add_if(struct brc
|
||
|
|
||
|
ifp = netdev_priv(ndev);
|
||
|
ifp->ndev = ndev;
|
||
|
+ /* store mapping ifidx to bssidx */
|
||
|
+ drvr->if2bss[ifidx] = bssidx;
|
||
|
}
|
||
|
|
||
|
ifp->drvr = drvr;
|
||
|
@@ -855,6 +856,7 @@ static void brcmf_del_if(struct brcmf_pu
|
||
|
struct brcmf_if *ifp;
|
||
|
|
||
|
ifp = drvr->iflist[bssidx];
|
||
|
+ drvr->if2bss[ifp->ifidx] = -1;
|
||
|
drvr->iflist[bssidx] = NULL;
|
||
|
if (!ifp) {
|
||
|
brcmf_err("Null interface, idx=%d\n", bssidx);
|
||
|
@@ -862,6 +864,7 @@ static void brcmf_del_if(struct brcmf_pu
|
||
|
}
|
||
|
brcmf_dbg(TRACE, "Enter, idx=%d, ifidx=%d\n", bssidx, ifp->ifidx);
|
||
|
if (ifp->ndev) {
|
||
|
+ drvr->if2bss[ifp->ifidx] = -1;
|
||
|
if (bssidx == 0) {
|
||
|
if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) {
|
||
|
rtnl_lock();
|
||
|
@@ -926,6 +929,7 @@ int brcmf_attach(struct device *dev)
|
||
|
if (!drvr)
|
||
|
return -ENOMEM;
|
||
|
|
||
|
+ memset(drvr->if2bss, 0xFF, sizeof(drvr->if2bss));
|
||
|
mutex_init(&drvr->proto_block);
|
||
|
|
||
|
/* Link to bus module */
|
||
|
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.h
|
||
|
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.h
|
||
|
@@ -122,6 +122,7 @@ struct brcmf_pub {
|
||
|
struct mac_address addresses[BRCMF_MAX_IFS];
|
||
|
|
||
|
struct brcmf_if *iflist[BRCMF_MAX_IFS];
|
||
|
+ s32 if2bss[BRCMF_MAX_IFS];
|
||
|
|
||
|
struct mutex proto_block;
|
||
|
unsigned char proto_buf[BRCMF_DCMD_MAXLEN];
|