Commit f1638c7c authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Felix Fietkau
Browse files

mt76: add usb implementation of {wr,rd}_rp



Add USB implementation for read and write reg pair routines.
The actual implementation can use mcu related routines according to
MCU state

Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo.bianconi@redhat.com>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent db0f04f3
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -650,6 +650,14 @@ int __mt76u_mcu_send_msg(struct mt76_dev *dev, struct sk_buff *skb,
			 int cmd, bool wait_resp);
int mt76u_mcu_send_msg(struct mt76_dev *dev, struct sk_buff *skb,
		       int cmd, bool wait_resp);
int mt76u_mcu_wr_rp(struct mt76_dev *dev, u32 base,
		    const struct mt76_reg_pair *data, int n);
int mt76u_mcu_rd_rp(struct mt76_dev *dev, u32 base,
		    struct mt76_reg_pair *data, int n);
int mt76u_wr_rp(struct mt76_dev *dev, u32 base,
		const struct mt76_reg_pair *data, int n);
int mt76u_rd_rp(struct mt76_dev *dev, u32 base,
		struct mt76_reg_pair *data, int n);
void mt76u_mcu_fw_reset(struct mt76_dev *dev);
int mt76u_mcu_init_rx(struct mt76_dev *dev);
void mt76u_mcu_deinit(struct mt76_dev *dev);
+3 −2
Original line number Diff line number Diff line
@@ -155,7 +155,8 @@ static void mt76x0_init_usb_dma(struct mt76x0_dev *dev)
}

#define RANDOM_WRITE(dev, tab)				\
	mt76x0_write_reg_pairs(dev, MT_MCU_MEMMAP_WLAN, tab, ARRAY_SIZE(tab));
	mt76u_wr_rp(&(dev)->mt76, MT_MCU_MEMMAP_WLAN,	\
		    tab, ARRAY_SIZE(tab))

static int mt76x0_init_bbp(struct mt76x0_dev *dev)
{
+0 −73
Original line number Diff line number Diff line
@@ -78,79 +78,6 @@ mt76x0_mcu_calibrate(struct mt76x0_dev *dev, enum mcu_calibrate cal, u32 val)
				  true);
}

int mt76x0_write_reg_pairs(struct mt76x0_dev *dev, u32 base,
			   const struct mt76_reg_pair *data, int n)
{
	const int max_vals_per_cmd = MT_INBAND_PACKET_MAX_LEN / 8;
	struct sk_buff *skb;
	int cnt, i, ret;

	if (!n)
		return 0;

	cnt = min(max_vals_per_cmd, n);

	skb = alloc_skb(cnt * 8 + MT_DMA_HDR_LEN + 4, GFP_KERNEL);
	if (!skb)
		return -ENOMEM;
	skb_reserve(skb, MT_DMA_HDR_LEN);

	for (i = 0; i < cnt; i++) {
		skb_put_le32(skb, base + data[i].reg);
		skb_put_le32(skb, data[i].value);
	}

	ret = mt76u_mcu_send_msg(&dev->mt76, skb, CMD_RANDOM_WRITE,
				 cnt == n);
	if (ret)
		return ret;

	return mt76x0_write_reg_pairs(dev, base, data + cnt, n - cnt);
}

int mt76x0_read_reg_pairs(struct mt76x0_dev *dev, u32 base,
			  struct mt76_reg_pair *data, int n)
{
	const int max_vals_per_cmd = MT_INBAND_PACKET_MAX_LEN / 8;
	struct mt76_usb *usb = &dev->mt76.usb;
	struct sk_buff *skb;
	int cnt, i, ret;

	if (!n)
		return 0;

	cnt = min(max_vals_per_cmd, n);
	if (cnt != n)
		return -EINVAL;

	skb = alloc_skb(cnt * 8 + MT_DMA_HDR_LEN + 4, GFP_KERNEL);
	if (!skb)
		return -ENOMEM;
	skb_reserve(skb, MT_DMA_HDR_LEN);

	for (i = 0; i < cnt; i++) {
		skb_put_le32(skb, base + data[i].reg);
		skb_put_le32(skb, data[i].value);
	}

	mutex_lock(&usb->mcu.mutex);

	usb->mcu.rp = data;
	usb->mcu.rp_len = n;
	usb->mcu.base = base;
	usb->mcu.burst = false;

	ret = __mt76u_mcu_send_msg(&dev->mt76, skb, CMD_RANDOM_READ,
				   true);

	usb->mcu.rp = NULL;

	mutex_unlock(&usb->mcu.mutex);

	return ret;

}

int mt76x0_burst_write_regs(struct mt76x0_dev *dev, u32 offset,
			     const u32 *data, int n)
{
+0 −4
Original line number Diff line number Diff line
@@ -126,10 +126,6 @@ void mt76x0_init_debugfs(struct mt76x0_dev *dev);
#define mt76_rmw_field(_dev, _reg, _field, _val)	\
	mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val))

int mt76x0_write_reg_pairs(struct mt76x0_dev *dev, u32 base,
			    const struct mt76_reg_pair *data, int len);
int mt76x0_read_reg_pairs(struct mt76x0_dev *dev, u32 base,
			  struct mt76_reg_pair *data, int len);
int mt76x0_burst_write_regs(struct mt76x0_dev *dev, u32 offset,
			     const u32 *data, int n);

+5 −4
Original line number Diff line number Diff line
@@ -117,7 +117,7 @@ rf_wr(struct mt76x0_dev *dev, u32 offset, u8 val)
			.value = val,
		};

		return mt76x0_write_reg_pairs(dev, MT_MCU_MEMMAP_RF, &pair, 1);
		return mt76u_wr_rp(&dev->mt76, MT_MCU_MEMMAP_RF, &pair, 1);
	} else {
		WARN_ON_ONCE(1);
		return mt76x0_rf_csr_wr(dev, offset, val);
@@ -135,7 +135,7 @@ rf_rr(struct mt76x0_dev *dev, u32 offset)
			.reg = offset,
		};

		ret = mt76x0_read_reg_pairs(dev, MT_MCU_MEMMAP_RF, &pair, 1);
		ret = mt76u_rd_rp(&dev->mt76, MT_MCU_MEMMAP_RF, &pair, 1);
		val = pair.value;
	} else {
		WARN_ON_ONCE(1);
@@ -176,7 +176,8 @@ rf_clear(struct mt76x0_dev *dev, u32 offset, u8 mask)
#endif

#define RF_RANDOM_WRITE(dev, tab)			\
	mt76x0_write_reg_pairs(dev, MT_MCU_MEMMAP_RF, tab, ARRAY_SIZE(tab));
	mt76u_wr_rp(&(dev)->mt76, MT_MCU_MEMMAP_RF,	\
		    tab, ARRAY_SIZE(tab))

int mt76x0_wait_bbp_ready(struct mt76x0_dev *dev)
{
Loading