pio.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #ifndef B43legacy_PIO_H_
  2. #define B43legacy_PIO_H_
  3. #include "b43legacy.h"
  4. #include <linux/interrupt.h>
  5. #include <linux/list.h>
  6. #include <linux/skbuff.h>
  7. #define B43legacy_PIO_TXCTL 0x00
  8. #define B43legacy_PIO_TXDATA 0x02
  9. #define B43legacy_PIO_TXQBUFSIZE 0x04
  10. #define B43legacy_PIO_RXCTL 0x08
  11. #define B43legacy_PIO_RXDATA 0x0A
  12. #define B43legacy_PIO_TXCTL_WRITELO (1 << 0)
  13. #define B43legacy_PIO_TXCTL_WRITEHI (1 << 1)
  14. #define B43legacy_PIO_TXCTL_COMPLETE (1 << 2)
  15. #define B43legacy_PIO_TXCTL_INIT (1 << 3)
  16. #define B43legacy_PIO_TXCTL_SUSPEND (1 << 7)
  17. #define B43legacy_PIO_RXCTL_DATAAVAILABLE (1 << 0)
  18. #define B43legacy_PIO_RXCTL_READY (1 << 1)
  19. /* PIO constants */
  20. #define B43legacy_PIO_MAXTXDEVQPACKETS 31
  21. #define B43legacy_PIO_TXQADJUST 80
  22. /* PIO tuning knobs */
  23. #define B43legacy_PIO_MAXTXPACKETS 256
  24. #ifdef CONFIG_B43LEGACY_PIO
  25. struct b43legacy_pioqueue;
  26. struct b43legacy_xmitstatus;
  27. struct b43legacy_pio_txpacket {
  28. struct b43legacy_pioqueue *queue;
  29. struct sk_buff *skb;
  30. struct list_head list;
  31. };
  32. #define pio_txpacket_getindex(packet) ((int)((packet) - \
  33. (packet)->queue->tx_packets_cache))
  34. struct b43legacy_pioqueue {
  35. struct b43legacy_wldev *dev;
  36. u16 mmio_base;
  37. bool tx_suspended;
  38. bool tx_frozen;
  39. bool need_workarounds; /* Workarounds needed for core.rev < 3 */
  40. /* Adjusted size of the device internal TX buffer. */
  41. u16 tx_devq_size;
  42. /* Used octets of the device internal TX buffer. */
  43. u16 tx_devq_used;
  44. /* Used packet slots in the device internal TX buffer. */
  45. u8 tx_devq_packets;
  46. /* Packets from the txfree list can
  47. * be taken on incoming TX requests.
  48. */
  49. struct list_head txfree;
  50. unsigned int nr_txfree;
  51. /* Packets on the txqueue are queued,
  52. * but not completely written to the chip, yet.
  53. */
  54. struct list_head txqueue;
  55. /* Packets on the txrunning queue are completely
  56. * posted to the device. We are waiting for the txstatus.
  57. */
  58. struct list_head txrunning;
  59. struct tasklet_struct txtask;
  60. struct b43legacy_pio_txpacket
  61. tx_packets_cache[B43legacy_PIO_MAXTXPACKETS];
  62. };
  63. static inline
  64. u16 b43legacy_pio_read(struct b43legacy_pioqueue *queue,
  65. u16 offset)
  66. {
  67. return b43legacy_read16(queue->dev, queue->mmio_base + offset);
  68. }
  69. static inline
  70. void b43legacy_pio_write(struct b43legacy_pioqueue *queue,
  71. u16 offset, u16 value)
  72. {
  73. b43legacy_write16(queue->dev, queue->mmio_base + offset, value);
  74. mmiowb();
  75. }
  76. int b43legacy_pio_init(struct b43legacy_wldev *dev);
  77. void b43legacy_pio_free(struct b43legacy_wldev *dev);
  78. int b43legacy_pio_tx(struct b43legacy_wldev *dev,
  79. struct sk_buff *skb);
  80. void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
  81. const struct b43legacy_txstatus *status);
  82. void b43legacy_pio_rx(struct b43legacy_pioqueue *queue);
  83. /* Suspend TX queue in hardware. */
  84. void b43legacy_pio_tx_suspend(struct b43legacy_pioqueue *queue);
  85. void b43legacy_pio_tx_resume(struct b43legacy_pioqueue *queue);
  86. /* Suspend (freeze) the TX tasklet (software level). */
  87. void b43legacy_pio_freeze_txqueues(struct b43legacy_wldev *dev);
  88. void b43legacy_pio_thaw_txqueues(struct b43legacy_wldev *dev);
  89. #else /* CONFIG_B43LEGACY_PIO */
  90. static inline
  91. int b43legacy_pio_init(struct b43legacy_wldev *dev)
  92. {
  93. return 0;
  94. }
  95. static inline
  96. void b43legacy_pio_free(struct b43legacy_wldev *dev)
  97. {
  98. }
  99. static inline
  100. int b43legacy_pio_tx(struct b43legacy_wldev *dev,
  101. struct sk_buff *skb)
  102. {
  103. return 0;
  104. }
  105. static inline
  106. void b43legacy_pio_handle_txstatus(struct b43legacy_wldev *dev,
  107. const struct b43legacy_txstatus *status)
  108. {
  109. }
  110. static inline
  111. void b43legacy_pio_rx(struct b43legacy_pioqueue *queue)
  112. {
  113. }
  114. static inline
  115. void b43legacy_pio_tx_suspend(struct b43legacy_pioqueue *queue)
  116. {
  117. }
  118. static inline
  119. void b43legacy_pio_tx_resume(struct b43legacy_pioqueue *queue)
  120. {
  121. }
  122. static inline
  123. void b43legacy_pio_freeze_txqueues(struct b43legacy_wldev *dev)
  124. {
  125. }
  126. static inline
  127. void b43legacy_pio_thaw_txqueues(struct b43legacy_wldev *dev)
  128. {
  129. }
  130. #endif /* CONFIG_B43LEGACY_PIO */
  131. #endif /* B43legacy_PIO_H_ */