aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHante Meuleman2013-02-08 15:53:43 +0100
committerJohn W. Linville2013-02-08 14:51:38 -0500
commit7ee2d926002daa5779277360613f296f27d2127b (patch)
tree434aed24a44d4681b4f2cd6c81b10c400e0d574f
parent0f8ffe177426e536def8f19f7eca5b895103c62a (diff)
brcmfmac: update p2p add and delete vif routines.
Improve exception handling. Store and removed created vif in cfg.p2p.bss array. Fix big endian bug. Fix msec jiffies bug. Reviewed-by: Arend Van Spriel <arend@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Signed-off-by: Hante Meuleman <meuleman@broadcom.com> Signed-off-by: Arend van Spriel <arend@broadcom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/p2p.c33
2 files changed, 25 insertions, 10 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
index d21d9b2201d8..7707194d4e7e 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
@@ -29,7 +29,7 @@ enum brcmf_fil_p2p_if_types {
struct brcmf_fil_p2p_if_le {
u8 addr[ETH_ALEN];
- enum brcmf_fil_p2p_if_types type;
+ __le16 type;
__le16 chspec;
};
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
index aef0287f5857..d2cefb4c7d2a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
@@ -739,7 +739,7 @@ static int brcmf_p2p_request_p2p_if(struct brcmf_if *ifp, u8 ea[ETH_ALEN],
/* fill the firmware request */
memcpy(if_request.addr, ea, ETH_ALEN);
- if_request.type = iftype;
+ if_request.type = cpu_to_le16((u16)iftype);
if_request.chspec = cpu_to_le16(chanspec);
err = brcmf_fil_iovar_data_set(ifp, "p2p_ifadd", &if_request,
@@ -747,11 +747,6 @@ static int brcmf_p2p_request_p2p_if(struct brcmf_if *ifp, u8 ea[ETH_ALEN],
if (err)
return err;
- if (iftype == BRCMF_FIL_P2P_IF_GO) {
- /* set station timeout for p2p */
- err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCB_TIMEOUT,
- BRCMF_SCB_TIMEOUT_VALUE);
- }
return err;
}
@@ -814,11 +809,15 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
}
vif = brcmf_alloc_vif(cfg, type, false);
+ if (IS_ERR(vif))
+ return (struct wireless_dev *)vif;
brcmf_cfg80211_arm_vif_event(cfg, vif);
err = brcmf_p2p_request_p2p_if(ifp, cfg->p2p.int_addr, iftype);
- if (err)
+ if (err) {
+ brcmf_cfg80211_arm_vif_event(cfg, NULL);
goto fail;
+ }
/* wait for firmware event */
err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_ADD,
@@ -835,10 +834,19 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
if (!ifp) {
brcmf_err("no if pointer provided\n");
err = -ENOENT;
+ goto fail;
}
strncpy(ifp->ndev->name, name, sizeof(ifp->ndev->name) - 1);
brcmf_cfg80211_vif_complete(cfg);
+ cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif;
+ /* Disable firmware roaming for P2P interface */
+ brcmf_fil_iovar_int_set(ifp, "roam_off", 1);
+ if (iftype == BRCMF_FIL_P2P_IF_GO) {
+ /* set station timeout for p2p */
+ brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCB_TIMEOUT,
+ BRCMF_SCB_TIMEOUT_VALUE);
+ }
return &ifp->vif->wdev;
fail:
@@ -883,18 +891,25 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
}
if (wait_for_disable)
- wait_for_completion_timeout(&cfg->vif_disabled, 500);
+ wait_for_completion_timeout(&cfg->vif_disabled,
+ msecs_to_jiffies(500));
brcmf_vif_clear_mgmt_ies(vif);
brcmf_cfg80211_arm_vif_event(cfg, vif);
err = brcmf_p2p_release_p2p_if(vif);
- if (!err)
+ if (!err) {
/* wait for firmware event */
err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL,
jiffie_timeout);
+ if (!err)
+ err = -EIO;
+ else
+ err = 0;
+ }
brcmf_cfg80211_arm_vif_event(cfg, NULL);
brcmf_free_vif(vif);
+ cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
return err;
}