Skip to content

Commit 0d45b52

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 85a9d75 commit 0d45b52

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

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

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

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-
865599
/**
866600
* brcmf_apsta_add_vif() - create a new AP or STA virtual interface
867601
*
@@ -7103,8 +6837,6 @@ static s32 brcmf_dongle_roam(struct brcmf_if *ifp)
71036837
if (err)
71046838
bphy_err(drvr, "WLC_SET_ROAM_TRIGGER error (%d)\n", err);
71056839

7106-
roam_delta[0] = cpu_to_le32(WL_ROAM_DELTA);
7107-
roam_delta[1] = cpu_to_le32(BRCM_BAND_ALL);
71086840
err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_ROAM_DELTA,
71096841
(void *)roam_delta, sizeof(roam_delta));
71106842
if (err)

0 commit comments

Comments
 (0)