Пример #1
0
static ssize_t pch_phub_bin_read(struct file *filp, struct kobject *kobj,
                                 struct bin_attribute *attr, char *buf,
                                 loff_t off, size_t count)
{
    unsigned int rom_signature;
    unsigned char rom_length;
    unsigned int tmp;
    unsigned int addr_offset;
    unsigned int orom_size;
    int ret;
    int err;

    struct pch_phub_reg *chip =
        dev_get_drvdata(container_of(kobj, struct device, kobj));

    ret = mutex_lock_interruptible(&pch_phub_mutex);
    if (ret) {
        err = -ERESTARTSYS;
        goto return_err_nomutex;
    }

    /* Get Rom signature */
    pch_phub_read_serial_rom(chip, chip->pch_opt_rom_start_address,
                             (unsigned char *)&rom_signature);
    rom_signature &= 0xff;
    pch_phub_read_serial_rom(chip, chip->pch_opt_rom_start_address + 1,
                             (unsigned char *)&tmp);
    rom_signature |= (tmp & 0xff) << 8;
    if (rom_signature == 0xAA55) {
        pch_phub_read_serial_rom(chip,
                                 chip->pch_opt_rom_start_address + 2,
                                 &rom_length);
        orom_size = rom_length * 512;
        if (orom_size < off) {
            addr_offset = 0;
            goto return_ok;
        }
        if (orom_size < count) {
            addr_offset = 0;
            goto return_ok;
        }

        for (addr_offset = 0; addr_offset < count; addr_offset++) {
            pch_phub_read_serial_rom(chip,
                                     chip->pch_opt_rom_start_address + addr_offset + off,
                                     &buf[addr_offset]);
        }
    } else {
        err = -ENODATA;
        goto return_err;
    }
return_ok:
    mutex_unlock(&pch_phub_mutex);
    return addr_offset;

return_err:
    mutex_unlock(&pch_phub_mutex);
return_err_nomutex:
    return err;
}
Пример #2
0
/**
 * pch_phub_read_serial_rom_val() - Read Serial ROM value
 * @offset_address:	Serial ROM address offset value.
 * @data:		Serial ROM value to read.
 */
static void pch_phub_read_serial_rom_val(struct pch_phub_reg *chip,
					 unsigned int offset_address, u8 *data)
{
	unsigned int mem_addr;

	mem_addr = chip->pch_mac_start_address +
			pch_phub_mac_offset[offset_address];

	pch_phub_read_serial_rom(chip, mem_addr, data);
}
Пример #3
0
/**
 * pch_phub_read_serial_rom_val() - Read Serial ROM value
 * @offset_address:	Serial ROM address offset value.
 * @data:		Serial ROM value to read.
 */
static void pch_phub_read_serial_rom_val(struct pch_phub_reg *chip,
					 unsigned int offset_address, u8 *data)
{
	unsigned int mem_addr;

	mem_addr = PCH_PHUB_ROM_START_ADDR_EG20T +
			pch_phub_mac_offset[offset_address];

	pch_phub_read_serial_rom(chip, mem_addr, data);
}