lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 323/757] mt76: mt7622: fix fw hang on mt7622
    Date
    From: Lorenzo Bianconi <lorenzo@kernel.org>

    [ Upstream commit 6892555dbe71ed551d3779aa20747484dc9b6ad5 ]

    Set poll timeout to 3s for mt7622 devices in order to avoid fw hangs.
    Swap mt7622_trigger_hif_int and doorbell configuration order in
    mt7615_mcu_drv_pmctrl routine.
    Introduce mt7615_mcu_lp_drv_pmctrl routine to take care of drv_own
    configuration for runtime-pm.

    Fixes: 08523a2a1db5 ("mt76: mt7615: add mt7615_pm_wake utility routine")
    Fixes: 894b7767ec2f ("mt76: mt7615: improve mt7615_driver_own reliability")
    Fixes: 757b0e7fd6f4 ("mt76: mt7615: avoid polling in fw_own for mt7663")
    Co-developed-by: Shayne Chen <shayne.chen@mediatek.com>
    Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
    Co-developed-by: Ryder Lee <ryder.lee@mediatek.com>
    Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
    Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
    Signed-off-by: Felix Fietkau <nbd@nbd.name>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../net/wireless/mediatek/mt76/mt7615/mcu.c | 46 +++++++++++++------
    1 file changed, 32 insertions(+), 14 deletions(-)

    diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
    index 82b6edd7a9f67..f42a69ee5635a 100644
    --- a/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
    +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mcu.c
    @@ -338,28 +338,46 @@ static int mt7615_mcu_drv_pmctrl(struct mt7615_dev *dev)
    {
    struct mt76_phy *mphy = &dev->mt76.phy;
    struct mt76_dev *mdev = &dev->mt76;
    - int i;
    + u32 addr;
    + int err;

    - if (!test_and_clear_bit(MT76_STATE_PM, &mphy->state))
    - goto out;
    + addr = is_mt7663(mdev) ? MT_PCIE_DOORBELL_PUSH : MT_CFG_LPCR_HOST;
    + mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN);

    mt7622_trigger_hif_int(dev, true);

    - for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) {
    - u32 addr;
    + addr = is_mt7663(mdev) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
    + err = !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 3000);

    - addr = is_mt7663(mdev) ? MT_PCIE_DOORBELL_PUSH : MT_CFG_LPCR_HOST;
    - mt76_wr(dev, addr, MT_CFG_LPCR_HOST_DRV_OWN);
    + mt7622_trigger_hif_int(dev, false);

    - addr = is_mt7663(mdev) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST;
    - if (mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN, 0, 50))
    - break;
    + if (err) {
    + dev_err(mdev->dev, "driver own failed\n");
    + return -ETIMEDOUT;
    }

    - mt7622_trigger_hif_int(dev, false);
    + clear_bit(MT76_STATE_PM, &mphy->state);
    +
    + return 0;
    +}
    +
    +static int mt7615_mcu_lp_drv_pmctrl(struct mt7615_dev *dev)
    +{
    + struct mt76_phy *mphy = &dev->mt76.phy;
    + int i;
    +
    + if (!test_and_clear_bit(MT76_STATE_PM, &mphy->state))
    + goto out;
    +
    + for (i = 0; i < MT7615_DRV_OWN_RETRY_COUNT; i++) {
    + mt76_wr(dev, MT_PCIE_DOORBELL_PUSH, MT_CFG_LPCR_HOST_DRV_OWN);
    + if (mt76_poll_msec(dev, MT_CONN_HIF_ON_LPCTL,
    + MT_CFG_LPCR_HOST_FW_OWN, 0, 50))
    + break;
    + }

    if (i == MT7615_DRV_OWN_RETRY_COUNT) {
    - dev_err(mdev->dev, "driver own failed\n");
    + dev_err(dev->mt76.dev, "driver own failed\n");
    set_bit(MT76_STATE_PM, &mphy->state);
    return -EIO;
    }
    @@ -386,7 +404,7 @@ static int mt7615_mcu_fw_pmctrl(struct mt7615_dev *dev)

    if (is_mt7622(&dev->mt76) &&
    !mt76_poll_msec(dev, addr, MT_CFG_LPCR_HOST_FW_OWN,
    - MT_CFG_LPCR_HOST_FW_OWN, 300)) {
    + MT_CFG_LPCR_HOST_FW_OWN, 3000)) {
    dev_err(dev->mt76.dev, "Timeout for firmware own\n");
    clear_bit(MT76_STATE_PM, &mphy->state);
    err = -EIO;
    @@ -1900,7 +1918,7 @@ static const struct mt7615_mcu_ops uni_update_ops = {
    .add_tx_ba = mt7615_mcu_uni_tx_ba,
    .add_rx_ba = mt7615_mcu_uni_rx_ba,
    .sta_add = mt7615_mcu_uni_add_sta,
    - .set_drv_ctrl = mt7615_mcu_drv_pmctrl,
    + .set_drv_ctrl = mt7615_mcu_lp_drv_pmctrl,
    .set_fw_ctrl = mt7615_mcu_fw_pmctrl,
    };

    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:11    [W:4.018 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site