Example #1
0
static int
ixgb_set_eeprom(struct net_device *netdev,
		  struct ethtool_eeprom *eeprom, u8 *bytes)
{
	struct ixgb_adapter *adapter = netdev_priv(netdev);
	struct ixgb_hw *hw = &adapter->hw;
	u16 *eeprom_buff;
	void *ptr;
	int max_len, first_word, last_word;
	u16 i;

	if (eeprom->len == 0)
		return -EINVAL;

	if (eeprom->magic != (hw->vendor_id | (hw->device_id << 16)))
		return -EFAULT;

	max_len = ixgb_get_eeprom_len(netdev);

	if (eeprom->offset > eeprom->offset + eeprom->len)
		return -EINVAL;

	if ((eeprom->offset + eeprom->len) > max_len)
		eeprom->len = (max_len - eeprom->offset);

	first_word = eeprom->offset >> 1;
	last_word = (eeprom->offset + eeprom->len - 1) >> 1;
	eeprom_buff = kmalloc(max_len, GFP_KERNEL);
	if (!eeprom_buff)
		return -ENOMEM;

	ptr = (void *)eeprom_buff;

	if (eeprom->offset & 1) {
		/* need read/modify/write of first changed EEPROM word */
		/* only the second byte of the word is being modified */
		eeprom_buff[0] = ixgb_read_eeprom(hw, first_word);
		ptr++;
	}
	if ((eeprom->offset + eeprom->len) & 1) {
		/* need read/modify/write of last changed EEPROM word */
		/* only the first byte of the word is being modified */
		eeprom_buff[last_word - first_word]
			= ixgb_read_eeprom(hw, last_word);
	}

	memcpy(ptr, bytes, eeprom->len);
	for (i = 0; i <= (last_word - first_word); i++)
		ixgb_write_eeprom(hw, first_word + i, eeprom_buff[i]);

	/* Update the checksum over the first part of the EEPROM if needed */
	if (first_word <= EEPROM_CHECKSUM_REG)
		ixgb_update_eeprom_checksum(hw);

	kfree(eeprom_buff);
	return 0;
}
Example #2
0
static void
ixgb_get_drvinfo(struct net_device *netdev,
           struct ethtool_drvinfo *drvinfo)
{
    struct ixgb_adapter *adapter = netdev_priv(netdev);

    strncpy(drvinfo->driver,  ixgb_driver_name, 32);
    strncpy(drvinfo->version, ixgb_driver_version, 32);
    strncpy(drvinfo->fw_version, "N/A", 32);
    strncpy(drvinfo->bus_info, pci_name(adapter->pdev), 32);
    drvinfo->n_stats = IXGB_STATS_LEN;
    drvinfo->regdump_len = ixgb_get_regs_len(netdev);
    drvinfo->eedump_len = ixgb_get_eeprom_len(netdev);
}
Example #3
0
static int
ixgb_get_eeprom(struct net_device *netdev,
          struct ethtool_eeprom *eeprom, u8 *bytes)
{
    struct ixgb_adapter *adapter = netdev_priv(netdev);
    struct ixgb_hw *hw = &adapter->hw;
    __le16 *eeprom_buff;
    int i, max_len, first_word, last_word;
    int ret_val = 0;

    if(eeprom->len == 0) {
        ret_val = -EINVAL;
        goto geeprom_error;
    }

    eeprom->magic = hw->vendor_id | (hw->device_id << 16);

    max_len = ixgb_get_eeprom_len(netdev);

    if(eeprom->offset > eeprom->offset + eeprom->len) {
        ret_val = -EINVAL;
        goto geeprom_error;
    }

    if((eeprom->offset + eeprom->len) > max_len)
        eeprom->len = (max_len - eeprom->offset);

    first_word = eeprom->offset >> 1;
    last_word = (eeprom->offset + eeprom->len - 1) >> 1;

    eeprom_buff = kmalloc(sizeof(__le16) *
            (last_word - first_word + 1), GFP_KERNEL);
    if(!eeprom_buff)
        return -ENOMEM;

    /* note the eeprom was good because the driver loaded */
    for(i = 0; i <= (last_word - first_word); i++) {
        eeprom_buff[i] = ixgb_get_eeprom_word(hw, (first_word + i));
    }

    memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 1),
            eeprom->len);
    kfree(eeprom_buff);

geeprom_error:
    return ret_val;
}