Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 72e5d479 authored by Felix Fietkau's avatar Felix Fietkau
Browse files

mt76: mt76x02: issue watchdog reset on MCU request timeout



MCU request timeout usually indicates that the device is no longer responsive,
and it usually does not recover without a reset

Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 90f42f2d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ struct mt76x02_dev {

	u32 tx_hang_reset;
	u8 tx_hang_check;
	u8 mcu_timeout;

	struct mt76x02_calibration cal;

+1 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
				"MCU message %d (seq %d) timed out\n", cmd,
				seq);
			ret = -ETIMEDOUT;
			dev->mcu_timeout = 1;
			break;
		}

+19 −9
Original line number Diff line number Diff line
@@ -494,18 +494,28 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
static void mt76x02_check_tx_hang(struct mt76x02_dev *dev)
{
	if (mt76x02_tx_hang(dev)) {
		if (++dev->tx_hang_check < MT_TX_HANG_TH)
		if (++dev->tx_hang_check >= MT_TX_HANG_TH)
			goto restart;
	} else {
		dev->tx_hang_check = 0;
	}

	if (dev->mcu_timeout)
		goto restart;

	return;

restart:
	mt76x02_watchdog_reset(dev);

	mutex_lock(&dev->mt76.mmio.mcu.mutex);
	dev->mcu_timeout = 0;
	mutex_unlock(&dev->mt76.mmio.mcu.mutex);

	dev->tx_hang_reset++;
	dev->tx_hang_check = 0;
	memset(dev->mt76.tx_dma_idx, 0xff,
	       sizeof(dev->mt76.tx_dma_idx));
	} else {
		dev->tx_hang_check = 0;
	}
}

void mt76x02_wdt_work(struct work_struct *work)