Skip to content

Commit c7fb3a7

Browse files
committed
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 399ef7b commit c7fb3a7

7 files changed

Lines changed: 120 additions & 23 deletions

File tree

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

Lines changed: 1 addition & 16 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-
s8 eventmask[BRCMF_EVENTING_MASK_LEN];
270270
u8 buf[BRCMF_DCMD_SMLEN];
271271
struct brcmf_bus *bus;
272272
struct brcmf_rev_info_le revinfo;
@@ -412,21 +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", eventmask,
417-
BRCMF_EVENTING_MASK_LEN);
418-
if (err) {
419-
bphy_err(drvr, "Get event_msgs error (%d)\n", err);
420-
goto done;
421-
}
422-
setbit(eventmask, BRCMF_E_IF);
423-
err = brcmf_fil_iovar_data_set(ifp, "event_msgs", eventmask,
424-
BRCMF_EVENTING_MASK_LEN);
425-
if (err) {
426-
bphy_err(drvr, "Set event_msgs error (%d)\n", err);
427-
goto done;
428-
}
429-
430415
/* Setup default scan channel time */
431416
err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_SCAN_CHANNEL_TIME,
432417
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
@@ -1220,6 +1220,11 @@ static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
12201220

12211221
brcmf_feat_attach(drvr);
12221222

1223+
/* Setup event_msgs, enable E_IF */
1224+
ret = brcmf_fweh_init_events(ifp);
1225+
if (ret)
1226+
goto fail;
1227+
12231228
ret = brcmf_proto_init_done(drvr);
12241229
if (ret < 0)
12251230
goto fail;

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

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

334335
pfn_mac.version = BRCMF_PFN_MACADDR_CFG_VER;
335336
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: 83 additions & 6 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

1820
/**
@@ -350,6 +352,67 @@ void brcmf_fweh_unregister(struct brcmf_pub *drvr,
350352
drvr->fweh.evt_handler[code] = NULL;
351353
}
352354

355+
/**
356+
* brcmf_fweh_init_events() - initialize event handling.
357+
*
358+
* @ifp: primary interface object.
359+
*/
360+
int brcmf_fweh_init_events(struct brcmf_if *ifp)
361+
{
362+
struct brcmf_pub *drvr = ifp->drvr;
363+
struct brcmf_eventmsgs_ext_le *eventmsgs;
364+
size_t size = sizeof(*eventmsgs) + BRCMF_EVENTING_MASK_LEN;
365+
int err;
366+
367+
eventmsgs = kzalloc(size, GFP_KERNEL);
368+
if(!eventmsgs)
369+
return -ENOMEM;
370+
371+
eventmsgs->version = EVENTMSGS_VER;
372+
eventmsgs->command = EVENTMSGS_NONE;
373+
eventmsgs->len = BRCMF_EVENTING_MASK_LEN;
374+
eventmsgs->maxgetsize = BRCMF_EVENTING_MASK_LEN;
375+
376+
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_EVENT_MSGS_EXT))
377+
err = brcmf_fil_iovar_data_get(ifp, "event_msgs_ext",
378+
eventmsgs, size);
379+
else
380+
err = brcmf_fil_iovar_data_get(ifp, "event_msgs",
381+
eventmsgs->mask,
382+
BRCMF_EVENTING_MASK_LEN);
383+
384+
if (err) {
385+
bphy_err(drvr, "Get event_msgs error (%d)\n", err);
386+
kfree(eventmsgs);
387+
return err;
388+
}
389+
390+
brcmf_dbg(EVENT, "Event mask len: driver=%d fw=%d\n",
391+
BRCMF_EVENTING_MASK_LEN, eventmsgs->len);
392+
393+
/* want to handle IF event as well */
394+
brcmf_dbg(EVENT, "enable event IF\n");
395+
setbit(eventmsgs->mask, BRCMF_E_IF);
396+
397+
eventmsgs->version = EVENTMSGS_VER;
398+
eventmsgs->command = EVENTMSGS_SET_MASK;
399+
eventmsgs->len = BRCMF_EVENTING_MASK_LEN;
400+
401+
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_EVENT_MSGS_EXT))
402+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs_ext",
403+
eventmsgs, size);
404+
else
405+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs",
406+
eventmsgs->mask,
407+
BRCMF_EVENTING_MASK_LEN);
408+
409+
if (err)
410+
bphy_err(drvr, "Set event_msgs error (%d)\n", err);
411+
412+
kfree(eventmsgs);
413+
return err;
414+
}
415+
353416
/**
354417
* brcmf_fweh_activate_events() - enables firmware events registered.
355418
*
@@ -358,27 +421,41 @@ void brcmf_fweh_unregister(struct brcmf_pub *drvr,
358421
int brcmf_fweh_activate_events(struct brcmf_if *ifp)
359422
{
360423
struct brcmf_pub *drvr = ifp->drvr;
424+
struct brcmf_eventmsgs_ext_le *eventmsgs;
425+
size_t size = sizeof(*eventmsgs) + BRCMF_EVENTING_MASK_LEN;
361426
int i, err;
362-
s8 eventmask[BRCMF_EVENTING_MASK_LEN];
363427

364-
memset(eventmask, 0, sizeof(eventmask));
428+
eventmsgs = kzalloc(size, GFP_KERNEL);
429+
if(!eventmsgs)
430+
return -ENOMEM;
431+
365432
for (i = 0; i < BRCMF_E_LAST; i++) {
366433
if (ifp->drvr->fweh.evt_handler[i]) {
367434
brcmf_dbg(EVENT, "enable event %s\n",
368435
brcmf_fweh_event_name(i));
369-
setbit(eventmask, i);
436+
setbit(eventmsgs->mask, i);
370437
}
371438
}
372439

373440
/* want to handle IF event as well */
374441
brcmf_dbg(EVENT, "enable event IF\n");
375-
setbit(eventmask, BRCMF_E_IF);
442+
setbit(eventmsgs->mask, BRCMF_E_IF);
443+
444+
eventmsgs->version = EVENTMSGS_VER;
445+
eventmsgs->command = EVENTMSGS_SET_MASK;
446+
eventmsgs->len = BRCMF_EVENTING_MASK_LEN;
447+
448+
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_EVENT_MSGS_EXT))
449+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs_ext",
450+
eventmsgs, size);
451+
else
452+
err = brcmf_fil_iovar_data_set(ifp, "event_msgs",
453+
eventmsgs->mask, size);
376454

377-
err = brcmf_fil_iovar_data_set(ifp, "event_msgs",
378-
eventmask, BRCMF_EVENTING_MASK_LEN);
379455
if (err)
380456
bphy_err(drvr, "Set event_msgs error (%d)\n", err);
381457

458+
kfree(eventmsgs);
382459
return err;
383460
}
384461

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code,
316316
void *data));
317317
void brcmf_fweh_unregister(struct brcmf_pub *drvr,
318318
enum brcmf_fweh_event_code code);
319+
int brcmf_fweh_init_events(struct brcmf_if *ifp);
319320
int brcmf_fweh_activate_events(struct brcmf_if *ifp);
320321
void brcmf_fweh_process_event(struct brcmf_pub *drvr,
321322
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
@@ -1244,4 +1244,31 @@ struct brcmf_mkeep_alive_pkt_le {
12441244
u8 data[];
12451245
} __packed;
12461246

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

0 commit comments

Comments
 (0)