mt76: mt7615: introduce mt7615_mcu_set_hif_suspend mcu command
authorSean Wang <sean.wang@mediatek.com>
Fri, 1 May 2020 10:36:12 +0000 (12:36 +0200)
committerFelix Fietkau <nbd@nbd.name>
Tue, 12 May 2020 17:52:34 +0000 (19:52 +0200)
Introduce the mt7615_mcu_set_hif_suspend mcu command, which is usually
used to configure the interface including PCIe, USB or SDIO to the right
state during operation suspend / resume.

Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h

index 7de7daf4d06751c918b6165697067d24305ae78d..e7f6ab5ab2db6f56589e97daee890f2b6b11e155 100644 (file)
@@ -194,7 +194,8 @@ mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd,
                break;
        case MCU_UNI_CMD_DEV_INFO_UPDATE:
        case MCU_UNI_CMD_BSS_INFO_UPDATE:
-       case MCU_UNI_CMD_STA_REC_UPDATE: {
+       case MCU_UNI_CMD_STA_REC_UPDATE:
+       case MCU_UNI_CMD_HIF_CTRL: {
                struct mt7615_mcu_uni_event *event;
 
                skb_pull(skb, sizeof(*rxd));
@@ -3220,3 +3221,36 @@ out:
 
        return ret;
 }
+
+int mt7615_mcu_set_hif_suspend(struct mt7615_dev *dev, bool suspend)
+{
+       struct {
+               struct {
+                       u8 hif_type; /* 0x0: HIF_SDIO
+                                     * 0x1: HIF_USB
+                                     * 0x2: HIF_PCIE
+                                     */
+                       u8 pad[3];
+               } __packed hdr;
+               struct hif_suspend_tlv {
+                       __le16 tag;
+                       __le16 len;
+                       u8 suspend;
+               } __packed hif_suspend;
+       } req = {
+               .hif_suspend = {
+                       .tag = cpu_to_le16(0), /* 0: UNI_HIF_CTRL_BASIC */
+                       .len = cpu_to_le16(sizeof(struct hif_suspend_tlv)),
+                       .suspend = suspend,
+               },
+       };
+
+       if (mt76_is_mmio(&dev->mt76))
+               req.hdr.hif_type = 2;
+       else if (mt76_is_usb(&dev->mt76))
+               req.hdr.hif_type = 1;
+
+       return __mt76_mcu_send_msg(&dev->mt76, MCU_UNI_CMD_HIF_CTRL,
+                                  &req, sizeof(req), true);
+}
+EXPORT_SYMBOL_GPL(mt7615_mcu_set_hif_suspend);
index 08dcfadceaf6dd57ebdb9340260a7a4ee971b3e6..1579ad94447983f758bfa3a14db8eb656278841a 100644 (file)
@@ -280,6 +280,7 @@ enum {
        MCU_UNI_CMD_DEV_INFO_UPDATE = MCU_UNI_PREFIX | 0x01,
        MCU_UNI_CMD_BSS_INFO_UPDATE = MCU_UNI_PREFIX | 0x02,
        MCU_UNI_CMD_STA_REC_UPDATE = MCU_UNI_PREFIX | 0x03,
+       MCU_UNI_CMD_HIF_CTRL = MCU_UNI_PREFIX | 0x07,
 };
 
 struct mt7615_mcu_uni_event {
index fdb20fbdfb90fabbd0e48dcd0751a8c765c103b7..6a26555dcce67b2f1d503a5397fd8c12f0c76fd6 100644 (file)
@@ -531,6 +531,8 @@ int mt7615_dfs_init_radar_detector(struct mt7615_phy *phy);
 int mt7615_init_debugfs(struct mt7615_dev *dev);
 int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq);
 
+int mt7615_mcu_set_hif_suspend(struct mt7615_dev *dev, bool suspend);
+
 int __mt7663_load_firmware(struct mt7615_dev *dev);
 
 /* usb */