Skip to content

Commit 81913bf

Browse files
marcanjannau
authored andcommitted
wifi: brcmfmac: Implement event_msgs_ext
This extended command supports bit set/clear operations, but we just use it like the old full mask set command. Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent e1103f6 commit 81913bf

7 files changed

Lines changed: 127 additions & 35 deletions

File tree

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

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "core.h"
1414
#include "bus.h"
1515
#include "debug.h"
16+
#include "fweh.h"
1617
#include "fwil.h"
1718
#include "fwil_types.h"
1819
#include "tracepoint.h"
@@ -266,7 +267,6 @@ static int brcmf_c_process_cal_blob(struct brcmf_if *ifp)
266267
int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
267268
{
268269
struct brcmf_pub *drvr = ifp->drvr;
269-
struct brcmf_fweh_info *fweh = drvr->fweh;
270270
u8 buf[BRCMF_DCMD_SMLEN];
271271
struct brcmf_bus *bus;
272272
struct brcmf_rev_info_le revinfo;
@@ -412,27 +412,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
412412

413413
brcmf_c_set_joinpref_default(ifp);
414414

415-
/* Setup event_msgs, enable E_IF */
416-
err = brcmf_fil_iovar_data_get(ifp, "event_msgs", fweh->event_mask,
417-
fweh->event_mask_len);
418-
if (err) {
419-
bphy_err(drvr, "Get event_msgs error (%d)\n", err);
420-
goto done;
421-
}
422-
/*
423-
* BRCMF_E_IF can safely be used to set the appropriate bit
424-
* in the event_mask as the firmware event code is guaranteed
425-
* to match the value of BRCMF_E_IF because it is old cruft
426-
* that all vendors have.
427-
*/
428-
setbit(fweh->event_mask, BRCMF_E_IF);
429-
err = brcmf_fil_iovar_data_set(ifp, "event_msgs", fweh->event_mask,
430-
fweh->event_mask_len);
431-
if (err) {
432-
bphy_err(drvr, "Set event_msgs error (%d)\n", err);
433-
goto done;
434-
}
435-
436415
/* Setup default scan channel time */
437416
err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME,
438417
BRCMF_DEFAULT_SCAN_CHANNEL_TIME);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,6 +1229,11 @@ static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
12291229

12301230
brcmf_feat_attach(drvr);
12311231

1232+
/* Setup event_msgs, enable E_IF */
1233+
ret = brcmf_fweh_init_events(ifp);
1234+
if (ret)
1235+
goto fail;
1236+
12321237
ret = brcmf_proto_init_done(drvr);
12331238
if (ret < 0)
12341239
goto fail;

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
332332
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_TDLS, "tdls_enable");
333333
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MFP, "mfp");
334334
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_DUMP_OBSS, "dump_obss");
335+
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_EVENT_MSGS_EXT, "event_msgs_ext");
335336

