xref: /freebsd/sys/contrib/dev/broadcom/brcm80211/brcmfmac/fwvid.h (revision b4c3e9b5b09c829b4135aff738bd2893ed052377)
1*b4c3e9b5SBjoern A. Zeeb /* SPDX-License-Identifier: ISC */
2*b4c3e9b5SBjoern A. Zeeb /*
3*b4c3e9b5SBjoern A. Zeeb  * Copyright (c) 2022 Broadcom Corporation
4*b4c3e9b5SBjoern A. Zeeb  */
5*b4c3e9b5SBjoern A. Zeeb #ifndef FWVID_H_
6*b4c3e9b5SBjoern A. Zeeb #define FWVID_H_
7*b4c3e9b5SBjoern A. Zeeb 
8*b4c3e9b5SBjoern A. Zeeb #include "firmware.h"
9*b4c3e9b5SBjoern A. Zeeb #include "cfg80211.h"
10*b4c3e9b5SBjoern A. Zeeb 
11*b4c3e9b5SBjoern A. Zeeb struct brcmf_pub;
12*b4c3e9b5SBjoern A. Zeeb struct brcmf_if;
13*b4c3e9b5SBjoern A. Zeeb 
14*b4c3e9b5SBjoern A. Zeeb struct brcmf_fwvid_ops {
15*b4c3e9b5SBjoern A. Zeeb 	void (*feat_attach)(struct brcmf_if *ifp);
16*b4c3e9b5SBjoern A. Zeeb 	int (*set_sae_password)(struct brcmf_if *ifp, struct cfg80211_crypto_settings *crypto);
17*b4c3e9b5SBjoern A. Zeeb 	int (*alloc_fweh_info)(struct brcmf_pub *drvr);
18*b4c3e9b5SBjoern A. Zeeb 	int (*activate_events)(struct brcmf_if *ifp);
19*b4c3e9b5SBjoern A. Zeeb 	void (*get_cfg80211_ops)(struct brcmf_pub *drvr);
20*b4c3e9b5SBjoern A. Zeeb 	void (*register_event_handlers)(struct brcmf_pub *drvr);
21*b4c3e9b5SBjoern A. Zeeb };
22*b4c3e9b5SBjoern A. Zeeb 
23*b4c3e9b5SBjoern A. Zeeb /* exported functions */
24*b4c3e9b5SBjoern A. Zeeb int brcmf_fwvid_register_vendor(enum brcmf_fwvendor fwvid, struct module *mod,
25*b4c3e9b5SBjoern A. Zeeb 				const struct brcmf_fwvid_ops *ops);
26*b4c3e9b5SBjoern A. Zeeb int brcmf_fwvid_unregister_vendor(enum brcmf_fwvendor fwvid, struct module *mod);
27*b4c3e9b5SBjoern A. Zeeb 
28*b4c3e9b5SBjoern A. Zeeb /* core driver functions */
29*b4c3e9b5SBjoern A. Zeeb int brcmf_fwvid_attach(struct brcmf_pub *drvr);
30*b4c3e9b5SBjoern A. Zeeb void brcmf_fwvid_detach(struct brcmf_pub *drvr);
31*b4c3e9b5SBjoern A. Zeeb const char *brcmf_fwvid_vendor_name(struct brcmf_pub *drvr);
32*b4c3e9b5SBjoern A. Zeeb 
brcmf_fwvid_feat_attach(struct brcmf_if * ifp)33*b4c3e9b5SBjoern A. Zeeb static inline void brcmf_fwvid_feat_attach(struct brcmf_if *ifp)
34*b4c3e9b5SBjoern A. Zeeb {
35*b4c3e9b5SBjoern A. Zeeb 	const struct brcmf_fwvid_ops *vops = ifp->drvr->vops;
36*b4c3e9b5SBjoern A. Zeeb 
37*b4c3e9b5SBjoern A. Zeeb 	if (!vops->feat_attach)
38*b4c3e9b5SBjoern A. Zeeb 		return;
39*b4c3e9b5SBjoern A. Zeeb 
40*b4c3e9b5SBjoern A. Zeeb 	vops->feat_attach(ifp);
41*b4c3e9b5SBjoern A. Zeeb }
42*b4c3e9b5SBjoern A. Zeeb 
brcmf_fwvid_set_sae_password(struct brcmf_if * ifp,struct cfg80211_crypto_settings * crypto)43*b4c3e9b5SBjoern A. Zeeb static inline int brcmf_fwvid_set_sae_password(struct brcmf_if *ifp,
44*b4c3e9b5SBjoern A. Zeeb 					       struct cfg80211_crypto_settings *crypto)
45*b4c3e9b5SBjoern A. Zeeb {
46*b4c3e9b5SBjoern A. Zeeb 	const struct brcmf_fwvid_ops *vops = ifp->drvr->vops;
47*b4c3e9b5SBjoern A. Zeeb 
48*b4c3e9b5SBjoern A. Zeeb 	if (!vops || !vops->set_sae_password)
49*b4c3e9b5SBjoern A. Zeeb 		return -EOPNOTSUPP;
50*b4c3e9b5SBjoern A. Zeeb 
51*b4c3e9b5SBjoern A. Zeeb 	return vops->set_sae_password(ifp, crypto);
52*b4c3e9b5SBjoern A. Zeeb }
53*b4c3e9b5SBjoern A. Zeeb 
brcmf_fwvid_alloc_fweh_info(struct brcmf_pub * drvr)54*b4c3e9b5SBjoern A. Zeeb static inline int brcmf_fwvid_alloc_fweh_info(struct brcmf_pub *drvr)
55*b4c3e9b5SBjoern A. Zeeb {
56*b4c3e9b5SBjoern A. Zeeb 	if (!drvr->vops)
57*b4c3e9b5SBjoern A. Zeeb 		return -EIO;
58*b4c3e9b5SBjoern A. Zeeb 
59*b4c3e9b5SBjoern A. Zeeb 	return drvr->vops->alloc_fweh_info(drvr);
60*b4c3e9b5SBjoern A. Zeeb }
61*b4c3e9b5SBjoern A. Zeeb 
brcmf_fwvid_activate_events(struct brcmf_if * ifp)62*b4c3e9b5SBjoern A. Zeeb static inline int brcmf_fwvid_activate_events(struct brcmf_if *ifp)
63*b4c3e9b5SBjoern A. Zeeb {
64*b4c3e9b5SBjoern A. Zeeb 	const struct brcmf_fwvid_ops *vops = ifp->drvr->vops;
65*b4c3e9b5SBjoern A. Zeeb 
66*b4c3e9b5SBjoern A. Zeeb 	if (!vops || !vops->activate_events)
67*b4c3e9b5SBjoern A. Zeeb 		return -EOPNOTSUPP;
68*b4c3e9b5SBjoern A. Zeeb 
69*b4c3e9b5SBjoern A. Zeeb 	return vops->activate_events(ifp);
70*b4c3e9b5SBjoern A. Zeeb }
71*b4c3e9b5SBjoern A. Zeeb 
brcmf_fwvid_get_cfg80211_ops(struct brcmf_pub * drvr)72*b4c3e9b5SBjoern A. Zeeb static inline void brcmf_fwvid_get_cfg80211_ops(struct brcmf_pub *drvr)
73*b4c3e9b5SBjoern A. Zeeb {
74*b4c3e9b5SBjoern A. Zeeb 	if (!drvr->vops || !drvr->vops->get_cfg80211_ops)
75*b4c3e9b5SBjoern A. Zeeb 		return;
76*b4c3e9b5SBjoern A. Zeeb 
77*b4c3e9b5SBjoern A. Zeeb 	drvr->vops->get_cfg80211_ops(drvr);
78*b4c3e9b5SBjoern A. Zeeb }
79*b4c3e9b5SBjoern A. Zeeb 
brcmf_fwvid_register_event_handlers(struct brcmf_pub * drvr)80*b4c3e9b5SBjoern A. Zeeb static inline void brcmf_fwvid_register_event_handlers(struct brcmf_pub *drvr)
81*b4c3e9b5SBjoern A. Zeeb {
82*b4c3e9b5SBjoern A. Zeeb 	if (!drvr->vops || !drvr->vops->register_event_handlers)
83*b4c3e9b5SBjoern A. Zeeb 		return;
84*b4c3e9b5SBjoern A. Zeeb 
85*b4c3e9b5SBjoern A. Zeeb 	drvr->vops->register_event_handlers(drvr);
86*b4c3e9b5SBjoern A. Zeeb }
87*b4c3e9b5SBjoern A. Zeeb 
88*b4c3e9b5SBjoern A. Zeeb #endif /* FWVID_H_ */
89