1*2774f206SBjoern A. Zeeb /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2*2774f206SBjoern A. Zeeb /* Copyright(c) 2018-2019 Realtek Corporation 3*2774f206SBjoern A. Zeeb */ 4*2774f206SBjoern A. Zeeb 5*2774f206SBjoern A. Zeeb #ifndef __RTK_PCI_H_ 6*2774f206SBjoern A. Zeeb #define __RTK_PCI_H_ 7*2774f206SBjoern A. Zeeb 8*2774f206SBjoern A. Zeeb #include "main.h" 9*2774f206SBjoern A. Zeeb 10*2774f206SBjoern A. Zeeb #define RTK_DEFAULT_TX_DESC_NUM 128 11*2774f206SBjoern A. Zeeb #define RTK_BEQ_TX_DESC_NUM 256 12*2774f206SBjoern A. Zeeb 13*2774f206SBjoern A. Zeeb #define RTK_MAX_RX_DESC_NUM 512 14*2774f206SBjoern A. Zeeb /* 11K + rx desc size */ 15*2774f206SBjoern A. Zeeb #define RTK_PCI_RX_BUF_SIZE (11454 + 24) 16*2774f206SBjoern A. Zeeb 17*2774f206SBjoern A. Zeeb #define RTK_PCI_CTRL 0x300 18*2774f206SBjoern A. Zeeb #define BIT_RST_TRXDMA_INTF BIT(20) 19*2774f206SBjoern A. Zeeb #define BIT_RX_TAG_EN BIT(15) 20*2774f206SBjoern A. Zeeb #define REG_DBI_WDATA_V1 0x03E8 21*2774f206SBjoern A. Zeeb #define REG_DBI_RDATA_V1 0x03EC 22*2774f206SBjoern A. Zeeb #define REG_DBI_FLAG_V1 0x03F0 23*2774f206SBjoern A. Zeeb #define BIT_DBI_RFLAG BIT(17) 24*2774f206SBjoern A. Zeeb #define BIT_DBI_WFLAG BIT(16) 25*2774f206SBjoern A. Zeeb #define BITS_DBI_WREN GENMASK(15, 12) 26*2774f206SBjoern A. Zeeb #define BITS_DBI_ADDR_MASK GENMASK(11, 2) 27*2774f206SBjoern A. Zeeb 28*2774f206SBjoern A. Zeeb #define REG_MDIO_V1 0x03F4 29*2774f206SBjoern A. Zeeb #define REG_PCIE_MIX_CFG 0x03F8 30*2774f206SBjoern A. Zeeb #define BITS_MDIO_ADDR_MASK GENMASK(4, 0) 31*2774f206SBjoern A. Zeeb #define BIT_MDIO_WFLAG_V1 BIT(5) 32*2774f206SBjoern A. Zeeb #define RTW_PCI_MDIO_PG_SZ BIT(5) 33*2774f206SBjoern A. Zeeb #define RTW_PCI_MDIO_PG_OFFS_G1 0 34*2774f206SBjoern A. Zeeb #define RTW_PCI_MDIO_PG_OFFS_G2 2 35*2774f206SBjoern A. Zeeb #define RTW_PCI_WR_RETRY_CNT 20 36*2774f206SBjoern A. Zeeb 37*2774f206SBjoern A. Zeeb #define RTK_PCIE_LINK_CFG 0x0719 38*2774f206SBjoern A. Zeeb #define BIT_CLKREQ_SW_EN BIT(4) 39*2774f206SBjoern A. Zeeb #define BIT_L1_SW_EN BIT(3) 40*2774f206SBjoern A. Zeeb #define BIT_CLKREQ_N_PAD BIT(0) 41*2774f206SBjoern A. Zeeb #define RTK_PCIE_CLKDLY_CTRL 0x0725 42*2774f206SBjoern A. Zeeb 43*2774f206SBjoern A. Zeeb #define BIT_PCI_BCNQ_FLAG BIT(4) 44*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_BCNQ 0x308 45*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_H2CQ 0x1320 46*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_MGMTQ 0x310 47*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_BKQ 0x330 48*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_BEQ 0x328 49*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_VIQ 0x320 50*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_VOQ 0x318 51*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_HI0Q 0x340 52*2774f206SBjoern A. Zeeb #define RTK_PCI_RXBD_DESA_MPDUQ 0x338 53*2774f206SBjoern A. Zeeb 54*2774f206SBjoern A. Zeeb #define TRX_BD_IDX_MASK GENMASK(11, 0) 55*2774f206SBjoern A. Zeeb #define TRX_BD_HW_IDX_MASK GENMASK(27, 16) 56*2774f206SBjoern A. Zeeb 57*2774f206SBjoern A. Zeeb /* BCNQ is specialized for rsvd page, does not need to specify a number */ 58*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_H2CQ 0x1328 59*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_MGMTQ 0x380 60*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_BKQ 0x38A 61*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_BEQ 0x388 62*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_VIQ 0x386 63*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_VOQ 0x384 64*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_HI0Q 0x38C 65*2774f206SBjoern A. Zeeb #define RTK_PCI_RXBD_NUM_MPDUQ 0x382 66*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_H2CQ 0x132C 67*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_MGMTQ 0x3B0 68*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_BKQ 0x3AC 69*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_BEQ 0x3A8 70*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_VIQ 0x3A4 71*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_VOQ 0x3A0 72*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_HI0Q 0x3B8 73*2774f206SBjoern A. Zeeb #define RTK_PCI_RXBD_IDX_MPDUQ 0x3B4 74*2774f206SBjoern A. Zeeb 75*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_RWPTR_CLR 0x39C 76*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_H2CQ_CSR 0x1330 77*2774f206SBjoern A. Zeeb 78*2774f206SBjoern A. Zeeb #define BIT_CLR_H2CQ_HOST_IDX BIT(16) 79*2774f206SBjoern A. Zeeb #define BIT_CLR_H2CQ_HW_IDX BIT(8) 80*2774f206SBjoern A. Zeeb 81*2774f206SBjoern A. Zeeb #define RTK_PCI_HIMR0 0x0B0 82*2774f206SBjoern A. Zeeb #define RTK_PCI_HISR0 0x0B4 83*2774f206SBjoern A. Zeeb #define RTK_PCI_HIMR1 0x0B8 84*2774f206SBjoern A. Zeeb #define RTK_PCI_HISR1 0x0BC 85*2774f206SBjoern A. Zeeb #define RTK_PCI_HIMR2 0x10B0 86*2774f206SBjoern A. Zeeb #define RTK_PCI_HISR2 0x10B4 87*2774f206SBjoern A. Zeeb #define RTK_PCI_HIMR3 0x10B8 88*2774f206SBjoern A. Zeeb #define RTK_PCI_HISR3 0x10BC 89*2774f206SBjoern A. Zeeb /* IMR 0 */ 90*2774f206SBjoern A. Zeeb #define IMR_TIMER2 BIT(31) 91*2774f206SBjoern A. Zeeb #define IMR_TIMER1 BIT(30) 92*2774f206SBjoern A. Zeeb #define IMR_PSTIMEOUT BIT(29) 93*2774f206SBjoern A. Zeeb #define IMR_GTINT4 BIT(28) 94*2774f206SBjoern A. Zeeb #define IMR_GTINT3 BIT(27) 95*2774f206SBjoern A. Zeeb #define IMR_TBDER BIT(26) 96*2774f206SBjoern A. Zeeb #define IMR_TBDOK BIT(25) 97*2774f206SBjoern A. Zeeb #define IMR_TSF_BIT32_TOGGLE BIT(24) 98*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT0 BIT(20) 99*2774f206SBjoern A. Zeeb #define IMR_BCNDOK0 BIT(16) 100*2774f206SBjoern A. Zeeb #define IMR_HSISR_IND_ON_INT BIT(15) 101*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT_E BIT(14) 102*2774f206SBjoern A. Zeeb #define IMR_ATIMEND BIT(12) 103*2774f206SBjoern A. Zeeb #define IMR_HISR1_IND_INT BIT(11) 104*2774f206SBjoern A. Zeeb #define IMR_C2HCMD BIT(10) 105*2774f206SBjoern A. Zeeb #define IMR_CPWM2 BIT(9) 106*2774f206SBjoern A. Zeeb #define IMR_CPWM BIT(8) 107*2774f206SBjoern A. Zeeb #define IMR_HIGHDOK BIT(7) 108*2774f206SBjoern A. Zeeb #define IMR_MGNTDOK BIT(6) 109*2774f206SBjoern A. Zeeb #define IMR_BKDOK BIT(5) 110*2774f206SBjoern A. Zeeb #define IMR_BEDOK BIT(4) 111*2774f206SBjoern A. Zeeb #define IMR_VIDOK BIT(3) 112*2774f206SBjoern A. Zeeb #define IMR_VODOK BIT(2) 113*2774f206SBjoern A. Zeeb #define IMR_RDU BIT(1) 114*2774f206SBjoern A. Zeeb #define IMR_ROK BIT(0) 115*2774f206SBjoern A. Zeeb /* IMR 1 */ 116*2774f206SBjoern A. Zeeb #define IMR_TXFIFO_TH_INT BIT(30) 117*2774f206SBjoern A. Zeeb #define IMR_BTON_STS_UPDATE BIT(29) 118*2774f206SBjoern A. Zeeb #define IMR_MCUERR BIT(28) 119*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT7 BIT(27) 120*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT6 BIT(26) 121*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT5 BIT(25) 122*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT4 BIT(24) 123*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT3 BIT(23) 124*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT2 BIT(22) 125*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT1 BIT(21) 126*2774f206SBjoern A. Zeeb #define IMR_BCNDOK7 BIT(20) 127*2774f206SBjoern A. Zeeb #define IMR_BCNDOK6 BIT(19) 128*2774f206SBjoern A. Zeeb #define IMR_BCNDOK5 BIT(18) 129*2774f206SBjoern A. Zeeb #define IMR_BCNDOK4 BIT(17) 130*2774f206SBjoern A. Zeeb #define IMR_BCNDOK3 BIT(16) 131*2774f206SBjoern A. Zeeb #define IMR_BCNDOK2 BIT(15) 132*2774f206SBjoern A. Zeeb #define IMR_BCNDOK1 BIT(14) 133*2774f206SBjoern A. Zeeb #define IMR_ATIMEND_E BIT(13) 134*2774f206SBjoern A. Zeeb #define IMR_ATIMEND BIT(12) 135*2774f206SBjoern A. Zeeb #define IMR_TXERR BIT(11) 136*2774f206SBjoern A. Zeeb #define IMR_RXERR BIT(10) 137*2774f206SBjoern A. Zeeb #define IMR_TXFOVW BIT(9) 138*2774f206SBjoern A. Zeeb #define IMR_RXFOVW BIT(8) 139*2774f206SBjoern A. Zeeb #define IMR_CPU_MGQ_TXDONE BIT(5) 140*2774f206SBjoern A. Zeeb #define IMR_PS_TIMER_C BIT(4) 141*2774f206SBjoern A. Zeeb #define IMR_PS_TIMER_B BIT(3) 142*2774f206SBjoern A. Zeeb #define IMR_PS_TIMER_A BIT(2) 143*2774f206SBjoern A. Zeeb #define IMR_CPUMGQ_TX_TIMER BIT(1) 144*2774f206SBjoern A. Zeeb /* IMR 3 */ 145*2774f206SBjoern A. Zeeb #define IMR_H2CDOK BIT(16) 146*2774f206SBjoern A. Zeeb 147*2774f206SBjoern A. Zeeb enum rtw_pci_flags { 148*2774f206SBjoern A. Zeeb RTW_PCI_FLAG_NAPI_RUNNING, 149*2774f206SBjoern A. Zeeb 150*2774f206SBjoern A. Zeeb NUM_OF_RTW_PCI_FLAGS, 151*2774f206SBjoern A. Zeeb }; 152*2774f206SBjoern A. Zeeb 153*2774f206SBjoern A. Zeeb /* one element is reserved to know if the ring is closed */ 154*2774f206SBjoern A. Zeeb static inline int avail_desc(u32 wp, u32 rp, u32 len) 155*2774f206SBjoern A. Zeeb { 156*2774f206SBjoern A. Zeeb if (rp > wp) 157*2774f206SBjoern A. Zeeb return rp - wp - 1; 158*2774f206SBjoern A. Zeeb else 159*2774f206SBjoern A. Zeeb return len - wp + rp - 1; 160*2774f206SBjoern A. Zeeb } 161*2774f206SBjoern A. Zeeb 162*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_OWN_OFFSET 15 163*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_BCN_WORK 0x383 164*2774f206SBjoern A. Zeeb 165*2774f206SBjoern A. Zeeb struct rtw_pci_tx_buffer_desc { 166*2774f206SBjoern A. Zeeb __le16 buf_size; 167*2774f206SBjoern A. Zeeb __le16 psb_len; 168*2774f206SBjoern A. Zeeb __le32 dma; 169*2774f206SBjoern A. Zeeb }; 170*2774f206SBjoern A. Zeeb 171*2774f206SBjoern A. Zeeb struct rtw_pci_tx_data { 172*2774f206SBjoern A. Zeeb dma_addr_t dma; 173*2774f206SBjoern A. Zeeb u8 sn; 174*2774f206SBjoern A. Zeeb }; 175*2774f206SBjoern A. Zeeb 176*2774f206SBjoern A. Zeeb struct rtw_pci_ring { 177*2774f206SBjoern A. Zeeb u8 *head; 178*2774f206SBjoern A. Zeeb dma_addr_t dma; 179*2774f206SBjoern A. Zeeb 180*2774f206SBjoern A. Zeeb u8 desc_size; 181*2774f206SBjoern A. Zeeb 182*2774f206SBjoern A. Zeeb u32 len; 183*2774f206SBjoern A. Zeeb u32 wp; 184*2774f206SBjoern A. Zeeb u32 rp; 185*2774f206SBjoern A. Zeeb }; 186*2774f206SBjoern A. Zeeb 187*2774f206SBjoern A. Zeeb struct rtw_pci_tx_ring { 188*2774f206SBjoern A. Zeeb struct rtw_pci_ring r; 189*2774f206SBjoern A. Zeeb struct sk_buff_head queue; 190*2774f206SBjoern A. Zeeb bool queue_stopped; 191*2774f206SBjoern A. Zeeb }; 192*2774f206SBjoern A. Zeeb 193*2774f206SBjoern A. Zeeb struct rtw_pci_rx_buffer_desc { 194*2774f206SBjoern A. Zeeb __le16 buf_size; 195*2774f206SBjoern A. Zeeb __le16 total_pkt_size; 196*2774f206SBjoern A. Zeeb __le32 dma; 197*2774f206SBjoern A. Zeeb }; 198*2774f206SBjoern A. Zeeb 199*2774f206SBjoern A. Zeeb struct rtw_pci_rx_ring { 200*2774f206SBjoern A. Zeeb struct rtw_pci_ring r; 201*2774f206SBjoern A. Zeeb struct sk_buff *buf[RTK_MAX_RX_DESC_NUM]; 202*2774f206SBjoern A. Zeeb }; 203*2774f206SBjoern A. Zeeb 204*2774f206SBjoern A. Zeeb #define RX_TAG_MAX 8192 205*2774f206SBjoern A. Zeeb 206*2774f206SBjoern A. Zeeb struct rtw_pci { 207*2774f206SBjoern A. Zeeb struct pci_dev *pdev; 208*2774f206SBjoern A. Zeeb 209*2774f206SBjoern A. Zeeb /* Used for PCI interrupt. */ 210*2774f206SBjoern A. Zeeb spinlock_t hwirq_lock; 211*2774f206SBjoern A. Zeeb /* Used for PCI TX ring/queueing, and enable INT. */ 212*2774f206SBjoern A. Zeeb spinlock_t irq_lock; 213*2774f206SBjoern A. Zeeb u32 irq_mask[4]; 214*2774f206SBjoern A. Zeeb bool irq_enabled; 215*2774f206SBjoern A. Zeeb bool running; 216*2774f206SBjoern A. Zeeb 217*2774f206SBjoern A. Zeeb /* napi structure */ 218*2774f206SBjoern A. Zeeb struct net_device netdev; 219*2774f206SBjoern A. Zeeb struct napi_struct napi; 220*2774f206SBjoern A. Zeeb 221*2774f206SBjoern A. Zeeb u16 rx_tag; 222*2774f206SBjoern A. Zeeb DECLARE_BITMAP(tx_queued, RTK_MAX_TX_QUEUE_NUM); 223*2774f206SBjoern A. Zeeb struct rtw_pci_tx_ring tx_rings[RTK_MAX_TX_QUEUE_NUM]; 224*2774f206SBjoern A. Zeeb struct rtw_pci_rx_ring rx_rings[RTK_MAX_RX_QUEUE_NUM]; 225*2774f206SBjoern A. Zeeb u16 link_ctrl; 226*2774f206SBjoern A. Zeeb atomic_t link_usage; 227*2774f206SBjoern A. Zeeb bool rx_no_aspm; 228*2774f206SBjoern A. Zeeb DECLARE_BITMAP(flags, NUM_OF_RTW_PCI_FLAGS); 229*2774f206SBjoern A. Zeeb 230*2774f206SBjoern A. Zeeb void __iomem *mmap; 231*2774f206SBjoern A. Zeeb }; 232*2774f206SBjoern A. Zeeb 233*2774f206SBjoern A. Zeeb extern const struct dev_pm_ops rtw_pm_ops; 234*2774f206SBjoern A. Zeeb 235*2774f206SBjoern A. Zeeb int rtw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id); 236*2774f206SBjoern A. Zeeb void rtw_pci_remove(struct pci_dev *pdev); 237*2774f206SBjoern A. Zeeb void rtw_pci_shutdown(struct pci_dev *pdev); 238*2774f206SBjoern A. Zeeb 239*2774f206SBjoern A. Zeeb static inline u32 max_num_of_tx_queue(u8 queue) 240*2774f206SBjoern A. Zeeb { 241*2774f206SBjoern A. Zeeb u32 max_num; 242*2774f206SBjoern A. Zeeb 243*2774f206SBjoern A. Zeeb switch (queue) { 244*2774f206SBjoern A. Zeeb case RTW_TX_QUEUE_BE: 245*2774f206SBjoern A. Zeeb max_num = RTK_BEQ_TX_DESC_NUM; 246*2774f206SBjoern A. Zeeb break; 247*2774f206SBjoern A. Zeeb case RTW_TX_QUEUE_BCN: 248*2774f206SBjoern A. Zeeb max_num = 1; 249*2774f206SBjoern A. Zeeb break; 250*2774f206SBjoern A. Zeeb default: 251*2774f206SBjoern A. Zeeb max_num = RTK_DEFAULT_TX_DESC_NUM; 252*2774f206SBjoern A. Zeeb break; 253*2774f206SBjoern A. Zeeb } 254*2774f206SBjoern A. Zeeb 255*2774f206SBjoern A. Zeeb return max_num; 256*2774f206SBjoern A. Zeeb } 257*2774f206SBjoern A. Zeeb 258*2774f206SBjoern A. Zeeb static inline struct 259*2774f206SBjoern A. Zeeb rtw_pci_tx_data *rtw_pci_get_tx_data(struct sk_buff *skb) 260*2774f206SBjoern A. Zeeb { 261*2774f206SBjoern A. Zeeb struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 262*2774f206SBjoern A. Zeeb 263*2774f206SBjoern A. Zeeb BUILD_BUG_ON(sizeof(struct rtw_pci_tx_data) > 264*2774f206SBjoern A. Zeeb sizeof(info->status.status_driver_data)); 265*2774f206SBjoern A. Zeeb 266*2774f206SBjoern A. Zeeb return (struct rtw_pci_tx_data *)info->status.status_driver_data; 267*2774f206SBjoern A. Zeeb } 268*2774f206SBjoern A. Zeeb 269*2774f206SBjoern A. Zeeb static inline 270*2774f206SBjoern A. Zeeb struct rtw_pci_tx_buffer_desc *get_tx_buffer_desc(struct rtw_pci_tx_ring *ring, 271*2774f206SBjoern A. Zeeb u32 size) 272*2774f206SBjoern A. Zeeb { 273*2774f206SBjoern A. Zeeb u8 *buf_desc; 274*2774f206SBjoern A. Zeeb 275*2774f206SBjoern A. Zeeb buf_desc = ring->r.head + ring->r.wp * size; 276*2774f206SBjoern A. Zeeb return (struct rtw_pci_tx_buffer_desc *)buf_desc; 277*2774f206SBjoern A. Zeeb } 278*2774f206SBjoern A. Zeeb 279*2774f206SBjoern A. Zeeb #endif 280