[BACK]Return to bwfmvar.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / dev / ic

File: [cvs.NetBSD.org] / src / sys / dev / ic / bwfmvar.h (download)

Revision 1.7, Wed Mar 25 03:44:44 2020 UTC (4 years ago) by thorpej
Branch: MAIN
Changes since 1.6: +51 -2 lines

- Refactor the firmware loading code into a set of common routines in the
  core driver that understand how to find model-specific files before the
  generic files.  This greatly simplifies the firmware loading procedure
  in each of the bus front ends.  Adding additional firmware file types
  (such as CLM files) much simpler.
- Make firmware image selection table-driven rather than a set of switch()
  and if() statements.
- Add several additional firmware image entries.

/* $NetBSD: bwfmvar.h,v 1.7 2020/03/25 03:44:44 thorpej Exp $ */
/* $OpenBSD: bwfmvar.h,v 1.1 2017/10/11 17:19:50 patrick Exp $ */
/*
 * Copyright (c) 2010-2016 Broadcom Corporation
 * Copyright (c) 2016,2017 Patrick Wildt <patrick@blueri.se>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <sys/pcq.h>
#include <dev/firmload.h>

/* Chipcommon Core Chip IDs */
#define BRCM_CC_43143_CHIP_ID		43143
#define BRCM_CC_43235_CHIP_ID		43235
#define BRCM_CC_43236_CHIP_ID		43236
#define BRCM_CC_43238_CHIP_ID		43238
#define BRCM_CC_43241_CHIP_ID		0x4324
#define BRCM_CC_43242_CHIP_ID		43242
#define BRCM_CC_4329_CHIP_ID		0x4329
#define BRCM_CC_4330_CHIP_ID		0x4330
#define BRCM_CC_4334_CHIP_ID		0x4334
#define BRCM_CC_43340_CHIP_ID		43340
#define BRCM_CC_43341_CHIP_ID		43341
#define BRCM_CC_43362_CHIP_ID		43362
#define BRCM_CC_4335_CHIP_ID		0x4335
#define BRCM_CC_4339_CHIP_ID		0x4339
#define BRCM_CC_43430_CHIP_ID		43430
#define BRCM_CC_4345_CHIP_ID		0x4345
#define BRCM_CC_43465_CHIP_ID		43465
#define BRCM_CC_4350_CHIP_ID		0x4350
#define BRCM_CC_43525_CHIP_ID		43525
#define BRCM_CC_4354_CHIP_ID		0x4354
#define BRCM_CC_4356_CHIP_ID		0x4356
#define BRCM_CC_43566_CHIP_ID		43566
#define BRCM_CC_43567_CHIP_ID		43567
#define BRCM_CC_43569_CHIP_ID		43569
#define BRCM_CC_43570_CHIP_ID		43570
#define BRCM_CC_4358_CHIP_ID		0x4358
#define BRCM_CC_4359_CHIP_ID		0x4359
#define BRCM_CC_43602_CHIP_ID		43602
#define BRCM_CC_4365_CHIP_ID		0x4365
#define BRCM_CC_4366_CHIP_ID		0x4366
#define BRCM_CC_43664_CHIP_ID		43664
#define BRCM_CC_4371_CHIP_ID		0x4371
#define CY_CC_4373_CHIP_ID		0x4373
#define CY_CC_43012_CHIP_ID		43012

/* Defaults */
#define BWFM_DEFAULT_SCAN_CHANNEL_TIME	40
#define BWFM_DEFAULT_SCAN_UNASSOC_TIME	40
#define BWFM_DEFAULT_SCAN_PASSIVE_TIME	120

#define	BWFM_TASK_COUNT			256

struct bwfm_softc;

struct bwfm_firmware_selector {
	uint32_t	fwsel_chip;	/* chip ID */
	uint32_t	fwsel_revmask;	/* mask of applicable chip revs */
	const char	*fwsel_basename;/* firmware file base name */
};
#define	BWFM_FW_ENTRY(c, r, b)						\
	{ .fwsel_chip = (c),						\
	  .fwsel_revmask = (r),						\
	  .fwsel_basename = b }

#define	BWFM_FW_ENTRY_END						\
	{ .fwsel_basename = NULL }

#define	BWFM_FWSEL_REV_EQ(x)	__BIT(x)
#define	BWFM_FWSEL_REV_LE(x)	__BITS(0,x)
#define	BWFM_FWSEL_REV_GE(x)	__BITS(x,31)
#define	BWFM_FWSEL_ALLREVS	__BITS(0,31)

#define	BWFM_FILETYPE_UCODE	0
#define	BWFM_FILETYPE_NVRAM	1
#define	BWFM_NFILETYPES		2

struct bwfm_firmware_context {
	/* inputs */
	uint32_t	ctx_chip;
	uint32_t	ctx_chiprev;
	const char *	ctx_model;
	uint32_t	ctx_req;

#define	BWFM_FWREQ(x)		__BIT(x)
#define	BWFM_FWOPT(x)		__BIT((x)+16)

	/* outputs */
	struct {
		void *	ctx_f_data;
		size_t	ctx_f_size;
	} ctx_file[BWFM_NFILETYPES];
};

struct bwfm_core {
	uint16_t	 co_id;
	uint16_t	 co_rev;
	uint32_t	 co_base;
	uint32_t	 co_wrapbase;
	LIST_ENTRY(bwfm_core) co_link;
};

