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

Commit 837e7f24 authored by Ivo van Doorn's avatar Ivo van Doorn Committed by David S. Miller
Browse files

rt2x00: Move init_txring and init_rxring into rt2x00lib



Prior to enabling the radio rt2x00lib should go through all
rings and for each entry should call the callback function
init_txentry() and init_rxentry().

Signed-off-by: default avatarIvo van Doorn <IvDoorn@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 7e56d38d
Loading
Loading
Loading
Loading
+27 −56
Original line number Diff line number Diff line
@@ -592,26 +592,18 @@ static void rt2400pci_link_tuner(struct rt2x00_dev *rt2x00dev)
/*
 * Initialization functions.
 */
static void rt2400pci_init_rxring(struct rt2x00_dev *rt2x00dev)
static void rt2400pci_init_rxentry(struct rt2x00_dev *rt2x00dev,
				   struct data_entry *entry)
{
	struct data_ring *ring = rt2x00dev->rx;
	__le32 *rxd;
	unsigned int i;
	__le32 *rxd = entry->priv;
	u32 word;

	memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring));

	for (i = 0; i < ring->stats.limit; i++) {
		rxd = ring->entry[i].priv;

	rt2x00_desc_read(rxd, 2, &word);
		rt2x00_set_field32(&word, RXD_W2_BUFFER_LENGTH,
				   ring->data_size);
	rt2x00_set_field32(&word, RXD_W2_BUFFER_LENGTH, entry->ring->data_size);
	rt2x00_desc_write(rxd, 2, word);

	rt2x00_desc_read(rxd, 1, &word);
		rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS,
				   ring->entry[i].data_dma);
	rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS, entry->data_dma);
	rt2x00_desc_write(rxd, 1, word);

	rt2x00_desc_read(rxd, 0, &word);
@@ -619,29 +611,18 @@ static void rt2400pci_init_rxring(struct rt2x00_dev *rt2x00dev)
	rt2x00_desc_write(rxd, 0, word);
}

	rt2x00_ring_index_clear(rt2x00dev->rx);
}

static void rt2400pci_init_txring(struct rt2x00_dev *rt2x00dev, const int queue)
static void rt2400pci_init_txentry(struct rt2x00_dev *rt2x00dev,
				   struct data_entry *entry)
{
	struct data_ring *ring = rt2x00lib_get_ring(rt2x00dev, queue);
	__le32 *txd;
	unsigned int i;
	__le32 *txd = entry->priv;
	u32 word;

	memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring));

	for (i = 0; i < ring->stats.limit; i++) {
		txd = ring->entry[i].priv;

	rt2x00_desc_read(txd, 1, &word);
		rt2x00_set_field32(&word, TXD_W1_BUFFER_ADDRESS,
				   ring->entry[i].data_dma);
	rt2x00_set_field32(&word, TXD_W1_BUFFER_ADDRESS, entry->data_dma);
	rt2x00_desc_write(txd, 1, word);

	rt2x00_desc_read(txd, 2, &word);
		rt2x00_set_field32(&word, TXD_W2_BUFFER_LENGTH,
				   ring->data_size);
	rt2x00_set_field32(&word, TXD_W2_BUFFER_LENGTH, entry->ring->data_size);
	rt2x00_desc_write(txd, 2, word);

	rt2x00_desc_read(txd, 0, &word);
@@ -650,22 +631,10 @@ static void rt2400pci_init_txring(struct rt2x00_dev *rt2x00dev, const int queue)
	rt2x00_desc_write(txd, 0, word);
}

	rt2x00_ring_index_clear(ring);
}

static int rt2400pci_init_rings(struct rt2x00_dev *rt2x00dev)
{
	u32 reg;

	/*
	 * Initialize rings.
	 */
	rt2400pci_init_rxring(rt2x00dev);
	rt2400pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA0);
	rt2400pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA1);
	rt2400pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_AFTER_BEACON);
	rt2400pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);

	/*
	 * Initialize registers.
	 */
@@ -1569,6 +1538,8 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {
	.probe_hw		= rt2400pci_probe_hw,
	.initialize		= rt2x00pci_initialize,
	.uninitialize		= rt2x00pci_uninitialize,
	.init_rxentry		= rt2400pci_init_rxentry,
	.init_txentry		= rt2400pci_init_txentry,
	.set_device_state	= rt2400pci_set_device_state,
	.rfkill_poll		= rt2400pci_rfkill_poll,
	.link_stats		= rt2400pci_link_stats,
+21 −48
Original line number Diff line number Diff line
@@ -683,21 +683,14 @@ static void rt2500pci_link_tuner(struct rt2x00_dev *rt2x00dev)
/*
 * Initialization functions.
 */
static void rt2500pci_init_rxring(struct rt2x00_dev *rt2x00dev)
static void rt2500pci_init_rxentry(struct rt2x00_dev *rt2x00dev,
				   struct data_entry *entry)
{
	struct data_ring *ring = rt2x00dev->rx;
	__le32 *rxd;
	unsigned int i;
	__le32 *rxd = entry->priv;
	u32 word;

	memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring));

	for (i = 0; i < ring->stats.limit; i++) {
		rxd = ring->entry[i].priv;

	rt2x00_desc_read(rxd, 1, &word);
		rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS,
				   ring->entry[i].data_dma);
	rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS, entry->data_dma);
	rt2x00_desc_write(rxd, 1, word);

	rt2x00_desc_read(rxd, 0, &word);
@@ -705,24 +698,14 @@ static void rt2500pci_init_rxring(struct rt2x00_dev *rt2x00dev)
	rt2x00_desc_write(rxd, 0, word);
}

	rt2x00_ring_index_clear(rt2x00dev->rx);
}

