static int unm_get_flash_block(unm_adapter *adapter, int base, int size, uint32_t *buf) { int i, addr; uint32_t *ptr32; addr = base; ptr32 = buf; for (i = 0; i < size / sizeof (uint32_t); i++) { if (rom_fast_read(adapter, addr, (int *)ptr32) == -1) return (-1); ptr32++; addr += sizeof (uint32_t); } if ((char *)buf + size > (char *)ptr32) { int local; if (rom_fast_read(adapter, addr, &local) == -1) return (-1); (void) memcpy(ptr32, &local, (uintptr_t)((char *)buf + size) - (uintptr_t)(char *)ptr32); } return (0); }
static int unm_nic_get_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom, uint8_t * bytes) { struct unm_adapter_s *adapter = netdev_priv(netdev); int i, b_offset, b_end; uint8_t b_data[4], b_align; uint32_t data, b_rem; if ((eeprom->len <= 0) || (eeprom->offset >= MAX_ROM_SIZE)) return -EINVAL; eeprom->magic = adapter->ahw.vendor_id | (adapter->ahw.device_id << 16); if ((eeprom->offset + eeprom->len) > MAX_ROM_SIZE) eeprom->len = MAX_ROM_SIZE - eeprom->offset; b_offset = eeprom->offset; b_end = eeprom->len + eeprom->offset; b_align = 4; b_rem = eeprom->offset % 4; /*Check for offset which is not 4 byte aligned */ if ((b_rem) & 0x03) { b_offset -= b_rem; if (rom_fast_read(adapter, b_offset, &data) == -1) return -1; memcpy(b_data, &data, b_align); if (eeprom->len < (b_align - b_rem)) { memcpy(bytes, (b_data + b_rem), eeprom->len); return 0; } else memcpy(bytes, (b_data + b_rem), (b_align - b_rem)); b_offset += b_align; bytes += b_align - b_rem; } for (i = 0; i <= (b_end - b_offset - b_align); i += b_align) { if (rom_fast_read(adapter, (b_offset + i), &data) == -1) return -1; memcpy((bytes + i), &data, b_align); } if ((b_end % b_align) & 0x03) { if (rom_fast_read(adapter, (b_offset + i), &data) == -1) return -1; memcpy((bytes + i), &data, (b_end % b_align)); } return 0; }
static int unm_nic_get_eeprom_len(struct net_device *netdev) { return MAX_ROM_SIZE; #if 0 struct unm_adapter_s *adapter = netdev_priv(netdev); int n; if ((rom_fast_read(adapter, 0, &n) == 0) && (n & 0x80000000)) { // verify the rom address n &= ~0x80000000; if (n < 1024) return (n); } return 0; #endif }