Commit 42f7e5bf authored by Arend van Spriel's avatar Arend van Spriel Committed by Johannes Berg
Browse files

wifi: brcmfmac: support per-vendor cfg80211 callbacks and firmware events



Adding two vendor operations that can be used to provide per-vendor
cfg80211 callbacks and per-vendor handlers for firmware events. These
two are often related to handling interactions from user-space through
nl80211. Exporting brcmf_fweh_register() for registering the per-vendor
event handler callbacks. Some other exports for get event name string
and allowing use of brcmf_dbg() in per-vendor module.

Tested-by: default avatarJames Prestwood <prestwoj@gmail.com>
Signed-off-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Link: https://patch.msgid.link/20250425085519.492267-2-arend.vanspriel@broadcom.com


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent cf1b684a
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -6760,6 +6760,8 @@ static void brcmf_register_event_handlers(struct brcmf_cfg80211_info *cfg)
	brcmf_fweh_register(cfg->pub, BRCMF_E_PSK_SUP,
			    brcmf_notify_connect_status);
	brcmf_fweh_register(cfg->pub, BRCMF_E_RSSI, brcmf_notify_rssi);

	brcmf_fwvid_register_event_handlers(cfg->pub);
}

static void brcmf_deinit_priv_mem(struct brcmf_cfg80211_info *cfg)
+1 −0
Original line number Diff line number Diff line
@@ -491,6 +491,7 @@ void __brcmf_dbg(u32 level, const char *func, const char *fmt, ...)
	trace_brcmf_dbg(level, func, &vaf);
	va_end(args);
}
BRCMF_EXPORT_SYMBOL_GPL(__brcmf_dbg);
#endif

static void brcmf_mp_attach(void)
+2 −0
Original line number Diff line number Diff line
@@ -1363,6 +1363,8 @@ int brcmf_attach(struct device *dev)
	brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
			    brcmf_psm_watchdog_notify);

	brcmf_fwvid_get_cfg80211_ops(drvr);

	ret = brcmf_bus_started(drvr, drvr->ops);
	if (ret != 0) {
		bphy_err(drvr, "dongle is not responding: err=%d\n", ret);
+2 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ const char *brcmf_fweh_event_name(enum brcmf_fweh_event_code code)
	return "nodebug";
}
#endif
BRCMF_EXPORT_SYMBOL_GPL(brcmf_fweh_event_name);

/**
 * brcmf_fweh_queue_event() - create and queue event.
@@ -405,6 +406,7 @@ int brcmf_fweh_register(struct brcmf_pub *drvr, enum brcmf_fweh_event_code code,
		  brcmf_fweh_event_name(code));
	return 0;
}
BRCMF_EXPORT_SYMBOL_GPL(brcmf_fweh_register);

/**
 * brcmf_fweh_unregister() - remove handler for given code.
+18 −0
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@ struct brcmf_fwvid_ops {
	void (*feat_attach)(struct brcmf_if *ifp);
	int (*set_sae_password)(struct brcmf_if *ifp, struct cfg80211_crypto_settings *crypto);
	int (*alloc_fweh_info)(struct brcmf_pub *drvr);
	void (*get_cfg80211_ops)(struct brcmf_pub *drvr);
	void (*register_event_handlers)(struct brcmf_pub *drvr);
};

/* exported functions */
@@ -56,4 +58,20 @@ static inline int brcmf_fwvid_alloc_fweh_info(struct brcmf_pub *drvr)
	return drvr->vops->alloc_fweh_info(drvr);
}

static inline void brcmf_fwvid_get_cfg80211_ops(struct brcmf_pub *drvr)
{
	if (!drvr->vops || !drvr->vops->get_cfg80211_ops)
		return;

	drvr->vops->get_cfg80211_ops(drvr);
}

static inline void brcmf_fwvid_register_event_handlers(struct brcmf_pub *drvr)
{
	if (!drvr->vops || !drvr->vops->register_event_handlers)
		return;

	drvr->vops->register_event_handlers(drvr);
}

#endif /* FWVID_H_ */