forked from Minki/linux
thunderbolt: Call tb_eeprom_get_drom_offset() from tb_eeprom_read_n()
We are going to re-use tb_drom_read() for USB4 DROM reading as well. USB4 has separate router operations for this which does not need the drom_offset. Therefore we move call to tb_eeprom_get_drom_offset() into tb_eeprom_read_n() where it is needed. While there change return -ENOSYS to -ENODEV because the former is only supposed to be used with system calls (invalid syscall nr). Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Link: https://lore.kernel.org/r/20191217123345.31850-3-mika.westerberg@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
386e5e29d8
commit
4deb200d34
@ -130,13 +130,52 @@ static int tb_eeprom_in(struct tb_switch *sw, u8 *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* tb_eeprom_get_drom_offset - get drom offset within eeprom
|
||||
*/
|
||||
static int tb_eeprom_get_drom_offset(struct tb_switch *sw, u16 *offset)
|
||||
{
|
||||
struct tb_cap_plug_events cap;
|
||||
int res;
|
||||
|
||||
if (!sw->cap_plug_events) {
|
||||
tb_sw_warn(sw, "no TB_CAP_PLUG_EVENTS, cannot read eeprom\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
res = tb_sw_read(sw, &cap, TB_CFG_SWITCH, sw->cap_plug_events,
|
||||
sizeof(cap) / 4);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
if (!cap.eeprom_ctl.present || cap.eeprom_ctl.not_present) {
|
||||
tb_sw_warn(sw, "no NVM\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (cap.drom_offset > 0xffff) {
|
||||
tb_sw_warn(sw, "drom offset is larger than 0xffff: %#x\n",
|
||||
cap.drom_offset);
|
||||
return -ENXIO;
|
||||
}
|
||||
*offset = cap.drom_offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* tb_eeprom_read_n - read count bytes from offset into val
|
||||
*/
|
||||
static int tb_eeprom_read_n(struct tb_switch *sw, u16 offset, u8 *val,
|
||||
size_t count)
|
||||
{
|
||||
u16 drom_offset;
|
||||
int i, res;
|
||||
|
||||
res = tb_eeprom_get_drom_offset(sw, &drom_offset);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
offset += drom_offset;
|
||||
|
||||
res = tb_eeprom_active(sw, true);
|
||||
if (res)
|
||||
return res;
|
||||
@ -238,36 +277,6 @@ struct tb_drom_entry_port {
|
||||
} __packed;
|
||||
|
||||
|
||||
/**
|
||||
* tb_eeprom_get_drom_offset - get drom offset within eeprom
|
||||
*/
|
||||
static int tb_eeprom_get_drom_offset(struct tb_switch *sw, u16 *offset)
|
||||
{
|
||||
struct tb_cap_plug_events cap;
|
||||
int res;
|
||||
if (!sw->cap_plug_events) {
|
||||
tb_sw_warn(sw, "no TB_CAP_PLUG_EVENTS, cannot read eeprom\n");
|
||||
return -ENOSYS;
|
||||
}
|
||||
res = tb_sw_read(sw, &cap, TB_CFG_SWITCH, sw->cap_plug_events,
|
||||
sizeof(cap) / 4);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
if (!cap.eeprom_ctl.present || cap.eeprom_ctl.not_present) {
|
||||
tb_sw_warn(sw, "no NVM\n");
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
if (cap.drom_offset > 0xffff) {
|
||||
tb_sw_warn(sw, "drom offset is larger than 0xffff: %#x\n",
|
||||
cap.drom_offset);
|
||||
return -ENXIO;
|
||||
}
|
||||
*offset = cap.drom_offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* tb_drom_read_uid_only - read uid directly from drom
|
||||
*
|
||||
@ -277,17 +286,11 @@ static int tb_eeprom_get_drom_offset(struct tb_switch *sw, u16 *offset)
|
||||
int tb_drom_read_uid_only(struct tb_switch *sw, u64 *uid)
|
||||
{
|
||||
u8 data[9];
|
||||
u16 drom_offset;
|
||||
u8 crc;
|
||||
int res = tb_eeprom_get_drom_offset(sw, &drom_offset);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
if (drom_offset == 0)
|
||||
return -ENODEV;
|
||||
int res;
|
||||
|
||||
/* read uid */
|
||||
res = tb_eeprom_read_n(sw, drom_offset, data, 9);
|
||||
res = tb_eeprom_read_n(sw, 0, data, 9);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
@ -489,7 +492,6 @@ err_free:
|
||||
*/
|
||||
int tb_drom_read(struct tb_switch *sw)
|
||||
{
|
||||
u16 drom_offset;
|
||||
u16 size;
|
||||
u32 crc;
|
||||
struct tb_drom_header *header;
|
||||
@ -517,11 +519,7 @@ int tb_drom_read(struct tb_switch *sw)
|
||||
return 0;
|
||||
}
|
||||
|
||||
res = tb_eeprom_get_drom_offset(sw, &drom_offset);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
res = tb_eeprom_read_n(sw, drom_offset + 14, (u8 *) &size, 2);
|
||||
res = tb_eeprom_read_n(sw, 14, (u8 *) &size, 2);
|
||||
if (res)
|
||||
return res;
|
||||
size &= 0x3ff;
|
||||
@ -535,7 +533,7 @@ int tb_drom_read(struct tb_switch *sw)
|
||||
sw->drom = kzalloc(size, GFP_KERNEL);
|
||||
if (!sw->drom)
|
||||
return -ENOMEM;
|
||||
res = tb_eeprom_read_n(sw, drom_offset, sw->drom, size);
|
||||
res = tb_eeprom_read_n(sw, 0, sw->drom, size);
|
||||
if (res)
|
||||
goto err;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user