thunderbolt: Check for NVM authentication status after the operation started
authorMika Westerberg <mika.westerberg@linux.intel.com>
Wed, 21 Apr 2021 14:14:10 +0000 (17:14 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Tue, 1 Jun 2021 07:53:32 +0000 (10:53 +0300)
If the NVM authentication fails immediately, like if the firmware
detects that the image is not valid for some reason, better to read the
status once and if set to non-zero fail the operation accordingly.

Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/thunderbolt/retimer.c

index 3aa790a..7226940 100644 (file)
@@ -151,6 +151,7 @@ static int tb_retimer_nvm_validate_and_write(struct tb_retimer *rt)
 
 static int tb_retimer_nvm_authenticate(struct tb_retimer *rt, bool auth_only)
 {
+       u32 status;
        int ret;
 
        if (auth_only) {
@@ -159,7 +160,24 @@ static int tb_retimer_nvm_authenticate(struct tb_retimer *rt, bool auth_only)
                        return ret;
        }
 
-       return usb4_port_retimer_nvm_authenticate(rt->port, rt->index);
+       ret = usb4_port_retimer_nvm_authenticate(rt->port, rt->index);
+       if (ret)
+               return ret;
+
+       usleep_range(100, 150);
+
+       /*
+        * Check the status now if we still can access the retimer. It
+        * is expected that the below fails.
+        */
+       ret = usb4_port_retimer_nvm_authenticate_status(rt->port, rt->index,
+                                                       &status);
+       if (!ret) {
+               rt->auth_status = status;
+               return status ? -EINVAL : 0;
+       }
+
+       return 0;
 }
 
 static ssize_t device_show(struct device *dev, struct device_attribute *attr,