1*804775dfSFelix Fietkau #ifndef __MTK_WED_H 2*804775dfSFelix Fietkau #define __MTK_WED_H 3*804775dfSFelix Fietkau 4*804775dfSFelix Fietkau #include <linux/kernel.h> 5*804775dfSFelix Fietkau #include <linux/rcupdate.h> 6*804775dfSFelix Fietkau #include <linux/regmap.h> 7*804775dfSFelix Fietkau #include <linux/pci.h> 8*804775dfSFelix Fietkau 9*804775dfSFelix Fietkau #define MTK_WED_TX_QUEUES 2 10*804775dfSFelix Fietkau 11*804775dfSFelix Fietkau struct mtk_wed_hw; 12*804775dfSFelix Fietkau struct mtk_wdma_desc; 13*804775dfSFelix Fietkau 14*804775dfSFelix Fietkau struct mtk_wed_ring { 15*804775dfSFelix Fietkau struct mtk_wdma_desc *desc; 16*804775dfSFelix Fietkau dma_addr_t desc_phys; 17*804775dfSFelix Fietkau int size; 18*804775dfSFelix Fietkau 19*804775dfSFelix Fietkau u32 reg_base; 20*804775dfSFelix Fietkau void __iomem *wpdma; 21*804775dfSFelix Fietkau }; 22*804775dfSFelix Fietkau 23*804775dfSFelix Fietkau struct mtk_wed_device { 24*804775dfSFelix Fietkau #ifdef CONFIG_NET_MEDIATEK_SOC_WED 25*804775dfSFelix Fietkau const struct mtk_wed_ops *ops; 26*804775dfSFelix Fietkau struct device *dev; 27*804775dfSFelix Fietkau struct mtk_wed_hw *hw; 28*804775dfSFelix Fietkau bool init_done, running; 29*804775dfSFelix Fietkau int wdma_idx; 30*804775dfSFelix Fietkau int irq; 31*804775dfSFelix Fietkau 32*804775dfSFelix Fietkau struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES]; 33*804775dfSFelix Fietkau struct mtk_wed_ring txfree_ring; 34*804775dfSFelix Fietkau struct mtk_wed_ring tx_wdma[MTK_WED_TX_QUEUES]; 35*804775dfSFelix Fietkau 36*804775dfSFelix Fietkau struct { 37*804775dfSFelix Fietkau int size; 38*804775dfSFelix Fietkau void **pages; 39*804775dfSFelix Fietkau struct mtk_wdma_desc *desc; 40*804775dfSFelix Fietkau dma_addr_t desc_phys; 41*804775dfSFelix Fietkau } buf_ring; 42*804775dfSFelix Fietkau 43*804775dfSFelix Fietkau /* filled by driver: */ 44*804775dfSFelix Fietkau struct { 45*804775dfSFelix Fietkau struct pci_dev *pci_dev; 46*804775dfSFelix Fietkau 47*804775dfSFelix Fietkau u32 wpdma_phys; 48*804775dfSFelix Fietkau 49*804775dfSFelix Fietkau u16 token_start; 50*804775dfSFelix Fietkau unsigned int nbuf; 51*804775dfSFelix Fietkau 52*804775dfSFelix Fietkau u32 (*init_buf)(void *ptr, dma_addr_t phys, int token_id); 53*804775dfSFelix Fietkau int (*offload_enable)(struct mtk_wed_device *wed); 54*804775dfSFelix Fietkau void (*offload_disable)(struct mtk_wed_device *wed); 55*804775dfSFelix Fietkau } wlan; 56*804775dfSFelix Fietkau #endif 57*804775dfSFelix Fietkau }; 58*804775dfSFelix Fietkau 59*804775dfSFelix Fietkau struct mtk_wed_ops { 60*804775dfSFelix Fietkau int (*attach)(struct mtk_wed_device *dev); 61*804775dfSFelix Fietkau int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, 62*804775dfSFelix Fietkau void __iomem *regs); 63*804775dfSFelix Fietkau int (*txfree_ring_setup)(struct mtk_wed_device *dev, 64*804775dfSFelix Fietkau void __iomem *regs); 65*804775dfSFelix Fietkau void (*detach)(struct mtk_wed_device *dev); 66*804775dfSFelix Fietkau 67*804775dfSFelix Fietkau void (*stop)(struct mtk_wed_device *dev); 68*804775dfSFelix Fietkau void (*start)(struct mtk_wed_device *dev, u32 irq_mask); 69*804775dfSFelix Fietkau void (*reset_dma)(struct mtk_wed_device *dev); 70*804775dfSFelix Fietkau 71*804775dfSFelix Fietkau u32 (*reg_read)(struct mtk_wed_device *dev, u32 reg); 72*804775dfSFelix Fietkau void (*reg_write)(struct mtk_wed_device *dev, u32 reg, u32 val); 73*804775dfSFelix Fietkau 74*804775dfSFelix Fietkau u32 (*irq_get)(struct mtk_wed_device *dev, u32 mask); 75*804775dfSFelix Fietkau void (*irq_set_mask)(struct mtk_wed_device *dev, u32 mask); 76*804775dfSFelix Fietkau }; 77*804775dfSFelix Fietkau 78*804775dfSFelix Fietkau extern const struct mtk_wed_ops __rcu *mtk_soc_wed_ops; 79*804775dfSFelix Fietkau 80*804775dfSFelix Fietkau static inline int 81*804775dfSFelix Fietkau mtk_wed_device_attach(struct mtk_wed_device *dev) 82*804775dfSFelix Fietkau { 83*804775dfSFelix Fietkau int ret = -ENODEV; 84*804775dfSFelix Fietkau 85*804775dfSFelix Fietkau #ifdef CONFIG_NET_MEDIATEK_SOC_WED 86*804775dfSFelix Fietkau rcu_read_lock(); 87*804775dfSFelix Fietkau dev->ops = rcu_dereference(mtk_soc_wed_ops); 88*804775dfSFelix Fietkau if (dev->ops) 89*804775dfSFelix Fietkau ret = dev->ops->attach(dev); 90*804775dfSFelix Fietkau else 91*804775dfSFelix Fietkau rcu_read_unlock(); 92*804775dfSFelix Fietkau 93*804775dfSFelix Fietkau if (ret) 94*804775dfSFelix Fietkau dev->ops = NULL; 95*804775dfSFelix Fietkau #endif 96*804775dfSFelix Fietkau 97*804775dfSFelix Fietkau return ret; 98*804775dfSFelix Fietkau } 99*804775dfSFelix Fietkau 100*804775dfSFelix Fietkau #ifdef CONFIG_NET_MEDIATEK_SOC_WED 101*804775dfSFelix Fietkau #define mtk_wed_device_active(_dev) !!(_dev)->ops 102*804775dfSFelix Fietkau #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev) 103*804775dfSFelix Fietkau #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask) 104*804775dfSFelix Fietkau #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) \ 105*804775dfSFelix Fietkau (_dev)->ops->tx_ring_setup(_dev, _ring, _regs) 106*804775dfSFelix Fietkau #define mtk_wed_device_txfree_ring_setup(_dev, _regs) \ 107*804775dfSFelix Fietkau (_dev)->ops->txfree_ring_setup(_dev, _regs) 108*804775dfSFelix Fietkau #define mtk_wed_device_reg_read(_dev, _reg) \ 109*804775dfSFelix Fietkau (_dev)->ops->reg_read(_dev, _reg) 110*804775dfSFelix Fietkau #define mtk_wed_device_reg_write(_dev, _reg, _val) \ 111*804775dfSFelix Fietkau (_dev)->ops->reg_write(_dev, _reg, _val) 112*804775dfSFelix Fietkau #define mtk_wed_device_irq_get(_dev, _mask) \ 113*804775dfSFelix Fietkau (_dev)->ops->irq_get(_dev, _mask) 114*804775dfSFelix Fietkau #define mtk_wed_device_irq_set_mask(_dev, _mask) \ 115*804775dfSFelix Fietkau (_dev)->ops->irq_set_mask(_dev, _mask) 116*804775dfSFelix Fietkau #else 117*804775dfSFelix Fietkau static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) 118*804775dfSFelix Fietkau { 119*804775dfSFelix Fietkau return false; 120*804775dfSFelix Fietkau } 121*804775dfSFelix Fietkau #define mtk_wed_device_detach(_dev) do {} while (0) 122*804775dfSFelix Fietkau #define mtk_wed_device_start(_dev, _mask) do {} while (0) 123*804775dfSFelix Fietkau #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) -ENODEV 124*804775dfSFelix Fietkau #define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV 125*804775dfSFelix Fietkau #define mtk_wed_device_reg_read(_dev, _reg) 0 126*804775dfSFelix Fietkau #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) 127*804775dfSFelix Fietkau #define mtk_wed_device_irq_get(_dev, _mask) 0 128*804775dfSFelix Fietkau #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) 129*804775dfSFelix Fietkau #endif 130*804775dfSFelix Fietkau 131*804775dfSFelix Fietkau #endif 132