bcm43xx_dma.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #ifndef BCM43xx_DMA_H_
  2. #define BCM43xx_DMA_H_
  3. #include <linux/list.h>
  4. #include <linux/spinlock.h>
  5. #include <linux/workqueue.h>
  6. #include <linux/linkage.h>
  7. #include <asm/atomic.h>
  8. /* DMA-Interrupt reasons. */
  9. /*TODO: add the missing ones. */
  10. #define BCM43xx_DMAIRQ_ERR0 (1 << 10)
  11. #define BCM43xx_DMAIRQ_ERR1 (1 << 11)
  12. #define BCM43xx_DMAIRQ_ERR2 (1 << 12)
  13. #define BCM43xx_DMAIRQ_ERR3 (1 << 13)
  14. #define BCM43xx_DMAIRQ_ERR4 (1 << 14)
  15. #define BCM43xx_DMAIRQ_ERR5 (1 << 15)
  16. #define BCM43xx_DMAIRQ_RX_DONE (1 << 16)
  17. /* helpers */
  18. #define BCM43xx_DMAIRQ_ANYERR (BCM43xx_DMAIRQ_ERR0 | \
  19. BCM43xx_DMAIRQ_ERR1 | \
  20. BCM43xx_DMAIRQ_ERR2 | \
  21. BCM43xx_DMAIRQ_ERR3 | \
  22. BCM43xx_DMAIRQ_ERR4 | \
  23. BCM43xx_DMAIRQ_ERR5)
  24. #define BCM43xx_DMAIRQ_FATALERR (BCM43xx_DMAIRQ_ERR0 | \
  25. BCM43xx_DMAIRQ_ERR1 | \
  26. BCM43xx_DMAIRQ_ERR2 | \
  27. BCM43xx_DMAIRQ_ERR4 | \
  28. BCM43xx_DMAIRQ_ERR5)
  29. #define BCM43xx_DMAIRQ_NONFATALERR BCM43xx_DMAIRQ_ERR3
  30. /* DMA controller register offsets. (relative to BCM43xx_DMA#_BASE) */
  31. #define BCM43xx_DMA_TX_CONTROL 0x00
  32. #define BCM43xx_DMA_TX_DESC_RING 0x04
  33. #define BCM43xx_DMA_TX_DESC_INDEX 0x08
  34. #define BCM43xx_DMA_TX_STATUS 0x0c
  35. #define BCM43xx_DMA_RX_CONTROL 0x10
  36. #define BCM43xx_DMA_RX_DESC_RING 0x14
  37. #define BCM43xx_DMA_RX_DESC_INDEX 0x18
  38. #define BCM43xx_DMA_RX_STATUS 0x1c
  39. /* DMA controller channel control word values. */
  40. #define BCM43xx_DMA_TXCTRL_ENABLE (1 << 0)
  41. #define BCM43xx_DMA_TXCTRL_SUSPEND (1 << 1)
  42. #define BCM43xx_DMA_TXCTRL_LOOPBACK (1 << 2)
  43. #define BCM43xx_DMA_TXCTRL_FLUSH (1 << 4)
  44. #define BCM43xx_DMA_RXCTRL_ENABLE (1 << 0)
  45. #define BCM43xx_DMA_RXCTRL_FRAMEOFF_MASK 0x000000fe
  46. #define BCM43xx_DMA_RXCTRL_FRAMEOFF_SHIFT 1
  47. #define BCM43xx_DMA_RXCTRL_PIO (1 << 8)
  48. /* DMA controller channel status word values. */
  49. #define BCM43xx_DMA_TXSTAT_DPTR_MASK 0x00000fff
  50. #define BCM43xx_DMA_TXSTAT_STAT_MASK 0x0000f000
  51. #define BCM43xx_DMA_TXSTAT_STAT_DISABLED 0x00000000
  52. #define BCM43xx_DMA_TXSTAT_STAT_ACTIVE 0x00001000
  53. #define BCM43xx_DMA_TXSTAT_STAT_IDLEWAIT 0x00002000
  54. #define BCM43xx_DMA_TXSTAT_STAT_STOPPED 0x00003000
  55. #define BCM43xx_DMA_TXSTAT_STAT_SUSP 0x00004000
  56. #define BCM43xx_DMA_TXSTAT_ERROR_MASK 0x000f0000
  57. #define BCM43xx_DMA_TXSTAT_FLUSHED (1 << 20)
  58. #define BCM43xx_DMA_RXSTAT_DPTR_MASK 0x00000fff
  59. #define BCM43xx_DMA_RXSTAT_STAT_MASK 0x0000f000
  60. #define BCM43xx_DMA_RXSTAT_STAT_DISABLED 0x00000000
  61. #define BCM43xx_DMA_RXSTAT_STAT_ACTIVE 0x00001000
  62. #define BCM43xx_DMA_RXSTAT_STAT_IDLEWAIT 0x00002000
  63. #define BCM43xx_DMA_RXSTAT_STAT_RESERVED 0x00003000
  64. #define BCM43xx_DMA_RXSTAT_STAT_ERRORS 0x00004000
  65. #define BCM43xx_DMA_RXSTAT_ERROR_MASK 0x000f0000
  66. /* DMA descriptor control field values. */
  67. #define BCM43xx_DMADTOR_BYTECNT_MASK 0x00001fff
  68. #define BCM43xx_DMADTOR_DTABLEEND (1 << 28) /* End of descriptor table */
  69. #define BCM43xx_DMADTOR_COMPIRQ (1 << 29) /* IRQ on completion request */
  70. #define BCM43xx_DMADTOR_FRAMEEND (1 << 30)
  71. #define BCM43xx_DMADTOR_FRAMESTART (1 << 31)
  72. /* Misc DMA constants */
  73. #define BCM43xx_DMA_RINGMEMSIZE PAGE_SIZE
  74. #define BCM43xx_DMA_BUSADDRMAX 0x3FFFFFFF
  75. #define BCM43xx_DMA_DMABUSADDROFFSET (1 << 30)
  76. #define BCM43xx_DMA1_RX_FRAMEOFFSET 30
  77. #define BCM43xx_DMA4_RX_FRAMEOFFSET 0
  78. /* DMA engine tuning knobs */
  79. #define BCM43xx_TXRING_SLOTS 512
  80. #define BCM43xx_RXRING_SLOTS 64
  81. #define BCM43xx_DMA1_RXBUFFERSIZE (2304 + 100)
  82. #define BCM43xx_DMA4_RXBUFFERSIZE 16
  83. /* Suspend the tx queue, if less than this percent slots are free. */
  84. #define BCM43xx_TXSUSPEND_PERCENT 20
  85. /* Resume the tx queue, if more than this percent slots are free. */
  86. #define BCM43xx_TXRESUME_PERCENT 50
  87. struct sk_buff;
  88. struct bcm43xx_private;
  89. struct bcm43xx_xmitstatus;
  90. struct bcm43xx_dmadesc {
  91. __le32 _control;
  92. __le32 _address;
  93. } __attribute__((__packed__));
  94. /* Macros to access the bcm43xx_dmadesc struct */
  95. #define get_desc_ctl(desc) le32_to_cpu((desc)->_control)
  96. #define set_desc_ctl(desc, ctl) do { (desc)->_control = cpu_to_le32(ctl); } while (0)
  97. #define get_desc_addr(desc) le32_to_cpu((desc)->_address)
  98. #define set_desc_addr(desc, addr) do { (desc)->_address = cpu_to_le32(addr); } while (0)
  99. struct bcm43xx_dmadesc_meta {
  100. /* The kernel DMA-able buffer. */
  101. struct sk_buff *skb;
  102. /* DMA base bus-address of the descriptor buffer. */
  103. dma_addr_t dmaaddr;
  104. /* Pointer to our txb (can be NULL).
  105. * This should be freed in completion IRQ.
  106. */
  107. struct ieee80211_txb *txb;
  108. };
  109. struct bcm43xx_dmaring {
  110. spinlock_t lock;
  111. struct bcm43xx_private *bcm;
  112. /* Kernel virtual base address of the ring memory. */
  113. struct bcm43xx_dmadesc *vbase;
  114. /* DMA memory offset */
  115. dma_addr_t memoffset;
  116. /* (Unadjusted) DMA base bus-address of the ring memory. */
  117. dma_addr_t dmabase;
  118. /* Meta data about all descriptors. */
  119. struct bcm43xx_dmadesc_meta *meta;
  120. /* Number of descriptor slots in the ring. */
  121. int nr_slots;
  122. /* Number of used descriptor slots. */
  123. int used_slots;
  124. /* Currently used slot in the ring. */
  125. int current_slot;
  126. /* Marks to suspend/resume the queue. */
  127. int suspend_mark;
  128. int resume_mark;
  129. /* Frameoffset in octets. */
  130. u32 frameoffset;
  131. /* Descriptor buffer size. */
  132. u16 rx_buffersize;
  133. /* The MMIO base register of the DMA controller, this
  134. * ring is posted to.
  135. */
  136. u16 mmio_base;
  137. u8 tx:1, /* TRUE, if this is a TX ring. */
  138. suspended:1; /* TRUE, if transfers are suspended on this ring. */
  139. #ifdef CONFIG_BCM43XX_DEBUG
  140. /* Maximum number of used slots. */
  141. int max_used_slots;
  142. #endif /* CONFIG_BCM43XX_DEBUG*/
  143. };
  144. int bcm43xx_dma_init(struct bcm43xx_private *bcm);
  145. void bcm43xx_dma_free(struct bcm43xx_private *bcm);
  146. int bcm43xx_dmacontroller_rx_reset(struct bcm43xx_private *bcm,
  147. u16 dmacontroller_mmio_base);
  148. int bcm43xx_dmacontroller_tx_reset(struct bcm43xx_private *bcm,
  149. u16 dmacontroller_mmio_base);
  150. int FASTCALL(bcm43xx_dma_transfer_txb(struct bcm43xx_private *bcm,
  151. struct ieee80211_txb *txb));
  152. void FASTCALL(bcm43xx_dma_handle_xmitstatus(struct bcm43xx_private *bcm,
  153. struct bcm43xx_xmitstatus *status));
  154. void FASTCALL(bcm43xx_dma_rx(struct bcm43xx_dmaring *ring));
  155. #endif /* BCM43xx_DMA_H_ */