aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorHante Meuleman <meuleman@broadcom.com>2013-02-08 09:53:47 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-02-08 14:51:39 -0500
commita0f07959ee6e7f5be147ca4c3906b9d7fd173ea0 (patch)
treeaa6069d95ae990459453c746831e27ffa2788601 /drivers
parent89286dc9452082c710e0767f3191b03421601214 (diff)
brcmfmac: Update AP mode for GO creation.
With this update it is possible to create an P2P go. Handle the p2p go role in creation and the update beacon from cfg80211. Also store primary bss in global struct. Needed to map cfg device back to primary device. 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')
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h5
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/p2p.c6
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/p2p.h3
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c255
4 files changed, 183 insertions, 86 deletions
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
index 7707194d4e7e..2c4ca59c35cf 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
@@ -39,4 +39,9 @@ struct brcmf_fil_chan_info_le {
39 __le32 scan_channel; 39 __le32 scan_channel;
40}; 40};
41 41
42struct brcmf_fil_bss_enable_le {
43 __le32 bsscfg_idx;
44 __le32 enable;
45};
46
42#endif /* FWIL_TYPES_H_ */ 47#endif /* FWIL_TYPES_H_ */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
index fa0127e809ac..d5f97117b266 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
@@ -691,15 +691,17 @@ void brcmf_p2p_cancel_remain_on_channel(struct brcmf_if *ifp)
691 * 691 *
692 * @cfg: driver private data for cfg80211 interface. 692 * @cfg: driver private data for cfg80211 interface.
693 */ 693 */
694void brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg) 694void brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg,
695 struct brcmf_cfg80211_vif *vif)
695{ 696{
696 struct brcmf_p2p_info *p2p; 697 struct brcmf_p2p_info *p2p;
697 698
698 p2p = &cfg->p2p; 699 p2p = &cfg->p2p;
699 700
700 p2p->cfg = cfg; 701 p2p->cfg = cfg;
701 brcmf_p2p_set_firmware(p2p); 702 p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = vif;
702 brcmf_p2p_generate_bss_mac(p2p); 703 brcmf_p2p_generate_bss_mac(p2p);
704 brcmf_p2p_set_firmware(p2p);
703} 705}
704 706
705/** 707/**
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.h b/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
index 1bf57c180739..4c1819c1fcc7 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
@@ -102,7 +102,8 @@ struct brcmf_p2p_info {
102 struct ieee80211_channel remain_on_channel; 102 struct ieee80211_channel remain_on_channel;
103}; 103};
104 104
105void brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg); 105void brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg,
106 struct brcmf_cfg80211_vif *vif);
106void brcmf_p2p_detach(struct brcmf_p2p_info *p2p); 107void brcmf_p2p_detach(struct brcmf_p2p_info *p2p);
107struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name, 108struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
108 enum nl80211_iftype type, u32 *flags, 109 enum nl80211_iftype type, u32 *flags,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 311226575583..c94d5361ca8f 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -3625,9 +3625,37 @@ s32 brcmf_vif_clear_mgmt_ies(struct brcmf_cfg80211_vif *vif)
3625} 3625}
3626 3626
3627static s32 3627static s32
3628brcmf_config_ap_mgmt_ie(struct brcmf_cfg80211_vif *vif,
3629 struct cfg80211_beacon_data *beacon)
3630{
3631 s32 err;
3632
3633 /* Set Beacon IEs to FW */
3634 err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_BEACON_FLAG,
3635 beacon->tail, beacon->tail_len);
3636 if (err) {
3637 brcmf_err("Set Beacon IE Failed\n");
3638 return err;
3639 }
3640 brcmf_dbg(TRACE, "Applied Vndr IEs for Beacon\n");
3641
3642 /* Set Probe Response IEs to FW */
3643 err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBRSP_FLAG,
3644 beacon->proberesp_ies,
3645 beacon->proberesp_ies_len);
3646 if (err)
3647 brcmf_err("Set Probe Resp IE Failed\n");
3648 else
3649 brcmf_dbg(TRACE, "Applied Vndr IEs for Probe Resp\n");
3650
3651 return err;
3652}
3653
3654static s32
3628brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev, 3655brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
3629 struct cfg80211_ap_settings *settings) 3656 struct cfg80211_ap_settings *settings)
3630{ 3657{
3658 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3631 s32 ie_offset; 3659 s32 ie_offset;
3632 struct brcmf_if *ifp = netdev_priv(ndev); 3660 struct brcmf_if *ifp = netdev_priv(ndev);
3633 struct brcmf_tlv *ssid_ie; 3661 struct brcmf_tlv *ssid_ie;
@@ -3636,6 +3664,8 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
3636 struct brcmf_tlv *rsn_ie; 3664 struct brcmf_tlv *rsn_ie;
3637 struct brcmf_vs_tlv *wpa_ie; 3665 struct brcmf_vs_tlv *wpa_ie;
3638 struct brcmf_join_params join_params; 3666 struct brcmf_join_params join_params;
3667 enum nl80211_iftype dev_role;
3668 struct brcmf_fil_bss_enable_le bss_enable;
3639 3669
3640 brcmf_dbg(TRACE, "channel_type=%d, beacon_interval=%d, dtim_period=%d,\n", 3670 brcmf_dbg(TRACE, "channel_type=%d, beacon_interval=%d, dtim_period=%d,\n",
3641 cfg80211_get_chandef_type(&settings->chandef), 3671 cfg80211_get_chandef_type(&settings->chandef),
@@ -3645,9 +3675,21 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
3645 settings->ssid, settings->ssid_len, settings->auth_type, 3675 settings->ssid, settings->ssid_len, settings->auth_type,
3646 settings->inactivity_timeout); 3676 settings->inactivity_timeout);
3647 3677
3648 if (!test_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state)) { 3678 if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif) {
3649 brcmf_err("Not in AP creation mode\n"); 3679 brcmf_dbg(TRACE, "Role = AP\n");
3650 return -EPERM; 3680 dev_role = NL80211_IFTYPE_AP;
3681 if (!test_bit(BRCMF_VIF_STATUS_AP_CREATING,
3682 &ifp->vif->sme_state)) {
3683 brcmf_err("Not in AP creation mode\n");
3684 return -EPERM;
3685 }
3686 } else {
3687 brcmf_dbg(TRACE, "Role = P2P GO\n");
3688 dev_role = NL80211_IFTYPE_P2P_GO;
3689 if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif) {
3690 ifp = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
3691 ndev = ifp->ndev;
3692 }
3651 } 3693 }
3652 3694
3653 memset(&ssid_le, 0, sizeof(ssid_le)); 3695 memset(&ssid_le, 0, sizeof(ssid_le));
@@ -3669,21 +3711,6 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
3669 } 3711 }
3670 3712
3671 brcmf_set_mpc(ndev, 0); 3713 brcmf_set_mpc(ndev, 0);
3672 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
3673 if (err < 0) {
3674 brcmf_err("BRCMF_C_DOWN error %d\n", err);
3675 goto exit;
3676 }
3677 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_INFRA, 1);
3678 if (err < 0) {
3679 brcmf_err("SET INFRA error %d\n", err);
3680 goto exit;
3681 }
3682 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 1);
3683 if (err < 0) {
3684 brcmf_err("setting AP mode failed %d\n", err);
3685 goto exit;
3686 }
3687 3714
3688 /* find the RSN_IE */ 3715 /* find the RSN_IE */
3689 rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, 3716 rsn_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
@@ -3711,25 +3738,8 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
3711 brcmf_dbg(TRACE, "No WPA(2) IEs found\n"); 3738 brcmf_dbg(TRACE, "No WPA(2) IEs found\n");
3712 brcmf_configure_opensecurity(ifp); 3739 brcmf_configure_opensecurity(ifp);
3713 } 3740 }
3714 /* Set Beacon IEs to FW */
3715 err = brcmf_vif_set_mgmt_ie(ndev_to_vif(ndev),
3716 BRCMF_VNDR_IE_BEACON_FLAG,
3717 settings->beacon.tail,
3718 settings->beacon.tail_len);
3719 if (err)
3720 brcmf_err("Set Beacon IE Failed\n");
3721 else
3722 brcmf_dbg(TRACE, "Applied Vndr IEs for Beacon\n");
3723 3741
3724 /* Set Probe Response IEs to FW */ 3742 brcmf_config_ap_mgmt_ie(ifp->vif, &settings->beacon);
3725 err = brcmf_vif_set_mgmt_ie(ndev_to_vif(ndev),
3726 BRCMF_VNDR_IE_PRBRSP_FLAG,
3727 settings->beacon.proberesp_ies,
3728 settings->beacon.proberesp_ies_len);
3729 if (err)
3730 brcmf_err("Set Probe Resp IE Failed\n");
3731 else
3732 brcmf_dbg(TRACE, "Applied Vndr IEs for Probe Resp\n");
3733 3743
3734 if (settings->beacon_interval) { 3744 if (settings->beacon_interval) {
3735 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_BCNPRD, 3745 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_BCNPRD,
@@ -3747,23 +3757,62 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
3747 goto exit; 3757 goto exit;
3748 } 3758 }
3749 } 3759 }
3750 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); 3760
3751 if (err < 0) { 3761 if (dev_role == NL80211_IFTYPE_AP) {
3752 brcmf_err("BRCMF_C_UP error (%d)\n", err); 3762 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1);
3753 goto exit; 3763 if (err < 0) {
3764 brcmf_err("BRCMF_C_DOWN error %d\n", err);
3765 goto exit;
3766 }
3754 brcmf_fil_iovar_int_set(ifp, "apsta", 0); 3767 brcmf_fil_iovar_int_set(ifp, "apsta", 0);
3755 } 3768 }
3756 3769
3757 memset(&join_params, 0, sizeof(join_params)); 3770 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_INFRA, 1);
3758 /* join parameters starts with ssid */
3759 memcpy(&join_params.ssid_le, &ssid_le, sizeof(ssid_le));
3760 /* create softap */
3761 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
3762 &join_params, sizeof(join_params));
3763 if (err < 0) { 3771 if (err < 0) {
3764 brcmf_err("SET SSID error (%d)\n", err); 3772 brcmf_err("SET INFRA error %d\n", err);
3765 goto exit; 3773 goto exit;
3766 } 3774 }
3775 if (dev_role == NL80211_IFTYPE_AP) {
3776 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 1);
3777 if (err < 0) {
3778 brcmf_err("setting AP mode failed %d\n", err);
3779 goto exit;
3780 }
3781 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1);
3782 if (err < 0) {
3783 brcmf_err("BRCMF_C_UP error (%d)\n", err);
3784 goto exit;
3785 }
3786
3787 memset(&join_params, 0, sizeof(join_params));
3788 /* join parameters starts with ssid */
3789 memcpy(&join_params.ssid_le, &ssid_le, sizeof(ssid_le));
3790 /* create softap */
3791 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID,
3792 &join_params, sizeof(join_params));
3793 if (err < 0) {
3794 brcmf_err("SET SSID error (%d)\n", err);
3795 goto exit;
3796 }
3797 brcmf_dbg(TRACE, "AP mode configuration complete\n");
3798 } else {
3799 err = brcmf_fil_bsscfg_data_set(ifp, "ssid", &ssid_le,
3800 sizeof(ssid_le));
3801 if (err < 0) {
3802 brcmf_err("setting ssid failed %d\n", err);
3803 goto exit;
3804 }
3805 bss_enable.bsscfg_idx = cpu_to_le32(ifp->bssidx);
3806 bss_enable.enable = cpu_to_le32(1);
3807 err = brcmf_fil_iovar_data_set(ifp, "bss", &bss_enable,
3808 sizeof(bss_enable));
3809 if (err < 0) {
3810 brcmf_err("bss_enable config failed %d\n", err);
3811 goto exit;
3812 }
3813
3814 brcmf_dbg(TRACE, "GO mode configuration complete\n");
3815 }
3767 clear_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state); 3816 clear_bit(BRCMF_VIF_STATUS_AP_CREATING, &ifp->vif->sme_state);
3768 set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state); 3817 set_bit(BRCMF_VIF_STATUS_AP_CREATED, &ifp->vif->sme_state);
3769 3818
@@ -3802,10 +3851,41 @@ exit:
3802 return err; 3851 return err;
3803} 3852}
3804 3853
3854static s32
3855brcmf_cfg80211_change_beacon(struct wiphy *wiphy, struct net_device *ndev,
3856 struct cfg80211_beacon_data *info)
3857{
3858 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3859 struct brcmf_if *ifp = netdev_priv(ndev);
3860 s32 err;
3861
3862 brcmf_dbg(TRACE, "Enter\n");
3863
3864 if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif) {
3865 brcmf_dbg(TRACE, "Role = AP\n");
3866 if (!test_bit(BRCMF_VIF_STATUS_AP_CREATED,
3867 &ifp->vif->sme_state)) {
3868 brcmf_err("AP was not yet created\n");
3869 return -EPERM;
3870 }
3871 } else {
3872 brcmf_dbg(TRACE, "Role = P2P GO\n");
3873 if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif) {
3874 ifp = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
3875 ndev = ifp->ndev;
3876 }
3877 }
3878
3879 err = brcmf_config_ap_mgmt_ie(ifp->vif, info);
3880
3881 return err;
3882}
3883
3805static int 3884static int
3806brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev, 3885brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev,
3807 u8 *mac) 3886 u8 *mac)
3808{ 3887{
3888 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3809 struct brcmf_scb_val_le scbval; 3889 struct brcmf_scb_val_le scbval;
3810 struct brcmf_if *ifp = netdev_priv(ndev); 3890 struct brcmf_if *ifp = netdev_priv(ndev);
3811 s32 err; 3891 s32 err;
@@ -3815,6 +3895,8 @@ brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev,
3815 3895
3816 brcmf_dbg(TRACE, "Enter %pM\n", mac); 3896 brcmf_dbg(TRACE, "Enter %pM\n", mac);
3817 3897
3898 if (ifp->vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
3899 ifp = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
3818 if (!check_vif_up(ifp->vif)) 3900 if (!check_vif_up(ifp->vif))
3819 return -EIO; 3901 return -EIO;
3820 3902
@@ -3824,7 +3906,12 @@ brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev,
3824 &scbval, sizeof(scbval)); 3906 &scbval, sizeof(scbval));
3825 if (err) 3907 if (err)
3826 brcmf_err("SCB_DEAUTHENTICATE_FOR_REASON failed %d\n", err); 3908 brcmf_err("SCB_DEAUTHENTICATE_FOR_REASON failed %d\n", err);
3827 3909 /*
3910 * Wait for the deauth event to come, supplicant will do the
3911 * delete iface immediately and we will have problem in sending
3912 * deauth frame if we delete the bss in firmware
3913 */
3914 brcmf_delay(400);
3828 brcmf_dbg(TRACE, "Exit\n"); 3915 brcmf_dbg(TRACE, "Exit\n");
3829 return err; 3916 return err;
3830} 3917}
@@ -3857,6 +3944,7 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
3857{ 3944{
3858 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); 3945 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
3859 const struct ieee80211_mgmt *mgmt; 3946 const struct ieee80211_mgmt *mgmt;
3947 struct brcmf_if *ifp;
3860 struct brcmf_cfg80211_vif *vif; 3948 struct brcmf_cfg80211_vif *vif;
3861 s32 err = 0; 3949 s32 err = 0;
3862 s32 ie_offset; 3950 s32 ie_offset;
@@ -3868,41 +3956,41 @@ brcmf_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
3868 3956
3869 mgmt = (const struct ieee80211_mgmt *)buf; 3957 mgmt = (const struct ieee80211_mgmt *)buf;
3870 3958
3871 if (ieee80211_is_mgmt(mgmt->frame_control)) { 3959 if (!ieee80211_is_mgmt(mgmt->frame_control)) {
3872 if (ieee80211_is_probe_resp(mgmt->frame_control)) { 3960 brcmf_err("Driver only allows MGMT packet type\n");
3873 /* Right now the only reason to get a probe response */ 3961 return -EPERM;
3874 /* is for p2p listen response from wpa_supplicant. */ 3962 }
3875 /* Unfortunately the wpa_supplicant sends it on the */
3876 /* primary ndev, while dongle wants it on the p2p */
3877 /* vif. Since this is only reason for a probe */
3878 /* response to be sent, the vif is taken from cfg. */
3879 /* If ever desired to send proberesp for non p2p */
3880 /* response then data should be checked for */
3881 /* "DIRECT-". Note in future supplicant will take */
3882 /* dedicated p2p wdev to do this and then this 'hack'*/
3883 /* is not needed anymore. */
3884 ie_offset = DOT11_MGMT_HDR_LEN +
3885 DOT11_BCN_PRB_FIXED_LEN;
3886 ie_len = len - ie_offset;
3887 3963
3964 if (ieee80211_is_probe_resp(mgmt->frame_control)) {
3965 /* Right now the only reason to get a probe response */
3966 /* is for p2p listen response or for p2p GO from */
3967 /* wpa_supplicant. Unfortunately the probe is send */
3968 /* on primary ndev, while dongle wants it on the p2p */
3969 /* vif. Since this is only reason for a probe */
3970 /* response to be sent, the vif is taken from cfg. */
3971 /* If ever desired to send proberesp for non p2p */
3972 /* response then data should be checked for */
3973 /* "DIRECT-". Note in future supplicant will take */
3974 /* dedicated p2p wdev to do this and then this 'hack'*/
3975 /* is not needed anymore. */
3976 ie_offset = DOT11_MGMT_HDR_LEN +
3977 DOT11_BCN_PRB_FIXED_LEN;
3978 ie_len = len - ie_offset;
3979 ifp = netdev_priv(wdev->netdev);
3980 vif = ifp->vif;
3981 if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif)
3888 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif; 3982 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif;
3889 if (vif == NULL) { 3983 err = brcmf_vif_set_mgmt_ie(vif,
3890 brcmf_err("No p2p device available for probe response\n"); 3984 BRCMF_VNDR_IE_PRBRSP_FLAG,
3891 err = -ENODEV; 3985 &buf[ie_offset],
3892 goto exit; 3986 ie_len);
3893 } 3987 cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, true,
3894 err = brcmf_vif_set_mgmt_ie(vif, 3988 GFP_KERNEL);
3895 BRCMF_VNDR_IE_PRBRSP_FLAG, 3989 } else {
3896 &buf[ie_offset], 3990 brcmf_dbg(TRACE, "Unhandled, fc=%04x!!\n", mgmt->frame_control);
3897 ie_len); 3991 brcmf_dbg_hex_dump(true, buf, len, "payload, len=%Zu\n", len);
3898 cfg80211_mgmt_tx_status(wdev, *cookie, buf, len, true,
3899 GFP_KERNEL);
3900 goto exit;
3901 }
3902 } 3992 }
3903 brcmf_dbg(TRACE, "Unhandled, is_mgmt %d, fc=%04x!!!!!\n", 3993
3904 ieee80211_is_mgmt(mgmt->frame_control), mgmt->frame_control);
3905exit:
3906 return err; 3994 return err;
3907} 3995}
3908 3996
@@ -3946,8 +4034,8 @@ static s32 brcmf_notify_rx_mgmt_p2p_probereq(struct brcmf_if *ifp,
3946 "Enter: event %d reason %d\n", e->event_code, e->reason); 4034 "Enter: event %d reason %d\n", e->event_code, e->reason);
3947 4035
3948 /* Firmware sends us two proberesponses for each idx one. At the */ 4036 /* Firmware sends us two proberesponses for each idx one. At the */
3949 /* moment only bsscfgidx 0 is passed up to supplicant */ 4037 /* moment anything but bsscfgidx 0 is passed up to supplicant */
3950 if (e->bsscfgidx) 4038 if (e->bsscfgidx == 0)
3951 return 0; 4039 return 0;
3952 4040
3953 /* Check if wpa_supplicant has registered for this frame */ 4041 /* Check if wpa_supplicant has registered for this frame */
@@ -3999,6 +4087,7 @@ static struct cfg80211_ops wl_cfg80211_ops = {
3999 .flush_pmksa = brcmf_cfg80211_flush_pmksa, 4087 .flush_pmksa = brcmf_cfg80211_flush_pmksa,
4000 .start_ap = brcmf_cfg80211_start_ap, 4088 .start_ap = brcmf_cfg80211_start_ap,
4001 .stop_ap = brcmf_cfg80211_stop_ap, 4089 .stop_ap = brcmf_cfg80211_stop_ap,
4090 .change_beacon = brcmf_cfg80211_change_beacon,
4002 .del_station = brcmf_cfg80211_del_station, 4091 .del_station = brcmf_cfg80211_del_station,
4003 .sched_scan_start = brcmf_cfg80211_sched_scan_start, 4092 .sched_scan_start = brcmf_cfg80211_sched_scan_start,
4004 .sched_scan_stop = brcmf_cfg80211_sched_scan_stop, 4093 .sched_scan_stop = brcmf_cfg80211_sched_scan_stop,
@@ -4727,7 +4816,7 @@ struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr,
4727 brcmf_err("Failed to init iwm_priv (%d)\n", err); 4816 brcmf_err("Failed to init iwm_priv (%d)\n", err);
4728 goto cfg80211_attach_out; 4817 goto cfg80211_attach_out;
4729 } 4818 }
4730 brcmf_p2p_attach(cfg); 4819 brcmf_p2p_attach(cfg, vif);
4731 4820
4732 ifp->vif = vif; 4821 ifp->vif = vif;
4733 return cfg; 4822 return cfg;