in eni.c [1595:1680]
static int get_esi_asic(struct atm_dev *dev)
{
struct eni_dev *eni_dev;
unsigned char tonga;
int error,failed,pci_error;
int address,i,j;
eni_dev = ENI_DEV(dev);
error = pci_error = 0;
tonga = SEPROM_MAGIC | SEPROM_DATA | SEPROM_CLK;
SET_SEPROM;
for (i = 0; i < ESI_LEN && !error && !pci_error; i++) {
/* start operation */
tonga |= SEPROM_DATA;
SET_SEPROM;
tonga |= SEPROM_CLK;
SET_SEPROM;
tonga &= ~SEPROM_DATA;
SET_SEPROM;
tonga &= ~SEPROM_CLK;
SET_SEPROM;
/* send address */
address = ((i+SEPROM_ESI_BASE) << 1)+1;
for (j = 7; j >= 0; j--) {
tonga = (address >> j) & 1 ? tonga | SEPROM_DATA :
tonga & ~SEPROM_DATA;
SET_SEPROM;
tonga |= SEPROM_CLK;
SET_SEPROM;
tonga &= ~SEPROM_CLK;
SET_SEPROM;
}
/* get ack */
tonga |= SEPROM_DATA;
SET_SEPROM;
tonga |= SEPROM_CLK;
SET_SEPROM;
GET_SEPROM;
failed = tonga & SEPROM_DATA;
tonga &= ~SEPROM_CLK;
SET_SEPROM;
tonga |= SEPROM_DATA;
SET_SEPROM;
if (failed) error = -EIO;
else {
dev->esi[i] = 0;
for (j = 7; j >= 0; j--) {
dev->esi[i] <<= 1;
tonga |= SEPROM_DATA;
SET_SEPROM;
tonga |= SEPROM_CLK;
SET_SEPROM;
GET_SEPROM;
if (tonga & SEPROM_DATA) dev->esi[i] |= 1;
tonga &= ~SEPROM_CLK;
SET_SEPROM;
tonga |= SEPROM_DATA;
SET_SEPROM;
}
/* get ack */
tonga |= SEPROM_DATA;
SET_SEPROM;
tonga |= SEPROM_CLK;
SET_SEPROM;
GET_SEPROM;
if (!(tonga & SEPROM_DATA)) error = -EIO;
tonga &= ~SEPROM_CLK;
SET_SEPROM;
tonga |= SEPROM_DATA;
SET_SEPROM;
}
/* stop operation */
tonga &= ~SEPROM_DATA;
SET_SEPROM;
tonga |= SEPROM_CLK;
SET_SEPROM;
tonga |= SEPROM_DATA;
SET_SEPROM;
}
if (pci_error) {
printk(KERN_ERR DEV_LABEL "(itf %d): error reading ESI "
"(0x%02x)\n",dev->number,pci_error);
error = -EIO;
}
return error;
}