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 */ 217453645fSAndriy Voskoboinyk 227453645fSAndriy Voskoboinyk #ifndef RTWN_PCI_VAR_H 237453645fSAndriy Voskoboinyk #define RTWN_PCI_VAR_H 247453645fSAndriy Voskoboinyk 257453645fSAndriy Voskoboinyk #define RTWN_PCI_RX_LIST_COUNT 256 267453645fSAndriy Voskoboinyk #define RTWN_PCI_TX_LIST_COUNT 256 277453645fSAndriy Voskoboinyk 28*17d5fbf2SAndriy Voskoboinyk /* sizeof(struct rtwn_rx_stat_common) + R88E_INTR_MSG_LEN */ 29*17d5fbf2SAndriy Voskoboinyk #define RTWN_PCI_RX_TMP_BUF_SIZE 84 30*17d5fbf2SAndriy Voskoboinyk 317453645fSAndriy Voskoboinyk struct rtwn_rx_data { 327453645fSAndriy Voskoboinyk bus_dmamap_t map; 337453645fSAndriy Voskoboinyk struct mbuf *m; 347453645fSAndriy Voskoboinyk bus_addr_t paddr; 357453645fSAndriy Voskoboinyk }; 367453645fSAndriy Voskoboinyk 377453645fSAndriy Voskoboinyk struct rtwn_rx_ring { 38c5ad99fcSAndriy Voskoboinyk struct rtwn_rx_stat_pci *desc; 397453645fSAndriy Voskoboinyk bus_addr_t paddr; 407453645fSAndriy Voskoboinyk bus_dma_tag_t desc_dmat; 417453645fSAndriy Voskoboinyk bus_dmamap_t desc_map; 427453645fSAndriy Voskoboinyk bus_dma_tag_t data_dmat; 437453645fSAndriy Voskoboinyk bus_dma_segment_t seg; 447453645fSAndriy Voskoboinyk struct rtwn_rx_data rx_data[RTWN_PCI_RX_LIST_COUNT]; 457453645fSAndriy Voskoboinyk int cur; 467453645fSAndriy Voskoboinyk }; 477453645fSAndriy Voskoboinyk 487453645fSAndriy Voskoboinyk struct rtwn_tx_data { 497453645fSAndriy Voskoboinyk bus_dmamap_t map; 507453645fSAndriy Voskoboinyk struct mbuf *m; 517453645fSAndriy Voskoboinyk struct ieee80211_node *ni; 527453645fSAndriy Voskoboinyk }; 537453645fSAndriy Voskoboinyk 547453645fSAndriy Voskoboinyk struct rtwn_tx_ring { 557453645fSAndriy Voskoboinyk bus_addr_t paddr; 567453645fSAndriy Voskoboinyk bus_dma_tag_t desc_dmat; 577453645fSAndriy Voskoboinyk bus_dmamap_t desc_map; 587453645fSAndriy Voskoboinyk bus_dma_tag_t data_dmat; 597453645fSAndriy Voskoboinyk bus_dma_segment_t seg; 607453645fSAndriy Voskoboinyk void *desc; 617453645fSAndriy Voskoboinyk struct rtwn_tx_data tx_data[RTWN_PCI_TX_LIST_COUNT]; 627453645fSAndriy Voskoboinyk int queued; 637453645fSAndriy Voskoboinyk int cur; 647453645fSAndriy Voskoboinyk int last; 657453645fSAndriy Voskoboinyk }; 667453645fSAndriy Voskoboinyk 677453645fSAndriy Voskoboinyk /* 687453645fSAndriy Voskoboinyk * TX queue indices. 697453645fSAndriy Voskoboinyk */ 707453645fSAndriy Voskoboinyk enum { 717453645fSAndriy Voskoboinyk RTWN_PCI_BK_QUEUE, 727453645fSAndriy Voskoboinyk RTWN_PCI_BE_QUEUE, 737453645fSAndriy Voskoboinyk RTWN_PCI_VI_QUEUE, 747453645fSAndriy Voskoboinyk RTWN_PCI_VO_QUEUE, 757453645fSAndriy Voskoboinyk RTWN_PCI_BEACON_QUEUE, 767453645fSAndriy Voskoboinyk RTWN_PCI_TXCMD_QUEUE, 777453645fSAndriy Voskoboinyk RTWN_PCI_MGNT_QUEUE, 787453645fSAndriy Voskoboinyk RTWN_PCI_HIGH_QUEUE, 797453645fSAndriy Voskoboinyk RTWN_PCI_HCCA_QUEUE, 807453645fSAndriy Voskoboinyk RTWN_PCI_NTXQUEUES 817453645fSAndriy Voskoboinyk }; 827453645fSAndriy Voskoboinyk 837453645fSAndriy Voskoboinyk /* 847453645fSAndriy Voskoboinyk * Interrupt events. 857453645fSAndriy Voskoboinyk */ 867453645fSAndriy Voskoboinyk enum { 877453645fSAndriy Voskoboinyk RTWN_PCI_INTR_RX_ERROR = 0x00000001, 887453645fSAndriy Voskoboinyk RTWN_PCI_INTR_RX_OVERFLOW = 0x00000002, 897453645fSAndriy Voskoboinyk RTWN_PCI_INTR_RX_DESC_UNAVAIL = 0x00000004, 907453645fSAndriy Voskoboinyk RTWN_PCI_INTR_RX_DONE = 0x00000008, 917453645fSAndriy Voskoboinyk RTWN_PCI_INTR_TX_ERROR = 0x00000010, 927453645fSAndriy Voskoboinyk RTWN_PCI_INTR_TX_OVERFLOW = 0x00000020, 937453645fSAndriy Voskoboinyk RTWN_PCI_INTR_TX_REPORT = 0x00000040, 947453645fSAndriy Voskoboinyk RTWN_PCI_INTR_PS_TIMEOUT = 0x00000080 957453645fSAndriy Voskoboinyk }; 967453645fSAndriy Voskoboinyk 977453645fSAndriy Voskoboinyk /* Shortcuts */ 987453645fSAndriy Voskoboinyk /* Vendor driver treats RX errors like ROK... */ 997453645fSAndriy Voskoboinyk #define RTWN_PCI_INTR_RX \ 100*17d5fbf2SAndriy Voskoboinyk (RTWN_PCI_INTR_RX_ERROR | RTWN_PCI_INTR_RX_OVERFLOW | \ 101*17d5fbf2SAndriy Voskoboinyk RTWN_PCI_INTR_RX_DESC_UNAVAIL | RTWN_PCI_INTR_RX_DONE) 1027453645fSAndriy Voskoboinyk 1037453645fSAndriy Voskoboinyk struct rtwn_pci_softc { 1047453645fSAndriy Voskoboinyk struct rtwn_softc pc_sc; /* must be the first */ 1057453645fSAndriy Voskoboinyk 1067453645fSAndriy Voskoboinyk struct resource *irq; 1077453645fSAndriy Voskoboinyk struct resource *mem; 1087453645fSAndriy Voskoboinyk bus_space_tag_t pc_st; 1097453645fSAndriy Voskoboinyk bus_space_handle_t pc_sh; 1107453645fSAndriy Voskoboinyk void *pc_ih; 1117453645fSAndriy Voskoboinyk bus_size_t pc_mapsize; 1127453645fSAndriy Voskoboinyk 113*17d5fbf2SAndriy Voskoboinyk uint8_t pc_rx_buf[RTWN_PCI_RX_TMP_BUF_SIZE]; 1147453645fSAndriy Voskoboinyk struct rtwn_rx_ring rx_ring; 1157453645fSAndriy Voskoboinyk struct rtwn_tx_ring tx_ring[RTWN_PCI_NTXQUEUES]; 1167453645fSAndriy Voskoboinyk 1177453645fSAndriy Voskoboinyk /* must be set by the driver. */ 1187453645fSAndriy Voskoboinyk uint16_t pc_qmap; 1197453645fSAndriy Voskoboinyk uint32_t tcr; 1207453645fSAndriy Voskoboinyk 1217453645fSAndriy Voskoboinyk void (*pc_setup_tx_desc)(struct rtwn_pci_softc *, 1227453645fSAndriy Voskoboinyk void *, uint32_t); 1237453645fSAndriy Voskoboinyk void (*pc_tx_postsetup)(struct rtwn_pci_softc *, 1247453645fSAndriy Voskoboinyk void *, bus_dma_segment_t *); 1257453645fSAndriy Voskoboinyk void (*pc_copy_tx_desc)(void *, const void *); 1267453645fSAndriy Voskoboinyk void (*pc_enable_intr)(struct rtwn_pci_softc *); 127*17d5fbf2SAndriy Voskoboinyk int (*pc_get_intr_status)(struct rtwn_pci_softc *, 128*17d5fbf2SAndriy Voskoboinyk int *); 1297453645fSAndriy Voskoboinyk }; 1307453645fSAndriy Voskoboinyk #define RTWN_PCI_SOFTC(sc) ((struct rtwn_pci_softc *)(sc)) 1317453645fSAndriy Voskoboinyk 1327453645fSAndriy Voskoboinyk #define rtwn_pci_setup_tx_desc(_pc, _desc, _addr) \ 1337453645fSAndriy Voskoboinyk (((_pc)->pc_setup_tx_desc)((_pc), (_desc), (_addr))) 1347453645fSAndriy Voskoboinyk #define rtwn_pci_tx_postsetup(_pc, _txd, _segs) \ 1357453645fSAndriy Voskoboinyk (((_pc)->pc_tx_postsetup)((_pc), (_txd), (_segs))) 1367453645fSAndriy Voskoboinyk #define rtwn_pci_copy_tx_desc(_pc, _dest, _src) \ 1377453645fSAndriy Voskoboinyk (((_pc)->pc_copy_tx_desc)((_dest), (_src))) 1387453645fSAndriy Voskoboinyk #define rtwn_pci_enable_intr(_pc) \ 1397453645fSAndriy Voskoboinyk (((_pc)->pc_enable_intr)((_pc))) 140*17d5fbf2SAndriy Voskoboinyk #define rtwn_pci_get_intr_status(_pc, _tx_rings) \ 141*17d5fbf2SAndriy Voskoboinyk (((_pc)->pc_get_intr_status)((_pc), (_tx_rings))) 1427453645fSAndriy Voskoboinyk 1437453645fSAndriy Voskoboinyk #endif /* RTWN_PCI_VAR_H */ 144