aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
diff options
context:
space:
mode:
authorHante Meuleman <meuleman@broadcom.com>2013-02-08 09:53:43 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-02-08 14:51:38 -0500
commit7ee2d926002daa5779277360613f296f27d2127b (patch)
tree434aed24a44d4681b4f2cd6c81b10c400e0d574f /drivers/net/wireless/brcm80211/brcmfmac/p2p.c
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>
Diffstat (limited to 'drivers/net/wireless/brcm80211/brcmfmac/p2p.c')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/p2p.c33
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
844fail: 852fail:
@@ -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}