Merge tag 'mt76-for-kvalo-2021-01-29' of https://github.com/nbd168/wireless
[linux-2.6-microblaze.git] / drivers / net / wireless / mediatek / mt76 / mt7915 / mcu.c
index 59a5ef2..1959292 100644 (file)
@@ -248,7 +248,7 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
 {
        struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76);
        struct mt7915_mcu_txd *mcu_txd;
-       enum mt76_txq_id txq;
+       enum mt76_mcuq_id qid;
        __le32 *txd;
        u32 val;
        u8 seq;
@@ -261,15 +261,15 @@ mt7915_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb,
                seq = ++dev->mt76.mcu.msg_seq & 0xf;
 
        if (cmd == MCU_CMD(FW_SCATTER)) {
-               txq = MT_MCUQ_FWDL;
+               qid = MT_MCUQ_FWDL;
                goto exit;
        }
 
        mcu_txd = (struct mt7915_mcu_txd *)skb_push(skb, sizeof(*mcu_txd));
        if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state))
-               txq = MT_MCUQ_WA;
+               qid = MT_MCUQ_WA;
        else
-               txq = MT_MCUQ_WM;
+               qid = MT_MCUQ_WM;
 
        txd = mcu_txd->txd;
 
@@ -310,7 +310,23 @@ exit:
        if (wait_seq)
                *wait_seq = seq;
 
-       return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[txq], skb, 0);
+       return mt76_tx_queue_skb_raw(dev, mdev->q_mcu[qid], skb, 0);
+}
+
+static void
+mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3)
+{
+       struct {
+               __le32 args[3];
+       } req = {
+               .args = {
+                       cpu_to_le32(a1),
+                       cpu_to_le32(a2),
+                       cpu_to_le32(a3),
+               },
+       };
+
+       mt76_mcu_send_msg(&dev->mt76, cmd, &req, sizeof(req), true);
 }
 
 static void
@@ -2831,6 +2847,7 @@ int mt7915_mcu_init(struct mt7915_dev *dev)
        set_bit(MT76_STATE_MCU_RUNNING, &dev->mphy.state);
        mt7915_mcu_fw_log_2_host(dev, 0);
        mt7915_mcu_set_mwds(dev, 1);
+       mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), MCU_WA_PARAM_RED, 0, 0);
 
        return 0;
 }
@@ -3384,6 +3401,25 @@ int mt7915_mcu_set_ser(struct mt7915_dev *dev, u8 action, u8 set, u8 band)
                                 &req, sizeof(req), false);
 }
 
+int mt7915_mcu_set_txbf_module(struct mt7915_dev *dev)
+{
+#define MT_BF_MODULE_UPDATE               25
+       struct {
+               u8 action;
+               u8 bf_num;
+               u8 bf_bitmap;
+               u8 bf_sel[8];
+               u8 rsv[8];
+       } __packed req = {
+               .action = MT_BF_MODULE_UPDATE,
+               .bf_num = 2,
+               .bf_bitmap = GENMASK(1, 0),
+       };
+
+       return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(TXBF_ACTION), &req,
+                                sizeof(req), true);
+}
+
 int mt7915_mcu_set_txbf_type(struct mt7915_dev *dev)
 {
 #define MT_BF_TYPE_UPDATE              20