Commit 4deb200d authored by Mika Westerberg's avatar Mika Westerberg Committed by Greg Kroah-Hartman

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: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Link: https://lore.kernel.org/r/20191217123345.31850-3-mika.westerberg@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 386e5e29
...@@ -130,13 +130,52 @@ static int tb_eeprom_in(struct tb_switch *sw, u8 *val) ...@@ -130,13 +130,52 @@ static int tb_eeprom_in(struct tb_switch *sw, u8 *val)
return 0; 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 * 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, static int tb_eeprom_read_n(struct tb_switch *sw, u16 offset, u8 *val,
size_t count) size_t count)
{ {
u16 drom_offset;
int i, res; 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); res = tb_eeprom_active(sw, true);
if (res) if (res)
return res; return res;
...@@ -238,36 +277,6 @@ struct tb_drom_entry_port { ...@@ -238,36 +277,6 @@ struct tb_drom_entry_port {
} __packed; } __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 * 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) ...@@ -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) int tb_drom_read_uid_only(struct tb_switch *sw, u64 *uid)
{ {
u8 data[9]; u8 data[9];
u16 drom_offset;
u8 crc; u8 crc;
int res = tb_eeprom_get_drom_offset(sw, &drom_offset); int res;
if (res)
return res;
if (drom_offset == 0)
return -ENODEV;
/* read uid */ /* read uid */
res = tb_eeprom_read_n(sw, drom_offset, data, 9); res = tb_eeprom_read_n(sw, 0, data, 9);
if (res) if (res)
return res; return res;
...@@ -489,7 +492,6 @@ static int tb_drom_copy_nvm(struct tb_switch *sw, u16 *size) ...@@ -489,7 +492,6 @@ static int tb_drom_copy_nvm(struct tb_switch *sw, u16 *size)
*/ */
int tb_drom_read(struct tb_switch *sw) int tb_drom_read(struct tb_switch *sw)
{ {
u16 drom_offset;
u16 size; u16 size;
u32 crc; u32 crc;
struct tb_drom_header *header; struct tb_drom_header *header;
...@@ -517,11 +519,7 @@ int tb_drom_read(struct tb_switch *sw) ...@@ -517,11 +519,7 @@ int tb_drom_read(struct tb_switch *sw)
return 0; return 0;
} }
res = tb_eeprom_get_drom_offset(sw, &drom_offset); res = tb_eeprom_read_n(sw, 14, (u8 *) &size, 2);
if (res)
return res;
res = tb_eeprom_read_n(sw, drom_offset + 14, (u8 *) &size, 2);
if (res) if (res)
return res; return res;
size &= 0x3ff; size &= 0x3ff;
...@@ -535,7 +533,7 @@ int tb_drom_read(struct tb_switch *sw) ...@@ -535,7 +533,7 @@ int tb_drom_read(struct tb_switch *sw)
sw->drom = kzalloc(size, GFP_KERNEL); sw->drom = kzalloc(size, GFP_KERNEL);
if (!sw->drom) if (!sw->drom)
return -ENOMEM; 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) if (res)
goto err; goto err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment