brcmfmac: add mapping for interface index to bsscfg index
authorArend van Spriel <arend@broadcom.com>
Wed, 26 Aug 2015 20:15:00 +0000 (22:15 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 29 Sep 2015 07:28:43 +0000 (10:28 +0300)
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>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/brcm80211/brcmfmac/core.c
drivers/net/wireless/brcm80211/brcmfmac/core.h

index cd0bffe282c67394c5a7322186549e7a302ec17d..5d81b74efb66ada480bad14854f1240eebf2f26c 100644 (file)
@@ -85,21 +85,20 @@ char *brcmf_ifname(struct brcmf_pub *drvr, int ifidx)
 
 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 brcmf_pub *drvr, s32 bssidx, s32 ifidx,
 
                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_pub *drvr, s32 bssidx)
        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_pub *drvr, s32 bssidx)
        }
        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 */
index 576e7ac2d66884a35ad7d1d0b9204a9e7dd7ddea..d81ff95acab5c3df29895b3a678343ade4f27505 100644 (file)
@@ -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];