Skip to content

Commit 30d7ce3

Browse files
dberlinjannau
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 <dberlin@dberlin.org>
1 parent ab3253b commit 30d7ce3

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
@@ -36,6 +36,7 @@
3636
#include "fwvid.h"
3737
#include "xtlv.h"
3838
#include "ratespec.h"
39+
#include "interface_create.h"
3940

4041
#define BRCMF_SCAN_IE_LEN_MAX 2048
4142

@@ -312,48 +313,6 @@ struct parsed_vndr_ies {
312313
struct parsed_vndr_ie_info ie_info[VNDR_IE_PARSE_LIMIT];
313314
};
314315

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-
357316
static u8 nl80211_band_to_fwil(enum nl80211_band band)
358317
{
359318
switch (band) {
@@ -636,231 +595,6 @@ brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev)
636595
ADDR_INDIRECT);
637596
}
638597

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-
864598
/**
865599
* brcmf_apsta_add_vif() - create a new AP or STA virtual interface
866600
*
@@ -7160,8 +6894,6 @@ static s32 brcmf_dongle_roam(struct brcmf_if *ifp)
71606894
if (err)
71616895
bphy_err(drvr, "WLC_SET_ROAM_TRIGGER error (%d)\n", err);
71626896

7163-
roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA);
7164-
roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL);
71656897
err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA,
71666898
(void *)roam_delta, sizeof(roam_delta));
71676899
if (err)

0 commit comments

Comments
 (0)