diff options
author | Stanislaw Gruszka | 2018-09-09 22:32:38 +0200 |
---|---|---|
committer | Felix Fietkau | 2018-09-19 12:31:19 +0200 |
commit | f1638c7cd686c22620030da8ebb7c973dfc768e1 (patch) | |
tree | 2b9ce91b28ddccdb2cc27e5b3bd16f26e09a4328 /drivers/net/wireless/mediatek/mt76/usb.c | |
parent | mt76: add mt76_mcu_ops data structure for mcu related pointers (diff) | |
download | kernel-qcow2-linux-f1638c7cd686c22620030da8ebb7c973dfc768e1.tar.gz kernel-qcow2-linux-f1638c7cd686c22620030da8ebb7c973dfc768e1.tar.xz kernel-qcow2-linux-f1638c7cd686c22620030da8ebb7c973dfc768e1.zip |
mt76: add usb implementation of {wr,rd}_rp
Add USB implementation for read and write reg pair routines.
The actual implementation can use mcu related routines according to
MCU state
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Diffstat (limited to 'drivers/net/wireless/mediatek/mt76/usb.c')
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/usb.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c index 1259a2b8e205..cd4d48594aaf 100644 --- a/drivers/net/wireless/mediatek/mt76/usb.c +++ b/drivers/net/wireless/mediatek/mt76/usb.c @@ -187,6 +187,60 @@ void mt76u_single_wr(struct mt76_dev *dev, const u8 req, EXPORT_SYMBOL_GPL(mt76u_single_wr); static int +mt76u_req_wr_rp(struct mt76_dev *dev, u32 base, + const struct mt76_reg_pair *data, int len) +{ + struct mt76_usb *usb = &dev->usb; + + mutex_lock(&usb->usb_ctrl_mtx); + while (len > 0) { + __mt76u_wr(dev, base + data->reg, data->value); + len--; + data++; + } + mutex_unlock(&usb->usb_ctrl_mtx); + + return 0; +} + +int mt76u_wr_rp(struct mt76_dev *dev, u32 base, + const struct mt76_reg_pair *data, int n) +{ + if (test_bit(MT76_STATE_MCU_RUNNING, &dev->state)) + return mt76u_mcu_wr_rp(dev, base, data, n); + else + return mt76u_req_wr_rp(dev, base, data, n); +} +EXPORT_SYMBOL_GPL(mt76u_wr_rp); + +static int +mt76u_req_rd_rp(struct mt76_dev *dev, u32 base, struct mt76_reg_pair *data, + int len) +{ + struct mt76_usb *usb = &dev->usb; + + mutex_lock(&usb->usb_ctrl_mtx); + while (len > 0) { + data->value = __mt76u_rr(dev, base + data->reg); + len--; + data++; + } + mutex_unlock(&usb->usb_ctrl_mtx); + + return 0; +} + +int mt76u_rd_rp(struct mt76_dev *dev, u32 base, + struct mt76_reg_pair *data, int n) +{ + if (test_bit(MT76_STATE_MCU_RUNNING, &dev->state)) + return mt76u_mcu_rd_rp(dev, base, data, n); + else + return mt76u_req_rd_rp(dev, base, data, n); +} +EXPORT_SYMBOL_GPL(mt76u_rd_rp); + +static int mt76u_set_endpoints(struct usb_interface *intf, struct mt76_usb *usb) { |