Skip to content

Commit

Permalink
rt2x00: Move init_txring and init_rxring into rt2x00lib
Browse files Browse the repository at this point in the history
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: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Ivo van Doorn authored and David S. Miller committed Jan 28, 2008
1 parent 7e56d38 commit 837e7f2
Show file tree
Hide file tree
Showing 9 changed files with 163 additions and 204 deletions.
83 changes: 27 additions & 56 deletions drivers/net/wireless/rt2x00/rt2400pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -592,80 +592,49 @@ 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, entry->ring->data_size);
rt2x00_desc_write(rxd, 2, word);

rt2x00_desc_read(rxd, 2, &word);
rt2x00_set_field32(&word, RXD_W2_BUFFER_LENGTH,
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_desc_write(rxd, 1, word);

rt2x00_desc_read(rxd, 0, &word);
rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1);
rt2x00_desc_write(rxd, 0, word);
}
rt2x00_desc_read(rxd, 1, &word);
rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS, entry->data_dma);
rt2x00_desc_write(rxd, 1, word);

rt2x00_ring_index_clear(rt2x00dev->rx);
rt2x00_desc_read(rxd, 0, &word);
rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1);
rt2x00_desc_write(rxd, 0, word);
}

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_desc_write(txd, 1, word);
rt2x00_desc_read(txd, 1, &word);
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_desc_write(txd, 2, word);

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

rt2x00_ring_index_clear(ring);
rt2x00_desc_read(txd, 0, &word);
rt2x00_set_field32(&word, TXD_W0_VALID, 0);
rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0);
rt2x00_desc_write(txd, 0, word);
}

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.
*/
Expand Down Expand Up @@ -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,
Expand Down
69 changes: 21 additions & 48 deletions drivers/net/wireless/rt2x00/rt2500pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -683,70 +683,41 @@ 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_desc_write(rxd, 1, word);

rt2x00_desc_read(rxd, 0, &word);
rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1);
rt2x00_desc_write(rxd, 0, word);
}
rt2x00_desc_read(rxd, 1, &word);
rt2x00_set_field32(&word, RXD_W1_BUFFER_ADDRESS, entry->data_dma);
rt2x00_desc_write(rxd, 1, word);

rt2x00_ring_index_clear(rt2x00dev->rx);
rt2x00_desc_read(rxd, 0, &word);
rt2x00_set_field32(&word, RXD_W0_OWNER_NIC, 1);
rt2x00_desc_write(rxd, 0, word);
}

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, entry->data_dma);
rt2x00_desc_write(txd, 1, word);

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

rt2x00_desc_read(txd, 0, &word);
rt2x00_set_field32(&word, TXD_W0_VALID, 0);
rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0);
rt2x00_desc_write(txd, 0, word);
}

rt2x00_ring_index_clear(ring);
rt2x00_desc_read(txd, 0, &word);
rt2x00_set_field32(&word, TXD_W0_VALID, 0);
rt2x00_set_field32(&word, TXD_W0_OWNER_NIC, 0);
rt2x00_desc_write(txd, 0, word);
}

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.
*/
Expand Down Expand Up @@ -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,
Expand Down
4 changes: 2 additions & 2 deletions drivers/net/wireless/rt2x00/rt2500usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -920,8 +920,6 @@ static int rt2500usb_enable_radio(struct rt2x00_dev *rt2x00dev)
return -EIO;
}

rt2x00usb_enable_radio(rt2x00dev);

/*
* Enable LED
*/
Expand Down Expand Up @@ -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,
Expand Down
8 changes: 8 additions & 0 deletions drivers/net/wireless/rt2x00/rt2x00.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand Down
46 changes: 46 additions & 0 deletions drivers/net/wireless/rt2x00/rt2x00dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*/
Expand All @@ -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.
*/
Expand Down
60 changes: 23 additions & 37 deletions drivers/net/wireless/rt2x00/rt2x00usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,43 +333,6 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
/*
* Radio handlers
*/
void rt2x00usb_enable_radio(struct rt2x00_dev *rt2x00dev)
{
struct usb_device *usb_dev =
interface_to_usbdev(rt2x00dev_usb(rt2x00dev));
struct data_ring *ring;
struct data_entry *entry;
unsigned int i;

/*
* Initialize the TX rings
*/
txringall_for_each(rt2x00dev, ring) {
for (i = 0; i < ring->stats.limit; i++)
ring->entry[i].flags = 0;

rt2x00_ring_index_clear(ring);
}

/*
* Initialize and start the RX ring.
*/
rt2x00_ring_index_clear(rt2x00dev->rx);

for (i = 0; i < rt2x00dev->rx->stats.limit; i++) {
entry = &rt2x00dev->rx->entry[i];

usb_fill_bulk_urb(entry->priv, usb_dev,
usb_rcvbulkpipe(usb_dev, 1),
entry->skb->data, entry->skb->len,
rt2x00usb_interrupt_rxdone, entry);

__set_bit(ENTRY_OWNER_NIC, &entry->flags);
usb_submit_urb(entry->priv, GFP_ATOMIC);
}
}
EXPORT_SYMBOL_GPL(rt2x00usb_enable_radio);

void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev)
{
struct data_ring *ring;
Expand All @@ -391,6 +354,29 @@ EXPORT_SYMBOL_GPL(rt2x00usb_disable_radio);
/*
* Device initialization handlers.
*/
void rt2x00usb_init_rxentry(struct rt2x00_dev *rt2x00dev,
struct data_entry *entry)
{
struct usb_device *usb_dev =
interface_to_usbdev(rt2x00dev_usb(rt2x00dev));

usb_fill_bulk_urb(entry->priv, usb_dev,
usb_rcvbulkpipe(usb_dev, 1),
entry->skb->data, entry->skb->len,
rt2x00usb_interrupt_rxdone, entry);

__set_bit(ENTRY_OWNER_NIC, &entry->flags);
usb_submit_urb(entry->priv, GFP_ATOMIC);
}
EXPORT_SYMBOL_GPL(rt2x00usb_init_rxentry);

void rt2x00usb_init_txentry(struct rt2x00_dev *rt2x00dev,
struct data_entry *entry)
{
entry->flags = 0;
}
EXPORT_SYMBOL_GPL(rt2x00usb_init_txentry);

static int rt2x00usb_alloc_urb(struct rt2x00_dev *rt2x00dev,
struct data_ring *ring)
{
Expand Down
5 changes: 4 additions & 1 deletion drivers/net/wireless/rt2x00/rt2x00usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,6 @@ static inline int rt2x00usb_eeprom_read(struct rt2x00_dev *rt2x00dev,
/*
* Radio handlers
*/
void rt2x00usb_enable_radio(struct rt2x00_dev *rt2x00dev);
void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev);

/*
Expand All @@ -167,6 +166,10 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev,
/*
* Device initialization handlers.
*/
void rt2x00usb_init_rxentry(struct rt2x00_dev *rt2x00dev,
struct data_entry *entry);
void rt2x00usb_init_txentry(struct rt2x00_dev *rt2x00dev,
struct data_entry *entry);
int rt2x00usb_initialize(struct rt2x00_dev *rt2x00dev);
void rt2x00usb_uninitialize(struct rt2x00_dev *rt2x00dev);

Expand Down
Loading

0 comments on commit 837e7f2

Please sign in to comment.