read mac addresses from bd
This commit is contained in:
parent
c52db0fa6b
commit
211d964c6f
|
|
@ -15,22 +15,132 @@
|
||||||
#include "board_detect.h"
|
#include "board_detect.h"
|
||||||
#include "bdparser.h"
|
#include "bdparser.h"
|
||||||
|
|
||||||
|
#define BD_ADDRESS 0x0000 /* Board descriptor at beginning of EEPROM */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ti_i2c_eeprom_init - Initialize an i2c bus and probe for a device
|
||||||
|
* @i2c_bus: i2c bus number to initialize
|
||||||
|
* @dev_addr: Device address to probe for
|
||||||
|
*
|
||||||
|
* Return: 0 on success or corresponding error on failure.
|
||||||
|
*/
|
||||||
|
static int __maybe_unused ti_i2c_eeprom_init(int i2c_bus, int dev_addr)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (i2c_bus >= 0) {
|
||||||
|
rc = i2c_set_bus_num(i2c_bus);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i2c_probe(dev_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ti_i2c_eeprom_read - Read data from an EEPROM
|
||||||
|
* @dev_addr: The device address of the EEPROM
|
||||||
|
* @offset: Offset to start reading in the EEPROM
|
||||||
|
* @ep: Pointer to a buffer to read into
|
||||||
|
* @epsize: Size of buffer
|
||||||
|
*
|
||||||
|
* Return: 0 on success or corresponding result of i2c_read
|
||||||
|
*/
|
||||||
|
static int __maybe_unused ti_i2c_eeprom_read(int dev_addr, int offset,
|
||||||
|
uchar *ep, int epsize)
|
||||||
|
{
|
||||||
|
return i2c_read(dev_addr, offset, 2, ep, epsize);
|
||||||
|
}
|
||||||
|
|
||||||
int __maybe_unused ti_i2c_eeprom_am_get(int bus_addr, int dev_addr)
|
int __maybe_unused ti_i2c_eeprom_am_get(int bus_addr, int dev_addr)
|
||||||
{
|
{
|
||||||
struct ti_common_eeprom *ep;
|
struct ti_common_eeprom *ep;
|
||||||
|
BD_Context bdCtx; /* The board descriptor context */
|
||||||
|
u8 bdHeader[8];
|
||||||
|
void* pBdData = NULL;
|
||||||
|
u8 bdHwVer = 0;
|
||||||
|
u8 bdHwRev = 0;
|
||||||
|
char bdProdName[32];
|
||||||
|
bd_bool_t rc;
|
||||||
|
|
||||||
ep = TI_EEPROM_DATA;
|
ep = TI_EEPROM_DATA;
|
||||||
if (ep->header == TI_EEPROM_HEADER_MAGIC)
|
if (ep->header == TI_EEPROM_HEADER_MAGIC)
|
||||||
goto already_read;
|
goto already_read;
|
||||||
|
|
||||||
/* Initialize with a known bad marker for i2c fails.. */
|
/* Mark eeprom valid. */
|
||||||
ep->header = TI_EEPROM_HEADER_MAGIC;
|
ep->header = TI_EEPROM_HEADER_MAGIC;
|
||||||
strlcpy(ep->name, "NBHW16", TI_EEPROM_HDR_NAME_LEN + 1); /* Do not take from BD to allow use of u-boot without BD. */
|
strlcpy(ep->name, "NBHW16", TI_EEPROM_HDR_NAME_LEN + 1); /* Do not take from BD to allow use of u-boot without BD. */
|
||||||
strlcpy(ep->version, "0.0", TI_EEPROM_HDR_REV_LEN + 1);
|
strlcpy(ep->version, "0.0", TI_EEPROM_HDR_REV_LEN + 1);
|
||||||
strlcpy(ep->serial, "1234", TI_EEPROM_HDR_SERIAL_LEN + 1);
|
strlcpy(ep->serial, "", TI_EEPROM_HDR_SERIAL_LEN + 1);
|
||||||
strlcpy(ep->config, "", TI_EEPROM_HDR_CONFIG_LEN + 1);
|
strlcpy(ep->config, "", TI_EEPROM_HDR_CONFIG_LEN + 1);
|
||||||
|
|
||||||
|
gpi2c_init();
|
||||||
|
rc = ti_i2c_eeprom_init(bus_addr, dev_addr);
|
||||||
|
if (rc)
|
||||||
|
goto do_fake_bd;
|
||||||
|
|
||||||
|
/* Read header bytes from beginning of EEPROM */
|
||||||
|
if (i2c_read( dev_addr, BD_ADDRESS, 2, bdHeader, BD_HEADER_LENGTH )) {
|
||||||
|
printf("%s() Can't read BD header from EEPROM\n", __FUNCTION__);
|
||||||
|
goto do_fake_bd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check whether this is a valid board descriptor (or empty EEPROM) */
|
||||||
|
rc = BD_CheckHeader( &bdCtx, bdHeader );
|
||||||
|
if (!rc) {
|
||||||
|
printf("%s() No valid board descriptor found\n", __FUNCTION__);
|
||||||
|
goto do_fake_bd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Allocate memory for descriptor data and .. */
|
||||||
|
pBdData = malloc( bdCtx.size );
|
||||||
|
if ( pBdData == NULL ) {
|
||||||
|
printf("%s() Can't allocate %d bytes\n", __FUNCTION__, bdCtx.size);
|
||||||
|
goto do_fake_bd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* .. read data from EEPROM */
|
||||||
|
if (i2c_read(dev_addr, BD_ADDRESS+BD_HEADER_LENGTH, 2, pBdData, bdCtx.size)) {
|
||||||
|
printf("%s() Can't read data from EEPROM\n", __FUNCTION__);
|
||||||
|
goto do_fake_bd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Import data into board descriptor context
|
||||||
|
*/
|
||||||
|
rc = BD_ImportData( &bdCtx, pBdData );
|
||||||
|
if (!rc) {
|
||||||
|
printf("%s() Invalid board descriptor data\n", __FUNCTION__);
|
||||||
|
goto do_fake_bd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** Get commonly used entries and cache them for later access ***/
|
||||||
|
|
||||||
|
/* Hardware version/revision */
|
||||||
|
if ( !BD_GetUInt8( &bdCtx, BD_Hw_Ver, 0, &bdHwVer) ) {
|
||||||
|
printf("%s() no Hw Version found\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
/* Hardware version/revision */
|
||||||
|
if ( !BD_GetUInt8( &bdCtx, BD_Hw_Rel, 0, &bdHwRev) ) {
|
||||||
|
printf("%s() no Hw Release found\n", __FUNCTION__);
|
||||||
|
}
|
||||||
|
snprintf(ep->version, sizeof(ep->version), "%d,%d", BD_Hw_Ver, BD_Hw_Rel);
|
||||||
|
|
||||||
|
/* MAC address */
|
||||||
memset(ep->mac_addr, 0x00, TI_EEPROM_HDR_NO_OF_MAC_ADDR * TI_EEPROM_HDR_ETH_ALEN);
|
memset(ep->mac_addr, 0x00, TI_EEPROM_HDR_NO_OF_MAC_ADDR * TI_EEPROM_HDR_ETH_ALEN);
|
||||||
|
for (i=0; i<TI_EEPROM_HDR_NO_OF_MAC_ADDR; i++) {
|
||||||
|
BD_GetMAC( &bdCtx, BD_Eth_Mac, i, &(ep->mac_addr[i][0]) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
do_fake_bd:
|
||||||
|
/* Fill in dummy mac addresses to get u-boot working without valid BD */
|
||||||
|
memset(ep->mac_addr, 0x00, TI_EEPROM_HDR_NO_OF_MAC_ADDR * TI_EEPROM_HDR_ETH_ALEN);
|
||||||
|
ep->mac_addr[0][5] = 1;
|
||||||
|
ep->mac_addr[1][5] = 2;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
already_read:
|
already_read:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue