diff --git a/mt7603/core.c b/mt7603/core.c index bc094de6..4ef6765c 100644 --- a/mt7603/core.c +++ b/mt7603/core.c @@ -81,7 +81,7 @@ u32 mt7603_reg_map(struct mt7603_dev *dev, u32 addr) u32 base = addr & GENMASK(31, 19); u32 offset = addr & GENMASK(18, 0); - mt76_wr(dev, MT_MCU_PCIE_REMAP_2, base); + dev->bus_ops->wr(&dev->mt76, MT_MCU_PCIE_REMAP_2, base); return MT_PCIE_REMAP_BASE_2 + offset; } diff --git a/mt7603/init.c b/mt7603/init.c index 5c19f82f..e0bc97be 100644 --- a/mt7603/init.c +++ b/mt7603/init.c @@ -417,12 +417,56 @@ static void mt7603_led_set_brightness(struct led_classdev *led_cdev, mt7603_led_set_config(mt76, 0xff, 0); } +static u32 __mt7603_reg_addr(struct mt7603_dev *dev, u32 addr) +{ + if (addr < 0x100000) + return addr; + + return mt7603_reg_map(dev, addr); +} + +static u32 mt7603_rr(struct mt76_dev *mdev, u32 offset) +{ + struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76); + u32 addr = __mt7603_reg_addr(dev, offset); + + return dev->bus_ops->rr(mdev, addr); +} + +static void mt7603_wr(struct mt76_dev *mdev, u32 offset, u32 val) +{ + struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76); + u32 addr = __mt7603_reg_addr(dev, offset); + + dev->bus_ops->wr(mdev, addr, val); +} + +static u32 mt7603_rmw(struct mt76_dev *mdev, u32 offset, u32 mask, u32 val) +{ + struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76); + u32 addr = __mt7603_reg_addr(dev, offset); + + return dev->bus_ops->rmw(mdev, addr, mask, val); +} + int mt7603_register_device(struct mt7603_dev *dev) { + struct mt76_bus_ops *bus_ops; struct ieee80211_hw *hw = mt76_hw(dev); struct wiphy *wiphy = hw->wiphy; int ret; + dev->bus_ops = dev->mt76.bus; + bus_ops = devm_kmemdup(dev->mt76.dev, dev->bus_ops, sizeof(*bus_ops), + GFP_KERNEL); + if (!bus_ops) + return -ENOMEM; + + bus_ops->rr = mt7603_rr; + bus_ops->wr = mt7603_wr; + bus_ops->rmw = mt7603_rmw; + dev->mt76.bus = bus_ops; + INIT_DELAYED_WORK(&dev->mac_work, mt7603_mac_work); tasklet_init(&dev->pre_tbtt_tasklet, mt7603_pre_tbtt_tasklet, (unsigned long)dev); diff --git a/mt7603/mt7603.h b/mt7603/mt7603.h index 5af35566..2ce102a6 100644 --- a/mt7603/mt7603.h +++ b/mt7603/mt7603.h @@ -95,6 +95,8 @@ enum mt7603_reset_cause { struct mt7603_dev { struct mt76_dev mt76; /* must be first */ + const struct mt76_bus_ops *bus_ops; + u32 rxfilter; u8 vif_mask;