0001 #ifndef __MTK_WED_H
0002 #define __MTK_WED_H
0003
0004 #include <linux/kernel.h>
0005 #include <linux/rcupdate.h>
0006 #include <linux/regmap.h>
0007 #include <linux/pci.h>
0008
0009 #define MTK_WED_TX_QUEUES 2
0010
0011 struct mtk_wed_hw;
0012 struct mtk_wdma_desc;
0013
0014 struct mtk_wed_ring {
0015 struct mtk_wdma_desc *desc;
0016 dma_addr_t desc_phys;
0017 int size;
0018
0019 u32 reg_base;
0020 void __iomem *wpdma;
0021 };
0022
0023 struct mtk_wed_device {
0024 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
0025 const struct mtk_wed_ops *ops;
0026 struct device *dev;
0027 struct mtk_wed_hw *hw;
0028 bool init_done, running;
0029 int wdma_idx;
0030 int irq;
0031
0032 struct mtk_wed_ring tx_ring[MTK_WED_TX_QUEUES];
0033 struct mtk_wed_ring txfree_ring;
0034 struct mtk_wed_ring tx_wdma[MTK_WED_TX_QUEUES];
0035
0036 struct {
0037 int size;
0038 void **pages;
0039 struct mtk_wdma_desc *desc;
0040 dma_addr_t desc_phys;
0041 } buf_ring;
0042
0043
0044 struct {
0045 struct pci_dev *pci_dev;
0046
0047 u32 wpdma_phys;
0048
0049 u16 token_start;
0050 unsigned int nbuf;
0051
0052 u32 (*init_buf)(void *ptr, dma_addr_t phys, int token_id);
0053 int (*offload_enable)(struct mtk_wed_device *wed);
0054 void (*offload_disable)(struct mtk_wed_device *wed);
0055 } wlan;
0056 #endif
0057 };
0058
0059 struct mtk_wed_ops {
0060 int (*attach)(struct mtk_wed_device *dev);
0061 int (*tx_ring_setup)(struct mtk_wed_device *dev, int ring,
0062 void __iomem *regs);
0063 int (*txfree_ring_setup)(struct mtk_wed_device *dev,
0064 void __iomem *regs);
0065 void (*detach)(struct mtk_wed_device *dev);
0066
0067 void (*stop)(struct mtk_wed_device *dev);
0068 void (*start)(struct mtk_wed_device *dev, u32 irq_mask);
0069 void (*reset_dma)(struct mtk_wed_device *dev);
0070
0071 u32 (*reg_read)(struct mtk_wed_device *dev, u32 reg);
0072 void (*reg_write)(struct mtk_wed_device *dev, u32 reg, u32 val);
0073
0074 u32 (*irq_get)(struct mtk_wed_device *dev, u32 mask);
0075 void (*irq_set_mask)(struct mtk_wed_device *dev, u32 mask);
0076 };
0077
0078 extern const struct mtk_wed_ops __rcu *mtk_soc_wed_ops;
0079
0080 static inline int
0081 mtk_wed_device_attach(struct mtk_wed_device *dev)
0082 {
0083 int ret = -ENODEV;
0084
0085 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
0086 rcu_read_lock();
0087 dev->ops = rcu_dereference(mtk_soc_wed_ops);
0088 if (dev->ops)
0089 ret = dev->ops->attach(dev);
0090 else
0091 rcu_read_unlock();
0092
0093 if (ret)
0094 dev->ops = NULL;
0095 #endif
0096
0097 return ret;
0098 }
0099
0100 #ifdef CONFIG_NET_MEDIATEK_SOC_WED
0101 #define mtk_wed_device_active(_dev) !!(_dev)->ops
0102 #define mtk_wed_device_detach(_dev) (_dev)->ops->detach(_dev)
0103 #define mtk_wed_device_start(_dev, _mask) (_dev)->ops->start(_dev, _mask)
0104 #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) \
0105 (_dev)->ops->tx_ring_setup(_dev, _ring, _regs)
0106 #define mtk_wed_device_txfree_ring_setup(_dev, _regs) \
0107 (_dev)->ops->txfree_ring_setup(_dev, _regs)
0108 #define mtk_wed_device_reg_read(_dev, _reg) \
0109 (_dev)->ops->reg_read(_dev, _reg)
0110 #define mtk_wed_device_reg_write(_dev, _reg, _val) \
0111 (_dev)->ops->reg_write(_dev, _reg, _val)
0112 #define mtk_wed_device_irq_get(_dev, _mask) \
0113 (_dev)->ops->irq_get(_dev, _mask)
0114 #define mtk_wed_device_irq_set_mask(_dev, _mask) \
0115 (_dev)->ops->irq_set_mask(_dev, _mask)
0116 #else
0117 static inline bool mtk_wed_device_active(struct mtk_wed_device *dev)
0118 {
0119 return false;
0120 }
0121 #define mtk_wed_device_detach(_dev) do {} while (0)
0122 #define mtk_wed_device_start(_dev, _mask) do {} while (0)
0123 #define mtk_wed_device_tx_ring_setup(_dev, _ring, _regs) -ENODEV
0124 #define mtk_wed_device_txfree_ring_setup(_dev, _ring, _regs) -ENODEV
0125 #define mtk_wed_device_reg_read(_dev, _reg) 0
0126 #define mtk_wed_device_reg_write(_dev, _reg, _val) do {} while (0)
0127 #define mtk_wed_device_irq_get(_dev, _mask) 0
0128 #define mtk_wed_device_irq_set_mask(_dev, _mask) do {} while (0)
0129 #endif
0130
0131 #endif