|
36 | 36 | #include "fwvid.h" |
37 | 37 | #include "xtlv.h" |
38 | 38 | #include "ratespec.h" |
| 39 | +#include "interface_create.h" |
39 | 40 |
|
40 | 41 | #define BRCMF_SCAN_IE_LEN_MAX 2048 |
41 | 42 |
|
@@ -312,48 +313,6 @@ struct parsed_vndr_ies { |
312 | 313 | struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT]; |
313 | 314 | }; |
314 | 315 |
|
315 | | -#define WL_INTERFACE_CREATE_VER_1 1 |
316 | | -#define WL_INTERFACE_CREATE_VER_2 2 |
317 | | -#define WL_INTERFACE_CREATE_VER_3 3 |
318 | | -#define WL_INTERFACE_CREATE_VER_MAX WL_INTERFACE_CREATE_VER_3 |
319 | | - |
320 | | -#define WL_INTERFACE_MAC_DONT_USE 0x0 |
321 | | -#define WL_INTERFACE_MAC_USE 0x2 |
322 | | - |
323 | | -#define WL_INTERFACE_CREATE_STA 0x0 |
324 | | -#define WL_INTERFACE_CREATE_AP 0x1 |
325 | | - |
326 | | -struct wl_interface_create_v1 { |
327 | | - u16 ver; /* structure version */ |
328 | | - u32 flags; /* flags for operation */ |
329 | | - u8 mac_addr[ETH_ALEN]; /* MAC address */ |
330 | | - u32 wlc_index; /* optional for wlc index */ |
331 | | -}; |
332 | | - |
333 | | -struct wl_interface_create_v2 { |
334 | | - u16 ver; /* structure version */ |
335 | | - u8 pad1[2]; |
336 | | - u32 flags; /* flags for operation */ |
337 | | - u8 mac_addr[ETH_ALEN]; /* MAC address */ |
338 | | - u8 iftype; /* type of interface created */ |
339 | | - u8 pad2; |
340 | | - u32 wlc_index; /* optional for wlc index */ |
341 | | -}; |
342 | | - |
343 | | -struct wl_interface_create_v3 { |
344 | | - u16 ver; /* structure version */ |
345 | | - u16 len; /* length of structure + data */ |
346 | | - u16 fixed_len; /* length of structure */ |
347 | | - u8 iftype; /* type of interface created */ |
348 | | - u8 wlc_index; /* optional for wlc index */ |
349 | | - u32 flags; /* flags for operation */ |
350 | | - u8 mac_addr[ETH_ALEN]; /* MAC address */ |
351 | | - u8 bssid[ETH_ALEN]; /* optional for BSSID */ |
352 | | - u8 if_index; /* interface index request */ |
353 | | - u8 pad[3]; |
354 | | - u8 data[]; /* Optional for specific data */ |
355 | | -}; |
356 | | - |
357 | 316 | static u8 nl80211_band_to_fwil(enum nl80211_band band) |
358 | 317 | { |
359 | 318 | switch (band) { |
@@ -636,231 +595,6 @@ brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev) |
636 | 595 | ADDR_INDIRECT); |
637 | 596 | } |
638 | 597 |
|
639 | | -static int brcmf_get_first_free_bsscfgidx(struct brcmf_pub *drvr) |
640 | | -{ |
641 | | - int bsscfgidx; |
642 | | - |
643 | | - for (bsscfgidx = 0; bsscfgidx < BRCMF_MAX_IFS; bsscfgidx++) { |
644 | | - /* bsscfgidx 1 is reserved for legacy P2P */ |
645 | | - if (bsscfgidx == 1) |
646 | | - continue; |
647 | | - if (!drvr->iflist[bsscfgidx]) |
648 | | - return bsscfgidx; |
649 | | - } |
650 | | - |
651 | | - return -ENOMEM; |
652 | | -} |
653 | | - |
654 | | -static void brcmf_set_vif_sta_macaddr(struct brcmf_if *ifp, u8 *mac_addr) |
655 | | -{ |
656 | | - u8 mac_idx = ifp->drvr->sta_mac_idx; |
657 | | - |
658 | | - /* set difference MAC address with locally administered bit */ |
659 | | - memcpy(mac_addr, ifp->mac_addr, ETH_ALEN); |
660 | | - mac_addr[0] |= 0x02; |
661 | | - mac_addr[3] ^= mac_idx ? 0xC0 : 0xA0; |
662 | | - mac_idx++; |
663 | | - mac_idx = mac_idx % 2; |
664 | | - ifp->drvr->sta_mac_idx = mac_idx; |
665 | | -} |
666 | | - |
667 | | -static int brcmf_cfg80211_request_sta_if(struct brcmf_if *ifp, u8 *macaddr) |
668 | | -{ |
669 | | - struct wl_interface_create_v1 iface_v1; |
670 | | - struct wl_interface_create_v2 iface_v2; |
671 | | - struct wl_interface_create_v3 iface_v3; |
672 | | - u32 iface_create_ver; |
673 | | - int err; |
674 | | - |
675 | | - /* interface_create version 1 */ |
676 | | - memset(&iface_v1, 0, sizeof(iface_v1)); |
677 | | - iface_v1.ver = WL_INTERFACE_CREATE_VER_1; |
678 | | - iface_v1.flags = WL_INTERFACE_CREATE_STA | |
679 | | - WL_INTERFACE_MAC_USE; |
680 | | - if (!is_zero_ether_addr(macaddr)) |
681 | | - memcpy(iface_v1.mac_addr, macaddr, ETH_ALEN); |
682 | | - else |
683 | | - brcmf_set_vif_sta_macaddr(ifp, iface_v1.mac_addr); |
684 | | - |
685 | | - err = brcmf_fil_iovar_data_get(ifp, "interface_create", |
686 | | - &iface_v1, |
687 | | - sizeof(iface_v1)); |
688 | | - if (err) { |
689 | | - brcmf_info("failed to create interface(v1), err=%d\n", |
690 | | - err); |
691 | | - } else { |
692 | | - brcmf_dbg(INFO, "interface created(v1)\n"); |
693 | | - return 0; |
694 | | - } |
695 | | - |
696 | | - /* interface_create version 2 */ |
697 | | - memset(&iface_v2, 0, sizeof(iface_v2)); |
698 | | - iface_v2.ver = WL_INTERFACE_CREATE_VER_2; |
699 | | - iface_v2.flags = WL_INTERFACE_MAC_USE; |
700 | | - iface_v2.iftype = WL_INTERFACE_CREATE_STA; |
701 | | - if (!is_zero_ether_addr(macaddr)) |
702 | | - memcpy(iface_v2.mac_addr, macaddr, ETH_ALEN); |
703 | | - else |
704 | | - brcmf_set_vif_sta_macaddr(ifp, iface_v2.mac_addr); |
705 | | - |
706 | | - err = brcmf_fil_iovar_data_get(ifp, "interface_create", |
707 | | - &iface_v2, |
708 | | - sizeof(iface_v2)); |
709 | | - if (err) { |
710 | | - brcmf_info("failed to create interface(v2), err=%d\n", |
711 | | - err); |
712 | | - } else { |
713 | | - brcmf_dbg(INFO, "interface created(v2)\n"); |
714 | | - return 0; |
715 | | - } |
716 | | - |
717 | | - /* interface_create version 3+ */ |
718 | | - /* get supported version from firmware side */ |
719 | | - iface_create_ver = 0; |
720 | | - err = brcmf_fil_bsscfg_int_query(ifp, "interface_create", |
721 | | - &iface_create_ver); |
722 | | - if (err) { |
723 | | - brcmf_err("fail to get supported version, err=%d\n", err); |
724 | | - return -EOPNOTSUPP; |
725 | | - } |
726 | | - |
727 | | - switch (iface_create_ver) { |
728 | | - case WL_INTERFACE_CREATE_VER_3: |
729 | | - memset(&iface_v3, 0, sizeof(iface_v3)); |
730 | | - iface_v3.ver = WL_INTERFACE_CREATE_VER_3; |
731 | | - iface_v3.flags = WL_INTERFACE_MAC_USE; |
732 | | - iface_v3.iftype = WL_INTERFACE_CREATE_STA; |
733 | | - if (!is_zero_ether_addr(macaddr)) |
734 | | - memcpy(iface_v3.mac_addr, macaddr, ETH_ALEN); |
735 | | - else |
736 | | - brcmf_set_vif_sta_macaddr(ifp, iface_v3.mac_addr); |
737 | | - |
738 | | - err = brcmf_fil_iovar_data_get(ifp, "interface_create", |
739 | | - &iface_v3, |
740 | | - sizeof(iface_v3)); |
741 | | - |
742 | | - if (!err) |
743 | | - brcmf_dbg(INFO, "interface created(v3)\n"); |
744 | | - break; |
745 | | - default: |
746 | | - brcmf_err("not support interface create(v%d)\n", |
747 | | - iface_create_ver); |
748 | | - err = -EOPNOTSUPP; |
749 | | - break; |
750 | | - } |
751 | | - |
752 | | - if (err) { |
753 | | - brcmf_info("station interface creation failed (%d)\n", |
754 | | - err); |
755 | | - return -EIO; |
756 | | - } |
757 | | - |
758 | | - return 0; |
759 | | -} |
760 | | - |
761 | | -static int brcmf_cfg80211_request_ap_if(struct brcmf_if *ifp) |
762 | | -{ |
763 | | - struct wl_interface_create_v1 iface_v1; |
764 | | - struct wl_interface_create_v2 iface_v2; |
765 | | - struct wl_interface_create_v3 iface_v3; |
766 | | - u32 iface_create_ver; |
767 | | - struct brcmf_pub *drvr = ifp->drvr; |
768 | | - struct brcmf_mbss_ssid_le mbss_ssid_le; |
769 | | - int bsscfgidx; |
770 | | - int err; |
771 | | - |
772 | | - /* interface_create version 1 */ |
773 | | - memset(&iface_v1, 0, sizeof(iface_v1)); |
774 | | - iface_v1.ver = WL_INTERFACE_CREATE_VER_1; |
775 | | - iface_v1.flags = WL_INTERFACE_CREATE_AP | |
776 | | - WL_INTERFACE_MAC_USE; |
777 | | - |
778 | | - brcmf_set_vif_sta_macaddr(ifp, iface_v1.mac_addr); |
779 | | - |
780 | | - err = brcmf_fil_iovar_data_get(ifp, "interface_create", |
781 | | - &iface_v1, |
782 | | - sizeof(iface_v1)); |
783 | | - if (err) { |
784 | | - brcmf_info("failed to create interface(v1), err=%d\n", |
785 | | - err); |
786 | | - } else { |
787 | | - brcmf_dbg(INFO, "interface created(v1)\n"); |
788 | | - return 0; |
789 | | - } |
790 | | - |
791 | | - /* interface_create version 2 */ |
792 | | - memset(&iface_v2, 0, sizeof(iface_v2)); |
793 | | - iface_v2.ver = WL_INTERFACE_CREATE_VER_2; |
794 | | - iface_v2.flags = WL_INTERFACE_MAC_USE; |
795 | | - iface_v2.iftype = WL_INTERFACE_CREATE_AP; |
796 | | - |
797 | | - brcmf_set_vif_sta_macaddr(ifp, iface_v2.mac_addr); |
798 | | - |
799 | | - err = brcmf_fil_iovar_data_get(ifp, "interface_create", |
800 | | - &iface_v2, |
801 | | - sizeof(iface_v2)); |
802 | | - if (err) { |
803 | | - brcmf_info("failed to create interface(v2), err=%d\n", |
804 | | - err); |
805 | | - } else { |
806 | | - brcmf_dbg(INFO, "interface created(v2)\n"); |
807 | | - return 0; |
808 | | - } |
809 | | - |
810 | | - /* interface_create version 3+ */ |
811 | | - /* get supported version from firmware side */ |
812 | | - iface_create_ver = 0; |
813 | | - err = brcmf_fil_bsscfg_int_query(ifp, "interface_create", |
814 | | - &iface_create_ver); |
815 | | - if (err) { |
816 | | - brcmf_err("fail to get supported version, err=%d\n", err); |
817 | | - return -EOPNOTSUPP; |
818 | | - } |
819 | | - |
820 | | - switch (iface_create_ver) { |
821 | | - case WL_INTERFACE_CREATE_VER_3: |
822 | | - memset(&iface_v3, 0, sizeof(iface_v3)); |
823 | | - iface_v3.ver = WL_INTERFACE_CREATE_VER_3; |
824 | | - iface_v3.flags = WL_INTERFACE_MAC_USE; |
825 | | - iface_v3.iftype = WL_INTERFACE_CREATE_AP; |
826 | | - brcmf_set_vif_sta_macaddr(ifp, iface_v3.mac_addr); |
827 | | - |
828 | | - err = brcmf_fil_iovar_data_get(ifp, "interface_create", |
829 | | - &iface_v3, |
830 | | - sizeof(iface_v3)); |
831 | | - |
832 | | - if (!err) |
833 | | - brcmf_dbg(INFO, "interface created(v3)\n"); |
834 | | - break; |
835 | | - default: |
836 | | - brcmf_err("not support interface create(v%d)\n", |
837 | | - iface_create_ver); |
838 | | - err = -EOPNOTSUPP; |
839 | | - break; |
840 | | - } |
841 | | - |
842 | | - if (err) { |
843 | | - brcmf_info("Does not support interface_create (%d)\n", |
844 | | - err); |
845 | | - memset(&mbss_ssid_le, 0, sizeof(mbss_ssid_le)); |
846 | | - bsscfgidx = brcmf_get_first_free_bsscfgidx(ifp->drvr); |
847 | | - if (bsscfgidx < 0) |
848 | | - return bsscfgidx; |
849 | | - |
850 | | - mbss_ssid_le.bsscfgidx = cpu_to_le32(bsscfgidx); |
851 | | - mbss_ssid_le.SSID_len = cpu_to_le32(5); |
852 | | - sprintf(mbss_ssid_le.SSID, "ssid%d", bsscfgidx); |
853 | | - |
854 | | - err = brcmf_fil_bsscfg_data_set(ifp, "bsscfg:ssid", &mbss_ssid_le, |
855 | | - sizeof(mbss_ssid_le)); |
856 | | - |
857 | | - if (err < 0) |
858 | | - bphy_err(drvr, "setting ssid failed %d\n", err); |
859 | | - } |
860 | | - |
861 | | - return err; |
862 | | -} |
863 | | - |
864 | 598 | /** |
865 | 599 | * brcmf_apsta_add_vif() - create a new AP or STA virtual interface |
866 | 600 | * |
@@ -7160,8 +6894,6 @@ static s32 brcmf_dongle_roam(struct brcmf_if *ifp) |
7160 | 6894 | if (err) |
7161 | 6895 | bphy_err(drvr, "WLC_SET_ROAM_TRIGGER error (%d)\n", err); |
7162 | 6896 |
|
7163 | | - roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA); |
7164 | | - roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL); |
7165 | 6897 | err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA, |
7166 | 6898 | (void *)roam_delta, sizeof(roam_delta)); |
7167 | 6899 | if (err) |
|
0 commit comments