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