Skip to content

Commit

Permalink
brcmfmac: update p2p add and delete vif routines.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Hante Meuleman authored and John W. Linville committed Feb 8, 2013
1 parent 0f8ffe1 commit 7ee2d92
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 10 deletions.
2 changes: 1 addition & 1 deletion drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down
33 changes: 24 additions & 9 deletions drivers/net/wireless/brcm80211/brcmfmac/p2p.c
Original file line number Diff line number Diff line change
Expand Up @@ -739,19 +739,14 @@ 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,
sizeof(if_request));
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;
}

Expand Down Expand Up @@ -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,
Expand All @@ -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:
Expand Down Expand Up @@ -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;
}

0 comments on commit 7ee2d92

Please sign in to comment.