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

Commit 8d0a2dcf authored by Ivo van Doorn's avatar Ivo van Doorn Committed by John W. Linville
Browse files

rt2x00: Optimize register access in rt2800usb



All register reads/writes in rt2800usb were previously done with
rt2800_register_read/rt2800_register_write. These however indirectly
call rt2x00usb_register_read/rt2x00usb_register_write which adds an
additional overhead of at least one call and several move instructions
to each register access.

Replacing the calls to rt2800_register_read/rt2800_register_write with
direct calls to rt2x00usb_register_read/rt2x00usb_register_write gets
rid of quite a number of instructions in the drivers hotpaths (IRQ
handling and txdone handling).

For consistency replace all references to rt2800_register_read/write
with the rt2x00usb_register_read/write variants.

Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 9a819996
Loading
Loading
Loading
Loading
+28 −28
Original line number Original line Diff line number Diff line
@@ -59,16 +59,16 @@ static void rt2800usb_start_queue(struct data_queue *queue)


	switch (queue->qid) {
	switch (queue->qid) {
	case QID_RX:
	case QID_RX:
		rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
		rt2x00usb_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
		rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 1);
		rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 1);
		rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
		rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
		break;
		break;
	case QID_BEACON:
	case QID_BEACON:
		rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
		rt2x00usb_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 1);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 1);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 1);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 1);
		rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
		rt2x00usb_register_write(rt2x00dev, BCN_TIME_CFG, reg);
		break;
		break;
	default:
	default:
		break;
		break;
@@ -82,16 +82,16 @@ static void rt2800usb_stop_queue(struct data_queue *queue)


	switch (queue->qid) {
	switch (queue->qid) {
	case QID_RX:
	case QID_RX:
		rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
		rt2x00usb_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
		rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0);
		rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0);
		rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
		rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
		break;
		break;
	case QID_BEACON:
	case QID_BEACON:
		rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
		rt2x00usb_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
		rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
		rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
		rt2x00usb_register_write(rt2x00dev, BCN_TIME_CFG, reg);
		break;
		break;
	default:
	default:
		break;
		break;
@@ -185,11 +185,11 @@ static int rt2800usb_write_firmware(struct rt2x00_dev *rt2x00dev,
	/*
	/*
	 * Write firmware to device.
	 * Write firmware to device.
	 */
	 */
	rt2800_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE,
	rt2x00usb_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE,
				      data + offset, length);
				      data + offset, length);


	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
	rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
	rt2800_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
	rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);


	/*
	/*
	 * Send firmware request to device to load firmware,
	 * Send firmware request to device to load firmware,
@@ -204,7 +204,7 @@ static int rt2800usb_write_firmware(struct rt2x00_dev *rt2x00dev,
	}
	}


	msleep(10);
	msleep(10);
	rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
	rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);


	return 0;
	return 0;
}
}
@@ -222,22 +222,22 @@ static int rt2800usb_init_registers(struct rt2x00_dev *rt2x00dev)
	if (rt2800_wait_csr_ready(rt2x00dev))
	if (rt2800_wait_csr_ready(rt2x00dev))
		return -EBUSY;
		return -EBUSY;


	rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, &reg);
	rt2x00usb_register_read(rt2x00dev, PBF_SYS_CTRL, &reg);
	rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, reg & ~0x00002000);
	rt2x00usb_register_write(rt2x00dev, PBF_SYS_CTRL, reg & ~0x00002000);


	rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
	rt2x00usb_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);


	rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
	rt2x00usb_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
	rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1);
	rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1);
	rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_BBP, 1);
	rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_BBP, 1);
	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
	rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, reg);


	rt2800_register_write(rt2x00dev, USB_DMA_CFG, 0x00000000);
	rt2x00usb_register_write(rt2x00dev, USB_DMA_CFG, 0x00000000);


	rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
	rt2x00usb_vendor_request_sw(rt2x00dev, USB_DEVICE_MODE, 0,
				    USB_MODE_RESET, REGISTER_TIMEOUT);
				    USB_MODE_RESET, REGISTER_TIMEOUT);


	rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);
	rt2x00usb_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);


	return 0;
	return 0;
}
}
@@ -249,7 +249,7 @@ static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev)
	if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev)))
	if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev)))
		return -EIO;
		return -EIO;


	rt2800_register_read(rt2x00dev, USB_DMA_CFG, &reg);
	rt2x00usb_register_read(rt2x00dev, USB_DMA_CFG, &reg);
	rt2x00_set_field32(&reg, USB_DMA_CFG_PHY_CLEAR, 0);
	rt2x00_set_field32(&reg, USB_DMA_CFG_PHY_CLEAR, 0);
	rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_EN, 0);
	rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_EN, 0);
	rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_TIMEOUT, 128);
	rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_AGG_TIMEOUT, 128);
@@ -262,7 +262,7 @@ static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev)
			    / 1024) - 3);
			    / 1024) - 3);
	rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_EN, 1);
	rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_EN, 1);
	rt2x00_set_field32(&reg, USB_DMA_CFG_TX_BULK_EN, 1);
	rt2x00_set_field32(&reg, USB_DMA_CFG_TX_BULK_EN, 1);
	rt2800_register_write(rt2x00dev, USB_DMA_CFG, reg);
	rt2x00usb_register_write(rt2x00dev, USB_DMA_CFG, reg);


	return rt2800_enable_radio(rt2x00dev);
	return rt2800_enable_radio(rt2x00dev);
}
}
@@ -338,12 +338,12 @@ static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev)
	unsigned int i;
	unsigned int i;
	u32 reg;
	u32 reg;


	rt2800_register_read(rt2x00dev, TXRXQ_PCNT, &reg);
	rt2x00usb_register_read(rt2x00dev, TXRXQ_PCNT, &reg);
	if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) {
	if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) {
		WARNING(rt2x00dev, "TX HW queue 0 timed out,"
		WARNING(rt2x00dev, "TX HW queue 0 timed out,"
			" invoke forced kick\n");
			" invoke forced kick\n");


		rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40012);
		rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf40012);


		for (i = 0; i < 10; i++) {
		for (i = 0; i < 10; i++) {
			udelay(10);
			udelay(10);
@@ -351,15 +351,15 @@ static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev)
				break;
				break;
		}
		}


		rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006);
		rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf40006);
	}
	}


	rt2800_register_read(rt2x00dev, TXRXQ_PCNT, &reg);
	rt2x00usb_register_read(rt2x00dev, TXRXQ_PCNT, &reg);
	if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) {
	if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) {
		WARNING(rt2x00dev, "TX HW queue 1 timed out,"
		WARNING(rt2x00dev, "TX HW queue 1 timed out,"
			" invoke forced kick\n");
			" invoke forced kick\n");


		rt2800_register_write(rt2x00dev, PBF_CFG, 0xf4000a);
		rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf4000a);


		for (i = 0; i < 10; i++) {
		for (i = 0; i < 10; i++) {
			udelay(10);
			udelay(10);
@@ -367,7 +367,7 @@ static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev)
				break;
				break;
		}
		}


		rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006);
		rt2x00usb_register_write(rt2x00dev, PBF_CFG, 0xf40006);
	}
	}


	rt2x00usb_watchdog(rt2x00dev);
	rt2x00usb_watchdog(rt2x00dev);