]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/wireless/rt2x00/rt2x00pci.c
rt2x00: Cleanup indirect register access
[karo-tx-linux.git] / drivers / net / wireless / rt2x00 / rt2x00pci.c
index adf2876ed8ab77de00d5c3676b781d4c62edeabf..d52b22b82d1fb4662184b653efe50f99b43fec13 100644 (file)
 #include "rt2x00.h"
 #include "rt2x00pci.h"
 
+/*
+ * Register access.
+ */
+int rt2x00pci_regbusy_read(struct rt2x00_dev *rt2x00dev,
+                          const unsigned int offset,
+                          const struct rt2x00_field32 field,
+                          u32 *reg)
+{
+       unsigned int i;
+
+       for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
+               rt2x00pci_register_read(rt2x00dev, offset, reg);
+               if (!rt2x00_get_field32(*reg, field))
+                       return 1;
+               udelay(REGISTER_BUSY_DELAY);
+       }
+
+       ERROR(rt2x00dev, "Indirect register access failed: "
+             "offset=0x%.08x, value=0x%.08x\n", offset, *reg);
+       *reg = ~0;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(rt2x00pci_regbusy_read);
+
 /*
  * TX data handlers.
  */
 int rt2x00pci_write_tx_data(struct queue_entry *entry)
 {
+       struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
        struct queue_entry_priv_pci *entry_priv = entry->priv_data;
        struct skb_frame_desc *skbdesc;
-       u32 word;
-
-       rt2x00_desc_read(entry_priv->desc, 0, &word);
 
        /*
         * This should not happen, we already checked the entry
         * was ours. When the hardware disagrees there has been
         * a queue corruption!
         */
-       if (unlikely(rt2x00_get_field32(word, TXD_ENTRY_OWNER_NIC) ||
-                    rt2x00_get_field32(word, TXD_ENTRY_VALID))) {
-               ERROR(entry->queue->rt2x00dev,
+       if (unlikely(rt2x00dev->ops->lib->get_entry_state(entry))) {
+               ERROR(rt2x00dev,
                      "Corrupt queue %d, accessing entry which is not ours.\n"
                      "Please file bug report to %s.\n",
                      entry->queue->qid, DRV_PROJECT);
@@ -76,14 +98,12 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev)
        struct queue_entry *entry;
        struct queue_entry_priv_pci *entry_priv;
        struct skb_frame_desc *skbdesc;
-       u32 word;
 
        while (1) {
                entry = rt2x00queue_get_entry(queue, Q_INDEX);
                entry_priv = entry->priv_data;
-               rt2x00_desc_read(entry_priv->desc, 0, &word);
 
-               if (rt2x00_get_field32(word, RXD_ENTRY_OWNER_NIC))
+               if (rt2x00dev->ops->lib->get_entry_state(entry))
                        break;
 
                /*
@@ -222,8 +242,7 @@ static int rt2x00pci_alloc_reg(struct rt2x00_dev *rt2x00dev)
 {
        struct pci_dev *pci_dev = to_pci_dev(rt2x00dev->dev);
 
-       rt2x00dev->csr.base = ioremap(pci_resource_start(pci_dev, 0),
-                                     pci_resource_len(pci_dev, 0));
+       rt2x00dev->csr.base = pci_ioremap_bar(pci_dev, 0);
        if (!rt2x00dev->csr.base)
                goto exit;