1804775dfSFelix Fietkau #ifndef __MTK_WED_H 2804775dfSFelix Fietkau #define __MTK_WED_H 3804775dfSFelix Fietkau 4804775dfSFelix Fietkau #include <linux/kernel.h> 5804775dfSFelix Fietkau #include <linux/rcupdate.h> 6804775dfSFelix Fietkau #include <linux/regmap.h> 7804775dfSFelix Fietkau #include <linux/pci.h> 8804775dfSFelix Fietkau 9804775dfSFelix Fietkau #define MTK_WED_TX_QUEUES 2 10804775dfSFelix Fietkau 11804775dfSFelix Fietkau struct mtk_wed_hw; 12804775dfSFelix Fietkau struct mtk_wdma_desc; 13804775dfSFelix Fietkau 14*2b2ba3ecSLorenzo Bianconi enum mtk_wed_bus_tye { 15*2b2ba3ecSLorenzo Bianconi MTK_WED_BUS_PCIE, 16*2b2ba3ecSLorenzo Bianconi MTK_WED_BUS_AXI, 17*2b2ba3ecSLorenzo Bianconi }; 18*2b2ba3ecSLorenzo Bianconi 19804775dfSFelix Fietkau struct mtk_wed_ring { 20804775dfSFelix Fietkau struct mtk_wdma_desc *desc; 21804775dfSFelix Fietkau dma_addr_t desc_phys; 22de84a090SLorenzo Bianconi u32 desc_size; 23804775dfSFelix Fietkau int size; 24804775dfSFelix Fietkau 25804775dfSFelix Fietkau u32 reg_base; 26804775dfSFelix Fietkau void __iomem *wpdma; 27804775dfSFelix Fietkau }; 28804775dfSFelix Fietkau 29804775dfSFelix Fietkau struct mtk_wed_device { 30804775dfSFelix Fietkau #ifdef CONFIG_NET_MEDIATEK_SOC_WED 31804775dfSFelix Fietkau const struct mtk_wed_ops *ops; 32804775dfSFelix Fietkau struct device *dev; 33804775dfSFelix Fietkau struct mtk_wed_hw *hw; 34804775dfSFelix Fietkau bool init_done, running; 35804775dfSFelix Fietkau int wdma_idx; 36804775dfSFelix Fietkau int irq; 37804775dfSFelix Fietkau 38804775dfSFelix Fietkau struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES]; 39804775dfSFelix Fietkau struct mtk_wed_ring txfree_ring; 40804775dfSFelix Fietkau struct mtk_wed_ring tx_wdma[MTK_WED_TX_QUEUES]; 41804775dfSFelix Fietkau 42804775dfSFelix Fietkau struct { 43804775dfSFelix Fietkau int size; 44804775dfSFelix Fietkau void **pages; 45804775dfSFelix Fietkau struct mtk_wdma_desc *desc; 46804775dfSFelix Fietkau dma_addr_t desc_phys; 47804775dfSFelix Fietkau } buf_ring; 48804775dfSFelix Fietkau 49804775dfSFelix Fietkau /* filled by driver: */ 50804775dfSFelix Fietkau struct { 51*2b2ba3ecSLorenzo Bianconi union { 52*2b2ba3ecSLorenzo Bianconi struct platform_device *platform_dev; 53804775dfSFelix Fietkau struct pci_dev *pci_dev; 54*2b2ba3ecSLorenzo Bianconi }; 55*2b2ba3ecSLorenzo Bianconi enum mtk_wed_bus_tye bus_type; 56804775dfSFelix Fietkau 57804775dfSFelix Fietkau u32 wpdma_phys; 58de84a090SLorenzo Bianconi u32 wpdma_int; 59de84a090SLorenzo Bianconi u32 wpdma_mask; 60de84a090SLorenzo Bianconi u32 wpdma_tx; 61de84a090SLorenzo Bianconi u32 wpdma_txfree; 62804775dfSFelix Fietkau 63804775dfSFelix Fietkau u16 token_start; 64804775dfSFelix Fietkau unsigned int nbuf; 65804775dfSFelix Fietkau 66de84a090SLorenzo Bianconi u8 tx_tbit[MTK_WED_TX_QUEUES]; 67de84a090SLorenzo Bianconi u8 txfree_tbit; 68de84a090SLorenzo Bianconi 69804775dfSFelix Fietkau u32 (*init_buf)(void *ptr, dma_addr_t phys, int token_id); 70804775dfSFelix Fietkau int (*offload_enable)(struct mtk_wed_device *wed); 71804775dfSFelix Fietkau void (*offload_disable)(struct mtk_wed_device *wed); 72804775dfSFelix Fietkau } wlan; 73804775dfSFelix Fietkau #endif 74804775dfSFelix Fietkau }; 75804775dfSFelix Fietkau 76804775dfSFelix Fietkau struct mtk_wed_ops { 77804775dfSFelix Fietkau int (*attach)(struct mtk_wed_device *dev); 78804775dfSFelix Fietkau int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring, 79804775dfSFelix Fietkau void __iomem *regs); 80804775dfSFelix Fietkau int (*txfree_ring_setup)(struct mtk_wed_device *dev, 81804775dfSFelix Fietkau void __iomem *regs); 82804775dfSFelix Fietkau void (*detach)(struct mtk_wed_device *dev); 83804775dfSFelix Fietkau 84804775dfSFelix Fietkau void (*stop)(struct mtk_wed_device *dev); 85804775dfSFelix Fietkau void (*start)(struct mtk_wed_device *dev, u32 irq_mask); 86804775dfSFelix Fietkau void (*reset_dma)(struct mtk_wed_device *dev); 87804775dfSFelix Fietkau 88804775dfSFelix Fietkau u32 (*reg_read)(struct mtk_wed_device *dev, u32 reg); 89804775dfSFelix Fietkau void (*reg_write)(struct mtk_wed_device *dev, u32 reg, u32 val); 90804775dfSFelix Fietkau 91804775dfSFelix Fietkau u32 (*irq_get)(struct mtk_wed_device *dev, u32 mask); 92804775dfSFelix Fietkau void (*irq_set_mask)(struct mtk_wed_device *dev, u32 mask); 93804775dfSFelix Fietkau }; 94804775dfSFelix Fietkau 95804775dfSFelix Fietkau extern const struct mtk_wed_ops __rcu *mtk_soc_wed_ops; 96804775dfSFelix Fietkau 97804775dfSFelix Fietkau static inline int 98804775dfSFelix Fietkau mtk_wed_device_attach(struct mtk_wed_device *dev) 99804775dfSFelix Fietkau { 100804775dfSFelix Fietkau int ret = -ENODEV; 101804775dfSFelix Fietkau 102804775dfSFelix Fietkau #ifdef CONFIG_NET_MEDIATEK_SOC_WED 103804775dfSFelix Fietkau rcu_read_lock(); 104804775dfSFelix Fietkau dev->ops = rcu_dereference(mtk_soc_wed_ops); 105804775dfSFelix Fietkau if (dev->ops) 106804775dfSFelix Fietkau ret = dev->ops->attach(dev); 107804775dfSFelix Fietkau else 108804775dfSFelix Fietkau rcu_read_unlock(); 109804775dfSFelix Fietkau 110804775dfSFelix Fietkau if (ret) 111804775dfSFelix Fietkau dev->ops = NULL; 112804775dfSFelix Fietkau #endif 113804775dfSFelix Fietkau 114804775dfSFelix Fietkau return ret; 115804775dfSFelix Fietkau } 116804775dfSFelix Fietkau 117804775dfSFelix Fietkau #ifdef CONFIG_NET_MEDIATEK_SOC_WED 118804775dfSFelix Fietkau #define mtk_wed_device_active(_dev) !!(_dev)->ops 119804775dfSFelix Fietkau #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev) 120804775dfSFelix Fietkau #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask) 121804775dfSFelix Fietkau #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) \ 122804775dfSFelix Fietkau (_dev)->ops->tx_ring_setup(_dev, _ring, _regs) 123804775dfSFelix Fietkau #define mtk_wed_device_txfree_ring_setup(_dev, _regs) \ 124804775dfSFelix Fietkau (_dev)->ops->txfree_ring_setup(_dev, _regs) 125804775dfSFelix Fietkau #define mtk_wed_device_reg_read(_dev, _reg) \ 126804775dfSFelix Fietkau (_dev)->ops->reg_read(_dev, _reg) 127804775dfSFelix Fietkau #define mtk_wed_device_reg_write(_dev, _reg, _val) \ 128804775dfSFelix Fietkau (_dev)->ops->reg_write(_dev, _reg, _val) 129804775dfSFelix Fietkau #define mtk_wed_device_irq_get(_dev, _mask) \ 130804775dfSFelix Fietkau (_dev)->ops->irq_get(_dev, _mask) 131804775dfSFelix Fietkau #define mtk_wed_device_irq_set_mask(_dev, _mask) \ 132804775dfSFelix Fietkau (_dev)->ops->irq_set_mask(_dev, _mask) 133804775dfSFelix Fietkau #else 134804775dfSFelix Fietkau static inline bool mtk_wed_device_active(struct mtk_wed_device *dev) 135804775dfSFelix Fietkau { 136804775dfSFelix Fietkau return false; 137804775dfSFelix Fietkau } 138804775dfSFelix Fietkau #define mtk_wed_device_detach(_dev) do {} while (0) 139804775dfSFelix Fietkau #define mtk_wed_device_start(_dev, _mask) do {} while (0) 140804775dfSFelix Fietkau #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) -ENODEV 141804775dfSFelix Fietkau #define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV 142804775dfSFelix Fietkau #define mtk_wed_device_reg_read(_dev, _reg) 0 143804775dfSFelix Fietkau #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0) 144804775dfSFelix Fietkau #define mtk_wed_device_irq_get(_dev, _mask) 0 145804775dfSFelix Fietkau #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0) 146804775dfSFelix Fietkau #endif 147804775dfSFelix Fietkau 148804775dfSFelix Fietkau #endif 149