Skip to content

Commit d964e14

Browse files
dberlinmarcan
authored andcommitted
[brcmfmac] Clean up and common interface creation handling
This makes firmware-side interface creation structures private to interface creation, and commons out how creation is handled Signed-off-by: Daniel Berlin <[email protected]>
1 parent a17c424 commit d964e14

4 files changed

Lines changed: 286 additions & 270 deletions

File tree

drivers/net/wireless/broadcom/brcm80211/brcmfmac/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ brcmfmac-objs += \
2727
pno.o \
2828
join_param.o \
2929
scan_param.o \
30-
xtlv.o
30+
xtlv.o \
31+
interface_create.o
3132

3233
brcmfmac-$(CONFIG_BRCMFMAC_PROTO_BCDC) += \
3334
bcdc.o \

drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

Lines changed: 1 addition & 269 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "feature.h"
3636
#include "xtlv.h"
3737
#include "ratespec.h"
38+
#include "interface_create.h"
3839

3940
#define BRCMF_SCAN_IE_LEN_MAX 2048
4041

@@ -309,48 +310,6 @@ struct parsed_vndr_ies {
309310
struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT];
310311
};
311312

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-
354313
static u8 nl80211_band_to_fwil(enum nl80211_band band)
355314
{
356315
switch (band) {
@@ -633,231 +592,6 @@ brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev)
633592
ADDR_INDIRECT);
634593
}
635594

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-
861595
/**
862596
* brcmf_apsta_add_vif() - create a new AP or STA virtual interface
863597
*
@@ -7092,8 +6826,6 @@ static s32 brcmf_dongle_roam(struct brcmf_if *ifp)
70926826
if (err)
70936827
bphy_err(drvr, "WLC_SET_ROAM_TRIGGER error (%d)\n", err);
70946828

7095-
roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA);
7096-
roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL);
70976829
err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA,
70986830
(void *)roam_delta, sizeof(roam_delta));
70996831
if (err)

0 commit comments

Comments
 (0)