tables_phy_ht.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. Broadcom B43 wireless driver
  3. IEEE 802.11n HT-PHY data tables
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; see the file COPYING. If not, write to
  14. the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
  15. Boston, MA 02110-1301, USA.
  16. */
  17. #include "b43.h"
  18. #include "tables_phy_ht.h"
  19. #include "phy_common.h"
  20. #include "phy_ht.h"
  21. u32 b43_httab_read(struct b43_wldev *dev, u32 offset)
  22. {
  23. u32 type, value;
  24. type = offset & B43_HTTAB_TYPEMASK;
  25. offset &= ~B43_HTTAB_TYPEMASK;
  26. B43_WARN_ON(offset > 0xFFFF);
  27. switch (type) {
  28. case B43_HTTAB_8BIT:
  29. b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
  30. value = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO) & 0xFF;
  31. break;
  32. case B43_HTTAB_16BIT:
  33. b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
  34. value = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
  35. break;
  36. case B43_HTTAB_32BIT:
  37. b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
  38. value = b43_phy_read(dev, B43_PHY_HT_TABLE_DATAHI);
  39. value <<= 16;
  40. value |= b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
  41. break;
  42. default:
  43. B43_WARN_ON(1);
  44. value = 0;
  45. }
  46. return value;
  47. }
  48. void b43_httab_read_bulk(struct b43_wldev *dev, u32 offset,
  49. unsigned int nr_elements, void *_data)
  50. {
  51. u32 type;
  52. u8 *data = _data;
  53. unsigned int i;
  54. type = offset & B43_HTTAB_TYPEMASK;
  55. offset &= ~B43_HTTAB_TYPEMASK;
  56. B43_WARN_ON(offset > 0xFFFF);
  57. b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
  58. for (i = 0; i < nr_elements; i++) {
  59. switch (type) {
  60. case B43_HTTAB_8BIT:
  61. *data = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO) & 0xFF;
  62. data++;
  63. break;
  64. case B43_HTTAB_16BIT:
  65. *((u16 *)data) = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
  66. data += 2;
  67. break;
  68. case B43_HTTAB_32BIT:
  69. *((u32 *)data) = b43_phy_read(dev, B43_PHY_HT_TABLE_DATAHI);
  70. *((u32 *)data) <<= 16;
  71. *((u32 *)data) |= b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
  72. data += 4;
  73. break;
  74. default:
  75. B43_WARN_ON(1);
  76. }
  77. }
  78. }
  79. void b43_httab_write(struct b43_wldev *dev, u32 offset, u32 value)
  80. {
  81. u32 type;
  82. type = offset & B43_HTTAB_TYPEMASK;
  83. offset &= 0xFFFF;
  84. switch (type) {
  85. case B43_HTTAB_8BIT:
  86. B43_WARN_ON(value & ~0xFF);
  87. b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
  88. b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
  89. break;
  90. case B43_HTTAB_16BIT:
  91. B43_WARN_ON(value & ~0xFFFF);
  92. b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
  93. b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
  94. break;
  95. case B43_HTTAB_32BIT:
  96. b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
  97. b43_phy_write(dev, B43_PHY_HT_TABLE_DATAHI, value >> 16);
  98. b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value & 0xFFFF);
  99. break;
  100. default:
  101. B43_WARN_ON(1);
  102. }
  103. return;
  104. }
  105. void b43_httab_write_bulk(struct b43_wldev *dev, u32 offset,
  106. unsigned int nr_elements, const void *_data)
  107. {
  108. u32 type, value;
  109. const u8 *data = _data;
  110. unsigned int i;
  111. type = offset & B43_HTTAB_TYPEMASK;
  112. offset &= ~B43_HTTAB_TYPEMASK;
  113. B43_WARN_ON(offset > 0xFFFF);
  114. b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
  115. for (i = 0; i < nr_elements; i++) {
  116. switch (type) {
  117. case B43_HTTAB_8BIT:
  118. value = *data;
  119. data++;
  120. B43_WARN_ON(value & ~0xFF);
  121. b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
  122. break;
  123. case B43_HTTAB_16BIT:
  124. value = *((u16 *)data);
  125. data += 2;
  126. B43_WARN_ON(value & ~0xFFFF);
  127. b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
  128. break;
  129. case B43_HTTAB_32BIT:
  130. value = *((u32 *)data);
  131. data += 4;
  132. b43_phy_write(dev, B43_PHY_HT_TABLE_DATAHI, value >> 16);
  133. b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO,
  134. value & 0xFFFF);
  135. break;
  136. default:
  137. B43_WARN_ON(1);
  138. }
  139. }
  140. }