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