336337
pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
337338
err = brcmf_fil_iovar_data_get(ifp, "pfn_macaddr", &pfn_mac,

drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@
6060
BRCMF_FEAT_DEF(SCAN_V3) \
6161
BRCMF_FEAT_DEF(PMKID_V2) \
6262
BRCMF_FEAT_DEF(PMKID_V3) \
63-
BRCMF_FEAT_DEF(SAE_EXT)
63+
BRCMF_FEAT_DEF(SAE_EXT) \
64+
BRCMF_FEAT_DEF(EVENT_MSGS_EXT) \
6465

6566
/*
6667
* Quirks:

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

Lines changed: 90 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
#include "core.h"
1212
#include "debug.h"
1313
#include "tracepoint.h"
14+
#include "feature.h"
1415
#include "fweh.h"
1516
#include "fwil.h"
17+
#include "fwil_types.h"
1618
#include "proto.h"
1719
#include "bus.h"
1820
#include "fwvid.h"
@@ -425,39 +427,115 @@ void brcmf_fweh_unregister(struct brcmf_pub *drvr,
425427
drvr->fweh->evt_handler[evt_handler_idx] = NULL;
426428
}
427429

430+
/**
431+
* brcmf_fweh_init_events() - initialize event handling.
432+
*
433+
* @ifp: primary interface object.
434+
*/
435+
int brcmf_fweh_init_events(struct brcmf_if *ifp)
436+
{
437+
struct brcmf_pub *drvr = ifp->drvr;
438+
struct brcmf_eventmsgs_ext_le *eventmsgs;
439+
size_t size = sizeof(*eventmsgs) + drvr->fweh->event_mask_len;
440+
int err;
441+
442+
eventmsgs = kzalloc(size, GFP_KERNEL);
443+
if(!eventmsgs)
444+
return -ENOMEM;
445+
446+
eventmsgs->version = EVENTMSGS_VER;
447+
eventmsgs->command = EVENTMSGS_NONE;
448+
eventmsgs->len = drvr->fweh->event_mask_len;
449+
eventmsgs->maxgetsize = drvr->fweh->event_mask_len;
450+
451+
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_EVENT_MSGS_EXT))
452+
err = brcmf_fil_iovar_data_get(ifp, "event_msgs_ext",
453+
eventmsgs, size);
454+
else
455+
err = brcmf_fil_iovar_data_get(ifp, "event_msgs",
456+
drvr->fweh->event_mask,
457+
drvr->fweh->event_mask_len);
458+
459+
if (err) {
460+
bphy_err(drvr, "Get event_msgs error (%d)\n", err);
461+
kfree(eventmsgs);
462+
return err;
463+
}
464+
465+
brcmf_dbg(EVENT, "Event mask len: driver=%d fw=%d\n",
466+
drvr->fweh->event_mask_len, eventmsgs->len);
467+
468+
/* want to handle IF event as well */
469+
brcmf_dbg(EVENT, "enable event IF\n");
470+
setbit(eventmsgs->mask, BRCMF_E_IF);
471+
472+
eventmsgs->version = EVENTMSGS_VER;
473+
eventmsgs->command = EVENTMSGS_SET_MASK;
474+
eventmsgs->len = drvr->fweh->event_mask_len;
475+
476+
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_EVENT_MSGS_EXT))
477+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs_ext",
478+
eventmsgs, size);
479+
else
480+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs",
481+
drvr->fweh->event_mask,
482+
drvr->fweh->event_mask_len);
483+
484+
if (err)
485+
bphy_err(drvr, "Set event_msgs error (%d)\n", err);
486+
487+
kfree(eventmsgs);
488+
return err;
489+
}
490+
428491
/**
429492
* brcmf_fweh_activate_events() - enables firmware events registered.
430493
*
431494
* @ifp: primary interface object.
432495
*/
433496
int brcmf_fweh_activate_events(struct brcmf_if *ifp)
434497
{
435-
struct brcmf_fweh_info *fweh = ifp->drvr->fweh;
436-
enum brcmf_fweh_event_code code;
498+
struct brcmf_pub *drvr = ifp->drvr;
499+
struct brcmf_eventmsgs_ext_le *eventmsgs;
500+
size_t size = sizeof(*eventmsgs) + drvr->fweh->event_mask_len;
437501
int i, err;
438502

439-
memset(fweh->event_mask, 0, fweh->event_mask_len);
440-
for (i = 0; i < fweh->num_event_codes; i++) {
441-
if (fweh->evt_handler[i]) {
442-
brcmf_fweh_map_fwevt_code(fweh, i, &code);
503+
eventmsgs = kzalloc(size, GFP_KERNEL);
504+
if(!eventmsgs)
505+
return -ENOMEM;
506+
507+
for (i = 0; i < drvr->fweh->num_event_codes; i++) {
508+
if (drvr->fweh->evt_handler[i]) {
443509
brcmf_dbg(EVENT, "enable event %s\n",
444-
brcmf_fweh_event_name(code));
445-
setbit(fweh->event_mask, i);
510+
brcmf_fweh_event_name(i));
511+
setbit(eventmsgs->mask, i);
446512
}
447513
}
448514

449515
/* want to handle IF event as well */
450516
brcmf_dbg(EVENT, "enable event IF\n");
451-
setbit(fweh->event_mask, BRCMF_E_IF);
517+
setbit(eventmsgs->mask, BRCMF_E_IF);
518+
519+
eventmsgs->version = EVENTMSGS_VER;
520+
eventmsgs->command = EVENTMSGS_SET_MASK;
521+
eventmsgs->len = drvr->fweh->event_mask_len;
452522

453523
/* allow per-vendor method to activate firmware events */
454524
if (!brcmf_fwvid_activate_events(ifp))
455525
return 0;
456526

457-
err = brcmf_fil_iovar_data_set(ifp, "event_msgs", fweh->event_mask,
458-
fweh->event_mask_len);
527+
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_EVENT_MSGS_EXT))
528+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs_ext",
529+
eventmsgs, size);
530+
else
531+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs",
532+
drvr->fweh->event_mask,
533+
drvr->fweh->event_mask_len);
534+
459535
if (err)
460-
bphy_err(fweh->drvr, "Set event_msgs error (%d)\n", err);
536+
bphy_err(drvr, "Set event_msgs error (%d)\n", err);
537+
538+
kfree(eventmsgs);
461539
return err;
462540
}
463541

drivers/net/wireless/broadcom/brcm80211/brcmfmac/fweh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code,
356356
void *data));
357357
void brcmf_fweh_unregister(struct brcmf_pub *drvr,
358358
enum brcmf_fweh_event_code code);
359+
int brcmf_fweh_init_events(struct brcmf_if *ifp);
359360
int brcmf_fweh_activate_events(struct brcmf_if *ifp);
360361
void brcmf_fweh_process_event(struct brcmf_pub *drvr,
361362
struct brcmf_event *event_packet,

drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,4 +1249,31 @@ struct brcmf_mkeep_alive_pkt_le {
12491249
u8 data[];
12501250
} __packed;
12511251

1252+
enum event_msgs_ext_command {
1253+
EVENTMSGS_NONE = 0,
1254+
EVENTMSGS_SET_BIT = 1,
1255+
EVENTMSGS_RESET_BIT = 2,
1256+
EVENTMSGS_SET_MASK = 3
1257+
};
1258+
1259+
#define EVENTMSGS_VER 1
1260+
1261+
/**
1262+
* struct brcmf_eventmsgs_ext_le - new event message mask commands
1263+
*
1264+
* @version: EVENTMSGS_VER
1265+
* @command: one of enum event_msgs_ext_command
1266+
* @len: for set, the mask size from the application to the firmware.
1267+
* for get, the actual firmware mask size.
1268+
* @maxgetsize: for get, the max size that the application can read from
1269+
* the firmware.
1270+
*/
1271+
struct brcmf_eventmsgs_ext_le {
1272+
u8 version;
1273+
u8 command;
1274+
u8 len;
1275+
u8 maxgetsize;
1276+
u8 mask[];
1277+
};
1278+
12521279
#endif /* FWIL_TYPES_H_ */

0 commit comments

Comments
 (0)