Skip to content

Commit 997f428

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 a73c103 commit 997f428

7 files changed

Lines changed: 126 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
@@ -1224,6 +1224,11 @@ static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
12241224

12251225
brcmf_feat_attach(drvr);
12261226

1227+
/* Setup event_msgs, enable E_IF */
1228+
ret = brcmf_fweh_init_events(ifp);
1229+
if (ret)
1230+
goto fail;
1231+
12271232
ret = brcmf_proto_init_done(drvr);
12281233
if (ret < 0)
12291234
goto fail;

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

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

335336
pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
336337
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
@@ -58,7 +58,8 @@
5858
BRCMF_FEAT_DEF(SCAN_V2) \
5959
BRCMF_FEAT_DEF(SCAN_V3) \
6060
BRCMF_FEAT_DEF(PMKID_V2) \
61-
BRCMF_FEAT_DEF(PMKID_V3)
61+
BRCMF_FEAT_DEF(PMKID_V3) \
62+
BRCMF_FEAT_DEF(EVENT_MSGS_EXT) \
6263

6364
/*
6465
* Quirks:

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

Lines changed: 89 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"
@@ -423,36 +425,111 @@ void brcmf_fweh_unregister(struct brcmf_pub *drvr,
423425
drvr->fweh->evt_handler[evt_handler_idx] = NULL;
424426
}
425427

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

437-
memset(fweh->event_mask, 0, fweh->event_mask_len);
438-
for (i = 0; i < fweh->num_event_codes; i++) {
439-
if (fweh->evt_handler[i]) {
440-
brcmf_fweh_map_fwevt_code(fweh, i, &code);
501+
eventmsgs = kzalloc(size, GFP_KERNEL);
502+
if(!eventmsgs)
503+
return -ENOMEM;
504+
505+
for (i = 0; i < drvr->fweh->num_event_codes; i++) {
506+
if (drvr->fweh->evt_handler[i]) {
441507
brcmf_dbg(EVENT, "enable event %s\n",
442-
brcmf_fweh_event_name(code));
443-
setbit(fweh->event_mask, i);
508+
brcmf_fweh_event_name(i));
509+
setbit(eventmsgs->mask, i);
444510
}
445511
}
446512

447513
/* want to handle IF event as well */
448514
brcmf_dbg(EVENT, "enable event IF\n");
449-
setbit(fweh->event_mask, BRCMF_E_IF);
515+
setbit(eventmsgs->mask, BRCMF_E_IF);
516+
517+
eventmsgs->version = EVENTMSGS_VER;
518+
eventmsgs->command = EVENTMSGS_SET_MASK;
519+
eventmsgs->len = drvr->fweh->event_mask_len;
520+
521+
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_EVENT_MSGS_EXT))
522+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs_ext",
523+
eventmsgs, size);
524+
else
525+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs",
526+
drvr->fweh->event_mask,
527+
drvr->fweh->event_mask_len);
450528

451-
err = brcmf_fil_iovar_data_set(ifp, "event_msgs", fweh->event_mask,
452-
fweh->event_mask_len);
453529
if (err)
454-
bphy_err(fweh->drvr, "Set event_msgs error (%d)\n", err);
530+
bphy_err(drvr, "Set event_msgs error (%d)\n", err);
455531

532+
kfree(eventmsgs);
456533
return err;
457534
}
458535

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code,
352352
void *data));
353353
void brcmf_fweh_unregister(struct brcmf_pub *drvr,
354354
enum brcmf_fweh_event_code code);
355+
int brcmf_fweh_init_events(struct brcmf_if *ifp);
355356
int brcmf_fweh_activate_events(struct brcmf_if *ifp);
356357
void brcmf_fweh_process_event(struct brcmf_pub *drvr,
357358
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)