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