xref: /openbsd-src/sys/dev/ic/bwfmvar.h (revision ec9994a1ab17a93efb508a42556a8198443660dc)
1*ec9994a1Skettenis /* $OpenBSD: bwfmvar.h,v 1.31 2022/03/06 18:52:47 kettenis Exp $ */
232b2494eSpatrick /*
332b2494eSpatrick  * Copyright (c) 2010-2016 Broadcom Corporation
432b2494eSpatrick  * Copyright (c) 2016,2017 Patrick Wildt <patrick@blueri.se>
532b2494eSpatrick  *
632b2494eSpatrick  * Permission to use, copy, modify, and/or distribute this software for any
732b2494eSpatrick  * purpose with or without fee is hereby granted, provided that the above
832b2494eSpatrick  * copyright notice and this permission notice appear in all copies.
932b2494eSpatrick  *
1032b2494eSpatrick  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1132b2494eSpatrick  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1232b2494eSpatrick  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1332b2494eSpatrick  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1432b2494eSpatrick  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1532b2494eSpatrick  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1632b2494eSpatrick  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1732b2494eSpatrick  */
1832b2494eSpatrick 
1932b2494eSpatrick /* Chipcommon Core Chip IDs */
2032b2494eSpatrick #define BRCM_CC_43143_CHIP_ID		43143
2132b2494eSpatrick #define BRCM_CC_43235_CHIP_ID		43235
2232b2494eSpatrick #define BRCM_CC_43236_CHIP_ID		43236
2332b2494eSpatrick #define BRCM_CC_43238_CHIP_ID		43238
2432b2494eSpatrick #define BRCM_CC_43241_CHIP_ID		0x4324
2532b2494eSpatrick #define BRCM_CC_43242_CHIP_ID		43242
2632b2494eSpatrick #define BRCM_CC_4329_CHIP_ID		0x4329
2732b2494eSpatrick #define BRCM_CC_4330_CHIP_ID		0x4330
2832b2494eSpatrick #define BRCM_CC_4334_CHIP_ID		0x4334
2932b2494eSpatrick #define BRCM_CC_43340_CHIP_ID		43340
305bc73f03Spatrick #define BRCM_CC_43341_CHIP_ID		43341
3132b2494eSpatrick #define BRCM_CC_43362_CHIP_ID		43362
3232b2494eSpatrick #define BRCM_CC_4335_CHIP_ID		0x4335
3332b2494eSpatrick #define BRCM_CC_4339_CHIP_ID		0x4339
3432b2494eSpatrick #define BRCM_CC_43430_CHIP_ID		43430
3532b2494eSpatrick #define BRCM_CC_4345_CHIP_ID		0x4345
36b7d6d397Spatrick #define BRCM_CC_43465_CHIP_ID		43465
3732b2494eSpatrick #define BRCM_CC_4350_CHIP_ID		0x4350
38b7d6d397Spatrick #define BRCM_CC_43525_CHIP_ID		43525
3932b2494eSpatrick #define BRCM_CC_4354_CHIP_ID		0x4354
408db7132fSpatrick #define BRCM_CC_4355_CHIP_ID		0x4355
4132b2494eSpatrick #define BRCM_CC_4356_CHIP_ID		0x4356
4232b2494eSpatrick #define BRCM_CC_43566_CHIP_ID		43566
4332b2494eSpatrick #define BRCM_CC_43567_CHIP_ID		43567
4432b2494eSpatrick #define BRCM_CC_43569_CHIP_ID		43569
4532b2494eSpatrick #define BRCM_CC_43570_CHIP_ID		43570
4632b2494eSpatrick #define BRCM_CC_4358_CHIP_ID		0x4358
4732b2494eSpatrick #define BRCM_CC_4359_CHIP_ID		0x4359
4832b2494eSpatrick #define BRCM_CC_43602_CHIP_ID		43602
498db7132fSpatrick #define BRCM_CC_4364_CHIP_ID		0x4364
5032b2494eSpatrick #define BRCM_CC_4365_CHIP_ID		0x4365
5132b2494eSpatrick #define BRCM_CC_4366_CHIP_ID		0x4366
528db7132fSpatrick #define BRCM_CC_43664_CHIP_ID		43664
538db7132fSpatrick #define BRCM_CC_43666_CHIP_ID		43666
5432b2494eSpatrick #define BRCM_CC_4371_CHIP_ID		0x4371
558db7132fSpatrick #define BRCM_CC_4377_CHIP_ID		0x4377
56c38a9bc9Spatrick #define BRCM_CC_4378_CHIP_ID		0x4378
578db7132fSpatrick #define BRCM_CC_4387_CHIP_ID		0x4387
58b7d6d397Spatrick #define CY_CC_4373_CHIP_ID		0x4373
598db7132fSpatrick #define CY_CC_43012_CHIP_ID		43012
608db7132fSpatrick #define CY_CC_43752_CHIP_ID		43752
6132b2494eSpatrick 
6232b2494eSpatrick /* Defaults */
6332b2494eSpatrick #define BWFM_DEFAULT_SCAN_CHANNEL_TIME	40
6432b2494eSpatrick #define BWFM_DEFAULT_SCAN_UNASSOC_TIME	40
6532b2494eSpatrick #define BWFM_DEFAULT_SCAN_PASSIVE_TIME	120
6632b2494eSpatrick 
6732b2494eSpatrick 
6832b2494eSpatrick struct bwfm_softc;
6932b2494eSpatrick 
7032b2494eSpatrick struct bwfm_core {
7132b2494eSpatrick 	uint16_t	 co_id;
7232b2494eSpatrick 	uint16_t	 co_rev;
7332b2494eSpatrick 	uint32_t	 co_base;
7432b2494eSpatrick 	uint32_t	 co_wrapbase;
7532b2494eSpatrick 	LIST_ENTRY(bwfm_core) co_link;
7632b2494eSpatrick };
7732b2494eSpatrick 
7832b2494eSpatrick struct bwfm_chip {
7932b2494eSpatrick 	uint32_t	 ch_chip;
8032b2494eSpatrick 	uint32_t	 ch_chiprev;
8132b2494eSpatrick 	uint32_t	 ch_cc_caps;
8232b2494eSpatrick 	uint32_t	 ch_cc_caps_ext;
8332b2494eSpatrick 	uint32_t	 ch_pmucaps;
8432b2494eSpatrick 	uint32_t	 ch_pmurev;
8532b2494eSpatrick 	uint32_t	 ch_rambase;
8632b2494eSpatrick 	uint32_t	 ch_ramsize;
8732b2494eSpatrick 	uint32_t	 ch_srsize;
8832b2494eSpatrick 	char		 ch_name[8];
8932b2494eSpatrick 	LIST_HEAD(,bwfm_core) ch_list;
9032b2494eSpatrick 	int (*ch_core_isup)(struct bwfm_softc *, struct bwfm_core *);
9132b2494eSpatrick 	void (*ch_core_disable)(struct bwfm_softc *, struct bwfm_core *,
9232b2494eSpatrick 	    uint32_t prereset, uint32_t reset);
9332b2494eSpatrick 	void (*ch_core_reset)(struct bwfm_softc *, struct bwfm_core *,
9432b2494eSpatrick 	    uint32_t prereset, uint32_t reset, uint32_t postreset);
9532b2494eSpatrick };
9632b2494eSpatrick 
9732b2494eSpatrick struct bwfm_bus_ops {
98972218f3Spatrick 	int (*bs_preinit)(struct bwfm_softc *);
9932b2494eSpatrick 	void (*bs_stop)(struct bwfm_softc *);
10002ee7d07Spatrick 	int (*bs_txcheck)(struct bwfm_softc *);
10132b2494eSpatrick 	int (*bs_txdata)(struct bwfm_softc *, struct mbuf *);
1022802c178Spatrick 	int (*bs_txctl)(struct bwfm_softc *, void *);
10332b2494eSpatrick };
10432b2494eSpatrick 
10532b2494eSpatrick struct bwfm_buscore_ops {
10632b2494eSpatrick 	uint32_t (*bc_read)(struct bwfm_softc *, uint32_t);
10732b2494eSpatrick 	void (*bc_write)(struct bwfm_softc *, uint32_t, uint32_t);
10832b2494eSpatrick 	int (*bc_prepare)(struct bwfm_softc *);
10932b2494eSpatrick 	int (*bc_reset)(struct bwfm_softc *);
11032b2494eSpatrick 	int (*bc_setup)(struct bwfm_softc *);
11132b2494eSpatrick 	void (*bc_activate)(struct bwfm_softc *, uint32_t);
11232b2494eSpatrick };
11332b2494eSpatrick 
11432b2494eSpatrick struct bwfm_proto_ops {
11532b2494eSpatrick 	int (*proto_query_dcmd)(struct bwfm_softc *, int, int,
11632b2494eSpatrick 	    char *, size_t *);
11732b2494eSpatrick 	int (*proto_set_dcmd)(struct bwfm_softc *, int, int,
11832b2494eSpatrick 	    char *, size_t);
1196f241297Spatrick 	void (*proto_rx)(struct bwfm_softc *, struct mbuf *,
1206f241297Spatrick 	    struct mbuf_list *);
121029d6dd5Spatrick 	void (*proto_rxctl)(struct bwfm_softc *, char *, size_t);
12232b2494eSpatrick };
12332b2494eSpatrick extern struct bwfm_proto_ops bwfm_proto_bcdc_ops;
12432b2494eSpatrick 
1257d9a7415Spatrick struct bwfm_host_cmd {
1267d9a7415Spatrick 	void	 (*cb)(struct bwfm_softc *, void *);
1277d9a7415Spatrick 	uint8_t	 data[256];
1287d9a7415Spatrick };
1297d9a7415Spatrick 
1307d9a7415Spatrick struct bwfm_cmd_key {
1317d9a7415Spatrick 	struct ieee80211_node	 *ni;
1327d9a7415Spatrick 	struct ieee80211_key	 *k;
1337d9a7415Spatrick };
1347d9a7415Spatrick 
135518be5f3Spatrick struct bwfm_cmd_flowring_create {
13602ee7d07Spatrick 	struct mbuf		*m;
137f67437f3Spatrick 	int			 flowid;
138f67437f3Spatrick 	int			 prio;
139518be5f3Spatrick };
140518be5f3Spatrick 
141b5553ee6Spatrick struct bwfm_cmd_flowring_delete {
142b5553ee6Spatrick 	int			 flowid;
143b5553ee6Spatrick };
144b5553ee6Spatrick 
1457d9a7415Spatrick struct bwfm_host_cmd_ring {
1467d9a7415Spatrick #define BWFM_HOST_CMD_RING_COUNT	32
1477d9a7415Spatrick 	struct bwfm_host_cmd	 cmd[BWFM_HOST_CMD_RING_COUNT];
1487d9a7415Spatrick 	int			 cur;
1497d9a7415Spatrick 	int			 next;
1507d9a7415Spatrick 	int			 queued;
1517d9a7415Spatrick };
1527d9a7415Spatrick 
153029d6dd5Spatrick struct bwfm_proto_bcdc_ctl {
154029d6dd5Spatrick 	int				 reqid;
155029d6dd5Spatrick 	char				*buf;
156029d6dd5Spatrick 	size_t				 len;
157029d6dd5Spatrick 	int				 done;
158029d6dd5Spatrick 	TAILQ_ENTRY(bwfm_proto_bcdc_ctl) next;
159029d6dd5Spatrick };
160029d6dd5Spatrick 
16132b2494eSpatrick struct bwfm_softc {
16232b2494eSpatrick 	struct device		 sc_dev;
16332b2494eSpatrick 	struct ieee80211com	 sc_ic;
16432b2494eSpatrick 	struct ifmedia		 sc_media;
16532b2494eSpatrick 	struct bwfm_bus_ops	*sc_bus_ops;
16632b2494eSpatrick 	struct bwfm_buscore_ops	*sc_buscore_ops;
16732b2494eSpatrick 	struct bwfm_proto_ops	*sc_proto_ops;
16832b2494eSpatrick 	struct bwfm_chip	 sc_chip;
16932b2494eSpatrick 	uint8_t			 sc_io_type;
17032b2494eSpatrick #define		BWFM_IO_TYPE_D11N		1
17132b2494eSpatrick #define		BWFM_IO_TYPE_D11AC		2
17232b2494eSpatrick 
173db31205aSkettenis 	int			 sc_node;
174972218f3Spatrick 	int			 sc_initialized;
17532b2494eSpatrick 	int			 sc_tx_timer;
1767d9a7415Spatrick 
1779b183917Skettenis 	int			 sc_scan_ver;
1789b183917Skettenis 
1797d9a7415Spatrick 	int			 (*sc_newstate)(struct ieee80211com *,
1807d9a7415Spatrick 				     enum ieee80211_state, int);
1817d9a7415Spatrick 	struct bwfm_host_cmd_ring sc_cmdq;
1827d9a7415Spatrick 	struct taskq		*sc_taskq;
1837d9a7415Spatrick 	struct task		 sc_task;
184625a64d2Spatrick 	struct mbuf_list	 sc_evml;
185029d6dd5Spatrick 
186029d6dd5Spatrick 	int			 sc_bcdc_reqid;
187029d6dd5Spatrick 	TAILQ_HEAD(, bwfm_proto_bcdc_ctl) sc_bcdc_rxctlq;
1886c2f85e4Spatrick 
189*ec9994a1Skettenis 	char			 sc_fwdir[16];
1906c2f85e4Spatrick 	u_char			*sc_clm;
1916c2f85e4Spatrick 	size_t			 sc_clmsize;
192da5a4af2Spatrick 	u_char			*sc_txcap;
193da5a4af2Spatrick 	size_t			 sc_txcapsize;
194da5a4af2Spatrick 	u_char			*sc_cal;
195da5a4af2Spatrick 	size_t			 sc_calsize;
196cbb32f9cSkrw 	int			 sc_key_tasks;
197c6a4ab0dSkettenis 
198c6a4ab0dSkettenis 	char			 sc_board_type[128];
199c6a4ab0dSkettenis 	char			 sc_module[8];
200c6a4ab0dSkettenis 	char			 sc_vendor[8];
201c6a4ab0dSkettenis 	char			 sc_modrev[8];
20232b2494eSpatrick };
20332b2494eSpatrick 
20432b2494eSpatrick void bwfm_attach(struct bwfm_softc *);
205972218f3Spatrick void bwfm_attachhook(struct device *);
206972218f3Spatrick int bwfm_preinit(struct bwfm_softc *);
2071a93a9bdSpatrick void bwfm_cleanup(struct bwfm_softc *);
20832b2494eSpatrick int bwfm_detach(struct bwfm_softc *, int);
2091a93a9bdSpatrick int bwfm_activate(struct bwfm_softc *, int);
21032b2494eSpatrick int bwfm_chip_attach(struct bwfm_softc *);
211e2612299Spatrick int bwfm_chip_set_active(struct bwfm_softc *, uint32_t);
212e2612299Spatrick void bwfm_chip_set_passive(struct bwfm_softc *);
213a4c8e2b6Spatrick int bwfm_chip_sr_capable(struct bwfm_softc *);
21432b2494eSpatrick struct bwfm_core *bwfm_chip_get_core(struct bwfm_softc *, int);
21532b2494eSpatrick struct bwfm_core *bwfm_chip_get_pmu(struct bwfm_softc *);
2166f241297Spatrick void bwfm_rx(struct bwfm_softc *, struct mbuf *, struct mbuf_list *);
217518be5f3Spatrick void bwfm_do_async(struct bwfm_softc *, void (*)(struct bwfm_softc *, void *),
218518be5f3Spatrick     void *, int);
219db31205aSkettenis int bwfm_nvram_convert(int, u_char **, size_t *, size_t *);
22094e4747cSpatrick int bwfm_loadfirmware(struct bwfm_softc *, const char *, const char *,
22194e4747cSpatrick     u_char **, size_t *, u_char **, size_t *, size_t *);
222