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,
358421int 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
0 commit comments