thunderbolt: Make sure device runtime resume completes before taking domain lock
authorMika Westerberg <mika.westerberg@linux.intel.com>
Tue, 28 May 2019 15:56:20 +0000 (18:56 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Wed, 12 Jun 2019 10:30:46 +0000 (13:30 +0300)
commit4f7c2e0d8765a0266b920c66ffc495fde44c1ec8
treebba2b7c2b916400273b6e1f9584207b9785c831a
parentd1fdb6d8f6a4109a4263176c84b899076a5f8008
thunderbolt: Make sure device runtime resume completes before taking domain lock

When a device is authorized from userspace by writing to authorized
attribute we first take the domain lock and then runtime resume the
device in question. There are two issues with this.

First is that the device connected notifications are blocked during this
time which means we get them only after the authorization operation is
complete. Because of this the authorization needed flag from the
firmware notification is not reflecting the real authorization status
anymore. So what happens is that the "authorized" keeps returning 0 even
if the device was already authorized properly.

Second issue is that each time the controller is runtime resumed the
connection_id field of device connected notification may be different
than in the previous resume. We need to use the latest connection_id
otherwise the firmware rejects the authorization command.

Fix these by moving runtime resume operations to happen before the
domain lock is taken, and waiting for the updated device connected
notification from the firmware before we allow runtime resume of a
device to complete.

While there add missing locking to tb_switch_nvm_read().

Fixes: 09f11b6c99fe ("thunderbolt: Take domain lock in switch sysfs attribute callbacks")
Reported-by: Pengfei Xu <pengfei.xu@intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/icm.c
drivers/thunderbolt/switch.c
drivers/thunderbolt/tb.h