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>
This commit is contained in:
Hante Meuleman 2013-02-08 15:53:43 +01:00 committed by John W. Linville
parent 0f8ffe1774
commit 7ee2d92600
2 changed files with 25 additions and 10 deletions

View File

@ -29,7 +29,7 @@ enum brcmf_fil_p2p_if_types {
struct brcmf_fil_p2p_if_le { struct brcmf_fil_p2p_if_le {
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];
enum brcmf_fil_p2p_if_types type; __le16 type;
__le16 chspec; __le16 chspec;
}; };

View File

@ -739,7 +739,7 @@ static int brcmf_p2p_request_p2p_if(struct brcmf_if *ifp, u8 ea[ETH_ALEN],
/* fill the firmware request */ /* fill the firmware request */
memcpy(if_request.addr, ea, ETH_ALEN); 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); if_request.chspec = cpu_to_le16(chanspec);
err = brcmf_fil_iovar_data_set(ifp, "p2p_ifadd", &if_request, 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) if (err)
return 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; 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); vif = brcmf_alloc_vif(cfg, type, false);
if (IS_ERR(vif))
return (struct wireless_dev *)vif;
brcmf_cfg80211_arm_vif_event(cfg, vif); brcmf_cfg80211_arm_vif_event(cfg, vif);
err = brcmf_p2p_request_p2p_if(ifp, cfg->p2p.int_addr, iftype); 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; goto fail;
}
/* wait for firmware event */ /* wait for firmware event */
err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_ADD, 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) { if (!ifp) {
brcmf_err("no if pointer provided\n"); brcmf_err("no if pointer provided\n");
err = -ENOENT; err = -ENOENT;
goto fail;
} }
strncpy(ifp->ndev->name, name, sizeof(ifp->ndev->name) - 1); strncpy(ifp->ndev->name, name, sizeof(ifp->ndev->name) - 1);
brcmf_cfg80211_vif_complete(cfg); 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; return &ifp->vif->wdev;
fail: fail:
@ -883,18 +891,25 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
} }
if (wait_for_disable) 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_vif_clear_mgmt_ies(vif);
brcmf_cfg80211_arm_vif_event(cfg, vif); brcmf_cfg80211_arm_vif_event(cfg, vif);
err = brcmf_p2p_release_p2p_if(vif); err = brcmf_p2p_release_p2p_if(vif);
if (!err) if (!err) {
/* wait for firmware event */ /* wait for firmware event */
err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL, err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL,
jiffie_timeout); jiffie_timeout);
if (!err)
err = -EIO;
else
err = 0;
}
brcmf_cfg80211_arm_vif_event(cfg, NULL); brcmf_cfg80211_arm_vif_event(cfg, NULL);
brcmf_free_vif(vif); brcmf_free_vif(vif);
cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL;
return err; return err;
} }