aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
diff options
context:
space:
mode:
authorArend van Spriel <arend@broadcom.com>2013-02-08 09:53:41 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-02-08 14:51:38 -0500
commit5f4f9f114eef4907b6077d19dd5ad7d0a27e0f80 (patch)
tree1984c32c530311db1eed82680220f5ced7701c11 /drivers/net/wireless/brcm80211/brcmfmac/p2p.c
parentde66efcadbb51935c8c668a38f2f1c187f349af9 (diff)
brcmfmac: implement support for deleting virtual interfaces
Deletion of the virtual interface was not fully supported so adding it now. Tested using p2p_connect command in wpa_supplicant. Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com> Reviewed-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.c64
1 files changed, 52 insertions, 12 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
index cec4116379ea..fff5722d4c0b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
@@ -827,6 +827,26 @@ static int brcmf_p2p_request_p2p_if(struct brcmf_if *ifp, u8 ea[ETH_ALEN],
827 return err; 827 return err;
828} 828}
829 829
830static int brcmf_p2p_disable_p2p_if(struct brcmf_cfg80211_vif *vif)
831{
832 struct brcmf_cfg80211_info *cfg = wdev_to_cfg(&vif->wdev);
833 struct net_device *pri_ndev = cfg_to_ndev(cfg);
834 struct brcmf_if *ifp = netdev_priv(pri_ndev);
835 u8 *addr = vif->wdev.netdev->dev_addr;
836
837 return brcmf_fil_iovar_data_set(ifp, "p2p_ifdis", addr, ETH_ALEN);
838}
839
840static int brcmf_p2p_release_p2p_if(struct brcmf_cfg80211_vif *vif)
841{
842 struct brcmf_cfg80211_info *cfg = wdev_to_cfg(&vif->wdev);
843 struct net_device *pri_ndev = cfg_to_ndev(cfg);
844 struct brcmf_if *ifp = netdev_priv(pri_ndev);
845 u8 *addr = vif->wdev.netdev->dev_addr;
846
847 return brcmf_fil_iovar_data_set(ifp, "p2p_ifdel", addr, ETH_ALEN);
848}
849
830/** 850/**
831 * brcmf_p2p_add_vif() - create a new P2P virtual interface. 851 * brcmf_p2p_add_vif() - create a new P2P virtual interface.
832 * 852 *
@@ -910,23 +930,43 @@ int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev)
910{ 930{
911 struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy); 931 struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
912 struct brcmf_cfg80211_vif *vif; 932 struct brcmf_cfg80211_vif *vif;
933 unsigned long jiffie_timeout = msecs_to_jiffies(1500);
934 bool wait_for_disable = false;
913 int err; 935 int err;
914 936
937 brcmf_dbg(TRACE, "delete P2P vif\n");
915 vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev); 938 vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev);
916 939
917 if (brcmf_cfg80211_vif_event_armed(cfg)) 940 switch (vif->wdev.iftype) {
918 return -EBUSY; 941 case NL80211_IFTYPE_P2P_CLIENT:
942 if (test_bit(BRCMF_VIF_STATUS_DISCONNECTING, &vif->sme_state))
943 wait_for_disable = true;
944 break;
945
946 case NL80211_IFTYPE_P2P_GO:
947 if (!brcmf_p2p_disable_p2p_if(vif))
948 wait_for_disable = true;
949 break;
950
951 case NL80211_IFTYPE_P2P_DEVICE:
952 default:
953 return -ENOTSUPP;
954 break;
955 }
956
957 if (wait_for_disable)
958 wait_for_completion_timeout(&cfg->vif_disabled, 500);
959
960 brcmf_vif_clear_mgmt_ies(vif);
919 961
920 brcmf_cfg80211_arm_vif_event(cfg, vif); 962 brcmf_cfg80211_arm_vif_event(cfg, vif);
921 /* wait for firmware event */ 963 err = brcmf_p2p_release_p2p_if(vif);
922 err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL, 964 if (!err)
923 msecs_to_jiffies(1500)); 965 /* wait for firmware event */
966 err = brcmf_cfg80211_wait_vif_event_timeout(cfg, BRCMF_E_IF_DEL,
967 jiffie_timeout);
924 brcmf_cfg80211_arm_vif_event(cfg, NULL); 968 brcmf_cfg80211_arm_vif_event(cfg, NULL);
925 if (wdev->netdev) 969 brcmf_free_vif(vif);
926 brcmf_dbg(INFO, "deleting vif \"%s\"\n", wdev->netdev->name); 970
927 else 971 return err;
928 brcmf_dbg(INFO, "deleting vif \"wdev-%u\"\n",
929 wdev->identifier);
930 brcmf_err("enter - not supported yet\n");
931 return -EOPNOTSUPP;
932} 972}