diff options
author | Arend van Spriel <arend@broadcom.com> | 2013-02-08 09:53:41 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-02-08 14:51:38 -0500 |
commit | 5f4f9f114eef4907b6077d19dd5ad7d0a27e0f80 (patch) | |
tree | 1984c32c530311db1eed82680220f5ced7701c11 /drivers/net/wireless/brcm80211/brcmfmac/p2p.c | |
parent | de66efcadbb51935c8c668a38f2f1c187f349af9 (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.c | 64 |
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 | ||
830 | static 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 | |||
840 | static 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 | } |