xref: /freebsd/sys/dev/rtwn/pci/rtwn_pci_var.h (revision 17d5fbf21b007d95c9caabb2f143642199af16b0)
17453645fSAndriy Voskoboinyk /*	$OpenBSD: if_rtwnreg.h,v 1.3 2015/06/14 08:02:47 stsp Exp $	*/
27453645fSAndriy Voskoboinyk 
37453645fSAndriy Voskoboinyk /*-
47453645fSAndriy Voskoboinyk  * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
57453645fSAndriy Voskoboinyk  * Copyright (c) 2015 Stefan Sperling <stsp@openbsd.org>
67453645fSAndriy Voskoboinyk  * Copyright (c) 2016 Andriy Voskoboinyk <avos@FreeBSD.org>
77453645fSAndriy Voskoboinyk  *
87453645fSAndriy Voskoboinyk  * Permission to use, copy, modify, and distribute this software for any
97453645fSAndriy Voskoboinyk  * purpose with or without fee is hereby granted, provided that the above
107453645fSAndriy Voskoboinyk  * copyright notice and this permission notice appear in all copies.
117453645fSAndriy Voskoboinyk  *
127453645fSAndriy Voskoboinyk  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
137453645fSAndriy Voskoboinyk  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
147453645fSAndriy Voskoboinyk  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
157453645fSAndriy Voskoboinyk  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
167453645fSAndriy Voskoboinyk  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
177453645fSAndriy Voskoboinyk  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
187453645fSAndriy Voskoboinyk  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
197453645fSAndriy Voskoboinyk  *
207453645fSAndriy Voskoboinyk  * $FreeBSD$
217453645fSAndriy Voskoboinyk  */
227453645fSAndriy Voskoboinyk 
237453645fSAndriy Voskoboinyk #ifndef RTWN_PCI_VAR_H
247453645fSAndriy Voskoboinyk #define RTWN_PCI_VAR_H
257453645fSAndriy Voskoboinyk 
267453645fSAndriy Voskoboinyk #define RTWN_PCI_RX_LIST_COUNT		256
277453645fSAndriy Voskoboinyk #define RTWN_PCI_TX_LIST_COUNT		256
287453645fSAndriy Voskoboinyk 
29*17d5fbf2SAndriy Voskoboinyk /* sizeof(struct rtwn_rx_stat_common) + R88E_INTR_MSG_LEN */
30*17d5fbf2SAndriy Voskoboinyk #define	RTWN_PCI_RX_TMP_BUF_SIZE	84
31*17d5fbf2SAndriy Voskoboinyk 
327453645fSAndriy Voskoboinyk struct rtwn_rx_data {
337453645fSAndriy Voskoboinyk 	bus_dmamap_t		map;
347453645fSAndriy Voskoboinyk 	struct mbuf		*m;
357453645fSAndriy Voskoboinyk 	bus_addr_t		paddr;
367453645fSAndriy Voskoboinyk };
377453645fSAndriy Voskoboinyk 
387453645fSAndriy Voskoboinyk struct rtwn_rx_ring {
39c5ad99fcSAndriy Voskoboinyk 	struct rtwn_rx_stat_pci	*desc;
407453645fSAndriy Voskoboinyk 	bus_addr_t		paddr;
417453645fSAndriy Voskoboinyk 	bus_dma_tag_t		desc_dmat;
427453645fSAndriy Voskoboinyk 	bus_dmamap_t		desc_map;
437453645fSAndriy Voskoboinyk 	bus_dma_tag_t		data_dmat;
447453645fSAndriy Voskoboinyk 	bus_dma_segment_t	seg;
457453645fSAndriy Voskoboinyk 	struct rtwn_rx_data	rx_data[RTWN_PCI_RX_LIST_COUNT];
467453645fSAndriy Voskoboinyk 	int			cur;
477453645fSAndriy Voskoboinyk };
487453645fSAndriy Voskoboinyk 
497453645fSAndriy Voskoboinyk struct rtwn_tx_data {
507453645fSAndriy Voskoboinyk 	bus_dmamap_t		map;
517453645fSAndriy Voskoboinyk 	struct mbuf		*m;
527453645fSAndriy Voskoboinyk 	struct ieee80211_node	*ni;
537453645fSAndriy Voskoboinyk };
547453645fSAndriy Voskoboinyk 
557453645fSAndriy Voskoboinyk struct rtwn_tx_ring {
567453645fSAndriy Voskoboinyk 	bus_addr_t		paddr;
577453645fSAndriy Voskoboinyk 	bus_dma_tag_t		desc_dmat;
587453645fSAndriy Voskoboinyk 	bus_dmamap_t		desc_map;
597453645fSAndriy Voskoboinyk 	bus_dma_tag_t		data_dmat;
607453645fSAndriy Voskoboinyk 	bus_dma_segment_t	seg;
617453645fSAndriy Voskoboinyk 	void			*desc;
627453645fSAndriy Voskoboinyk 	struct rtwn_tx_data	tx_data[RTWN_PCI_TX_LIST_COUNT];
637453645fSAndriy Voskoboinyk 	int			queued;
647453645fSAndriy Voskoboinyk 	int			cur;
657453645fSAndriy Voskoboinyk 	int			last;
667453645fSAndriy Voskoboinyk };
677453645fSAndriy Voskoboinyk 
687453645fSAndriy Voskoboinyk /*
697453645fSAndriy Voskoboinyk  * TX queue indices.
707453645fSAndriy Voskoboinyk  */
717453645fSAndriy Voskoboinyk enum {
727453645fSAndriy Voskoboinyk 	RTWN_PCI_BK_QUEUE,
737453645fSAndriy Voskoboinyk 	RTWN_PCI_BE_QUEUE,
747453645fSAndriy Voskoboinyk 	RTWN_PCI_VI_QUEUE,
757453645fSAndriy Voskoboinyk 	RTWN_PCI_VO_QUEUE,
767453645fSAndriy Voskoboinyk 	RTWN_PCI_BEACON_QUEUE,
777453645fSAndriy Voskoboinyk 	RTWN_PCI_TXCMD_QUEUE,
787453645fSAndriy Voskoboinyk 	RTWN_PCI_MGNT_QUEUE,
797453645fSAndriy Voskoboinyk 	RTWN_PCI_HIGH_QUEUE,
807453645fSAndriy Voskoboinyk 	RTWN_PCI_HCCA_QUEUE,
817453645fSAndriy Voskoboinyk 	RTWN_PCI_NTXQUEUES
827453645fSAndriy Voskoboinyk };
837453645fSAndriy Voskoboinyk 
847453645fSAndriy Voskoboinyk /*
857453645fSAndriy Voskoboinyk  * Interrupt events.
867453645fSAndriy Voskoboinyk  */
877453645fSAndriy Voskoboinyk enum {
887453645fSAndriy Voskoboinyk 	RTWN_PCI_INTR_RX_ERROR		= 0x00000001,
897453645fSAndriy Voskoboinyk 	RTWN_PCI_INTR_RX_OVERFLOW	= 0x00000002,
907453645fSAndriy Voskoboinyk 	RTWN_PCI_INTR_RX_DESC_UNAVAIL	= 0x00000004,
917453645fSAndriy Voskoboinyk 	RTWN_PCI_INTR_RX_DONE		= 0x00000008,
927453645fSAndriy Voskoboinyk 	RTWN_PCI_INTR_TX_ERROR		= 0x00000010,
937453645fSAndriy Voskoboinyk 	RTWN_PCI_INTR_TX_OVERFLOW	= 0x00000020,
947453645fSAndriy Voskoboinyk 	RTWN_PCI_INTR_TX_REPORT		= 0x00000040,
957453645fSAndriy Voskoboinyk 	RTWN_PCI_INTR_PS_TIMEOUT	= 0x00000080
967453645fSAndriy Voskoboinyk };
977453645fSAndriy Voskoboinyk 
987453645fSAndriy Voskoboinyk /* Shortcuts */
997453645fSAndriy Voskoboinyk /* Vendor driver treats RX errors like ROK... */
1007453645fSAndriy Voskoboinyk #define RTWN_PCI_INTR_RX \
101*17d5fbf2SAndriy Voskoboinyk 	(RTWN_PCI_INTR_RX_ERROR | RTWN_PCI_INTR_RX_OVERFLOW | \
102*17d5fbf2SAndriy Voskoboinyk 	 RTWN_PCI_INTR_RX_DESC_UNAVAIL | RTWN_PCI_INTR_RX_DONE)
1037453645fSAndriy Voskoboinyk 
1047453645fSAndriy Voskoboinyk 
1057453645fSAndriy Voskoboinyk struct rtwn_pci_softc {
1067453645fSAndriy Voskoboinyk 	struct rtwn_softc	pc_sc;		/* must be the first */
1077453645fSAndriy Voskoboinyk 
1087453645fSAndriy Voskoboinyk 	struct resource		*irq;
1097453645fSAndriy Voskoboinyk 	struct resource		*mem;
1107453645fSAndriy Voskoboinyk 	bus_space_tag_t		pc_st;
1117453645fSAndriy Voskoboinyk 	bus_space_handle_t	pc_sh;
1127453645fSAndriy Voskoboinyk 	void			*pc_ih;
1137453645fSAndriy Voskoboinyk 	bus_size_t		pc_mapsize;
1147453645fSAndriy Voskoboinyk 
115*17d5fbf2SAndriy Voskoboinyk 	uint8_t			pc_rx_buf[RTWN_PCI_RX_TMP_BUF_SIZE];
1167453645fSAndriy Voskoboinyk 	struct rtwn_rx_ring	rx_ring;
1177453645fSAndriy Voskoboinyk 	struct rtwn_tx_ring	tx_ring[RTWN_PCI_NTXQUEUES];
1187453645fSAndriy Voskoboinyk 
1197453645fSAndriy Voskoboinyk 	/* must be set by the driver. */
1207453645fSAndriy Voskoboinyk 	uint16_t		pc_qmap;
1217453645fSAndriy Voskoboinyk 	uint32_t		tcr;
1227453645fSAndriy Voskoboinyk 
1237453645fSAndriy Voskoboinyk 	void			(*pc_setup_tx_desc)(struct rtwn_pci_softc *,
1247453645fSAndriy Voskoboinyk 				    void *, uint32_t);
1257453645fSAndriy Voskoboinyk 	void			(*pc_tx_postsetup)(struct rtwn_pci_softc *,
1267453645fSAndriy Voskoboinyk 				    void *, bus_dma_segment_t *);
1277453645fSAndriy Voskoboinyk 	void			(*pc_copy_tx_desc)(void *, const void *);
1287453645fSAndriy Voskoboinyk 	void			(*pc_enable_intr)(struct rtwn_pci_softc *);
129*17d5fbf2SAndriy Voskoboinyk 	int			(*pc_get_intr_status)(struct rtwn_pci_softc *,
130*17d5fbf2SAndriy Voskoboinyk 				    int *);
1317453645fSAndriy Voskoboinyk };
1327453645fSAndriy Voskoboinyk #define RTWN_PCI_SOFTC(sc)	((struct rtwn_pci_softc *)(sc))
1337453645fSAndriy Voskoboinyk 
1347453645fSAndriy Voskoboinyk #define rtwn_pci_setup_tx_desc(_pc, _desc, _addr) \
1357453645fSAndriy Voskoboinyk 	(((_pc)->pc_setup_tx_desc)((_pc), (_desc), (_addr)))
1367453645fSAndriy Voskoboinyk #define rtwn_pci_tx_postsetup(_pc, _txd, _segs) \
1377453645fSAndriy Voskoboinyk 	(((_pc)->pc_tx_postsetup)((_pc), (_txd), (_segs)))
1387453645fSAndriy Voskoboinyk #define rtwn_pci_copy_tx_desc(_pc, _dest, _src) \
1397453645fSAndriy Voskoboinyk 	(((_pc)->pc_copy_tx_desc)((_dest), (_src)))
1407453645fSAndriy Voskoboinyk #define rtwn_pci_enable_intr(_pc) \
1417453645fSAndriy Voskoboinyk 	(((_pc)->pc_enable_intr)((_pc)))
142*17d5fbf2SAndriy Voskoboinyk #define rtwn_pci_get_intr_status(_pc, _tx_rings) \
143*17d5fbf2SAndriy Voskoboinyk 	(((_pc)->pc_get_intr_status)((_pc), (_tx_rings)))
1447453645fSAndriy Voskoboinyk 
1457453645fSAndriy Voskoboinyk #endif	/* RTWN_PCI_VAR_H */
146