drivers/net/wireless/mediatek/mt76/mt7615/testmode.c

Source file repositories/reference/linux-study-clean/drivers/net/wireless/mediatek/mt76/mt7615/testmode.c

File Facts

System
Linux kernel
Corpus path
drivers/net/wireless/mediatek/mt76/mt7615/testmode.c
Extension
.c
Size
9362 bytes
Lines
377
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (ret < 0) {
			dev_kfree_skb(skb);
			return -EINVAL;
		}

		if (tx_power && tx_power[i])
			data[ret - MT_EE_NIC_CONF_0] = tx_power[i];
	}

	return mt76_mcu_skb_send_msg(&dev->mt76, skb,
				     MCU_EXT_CMD(SET_TX_POWER_CTRL), false);
}

static void
mt7615_tm_reg_backup_restore(struct mt7615_phy *phy)
{
	struct mt7615_dev *dev = phy->dev;
	u32 *b = phy->test.reg_backup;
	int n_regs = ARRAY_SIZE(reg_backup_list);
	int n_rf_regs = ARRAY_SIZE(rf_backup_list);
	int i;

	if (phy->mt76->test.state == MT76_TM_STATE_OFF) {
		for (i = 0; i < n_regs; i++)
			mt76_wr(dev, reg_backup_list[i], b[i]);

		for (i = 0; i < n_rf_regs; i++)
			mt7615_rf_wr(dev, rf_backup_list[i].wf,
				     rf_backup_list[i].reg, b[n_regs + i]);
		return;
	}

	if (b)
		return;

	b = devm_kzalloc(dev->mt76.dev, 4 * (n_regs + n_rf_regs),
			 GFP_KERNEL);
	if (!b)
		return;

	phy->test.reg_backup = b;
	for (i = 0; i < n_regs; i++)
		b[i] = mt76_rr(dev, reg_backup_list[i]);
	for (i = 0; i < n_rf_regs; i++)
		b[n_regs + i] = mt7615_rf_rr(dev, rf_backup_list[i].wf,
					     rf_backup_list[i].reg);
}

static void
mt7615_tm_init(struct mt7615_phy *phy)
{
	struct mt7615_dev *dev = phy->dev;
	unsigned int total_flags = ~0;

	if (!test_bit(MT76_STATE_RUNNING, &phy->mt76->state))
		return;

	mt7615_mcu_set_sku_en(phy, phy->mt76->test.state == MT76_TM_STATE_OFF);

	mutex_unlock(&dev->mt76.mutex);
	mt76_update_channel(phy->mt76);
	mt7615_ops.configure_filter(phy->mt76->hw, 0, &total_flags, 0);
	mutex_lock(&dev->mt76.mutex);

	mt7615_tm_reg_backup_restore(phy);
}

static void
mt7615_tm_set_rx_enable(struct mt7615_dev *dev, bool en)
{
	u32 rqcr_mask = (MT_ARB_RQCR_RX_START |
			 MT_ARB_RQCR_RXV_START |
			 MT_ARB_RQCR_RXV_R_EN |
			 MT_ARB_RQCR_RXV_T_EN) *
			(BIT(0) | BIT(MT_ARB_RQCR_BAND_SHIFT));

	if (en) {
		mt76_clear(dev, MT_ARB_SCR,
			   MT_ARB_SCR_RX0_DISABLE | MT_ARB_SCR_RX1_DISABLE);
		mt76_set(dev, MT_ARB_RQCR, rqcr_mask);
	} else {
		mt76_set(dev, MT_ARB_SCR,
			 MT_ARB_SCR_RX0_DISABLE | MT_ARB_SCR_RX1_DISABLE);
		mt76_clear(dev, MT_ARB_RQCR, rqcr_mask);
	}
}

static void
mt7615_tm_set_tx_antenna(struct mt7615_phy *phy, bool en)
{

Annotation

Implementation Notes