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. Zeebstatic 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. Zeebstatic 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. Zeebstatic 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. Zeebstatic 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. Zeebstatic 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. Zeebstatic 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