Commit 8824d19b authored by Nikunj A. Dadhania's avatar Nikunj A. Dadhania Committed by Mika Westerberg

thunderbolt: Disable ports that are not implemented

Commit 4caf2511 ("thunderbolt: Add trivial .shutdown") exposes a bug
in the Thunderbolt driver, that frees an unallocated id, resulting in the
following spinlock bad magic bug.

[ 20.633803] BUG: spinlock bad magic on CPU#4, halt/3313
[ 20.640030] lock: 0xffff92e6ad5c97e0, .magic: 00000000, .owner: <none>/-1, .owner_cpu: 0
[ 20.672139] Call Trace:
[ 20.675032] dump_stack+0x97/0xdb
[ 20.678950] ? spin_bug+0xa5/0xb0
[ 20.682865] do_raw_spin_lock+0x68/0x98
[ 20.687397] _raw_spin_lock_irqsave+0x3f/0x5d
[ 20.692535] ida_destroy+0x4f/0x124
[ 20.696657] tb_switch_release+0x6d/0xfd
[ 20.701295] device_release+0x2c/0x7d
[ 20.705622] kobject_put+0x8e/0xac
[ 20.709637] tb_stop+0x55/0x66
[ 20.713243] tb_domain_remove+0x36/0x62
[ 20.717774] nhi_remove+0x4d/0x58

Fix the issue by disabling ports that are enabled as per the EEPROM, but
not implemented. While at it, update the kernel doc for the disabled
field, to reflect this.

Cc: stable@vger.kernel.org
Fixes: 4caf2511 ("thunderbolt: Add trivial .shutdown")
Reported-by: default avatarSrikanth Nandamuri <srikanth.nandamuri@intel.com>
Signed-off-by: default avatarNikunj A. Dadhania <nikunj.dadhania@linux.intel.com>
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent d012a719
...@@ -684,6 +684,7 @@ static int tb_init_port(struct tb_port *port) ...@@ -684,6 +684,7 @@ static int tb_init_port(struct tb_port *port)
if (res == -ENODEV) { if (res == -ENODEV) {
tb_dbg(port->sw->tb, " Port %d: not implemented\n", tb_dbg(port->sw->tb, " Port %d: not implemented\n",
port->port); port->port);
port->disabled = true;
return 0; return 0;
} }
return res; return res;
......
...@@ -186,7 +186,7 @@ struct tb_switch { ...@@ -186,7 +186,7 @@ struct tb_switch {
* @cap_adap: Offset of the adapter specific capability (%0 if not present) * @cap_adap: Offset of the adapter specific capability (%0 if not present)
* @cap_usb4: Offset to the USB4 port capability (%0 if not present) * @cap_usb4: Offset to the USB4 port capability (%0 if not present)
* @port: Port number on switch * @port: Port number on switch
* @disabled: Disabled by eeprom * @disabled: Disabled by eeprom or enabled but not implemented
* @bonded: true if the port is bonded (two lanes combined as one) * @bonded: true if the port is bonded (two lanes combined as one)
* @dual_link_port: If the switch is connected using two ports, points * @dual_link_port: If the switch is connected using two ports, points
* to the other port. * to the other port.
......
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