static void rt2500pci_init_txring(struct rt2x00_dev *rt2x00dev, const int queue)
static void rt2500pci_init_txentry(struct rt2x00_dev *rt2x00dev,
				   struct data_entry *entry)
{
	struct data_ring *ring = rt2x00lib_get_ring(rt2x00dev, queue);
	__le32 *txd;
	unsigned int i;
	__le32 *txd = entry->priv;
	u32 word;

	memset(ring->data_addr, 0x00, rt2x00_get_ring_size(ring));

	for (i = 0; i < ring->stats.limit; i++) {
		txd = ring->entry[i].priv;

	rt2x00_desc_read(txd, 1, &word);
		rt2x00_set_field32(&word, TXD_W1_BUFFER_ADDRESS,
				   ring->entry[i].data_dma);
	rt2x00_set_field32(&word, TXD_W1_BUFFER_ADDRESS, entry->data_dma);
	rt2x00_desc_write(txd, 1, word);

	rt2x00_desc_read(txd, 0, &word);
@@ -731,22 +714,10 @@ static void rt2500pci_init_txring(struct rt2x00_dev *rt2x00dev, const int queue)
	rt2x00_desc_write(txd, 0, word);
}

	rt2x00_ring_index_clear(ring);
}

static int rt2500pci_init_rings(struct rt2x00_dev *rt2x00dev)
{
	u32 reg;

	/*
	 * Initialize rings.
	 */
	rt2500pci_init_rxring(rt2x00dev);
	rt2500pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA0);
	rt2500pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_DATA1);
	rt2500pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_AFTER_BEACON);
	rt2500pci_init_txring(rt2x00dev, IEEE80211_TX_QUEUE_BEACON);

	/*
	 * Initialize registers.
	 */
@@ -1878,6 +1849,8 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {
	.probe_hw		= rt2500pci_probe_hw,
	.initialize		= rt2x00pci_initialize,
	.uninitialize		= rt2x00pci_uninitialize,
	.init_rxentry		= rt2500pci_init_rxentry,
	.init_txentry		= rt2500pci_init_txentry,
	.set_device_state	= rt2500pci_set_device_state,
	.rfkill_poll		= rt2500pci_rfkill_poll,
	.link_stats		= rt2500pci_link_stats,
+2 −2
Original line number Diff line number Diff line
@@ -920,8 +920,6 @@ static int rt2500usb_enable_radio(struct rt2x00_dev *rt2x00dev)
		return -EIO;
	}

	rt2x00usb_enable_radio(rt2x00dev);

	/*
	 * Enable LED
	 */
@@ -1776,6 +1774,8 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
	.probe_hw		= rt2500usb_probe_hw,
	.initialize		= rt2x00usb_initialize,
	.uninitialize		= rt2x00usb_uninitialize,
	.init_rxentry		= rt2x00usb_init_rxentry,
	.init_txentry		= rt2x00usb_init_txentry,
	.set_device_state	= rt2500usb_set_device_state,
	.link_stats		= rt2500usb_link_stats,
	.reset_tuner		= rt2500usb_reset_tuner,
+8 −0
Original line number Diff line number Diff line
@@ -473,6 +473,14 @@ struct rt2x00lib_ops {
	int (*initialize) (struct rt2x00_dev *rt2x00dev);
	void (*uninitialize) (struct rt2x00_dev *rt2x00dev);

	/*
	 * Ring initialization handlers
	 */
	void (*init_rxentry) (struct rt2x00_dev *rt2x00dev,
			      struct data_entry *entry);
	void (*init_txentry) (struct rt2x00_dev *rt2x00dev,
			      struct data_entry *entry);

	/*
	 * Radio control handlers.
	 */
+46 −0
Original line number Diff line number Diff line
@@ -102,6 +102,46 @@ void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev)
	rt2x00lib_start_link_tuner(rt2x00dev);
}

/*
 * Ring initialization
 */
static void rt2x00lib_init_rxrings(struct rt2x00_dev *rt2x00dev)
{
	struct data_ring *ring = rt2x00dev->rx;
	unsigned int i;

	if (!rt2x00dev->ops->lib->init_rxentry)
		return;

	if (ring->data_addr)
		memset(ring->data_addr, 0, rt2x00_get_ring_size(ring));

	for (i = 0; i < ring->stats.limit; i++)
		rt2x00dev->ops->lib->init_rxentry(rt2x00dev, &ring->entry[i]);

	rt2x00_ring_index_clear(ring);
}

static void rt2x00lib_init_txrings(struct rt2x00_dev *rt2x00dev)
{
	struct data_ring *ring;
	unsigned int i;

	if (!rt2x00dev->ops->lib->init_txentry)
		return;

	txringall_for_each(rt2x00dev, ring) {
		if (ring->data_addr)
			memset(ring->data_addr, 0, rt2x00_get_ring_size(ring));

		for (i = 0; i < ring->stats.limit; i++)
			rt2x00dev->ops->lib->init_txentry(rt2x00dev,
							  &ring->entry[i]);

		rt2x00_ring_index_clear(ring);
	}
}

/*
 * Radio control handlers.
 */
@@ -117,6 +157,12 @@ int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev)
	    test_bit(DEVICE_DISABLED_RADIO_HW, &rt2x00dev->flags))
		return 0;

	/*
	 * Initialize all data rings.
	 */
	rt2x00lib_init_rxrings(rt2x00dev);
	rt2x00lib_init_txrings(rt2x00dev);

	/*
	 * Enable radio.
	 */
Loading