Esempio n. 1
0
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
}