#define mt76_rd_rp(dev, ...)   (dev)->mt76.bus->rd_rp(&((dev)->mt76), __VA_ARGS__)
 
 #define mt76_mcu_send_msg(dev, ...)    (dev)->mt76.mcu_ops->mcu_send_msg(&((dev)->mt76), __VA_ARGS__)
+#define __mt76_mcu_send_msg(dev, ...)  (dev)->mcu_ops->mcu_send_msg((dev), __VA_ARGS__)
 
 #define mt76_set(dev, offset, val)     mt76_rmw(dev, offset, 0, val)
 #define mt76_clear(dev, offset, val)   mt76_rmw(dev, offset, val, 0)
 
 }
 
 static int
-mt7603_mcu_msg_send(struct mt7603_dev *dev, int cmd, const void *data,
+mt7603_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
                    int len, bool wait_resp)
 {
-       struct mt76_dev *mdev = &dev->mt76;
+       struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
        unsigned long expires = jiffies + 3 * HZ;
        struct mt7603_mcu_rxd *rxd;
        struct sk_buff *skb;
                .mode = cpu_to_le32(BIT(31)),
        };
 
-       return mt7603_mcu_msg_send(dev, -MCU_CMD_TARGET_ADDRESS_LEN_REQ,
+       return __mt76_mcu_send_msg(&dev->mt76, -MCU_CMD_TARGET_ADDRESS_LEN_REQ,
                                   &req, sizeof(req), true);
 }
 
                .addr = cpu_to_le32(addr),
        };
 
-       return mt7603_mcu_msg_send(dev, -MCU_CMD_FW_START_REQ,
+       return __mt76_mcu_send_msg(&dev->mt76, -MCU_CMD_FW_START_REQ,
                                   &req, sizeof(req), true);
 }
 
 static int
 mt7603_mcu_restart(struct mt7603_dev *dev)
 {
-       return mt7603_mcu_msg_send(dev, -MCU_CMD_RESTART_DL_REQ,
+       return __mt76_mcu_send_msg(&dev->mt76, -MCU_CMD_RESTART_DL_REQ,
                                   NULL, 0, true);
 }
 
-int mt7603_load_firmware(struct mt7603_dev *dev)
+static int mt7603_load_firmware(struct mt7603_dev *dev)
 {
        const struct firmware *fw;
        const struct mt7603_fw_trailer *hdr;
        return ret;
 }
 
+int mt7603_mcu_init(struct mt7603_dev *dev)
+{
+       static const struct mt76_mcu_ops mt7603_mcu_ops = {
+               .mcu_send_msg = mt7603_mcu_msg_send,
+       };
+
+       dev->mt76.mcu_ops = &mt7603_mcu_ops;
+       return mt7603_load_firmware(dev);
+}
+
 void mt7603_mcu_exit(struct mt7603_dev *dev)
 {
        mt7603_mcu_restart(dev);
                req.data[i].pad = 0;
        }
 
-       return mt7603_mcu_msg_send(dev, MCU_EXT_CMD_EFUSE_BUFFER_MODE,
+       return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_EFUSE_BUFFER_MODE,
                                   &req, sizeof(req), true);
 }
 
        memcpy(req.temp_comp_power, eep + MT_EE_STEP_NUM_NEG_6_7,
               sizeof(req.temp_comp_power));
 
-       return mt7603_mcu_msg_send(dev, MCU_EXT_CMD_SET_TX_POWER_CTRL,
+       return __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_SET_TX_POWER_CTRL,
                                   &req, sizeof(req), true);
 }
 
        for (i = 0; i < ARRAY_SIZE(req.txpower); i++)
                req.txpower[i] = tx_power;
 
-       ret = mt7603_mcu_msg_send(dev, MCU_EXT_CMD_CHANNEL_SWITCH,
+       ret = __mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD_CHANNEL_SWITCH,
                                  &req, sizeof(req), true);
        if (ret)
                return ret;