Introduce and use a set of accessor functions to return the DMA capabilities
of
the chip. The detected DMA mask is accessible through bcm43xx_wldev and it
cannot vary between the rings on a chip, so no need to separately keep track
of
it on a per-ring basis. This paves the way for checking for 30bit dma
without
keeping separate track of it.

Signed-off-by: Will Dyson <[EMAIL PROTECTED]>
---
.../net/wireless/mac80211/bcm43xx/bcm43xx_dma.c    |   70
+++++++++-----------
.../net/wireless/mac80211/bcm43xx/bcm43xx_dma.h    |   49 +++++++++++---
2 files changed, 70 insertions(+), 49 deletions(-)

diff --git a/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.c
b/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.c
index 4abc6c8..d09b849 100644
--- a/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.c
+++ b/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.c
@@ -418,18 +418,18 @@ static void free_ringmemory(struct bcm43xx_dmaring
*ring)

/* Reset the RX DMA channel */
int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_wldev *dev,
-                   u16 mmio_base, int dma64)
+                   u16 mmio_base)
{
    int i;
    u32 value;
    u16 offset;

-    offset = dma64 ? BCM43xx_DMA64_RXCTL : BCM43xx_DMA32_RXCTL;
+    offset = bcm43xx_dma64(dev) ? BCM43xx_DMA64_RXCTL :
BCM43xx_DMA32_RXCTL;
    bcm43xx_write32(dev, mmio_base + offset, 0);
    for (i = 0; i < 1000; i++) {
-        offset = dma64 ? BCM43xx_DMA64_RXSTATUS : BCM43xx_DMA32_RXSTATUS;
+        offset = bcm43xx_dma64(dev) ? BCM43xx_DMA64_RXSTATUS :
BCM43xx_DMA32_RXSTATUS;
        value = bcm43xx_read32(dev, mmio_base + offset);
-        if (dma64) {
+        if (bcm43xx_dma64(dev)) {
            value &= BCM43xx_DMA64_RXSTAT;
            if (value == BCM43xx_DMA64_RXSTAT_DISABLED) {
                i = -1;
@@ -454,16 +454,16 @@ int bcm43xx_dmacontroller_rx_reset(struct
bcm43xx_wldev *dev,

/* Reset the RX DMA channel */
int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_wldev *dev,
-                   u16 mmio_base, int dma64)
+                   u16 mmio_base)
{
    int i;
    u32 value;
    u16 offset;

    for (i = 0; i < 1000; i++) {
-        offset = dma64 ? BCM43xx_DMA64_TXSTATUS : BCM43xx_DMA32_TXSTATUS;
+        offset = bcm43xx_dma64(dev) ? BCM43xx_DMA64_TXSTATUS :
BCM43xx_DMA32_TXSTATUS;
        value = bcm43xx_read32(dev, mmio_base + offset);
-        if (dma64) {
+        if (bcm43xx_dma64(dev)) {
            value &= BCM43xx_DMA64_TXSTAT;
            if (value == BCM43xx_DMA64_TXSTAT_DISABLED ||
                value == BCM43xx_DMA64_TXSTAT_IDLEWAIT ||
@@ -478,12 +478,12 @@ int bcm43xx_dmacontroller_tx_reset(struct
bcm43xx_wldev *dev,
        }
        udelay(10);
    }
-    offset = dma64 ? BCM43xx_DMA64_TXCTL : BCM43xx_DMA32_TXCTL;
+    offset = bcm43xx_dma64(dev) ? BCM43xx_DMA64_TXCTL :
BCM43xx_DMA32_TXCTL;
    bcm43xx_write32(dev, mmio_base + offset, 0);
    for (i = 0; i < 1000; i++) {
-        offset = dma64 ? BCM43xx_DMA64_TXSTATUS : BCM43xx_DMA32_TXSTATUS;
+        offset = bcm43xx_dma64(dev) ? BCM43xx_DMA64_TXSTATUS :
BCM43xx_DMA32_TXSTATUS;
        value = bcm43xx_read32(dev, mmio_base + offset);
-        if (dma64) {
+        if (bcm43xx_dma64(dev)) {
            value &= BCM43xx_DMA64_TXSTAT;
            if (value == BCM43xx_DMA64_TXSTAT_DISABLED) {
                i = -1;
@@ -587,7 +587,7 @@ static int dmacontroller_setup(struct bcm43xx_dmaring
*ring)
    u32 trans = ssb_dma_translation(ring->dev->dev);

    if (ring->tx) {
-        if (ring->dma64) {
+        if (bcm43xx_dma64(ring->dev)) {
            u64 ringbase = (u64)(ring->dmabase);

            addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK)
@@ -618,7 +618,7 @@ static int dmacontroller_setup(struct bcm43xx_dmaring
*ring)
        err = alloc_initial_descbuffers(ring);
        if (err)
            goto out;
-        if (ring->dma64) {
+        if (bcm43xx_dma64(ring->dev)) {
            u64 ringbase = (u64)(ring->dmabase);

            addrext = ((ringbase >> 32) & SSB_DMA_TRANSLATION_MASK)
@@ -659,15 +659,15 @@ out:
static void dmacontroller_cleanup(struct bcm43xx_dmaring *ring)
{
    if (ring->tx) {
-        bcm43xx_dmacontroller_tx_reset(ring->dev, ring->mmio_base,
ring->dma64);
-        if (ring->dma64) {
+        bcm43xx_dmacontroller_tx_reset(ring->dev, ring->mmio_base);
+        if (bcm43xx_dma64(ring->dev)) {
            bcm43xx_dma_write(ring, BCM43xx_DMA64_TXRINGLO, 0);
            bcm43xx_dma_write(ring, BCM43xx_DMA64_TXRINGHI, 0);
        } else
            bcm43xx_dma_write(ring, BCM43xx_DMA32_TXRING, 0);
    } else {
-        bcm43xx_dmacontroller_rx_reset(ring->dev, ring->mmio_base,
ring->dma64);
-        if (ring->dma64) {
+        bcm43xx_dmacontroller_rx_reset(ring->dev, ring->mmio_base);
+        if (bcm43xx_dma64(ring->dev)) {
            bcm43xx_dma_write(ring, BCM43xx_DMA64_RXRINGLO, 0);
            bcm43xx_dma_write(ring, BCM43xx_DMA64_RXRINGHI, 0);
        } else
@@ -725,8 +725,7 @@ static u64 supported_dma_mask(struct bcm43xx_wldev *dev)
static
struct bcm43xx_dmaring * bcm43xx_setup_dmaring(struct bcm43xx_wldev *dev,
                           int controller_index,
-                           int for_tx,
-                           int dma64)
+                           int for_tx)
{
    struct bcm43xx_dmaring *ring;
    int err;
@@ -754,10 +753,9 @@ struct bcm43xx_dmaring * bcm43xx_setup_dmaring(struct
bcm43xx_wldev *dev,

    ring->dev = dev;
    ring->nr_slots = nr_slots;
-    ring->mmio_base = bcm43xx_dmacontroller_base(dma64, controller_index);
+    ring->mmio_base = bcm43xx_dmacontroller_base(bcm43xx_dma64(dev),
controller_index);
    ring->index = controller_index;
-    ring->dma64 = !!dma64;
-    if (dma64)
+    if (bcm43xx_dma64(dev))
        ring->ops = &dma64_ops;
    else
        ring->ops = &dma32_ops;
@@ -802,7 +800,7 @@ static void bcm43xx_destroy_dmaring(struct
bcm43xx_dmaring *ring)
        return;

    dprintk(KERN_INFO PFX "DMA-%s 0x%04X (%s) max used slots: %d/%d\n",
-        (ring->dma64) ? "64" : "32",
+        (bcm43xx_dma64(ring->dev)) ? "64" : "32",
        ring->mmio_base,
        (ring->tx) ? "TX" : "RX",
        ring->max_used_slots, ring->nr_slots);
@@ -850,14 +848,8 @@ int bcm43xx_dma_init(struct bcm43xx_wldev *dev)
    struct bcm43xx_dma *dma = &dev->dma;
    struct bcm43xx_dmaring *ring;
    int err;
-    u64 dmamask;
-    int dma64 = 0;

-    dmamask = supported_dma_mask(dev);
-    if (dmamask == DMA_64BIT_MASK)
-        dma64 = 1;
-
-    err = ssb_dma_set_mask(dev->dev, dmamask);
+    err = ssb_dma_set_mask(dev->dev, supported_dma_mask(dev));
    if (err) {
#ifdef BCM43XX_MAC80211_PIO
        printk(KERN_WARNING PFX "DMA for this device not supported. "
@@ -873,52 +865,52 @@ int bcm43xx_dma_init(struct bcm43xx_wldev *dev)

    err = -ENOMEM;
    /* setup TX DMA channels. */
-    ring = bcm43xx_setup_dmaring(dev, 0, 1, dma64);
+    ring = bcm43xx_setup_dmaring(dev, 0, 1);
    if (!ring)
        goto out;
    dma->tx_ring0 = ring;

-    ring = bcm43xx_setup_dmaring(dev, 1, 1, dma64);
+    ring = bcm43xx_setup_dmaring(dev, 1, 1);
    if (!ring)
        goto err_destroy_tx0;
    dma->tx_ring1 = ring;

-    ring = bcm43xx_setup_dmaring(dev, 2, 1, dma64);
+    ring = bcm43xx_setup_dmaring(dev, 2, 1);
    if (!ring)
        goto err_destroy_tx1;
    dma->tx_ring2 = ring;

-    ring = bcm43xx_setup_dmaring(dev, 3, 1, dma64);
+    ring = bcm43xx_setup_dmaring(dev, 3, 1);
    if (!ring)
        goto err_destroy_tx2;
    dma->tx_ring3 = ring;

-    ring = bcm43xx_setup_dmaring(dev, 4, 1, dma64);
+    ring = bcm43xx_setup_dmaring(dev, 4, 1);
    if (!ring)
        goto err_destroy_tx3;
    dma->tx_ring4 = ring;

-    ring = bcm43xx_setup_dmaring(dev, 5, 1, dma64);
+    ring = bcm43xx_setup_dmaring(dev, 5, 1);
    if (!ring)
        goto err_destroy_tx4;
    dma->tx_ring5 = ring;

    /* setup RX DMA channels. */
-    ring = bcm43xx_setup_dmaring(dev, 0, 0, dma64);
+    ring = bcm43xx_setup_dmaring(dev, 0, 0);
    if (!ring)
        goto err_destroy_tx5;
    dma->rx_ring0 = ring;

    if (dev->dev->id.revision < 5) {
-        ring = bcm43xx_setup_dmaring(dev, 3, 0, dma64);
+        ring = bcm43xx_setup_dmaring(dev, 3, 0);
        if (!ring)
            goto err_destroy_rx0;
        dma->rx_ring3 = ring;
    }

    dprintk(KERN_INFO PFX "%d-bit DMA initialized\n",
-        (dmamask == DMA_64BIT_MASK) ? 64 :
-        (dmamask == DMA_32BIT_MASK) ? 32 : 30);
+        (bcm43xx_dma64(dev)) ? 64 :
+        (bcm43xx_dma30(dev)) ? 32 : 30);
    err = 0;
out:
    return err;
diff --git a/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.h
b/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.h
index 94fac2a..56e2f3d 100644
--- a/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.h
+++ b/drivers/net/wireless/mac80211/bcm43xx/bcm43xx_dma.h
@@ -248,8 +248,6 @@ struct bcm43xx_dmaring {
    int index;
    /* Boolean. Is this a TX ring? */
    u8 tx;
-    /* Boolean. 64bit DMA if true, 32bit DMA otherwise. */
-    u8 dma64;
    /* Boolean. Is this ring stopped at ieee80211 level? */
    u8 stopped;
    struct bcm43xx_wldev *dev;
@@ -259,6 +257,23 @@ struct bcm43xx_dmaring {
#endif /* CONFIG_BCM43XX_MAC80211_DEBUG*/
};

+static inline
+int bcm43xx_dma64(struct bcm43xx_wldev *dev)
+{
+    return (*dev->dev->dev->dma_mask == DMA_64BIT_MASK);
+}
+
+static inline
+int bcm43xx_dma32(struct bcm43xx_wldev *dev)
+{
+    return (*dev->dev->dev->dma_mask == DMA_32BIT_MASK);
+}
+
+static inline
+int bcm43xx_dma30(struct bcm43xx_wldev *dev)
+{
+    return (*dev->dev->dev->dma_mask == DMA_30BIT_MASK);
+}

static inline
u32 bcm43xx_dma_read(struct bcm43xx_dmaring *ring,
@@ -279,11 +294,9 @@ int bcm43xx_dma_init(struct bcm43xx_wldev *dev);
void bcm43xx_dma_free(struct bcm43xx_wldev *dev);

int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_wldev *dev,
-                   u16 dmacontroller_mmio_base,
-                   int dma64);
+                   u16 dmacontroller_mmio_base);
int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_wldev *dev,
-                   u16 dmacontroller_mmio_base,
-                   int dma64);
+                   u16 dmacontroller_mmio_base);

u16 bcm43xx_dmacontroller_base(int dma64bit, int dmacontroller_idx);

@@ -305,6 +318,24 @@ void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring);


static inline
+int bcm43xx_dma64(struct bcm43xx_dmaring *ring)
+{
+    return 0;
+}
+
+static inline
+int bcm43xx_dma32(struct bcm43xx_dmaring *ring)
+{
+    return 0;
+}
+
+static inline
+int bcm43xx_dma30(struct bcm43xx_dmaring *ring)
+{
+    return 0;
+}
+
+static inline
int bcm43xx_dma_init(struct bcm43xx_wldev *dev)
{
    return 0;
@@ -315,15 +346,13 @@ void bcm43xx_dma_free(struct bcm43xx_wldev *dev)
}
static inline
int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_wldev *dev,
-                   u16 dmacontroller_mmio_base,
-                   int dma64)
+                   u16 dmacontroller_mmio_base)
{
    return 0;
}
static inline
int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_wldev *dev,
-                   u16 dmacontroller_mmio_base,
-                   int dma64)
+                   u16 dmacontroller_mmio_base)
{
    return 0;
}
--
1.5.0.3



--
Will Dyson
http://www.lucidts.com/
Linux/Mac/Win consulting
_______________________________________________
Bcm43xx-dev mailing list
Bcm43xx-dev@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to