• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/staging/vt6655/
1/*
2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
3 * All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * File: srom.c
20 *
21 * Purpose:Implement functions to access eeprom
22 *
23 * Author: Jerry Chen
24 *
25 * Date: Jan 29, 2003
26 *
27 * Functions:
28 *      SROMbyReadEmbedded - Embedded read eeprom via MAC
29 *      SROMbWriteEmbedded - Embedded write eeprom via MAC
30 *      SROMvRegBitsOn - Set Bits On in eeprom
31 *      SROMvRegBitsOff - Clear Bits Off in eeprom
32 *      SROMbIsRegBitsOn - Test if Bits On in eeprom
33 *      SROMbIsRegBitsOff - Test if Bits Off in eeprom
34 *      SROMvReadAllContents - Read all contents in eeprom
35 *      SROMvWriteAllContents - Write all contents in eeprom
36 *      SROMvReadEtherAddress - Read Ethernet Address in eeprom
37 *      SROMvWriteEtherAddress - Write Ethernet Address in eeprom
38 *      SROMvReadSubSysVenId - Read Sub_VID and Sub_SysId in eeprom
39 *      SROMbAutoLoad - Auto Load eeprom to MAC register
40 *
41 * Revision History:
42 *
43 */
44
45#include "upc.h"
46#include "tmacro.h"
47#include "tether.h"
48#include "mac.h"
49#include "srom.h"
50
51/*---------------------  Static Definitions -------------------------*/
52
53/*---------------------  Static Classes  ----------------------------*/
54
55/*---------------------  Static Variables  --------------------------*/
56
57/*---------------------  Static Functions  --------------------------*/
58
59/*---------------------  Export Variables  --------------------------*/
60
61/*---------------------  Export Functions  --------------------------*/
62
63
64
65
66/*
67 * Description: Read a byte from EEPROM, by MAC I2C
68 *
69 * Parameters:
70 *  In:
71 *      dwIoBase        - I/O base address
72 *      byContntOffset  - address of EEPROM
73 *  Out:
74 *      none
75 *
76 * Return Value: data read
77 *
78 */
79unsigned char SROMbyReadEmbedded(unsigned long dwIoBase, unsigned char byContntOffset)
80{
81    unsigned short wDelay, wNoACK;
82    unsigned char byWait;
83    unsigned char byData;
84    unsigned char byOrg;
85
86    byData = 0xFF;
87    VNSvInPortB(dwIoBase + MAC_REG_I2MCFG, &byOrg);
88    /* turn off hardware retry for getting NACK */
89    VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, (byOrg & (~I2MCFG_NORETRY)));
90    for (wNoACK = 0; wNoACK < W_MAX_I2CRETRY; wNoACK++) {
91        VNSvOutPortB(dwIoBase + MAC_REG_I2MTGID, EEP_I2C_DEV_ID);
92        VNSvOutPortB(dwIoBase + MAC_REG_I2MTGAD, byContntOffset);
93
94        /* issue read command */
95        VNSvOutPortB(dwIoBase + MAC_REG_I2MCSR, I2MCSR_EEMR);
96        /* wait DONE be set */
97        for (wDelay = 0; wDelay < W_MAX_TIMEOUT; wDelay++) {
98            VNSvInPortB(dwIoBase + MAC_REG_I2MCSR, &byWait);
99            if (byWait & (I2MCSR_DONE | I2MCSR_NACK))
100                break;
101            PCAvDelayByIO(CB_DELAY_LOOP_WAIT);
102        }
103        if ((wDelay < W_MAX_TIMEOUT) &&
104             ( !(byWait & I2MCSR_NACK))) {
105            break;
106        }
107    }
108    VNSvInPortB(dwIoBase + MAC_REG_I2MDIPT, &byData);
109    VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, byOrg);
110    return byData;
111}
112
113
114/*
115 * Description: Write a byte to EEPROM, by MAC I2C
116 *
117 * Parameters:
118 *  In:
119 *      dwIoBase        - I/O base address
120 *      byContntOffset  - address of EEPROM
121 *      wData           - data to write
122 *  Out:
123 *      none
124 *
125 * Return Value: true if succeeded; false if failed.
126 *
127 */
128bool SROMbWriteEmbedded(unsigned long dwIoBase, unsigned char byContntOffset, unsigned char byData)
129{
130    unsigned short wDelay, wNoACK;
131    unsigned char byWait;
132
133    unsigned char byOrg;
134
135    VNSvInPortB(dwIoBase + MAC_REG_I2MCFG, &byOrg);
136    /* turn off hardware retry for getting NACK */
137    VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, (byOrg & (~I2MCFG_NORETRY)));
138    for (wNoACK = 0; wNoACK < W_MAX_I2CRETRY; wNoACK++) {
139        VNSvOutPortB(dwIoBase + MAC_REG_I2MTGID, EEP_I2C_DEV_ID);
140        VNSvOutPortB(dwIoBase + MAC_REG_I2MTGAD, byContntOffset);
141        VNSvOutPortB(dwIoBase + MAC_REG_I2MDOPT, byData);
142
143        /* issue write command */
144        VNSvOutPortB(dwIoBase + MAC_REG_I2MCSR, I2MCSR_EEMW);
145        /* wait DONE be set */
146        for (wDelay = 0; wDelay < W_MAX_TIMEOUT; wDelay++) {
147            VNSvInPortB(dwIoBase + MAC_REG_I2MCSR, &byWait);
148            if (byWait & (I2MCSR_DONE | I2MCSR_NACK))
149                break;
150            PCAvDelayByIO(CB_DELAY_LOOP_WAIT);
151        }
152
153        if ((wDelay < W_MAX_TIMEOUT) &&
154             ( !(byWait & I2MCSR_NACK))) {
155            break;
156        }
157    }
158    if (wNoACK == W_MAX_I2CRETRY) {
159        VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, byOrg);
160        return false;
161    }
162    VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, byOrg);
163    return true;
164}
165
166
167/*
168 * Description: Turn bits on in eeprom
169 *
170 * Parameters:
171 *  In:
172 *      dwIoBase        - I/O base address
173 *      byContntOffset  - address of EEPROM
174 *      byBits          - bits to turn on
175 *  Out:
176 *      none
177 *
178 * Return Value: none
179 *
180 */
181void SROMvRegBitsOn(unsigned long dwIoBase, unsigned char byContntOffset, unsigned char byBits)
182{
183    unsigned char byOrgData;
184
185    byOrgData = SROMbyReadEmbedded(dwIoBase, byContntOffset);
186    SROMbWriteEmbedded(dwIoBase, byContntOffset,(unsigned char)(byOrgData | byBits));
187}
188
189
190/*
191 * Description: Turn bits off in eeprom
192 *
193 * Parameters:
194 *  In:
195 *      dwIoBase        - I/O base address
196 *      byContntOffset  - address of EEPROM
197 *      byBits          - bits to turn off
198 *  Out:
199 *      none
200 *
201 */
202void SROMvRegBitsOff(unsigned long dwIoBase, unsigned char byContntOffset, unsigned char byBits)
203{
204    unsigned char byOrgData;
205
206    byOrgData = SROMbyReadEmbedded(dwIoBase, byContntOffset);
207    SROMbWriteEmbedded(dwIoBase, byContntOffset,(unsigned char)(byOrgData & (~byBits)));
208}
209
210
211/*
212 * Description: Test if bits on in eeprom
213 *
214 * Parameters:
215 *  In:
216 *      dwIoBase        - I/O base address
217 *      byContntOffset  - address of EEPROM
218 *      byTestBits      - bits to test
219 *  Out:
220 *      none
221 *
222 * Return Value: true if all test bits on; otherwise false
223 *
224 */
225bool SROMbIsRegBitsOn(unsigned long dwIoBase, unsigned char byContntOffset, unsigned char byTestBits)
226{
227    unsigned char byOrgData;
228
229    byOrgData = SROMbyReadEmbedded(dwIoBase, byContntOffset);
230    return (byOrgData & byTestBits) == byTestBits;
231}
232
233
234/*
235 * Description: Test if bits off in eeprom
236 *
237 * Parameters:
238 *  In:
239 *      dwIoBase        - I/O base address
240 *      byContntOffset  - address of EEPROM
241 *      byTestBits      - bits to test
242 *  Out:
243 *      none
244 *
245 * Return Value: true if all test bits off; otherwise false
246 *
247 */
248bool SROMbIsRegBitsOff(unsigned long dwIoBase, unsigned char byContntOffset, unsigned char byTestBits)
249{
250    unsigned char byOrgData;
251
252    byOrgData = SROMbyReadEmbedded(dwIoBase, byContntOffset);
253    return !(byOrgData & byTestBits);
254}
255
256
257/*
258 * Description: Read all contents of eeprom to buffer
259 *
260 * Parameters:
261 *  In:
262 *      dwIoBase        - I/O base address
263 *  Out:
264 *      pbyEepromRegs   - EEPROM content Buffer
265 *
266 * Return Value: none
267 *
268 */
269void SROMvReadAllContents(unsigned long dwIoBase, unsigned char *pbyEepromRegs)
270{
271    int     ii;
272
273    /* ii = Rom Address */
274    for (ii = 0; ii < EEP_MAX_CONTEXT_SIZE; ii++) {
275        *pbyEepromRegs = SROMbyReadEmbedded(dwIoBase,(unsigned char) ii);
276        pbyEepromRegs++;
277    }
278}
279
280
281/*
282 * Description: Write all contents of buffer to eeprom
283 *
284 * Parameters:
285 *  In:
286 *      dwIoBase        - I/O base address
287 *      pbyEepromRegs   - EEPROM content Buffer
288 *  Out:
289 *      none
290 *
291 * Return Value: none
292 *
293 */
294void SROMvWriteAllContents(unsigned long dwIoBase, unsigned char *pbyEepromRegs)
295{
296    int     ii;
297
298    /* ii = Rom Address */
299    for (ii = 0; ii < EEP_MAX_CONTEXT_SIZE; ii++) {
300        SROMbWriteEmbedded(dwIoBase,(unsigned char) ii, *pbyEepromRegs);
301        pbyEepromRegs++;
302    }
303}
304
305
306/*
307 * Description: Read Ethernet Address from eeprom to buffer
308 *
309 * Parameters:
310 *  In:
311 *      dwIoBase        - I/O base address
312 *  Out:
313 *      pbyEtherAddress - Ethernet Address buffer
314 *
315 * Return Value: none
316 *
317 */
318void SROMvReadEtherAddress(unsigned long dwIoBase, unsigned char *pbyEtherAddress)
319{
320    unsigned char ii;
321
322    /* ii = Rom Address */
323    for (ii = 0; ii < ETH_ALEN; ii++) {
324        *pbyEtherAddress = SROMbyReadEmbedded(dwIoBase, ii);
325        pbyEtherAddress++;
326    }
327}
328
329
330/*
331 * Description: Write Ethernet Address from buffer to eeprom
332 *
333 * Parameters:
334 *  In:
335 *      dwIoBase        - I/O base address
336 *      pbyEtherAddress - Ethernet Address buffer
337 *  Out:
338 *      none
339 *
340 * Return Value: none
341 *
342 */
343void SROMvWriteEtherAddress(unsigned long dwIoBase, unsigned char *pbyEtherAddress)
344{
345    unsigned char ii;
346
347    /* ii = Rom Address */
348    for (ii = 0; ii < ETH_ALEN; ii++) {
349        SROMbWriteEmbedded(dwIoBase, ii, *pbyEtherAddress);
350        pbyEtherAddress++;
351    }
352}
353
354
355/*
356 * Description: Read Sub_VID and Sub_SysId from eeprom to buffer
357 *
358 * Parameters:
359 *  In:
360 *      dwIoBase        - I/O base address
361 *  Out:
362 *      pdwSubSysVenId  - Sub_VID and Sub_SysId read
363 *
364 * Return Value: none
365 *
366 */
367void SROMvReadSubSysVenId(unsigned long dwIoBase, unsigned long *pdwSubSysVenId)
368{
369    unsigned char *pbyData;
370
371    pbyData = (unsigned char *)pdwSubSysVenId;
372    /* sub vendor */
373    *pbyData = SROMbyReadEmbedded(dwIoBase, 6);
374    *(pbyData+1) = SROMbyReadEmbedded(dwIoBase, 7);
375    /* sub system */
376    *(pbyData+2) = SROMbyReadEmbedded(dwIoBase, 8);
377    *(pbyData+3) = SROMbyReadEmbedded(dwIoBase, 9);
378}
379
380/*
381 * Description: Auto Load EEPROM to MAC register
382 *
383 * Parameters:
384 *  In:
385 *      dwIoBase        - I/O base address
386 *  Out:
387 *      none
388 *
389 * Return Value: true if success; otherwise false
390 *
391 */
392bool SROMbAutoLoad(unsigned long dwIoBase)
393{
394    unsigned char byWait;
395    int     ii;
396
397    unsigned char byOrg;
398
399    VNSvInPortB(dwIoBase + MAC_REG_I2MCFG, &byOrg);
400    /* turn on hardware retry */
401    VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, (byOrg | I2MCFG_NORETRY));
402
403    MACvRegBitsOn(dwIoBase, MAC_REG_I2MCSR, I2MCSR_AUTOLD);
404
405    /* ii = Rom Address */
406    for (ii = 0; ii < EEP_MAX_CONTEXT_SIZE; ii++) {
407        MACvTimer0MicroSDelay(dwIoBase, CB_EEPROM_READBYTE_WAIT);
408        VNSvInPortB(dwIoBase + MAC_REG_I2MCSR, &byWait);
409        if ( !(byWait & I2MCSR_AUTOLD))
410            break;
411    }
412
413    VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, byOrg);
414
415    if (ii == EEP_MAX_CONTEXT_SIZE)
416        return false;
417    return true;
418}
419