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