struct bwfm_chip {
	uint32_t	 ch_chip;
	uint32_t	 ch_chiprev;
	uint32_t	 ch_cc_caps;
	uint32_t	 ch_cc_caps_ext;
	uint32_t	 ch_pmucaps;
	uint32_t	 ch_pmurev;
	uint32_t	 ch_rambase;
	uint32_t	 ch_ramsize;
	uint32_t	 ch_srsize;
	char		 ch_name[8];
	LIST_HEAD(,bwfm_core) ch_list;
	int (*ch_core_isup)(struct bwfm_softc *, struct bwfm_core *);
	void (*ch_core_disable)(struct bwfm_softc *, struct bwfm_core *,
	    uint32_t prereset, uint32_t reset);
	void (*ch_core_reset)(struct bwfm_softc *, struct bwfm_core *,
	    uint32_t prereset, uint32_t reset, uint32_t postreset);
};

struct bwfm_bus_ops {
	void (*bs_init)(struct bwfm_softc *);
	void (*bs_stop)(struct bwfm_softc *);
	int (*bs_txcheck)(struct bwfm_softc *);
	int (*bs_txdata)(struct bwfm_softc *, struct mbuf **);
	int (*bs_txctl)(struct bwfm_softc *, char *, size_t);
	int (*bs_rxctl)(struct bwfm_softc *, char *, size_t *);
};

struct bwfm_buscore_ops {
	uint32_t (*bc_read)(struct bwfm_softc *, uint32_t);
	void (*bc_write)(struct bwfm_softc *, uint32_t, uint32_t);
	int (*bc_prepare)(struct bwfm_softc *);
	int (*bc_reset)(struct bwfm_softc *);
	int (*bc_setup)(struct bwfm_softc *);
	void (*bc_activate)(struct bwfm_softc *, const uint32_t);
};

struct bwfm_proto_ops {
	int (*proto_query_dcmd)(struct bwfm_softc *, int, int,
	    char *, size_t *);
	int (*proto_set_dcmd)(struct bwfm_softc *, int, int,
	    char *, size_t);
};
extern struct bwfm_proto_ops bwfm_proto_bcdc_ops;

enum bwfm_task_cmd {
	BWFM_TASK_NEWSTATE,
	BWFM_TASK_KEY_SET,
	BWFM_TASK_KEY_DELETE,
	BWFM_TASK_RX_EVENT,
};

struct bwfm_cmd_newstate {
	enum ieee80211_state	 state;
	int			 arg;
};

struct bwfm_cmd_key {
	const struct ieee80211_key *key;
	uint8_t			 mac[IEEE80211_ADDR_LEN];
};

struct bwfm_task {
	struct work		 t_work;
	struct bwfm_softc	*t_sc;
	enum bwfm_task_cmd	 t_cmd;
	union {
		struct bwfm_cmd_newstate	newstate;
		struct bwfm_cmd_key		key;
		struct mbuf			*mbuf;
	} t_u;
#define	t_newstate	t_u.newstate
#define	t_key		t_u.key
#define	t_mbuf		t_u.mbuf
};

struct bwfm_softc {
	device_t		 sc_dev;
	struct ieee80211com	 sc_ic;
	struct ethercom		 sc_ec;
#define	sc_if			 sc_ec.ec_if

	struct bwfm_bus_ops	*sc_bus_ops;
	struct bwfm_buscore_ops	*sc_buscore_ops;
	struct bwfm_proto_ops	*sc_proto_ops;
	struct bwfm_chip	 sc_chip;
	uint8_t			 sc_io_type;
#define		BWFM_IO_TYPE_D11N		1
#define		BWFM_IO_TYPE_D11AC		2

	int			 sc_tx_timer;

	bool			 sc_if_attached;
	struct bwfm_task	 sc_task[BWFM_TASK_COUNT];
	pcq_t			*sc_freetask;
	struct workqueue	*sc_taskq;

	int			(*sc_newstate)(struct ieee80211com *,
				    enum ieee80211_state, int);

	int			 sc_bcdc_reqid;
};

void bwfm_attach(struct bwfm_softc *);
void bwfm_chip_socram_ramsize(struct bwfm_softc *, struct bwfm_core *);
void bwfm_chip_sysmem_ramsize(struct bwfm_softc *, struct bwfm_core *);
void bwfm_chip_tcm_ramsize(struct bwfm_softc *, struct bwfm_core *);
void bwfm_chip_tcm_rambase(struct bwfm_softc *);
void bwfm_start(struct ifnet *);
int bwfm_detach(struct bwfm_softc *, int);
int bwfm_chip_attach(struct bwfm_softc *);
int bwfm_chip_set_active(struct bwfm_softc *, uint32_t);
void bwfm_chip_set_passive(struct bwfm_softc *);
int bwfm_chip_sr_capable(struct bwfm_softc *);
struct bwfm_core *bwfm_chip_get_core(struct bwfm_softc *, int);
struct bwfm_core *bwfm_chip_get_pmu(struct bwfm_softc *);
void bwfm_rx(struct bwfm_softc *, struct mbuf *m);

void	bwfm_firmware_context_init(struct bwfm_firmware_context *,
	    uint32_t, uint32_t, const char *, uint32_t);
bool	bwfm_firmware_open(struct bwfm_softc *,
	    const struct bwfm_firmware_selector *,
	    struct bwfm_firmware_context *);
void	bwfm_firmware_close(struct bwfm_firmware_context *);
void *	bwfm_firmware_data(struct bwfm_firmware_context *,
	    unsigned int, size_t *);
const char *bwfm_firmware_description(unsigned int);