1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37#include "../rt_config.h"
38
39
40VOID RaiseClock(
41 IN PRTMP_ADAPTER pAd,
42 IN UINT32 *x)
43{
44 *x = *x | EESK;
45 RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);
46 RTMPusecDelay(1);
47}
48
49
50VOID LowerClock(
51 IN PRTMP_ADAPTER pAd,
52 IN UINT32 *x)
53{
54 *x = *x & ~EESK;
55 RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);
56 RTMPusecDelay(1);
57}
58
59
60USHORT ShiftInBits(
61 IN PRTMP_ADAPTER pAd)
62{
63 UINT32 x,i;
64 USHORT data=0;
65
66 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
67
68 x &= ~( EEDO | EEDI);
69
70 for(i=0; i<16; i++)
71 {
72 data = data << 1;
73 RaiseClock(pAd, &x);
74
75 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
76
77 x &= ~(EEDI);
78 if(x & EEDO)
79 data |= 1;
80
81 LowerClock(pAd, &x);
82 }
83
84 return data;
85}
86
87
88VOID ShiftOutBits(
89 IN PRTMP_ADAPTER pAd,
90 IN USHORT data,
91 IN USHORT count)
92{
93 UINT32 x,mask;
94
95 mask = 0x01 << (count - 1);
96 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
97
98 x &= ~(EEDO | EEDI);
99
100 do
101 {
102 x &= ~EEDI;
103 if(data & mask) x |= EEDI;
104
105 RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
106
107 RaiseClock(pAd, &x);
108 LowerClock(pAd, &x);
109
110 mask = mask >> 1;
111 } while(mask);
112
113 x &= ~EEDI;
114 RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
115}
116
117
118VOID EEpromCleanup(
119 IN PRTMP_ADAPTER pAd)
120{
121 UINT32 x;
122
123 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
124
125 x &= ~(EECS | EEDI);
126 RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
127
128 RaiseClock(pAd, &x);
129 LowerClock(pAd, &x);
130}
131
132VOID EWEN(
133 IN PRTMP_ADAPTER pAd)
134{
135 UINT32 x;
136
137
138 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
139 x &= ~(EEDI | EEDO | EESK);
140 x |= EECS;
141 RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
142
143
144 RaiseClock(pAd, &x);
145 LowerClock(pAd, &x);
146
147
148 ShiftOutBits(pAd, EEPROM_EWEN_OPCODE, 5);
149 ShiftOutBits(pAd, 0, 6);
150
151 EEpromCleanup(pAd);
152}
153
154VOID EWDS(
155 IN PRTMP_ADAPTER pAd)
156{
157 UINT32 x;
158
159
160 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
161 x &= ~(EEDI | EEDO | EESK);
162 x |= EECS;
163 RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
164
165
166 RaiseClock(pAd, &x);
167 LowerClock(pAd, &x);
168
169
170 ShiftOutBits(pAd, EEPROM_EWDS_OPCODE, 5);
171 ShiftOutBits(pAd, 0, 6);
172
173 EEpromCleanup(pAd);
174}
175
176
177USHORT RTMP_EEPROM_READ16(
178 IN PRTMP_ADAPTER pAd,
179 IN USHORT Offset)
180{
181 UINT32 x;
182 USHORT data;
183
184 Offset /= 2;
185
186 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
187 x &= ~(EEDI | EEDO | EESK);
188 x |= EECS;
189 RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
190
191
192 RaiseClock(pAd, &x);
193 LowerClock(pAd, &x);
194
195
196 ShiftOutBits(pAd, EEPROM_READ_OPCODE, 3);
197 ShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum);
198
199
200 data = ShiftInBits(pAd);
201
202 EEpromCleanup(pAd);
203
204 return data;
205}
206
207VOID RTMP_EEPROM_WRITE16(
208 IN PRTMP_ADAPTER pAd,
209 IN USHORT Offset,
210 IN USHORT Data)
211{
212 UINT32 x;
213
214 Offset /= 2;
215
216 EWEN(pAd);
217
218
219 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
220 x &= ~(EEDI | EEDO | EESK);
221 x |= EECS;
222 RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
223
224
225 RaiseClock(pAd, &x);
226 LowerClock(pAd, &x);
227
228
229 ShiftOutBits(pAd, EEPROM_WRITE_OPCODE, 3);
230 ShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum);
231 ShiftOutBits(pAd, Data, 16);
232
233
234 RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
235
236 EEpromCleanup(pAd);
237
238 RTMPusecDelay(10000);
239
240 EWDS(pAd);
241
242 EEpromCleanup(pAd);
243}
244
245