This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / drivers / net / wireless / bcm43xx / bcm43xx_dma.h
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_dma.h b/drivers/net/wireless/bcm43xx/bcm43xx_dma.h
new file mode 100644 (file)
index 0000000..b7d7763
--- /dev/null
@@ -0,0 +1,226 @@
+#ifndef BCM43xx_DMA_H_
+#define BCM43xx_DMA_H_
+
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <linux/workqueue.h>
+#include <linux/linkage.h>
+#include <asm/atomic.h>
+
+
+/* DMA-Interrupt reasons. */
+#define BCM43xx_DMAIRQ_FATALMASK       ((1 << 10) | (1 << 11) | (1 << 12) \
+                                        | (1 << 14) | (1 << 15))
+#define BCM43xx_DMAIRQ_NONFATALMASK    (1 << 13)
+#define BCM43xx_DMAIRQ_RX_DONE         (1 << 16)
+
+/* DMA controller register offsets. (relative to BCM43xx_DMA#_BASE) */
+#define BCM43xx_DMA_TX_CONTROL         0x00
+#define BCM43xx_DMA_TX_DESC_RING       0x04
+#define BCM43xx_DMA_TX_DESC_INDEX      0x08
+#define BCM43xx_DMA_TX_STATUS          0x0c
+#define BCM43xx_DMA_RX_CONTROL         0x10
+#define BCM43xx_DMA_RX_DESC_RING       0x14
+#define BCM43xx_DMA_RX_DESC_INDEX      0x18
+#define BCM43xx_DMA_RX_STATUS          0x1c
+
+/* DMA controller channel control word values. */
+#define BCM43xx_DMA_TXCTRL_ENABLE              (1 << 0)
+#define BCM43xx_DMA_TXCTRL_SUSPEND             (1 << 1)
+#define BCM43xx_DMA_TXCTRL_LOOPBACK            (1 << 2)
+#define BCM43xx_DMA_TXCTRL_FLUSH               (1 << 4)
+#define BCM43xx_DMA_RXCTRL_ENABLE              (1 << 0)
+#define BCM43xx_DMA_RXCTRL_FRAMEOFF_MASK       0x000000fe
+#define BCM43xx_DMA_RXCTRL_FRAMEOFF_SHIFT      1
+#define BCM43xx_DMA_RXCTRL_PIO                 (1 << 8)
+/* DMA controller channel status word values. */
+#define BCM43xx_DMA_TXSTAT_DPTR_MASK           0x00000fff
+#define BCM43xx_DMA_TXSTAT_STAT_MASK           0x0000f000
+#define BCM43xx_DMA_TXSTAT_STAT_DISABLED       0x00000000
+#define BCM43xx_DMA_TXSTAT_STAT_ACTIVE         0x00001000
+#define BCM43xx_DMA_TXSTAT_STAT_IDLEWAIT       0x00002000
+#define BCM43xx_DMA_TXSTAT_STAT_STOPPED                0x00003000
+#define BCM43xx_DMA_TXSTAT_STAT_SUSP           0x00004000
+#define BCM43xx_DMA_TXSTAT_ERROR_MASK          0x000f0000
+#define BCM43xx_DMA_TXSTAT_FLUSHED             (1 << 20)
+#define BCM43xx_DMA_RXSTAT_DPTR_MASK           0x00000fff
+#define BCM43xx_DMA_RXSTAT_STAT_MASK           0x0000f000
+#define BCM43xx_DMA_RXSTAT_STAT_DISABLED       0x00000000
+#define BCM43xx_DMA_RXSTAT_STAT_ACTIVE         0x00001000
+#define BCM43xx_DMA_RXSTAT_STAT_IDLEWAIT       0x00002000
+#define BCM43xx_DMA_RXSTAT_STAT_RESERVED       0x00003000
+#define BCM43xx_DMA_RXSTAT_STAT_ERRORS         0x00004000
+#define BCM43xx_DMA_RXSTAT_ERROR_MASK          0x000f0000
+
+/* DMA descriptor control field values. */
+#define BCM43xx_DMADTOR_BYTECNT_MASK           0x00001fff
+#define BCM43xx_DMADTOR_DTABLEEND              (1 << 28) /* End of descriptor table */
+#define BCM43xx_DMADTOR_COMPIRQ                        (1 << 29) /* IRQ on completion request */
+#define BCM43xx_DMADTOR_FRAMEEND               (1 << 30)
+#define BCM43xx_DMADTOR_FRAMESTART             (1 << 31)
+
+/* Misc DMA constants */
+#define BCM43xx_DMA_RINGMEMSIZE                PAGE_SIZE
+#define BCM43xx_DMA_BUSADDRMAX         0x3FFFFFFF
+#define BCM43xx_DMA_DMABUSADDROFFSET   (1 << 30)
+#define BCM43xx_DMA1_RX_FRAMEOFFSET    30
+#define BCM43xx_DMA4_RX_FRAMEOFFSET    0
+
+/* DMA engine tuning knobs */
+#define BCM43xx_TXRING_SLOTS           512
+#define BCM43xx_RXRING_SLOTS           64
+#define BCM43xx_DMA1_RXBUFFERSIZE      (2304 + 100)
+#define BCM43xx_DMA4_RXBUFFERSIZE      16
+/* Suspend the tx queue, if less than this percent slots are free. */
+#define BCM43xx_TXSUSPEND_PERCENT      20
+/* Resume the tx queue, if more than this percent slots are free. */
+#define BCM43xx_TXRESUME_PERCENT       50
+
+
+
+#ifdef CONFIG_BCM43XX_DMA
+
+
+struct sk_buff;
+struct bcm43xx_private;
+struct bcm43xx_xmitstatus;
+
+
+struct bcm43xx_dmadesc {
+       __le32 _control;
+       __le32 _address;
+} __attribute__((__packed__));
+
+/* Macros to access the bcm43xx_dmadesc struct */
+#define get_desc_ctl(desc)             le32_to_cpu((desc)->_control)
+#define set_desc_ctl(desc, ctl)                do { (desc)->_control = cpu_to_le32(ctl); } while (0)
+#define get_desc_addr(desc)            le32_to_cpu((desc)->_address)
+#define set_desc_addr(desc, addr)      do { (desc)->_address = cpu_to_le32(addr); } while (0)
+
+struct bcm43xx_dmadesc_meta {
+       /* The kernel DMA-able buffer. */
+       struct sk_buff *skb;
+       /* DMA base bus-address of the descriptor buffer. */
+       dma_addr_t dmaaddr;
+};
+
+struct bcm43xx_dmaring {
+       struct bcm43xx_private *bcm;
+       /* Kernel virtual base address of the ring memory. */
+       struct bcm43xx_dmadesc *vbase;
+       /* DMA memory offset */
+       dma_addr_t memoffset;
+       /* (Unadjusted) DMA base bus-address of the ring memory. */
+       dma_addr_t dmabase;
+       /* Meta data about all descriptors. */
+       struct bcm43xx_dmadesc_meta *meta;
+       /* Number of descriptor slots in the ring. */
+       int nr_slots;
+       /* Number of used descriptor slots. */
+       int used_slots;
+       /* Currently used slot in the ring. */
+       int current_slot;
+       /* Marks to suspend/resume the queue. */
+       int suspend_mark;
+       int resume_mark;
+       /* Frameoffset in octets. */
+       u32 frameoffset;
+       /* Descriptor buffer size. */
+       u16 rx_buffersize;
+       /* The MMIO base register of the DMA controller, this
+        * ring is posted to.
+        */
+       u16 mmio_base;
+       u8 tx:1,        /* TRUE, if this is a TX ring. */
+          suspended:1; /* TRUE, if transfers are suspended on this ring. */
+#ifdef CONFIG_BCM43XX_DEBUG
+       /* Maximum number of used slots. */
+       int max_used_slots;
+#endif /* CONFIG_BCM43XX_DEBUG*/
+};
+
+
+static inline
+u32 bcm43xx_dma_read(struct bcm43xx_dmaring *ring,
+                    u16 offset)
+{
+       return bcm43xx_read32(ring->bcm, ring->mmio_base + offset);
+}
+
+static inline
+void bcm43xx_dma_write(struct bcm43xx_dmaring *ring,
+                      u16 offset, u32 value)
+{
+       bcm43xx_write32(ring->bcm, ring->mmio_base + offset, value);
+}
+
+
+int bcm43xx_dma_init(struct bcm43xx_private *bcm);
+void bcm43xx_dma_free(struct bcm43xx_private *bcm);
+
+int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_private *bcm,
+                                  u16 dmacontroller_mmio_base);
+int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_private *bcm,
+                                  u16 dmacontroller_mmio_base);
+
+void bcm43xx_dma_tx_suspend(struct bcm43xx_dmaring *ring);
+void bcm43xx_dma_tx_resume(struct bcm43xx_dmaring *ring);
+
+void bcm43xx_dma_handle_xmitstatus(struct bcm43xx_private *bcm,
+                                  struct bcm43xx_xmitstatus *status);
+
+int bcm43xx_dma_tx(struct bcm43xx_private *bcm,
+                  struct ieee80211_txb *txb);
+void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring);
+
+
+#else /* CONFIG_BCM43XX_DMA */
+
+
+static inline
+int bcm43xx_dma_init(struct bcm43xx_private *bcm)
+{
+       return 0;
+}
+static inline
+void bcm43xx_dma_free(struct bcm43xx_private *bcm)
+{
+}
+static inline
+int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_private *bcm,
+                                  u16 dmacontroller_mmio_base)
+{
+       return 0;
+}
+static inline
+int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_private *bcm,
+                                  u16 dmacontroller_mmio_base)
+{
+       return 0;
+}
+static inline
+int bcm43xx_dma_tx(struct bcm43xx_private *bcm,
+                  struct ieee80211_txb *txb)
+{
+       return 0;
+}
+static inline
+void bcm43xx_dma_handle_xmitstatus(struct bcm43xx_private *bcm,
+                                  struct bcm43xx_xmitstatus *status)
+{
+}
+static inline
+void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring)
+{
+}
+static inline
+void bcm43xx_dma_tx_suspend(struct bcm43xx_dmaring *ring)
+{
+}
+static inline
+void bcm43xx_dma_tx_resume(struct bcm43xx_dmaring *ring)
+{
+}
+
+#endif /* CONFIG_BCM43XX_DMA */
+#endif /* BCM43xx_DMA_H_ */