| /* |
| * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. |
| * All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * File: srom.c |
| * |
| * Purpose:Implement functions to access eeprom |
| * |
| * Author: Jerry Chen |
| * |
| * Date: Jan 29, 2003 |
| * |
| * Functions: |
| * SROMbyReadEmbedded - Embedded read eeprom via MAC |
| * SROMbWriteEmbedded - Embedded write eeprom via MAC |
| * SROMvRegBitsOn - Set Bits On in eeprom |
| * SROMvRegBitsOff - Clear Bits Off in eeprom |
| * SROMbIsRegBitsOn - Test if Bits On in eeprom |
| * SROMbIsRegBitsOff - Test if Bits Off in eeprom |
| * SROMvReadAllContents - Read all contents in eeprom |
| * SROMvWriteAllContents - Write all contents in eeprom |
| * SROMvReadEtherAddress - Read Ethernet Address in eeprom |
| * SROMvWriteEtherAddress - Write Ethernet Address in eeprom |
| * SROMvReadSubSysVenId - Read Sub_VID and Sub_SysId in eeprom |
| * SROMbAutoLoad - Auto Load eeprom to MAC register |
| * |
| * Revision History: |
| * |
| */ |
| |
| #include "upc.h" |
| #include "tmacro.h" |
| #include "tether.h" |
| #include "mac.h" |
| #include "srom.h" |
| |
| /*--------------------- Static Definitions -------------------------*/ |
| |
| /*--------------------- Static Classes ----------------------------*/ |
| |
| /*--------------------- Static Variables --------------------------*/ |
| |
| /*--------------------- Static Functions --------------------------*/ |
| |
| /*--------------------- Export Variables --------------------------*/ |
| |
| /*--------------------- Export Functions --------------------------*/ |
| |
| /* |
| * Description: Read a byte from EEPROM, by MAC I2C |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * byContntOffset - address of EEPROM |
| * Out: |
| * none |
| * |
| * Return Value: data read |
| * |
| */ |
| unsigned char SROMbyReadEmbedded(void __iomem *dwIoBase, unsigned char byContntOffset) |
| { |
| unsigned short wDelay, wNoACK; |
| unsigned char byWait; |
| unsigned char byData; |
| unsigned char byOrg; |
| |
| byData = 0xFF; |
| VNSvInPortB(dwIoBase + MAC_REG_I2MCFG, &byOrg); |
| /* turn off hardware retry for getting NACK */ |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, (byOrg & (~I2MCFG_NORETRY))); |
| for (wNoACK = 0; wNoACK < W_MAX_I2CRETRY; wNoACK++) { |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MTGID, EEP_I2C_DEV_ID); |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MTGAD, byContntOffset); |
| |
| /* issue read command */ |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MCSR, I2MCSR_EEMR); |
| /* wait DONE be set */ |
| for (wDelay = 0; wDelay < W_MAX_TIMEOUT; wDelay++) { |
| VNSvInPortB(dwIoBase + MAC_REG_I2MCSR, &byWait); |
| if (byWait & (I2MCSR_DONE | I2MCSR_NACK)) |
| break; |
| PCAvDelayByIO(CB_DELAY_LOOP_WAIT); |
| } |
| if ((wDelay < W_MAX_TIMEOUT) && |
| (!(byWait & I2MCSR_NACK))) { |
| break; |
| } |
| } |
| VNSvInPortB(dwIoBase + MAC_REG_I2MDIPT, &byData); |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, byOrg); |
| return byData; |
| } |
| |
| /* |
| * Description: Write a byte to EEPROM, by MAC I2C |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * byContntOffset - address of EEPROM |
| * wData - data to write |
| * Out: |
| * none |
| * |
| * Return Value: true if succeeded; false if failed. |
| * |
| */ |
| bool SROMbWriteEmbedded(void __iomem *dwIoBase, unsigned char byContntOffset, unsigned char byData) |
| { |
| unsigned short wDelay, wNoACK; |
| unsigned char byWait; |
| |
| unsigned char byOrg; |
| |
| VNSvInPortB(dwIoBase + MAC_REG_I2MCFG, &byOrg); |
| /* turn off hardware retry for getting NACK */ |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, (byOrg & (~I2MCFG_NORETRY))); |
| for (wNoACK = 0; wNoACK < W_MAX_I2CRETRY; wNoACK++) { |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MTGID, EEP_I2C_DEV_ID); |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MTGAD, byContntOffset); |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MDOPT, byData); |
| |
| /* issue write command */ |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MCSR, I2MCSR_EEMW); |
| /* wait DONE be set */ |
| for (wDelay = 0; wDelay < W_MAX_TIMEOUT; wDelay++) { |
| VNSvInPortB(dwIoBase + MAC_REG_I2MCSR, &byWait); |
| if (byWait & (I2MCSR_DONE | I2MCSR_NACK)) |
| break; |
| PCAvDelayByIO(CB_DELAY_LOOP_WAIT); |
| } |
| |
| if ((wDelay < W_MAX_TIMEOUT) && |
| (!(byWait & I2MCSR_NACK))) { |
| break; |
| } |
| } |
| if (wNoACK == W_MAX_I2CRETRY) { |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, byOrg); |
| return false; |
| } |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, byOrg); |
| return true; |
| } |
| |
| /* |
| * Description: Turn bits on in eeprom |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * byContntOffset - address of EEPROM |
| * byBits - bits to turn on |
| * Out: |
| * none |
| * |
| * Return Value: none |
| * |
| */ |
| void SROMvRegBitsOn(void __iomem *dwIoBase, unsigned char byContntOffset, unsigned char byBits) |
| { |
| unsigned char byOrgData; |
| |
| byOrgData = SROMbyReadEmbedded(dwIoBase, byContntOffset); |
| SROMbWriteEmbedded(dwIoBase, byContntOffset, (unsigned char)(byOrgData | byBits)); |
| } |
| |
| /* |
| * Description: Turn bits off in eeprom |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * byContntOffset - address of EEPROM |
| * byBits - bits to turn off |
| * Out: |
| * none |
| * |
| */ |
| void SROMvRegBitsOff(void __iomem *dwIoBase, unsigned char byContntOffset, unsigned char byBits) |
| { |
| unsigned char byOrgData; |
| |
| byOrgData = SROMbyReadEmbedded(dwIoBase, byContntOffset); |
| SROMbWriteEmbedded(dwIoBase, byContntOffset, (unsigned char)(byOrgData & (~byBits))); |
| } |
| |
| /* |
| * Description: Test if bits on in eeprom |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * byContntOffset - address of EEPROM |
| * byTestBits - bits to test |
| * Out: |
| * none |
| * |
| * Return Value: true if all test bits on; otherwise false |
| * |
| */ |
| bool SROMbIsRegBitsOn(void __iomem *dwIoBase, unsigned char byContntOffset, unsigned char byTestBits) |
| { |
| unsigned char byOrgData; |
| |
| byOrgData = SROMbyReadEmbedded(dwIoBase, byContntOffset); |
| return (byOrgData & byTestBits) == byTestBits; |
| } |
| |
| /* |
| * Description: Test if bits off in eeprom |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * byContntOffset - address of EEPROM |
| * byTestBits - bits to test |
| * Out: |
| * none |
| * |
| * Return Value: true if all test bits off; otherwise false |
| * |
| */ |
| bool SROMbIsRegBitsOff(void __iomem *dwIoBase, unsigned char byContntOffset, unsigned char byTestBits) |
| { |
| unsigned char byOrgData; |
| |
| byOrgData = SROMbyReadEmbedded(dwIoBase, byContntOffset); |
| return !(byOrgData & byTestBits); |
| } |
| |
| /* |
| * Description: Read all contents of eeprom to buffer |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * Out: |
| * pbyEepromRegs - EEPROM content Buffer |
| * |
| * Return Value: none |
| * |
| */ |
| void SROMvReadAllContents(void __iomem *dwIoBase, unsigned char *pbyEepromRegs) |
| { |
| int ii; |
| |
| /* ii = Rom Address */ |
| for (ii = 0; ii < EEP_MAX_CONTEXT_SIZE; ii++) { |
| *pbyEepromRegs = SROMbyReadEmbedded(dwIoBase, (unsigned char)ii); |
| pbyEepromRegs++; |
| } |
| } |
| |
| /* |
| * Description: Write all contents of buffer to eeprom |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * pbyEepromRegs - EEPROM content Buffer |
| * Out: |
| * none |
| * |
| * Return Value: none |
| * |
| */ |
| void SROMvWriteAllContents(void __iomem *dwIoBase, unsigned char *pbyEepromRegs) |
| { |
| int ii; |
| |
| /* ii = Rom Address */ |
| for (ii = 0; ii < EEP_MAX_CONTEXT_SIZE; ii++) { |
| SROMbWriteEmbedded(dwIoBase, (unsigned char)ii, *pbyEepromRegs); |
| pbyEepromRegs++; |
| } |
| } |
| |
| /* |
| * Description: Read Ethernet Address from eeprom to buffer |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * Out: |
| * pbyEtherAddress - Ethernet Address buffer |
| * |
| * Return Value: none |
| * |
| */ |
| void SROMvReadEtherAddress(void __iomem *dwIoBase, unsigned char *pbyEtherAddress) |
| { |
| unsigned char ii; |
| |
| /* ii = Rom Address */ |
| for (ii = 0; ii < ETH_ALEN; ii++) { |
| *pbyEtherAddress = SROMbyReadEmbedded(dwIoBase, ii); |
| pbyEtherAddress++; |
| } |
| } |
| |
| /* |
| * Description: Write Ethernet Address from buffer to eeprom |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * pbyEtherAddress - Ethernet Address buffer |
| * Out: |
| * none |
| * |
| * Return Value: none |
| * |
| */ |
| void SROMvWriteEtherAddress(void __iomem *dwIoBase, unsigned char *pbyEtherAddress) |
| { |
| unsigned char ii; |
| |
| /* ii = Rom Address */ |
| for (ii = 0; ii < ETH_ALEN; ii++) { |
| SROMbWriteEmbedded(dwIoBase, ii, *pbyEtherAddress); |
| pbyEtherAddress++; |
| } |
| } |
| |
| /* |
| * Description: Read Sub_VID and Sub_SysId from eeprom to buffer |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * Out: |
| * pdwSubSysVenId - Sub_VID and Sub_SysId read |
| * |
| * Return Value: none |
| * |
| */ |
| void SROMvReadSubSysVenId(void __iomem *dwIoBase, unsigned long *pdwSubSysVenId) |
| { |
| unsigned char *pbyData; |
| |
| pbyData = (unsigned char *)pdwSubSysVenId; |
| /* sub vendor */ |
| *pbyData = SROMbyReadEmbedded(dwIoBase, 6); |
| *(pbyData+1) = SROMbyReadEmbedded(dwIoBase, 7); |
| /* sub system */ |
| *(pbyData+2) = SROMbyReadEmbedded(dwIoBase, 8); |
| *(pbyData+3) = SROMbyReadEmbedded(dwIoBase, 9); |
| } |
| |
| /* |
| * Description: Auto Load EEPROM to MAC register |
| * |
| * Parameters: |
| * In: |
| * dwIoBase - I/O base address |
| * Out: |
| * none |
| * |
| * Return Value: true if success; otherwise false |
| * |
| */ |
| bool SROMbAutoLoad(void __iomem *dwIoBase) |
| { |
| unsigned char byWait; |
| int ii; |
| |
| unsigned char byOrg; |
| |
| VNSvInPortB(dwIoBase + MAC_REG_I2MCFG, &byOrg); |
| /* turn on hardware retry */ |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, (byOrg | I2MCFG_NORETRY)); |
| |
| MACvRegBitsOn(dwIoBase, MAC_REG_I2MCSR, I2MCSR_AUTOLD); |
| |
| /* ii = Rom Address */ |
| for (ii = 0; ii < EEP_MAX_CONTEXT_SIZE; ii++) { |
| MACvTimer0MicroSDelay(dwIoBase, CB_EEPROM_READBYTE_WAIT); |
| VNSvInPortB(dwIoBase + MAC_REG_I2MCSR, &byWait); |
| if (!(byWait & I2MCSR_AUTOLD)) |
| break; |
| } |
| |
| VNSvOutPortB(dwIoBase + MAC_REG_I2MCFG, byOrg); |
| |
| if (ii == EEP_MAX_CONTEXT_SIZE) |
| return false; |
| return true; |
| } |