diff options
author | Hante Meuleman <meuleman@broadcom.com> | 2013-02-08 09:53:43 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-02-08 14:51:38 -0500 |
commit | 7ee2d926002daa5779277360613f296f27d2127b (patch) | |
tree | 434aed24a44d4681b4f2cd6c81b10c400e0d574f /drivers/net/wireless/brcm80211/brcmfmac/p2p.c | |
parent | 0f8ffe177426e536def8f19f7eca5b895103c62a (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>
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/p2p.c')
-rw-r--r-- | drivers/net/wireless/brcm80211/brcmfmac/p2p.c | 33 |
1 files changed, 24 insertions, 9 deletions
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], | |||
739 | 739 | ||
740 | /* fill the firmware request */ | 740 | /* fill the firmware request */ |
741 | memcpy(if_request.addr, ea, ETH_ALEN); | 741 | memcpy(if_request.addr, ea, ETH_ALEN); |
742 | if_request.type = iftype; | 742 | if_request.type = cpu_to_le16((u16)iftype); |
743 | if_request.chspec = cpu_to_le16(chanspec); | 743 | if_request.chspec = cpu_to_le16(chanspec); |
744 | 744 | ||
745 | err = brcmf_fil_iovar_data_set(ifp, "p2p_ifadd", &if_request, | 745 | 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], | |||
747 | if (err) | 747 | if (err) |
748 | return err; | 748 | return err; |
749 | 749 | ||
750 | if (iftype == BRCMF_FIL_P2P_IF_GO) { | ||
751 | /* set station timeout for p2p */ | ||
752 | err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCB_TIMEOUT, | ||
753 | BRCMF_SCB_TIMEOUT_VALUE); | ||
754 | } | ||
755 | return err; | 750 | return err; |
756 | } | 751 | } |
757 | 752 | ||
@@ -814,11 +809,15 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name, | |||
814 | } | 809 | } |
815 | 810 | ||
816 | vif = brcmf_alloc_vif(cfg, type, false); | 811 | vif = brcmf_alloc_vif(cfg, type, false); |
812 | if (IS_ERR(vif)) | ||
813 | return (struct wireless_dev *)vif; | ||
817 | brcmf_cfg80211_arm_vif_event(cfg, vif); | 814 | brcmf_cfg80211_arm_vif_event(cfg, vif); |
818 | 815 | ||
819 | err = brcmf_p2p_request_p2p_if(ifp, cfg->p2p.int_addr, iftype); | 816 | err = brcmf_p2p_request_p2p_if(ifp, cfg->p2p.int_addr, iftype); |
820 | if (err) | 817 | if (err) { |
818 | brcmf_cfg80211_arm_vif_event(cfg, NULL); | ||
821 | goto fail; | 819 | goto fail; |
820 | } | ||
822 | 821 | ||
823 | /* wait for firmware event */ | 822 | /* wait for firmware event */ |
824 | err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_ADD, | 823 | 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, | |||
835 | if (!ifp) { | 834 | if (!ifp) { |
836 | brcmf_err("no if pointer provided\n"); | 835 | brcmf_err("no if pointer provided\n"); |
837 | err = -ENOENT; | 836 | err = -ENOENT; |
837 | goto fail; | ||
838 | } | 838 | } |
839 | 839 | ||
840 | strncpy(ifp->ndev->name, name, sizeof(ifp->ndev->name) - 1); | 840 | strncpy(ifp->ndev->name, name, sizeof(ifp->ndev->name) - 1); |
841 | brcmf_cfg80211_vif_complete(cfg); | 841 | brcmf_cfg80211_vif_complete(cfg); |
842 | cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = vif; | ||
843 | /* Disable firmware roaming for P2P interface */ | ||
844 | brcmf_fil_iovar_int_set(ifp, "roam_off", 1); | ||
845 | if (iftype == BRCMF_FIL_P2P_IF_GO) { | ||
846 | /* set station timeout for p2p */ | ||
847 | brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCB_TIMEOUT, | ||
848 | BRCMF_SCB_TIMEOUT_VALUE); | ||
849 | } | ||
842 | return &ifp->vif->wdev; | 850 | return &ifp->vif->wdev; |
843 | 851 | ||
844 | fail: | 852 | fail: |
@@ -883,18 +891,25 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev) | |||
883 | } | 891 | } |
884 | 892 | ||
885 | if (wait_for_disable) | 893 | if (wait_for_disable) |
886 | wait_for_completion_timeout(&cfg->vif_disabled, 500); | 894 | wait_for_completion_timeout(&cfg->vif_disabled, |
895 | msecs_to_jiffies(500)); | ||
887 | 896 | ||
888 | brcmf_vif_clear_mgmt_ies(vif); | 897 | brcmf_vif_clear_mgmt_ies(vif); |
889 | 898 | ||
890 | brcmf_cfg80211_arm_vif_event(cfg, vif); | 899 | brcmf_cfg80211_arm_vif_event(cfg, vif); |
891 | err = brcmf_p2p_release_p2p_if(vif); | 900 | err = brcmf_p2p_release_p2p_if(vif); |
892 | if (!err) | 901 | if (!err) { |
893 | /* wait for firmware event */ | 902 | /* wait for firmware event */ |
894 | err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL, | 903 | err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL, |
895 | jiffie_timeout); | 904 | jiffie_timeout); |
905 | if (!err) | ||
906 | err = -EIO; | ||
907 | else | ||
908 | err = 0; | ||
909 | } | ||
896 | brcmf_cfg80211_arm_vif_event(cfg, NULL); | 910 | brcmf_cfg80211_arm_vif_event(cfg, NULL); |
897 | brcmf_free_vif(vif); | 911 | brcmf_free_vif(vif); |
912 | cfg->p2p.bss_idx[P2PAPI_BSSCFG_CONNECTION].vif = NULL; | ||
898 | 913 | ||
899 | return err; | 914 | return err; |
900 | } | 915 | } |