]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
thunderbolt: Add missing usb4_port_sb_read() to usb4_port_sw_margin()
authorAapo Vienamo <aapo.vienamo@linux.intel.com>
Fri, 19 Jul 2024 18:37:17 +0000 (21:37 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 22 Aug 2024 04:32:06 +0000 (07:32 +0300)
Synchronize the operation completion by reading back the software
margining operation completion metadata into margining->results.

Signed-off-by: Aapo Vienamo <aapo.vienamo@linux.intel.com>
Co-developed-by: R Kannappan <r.kannappan@intel.com>
Signed-off-by: R Kannappan <r.kannappan@intel.com>
Co-developed-by: Rene Sapiens <rene.sapiens@intel.com>
Signed-off-by: Rene Sapiens <rene.sapiens@intel.com>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/debugfs.c
drivers/thunderbolt/tb.h
drivers/thunderbolt/usb4.c

index 9ed4bb2e8d05fd2bb779c071612c6c16a45c19a5..a0d07887990ef8b3778595f6e717f841b823cba6 100644 (file)
@@ -785,9 +785,8 @@ static int margining_run_write(void *data, u64 val)
                            margining->time ? "time" : "voltage", dev_name(dev),
                            margining->lanes);
                ret = usb4_port_sw_margin(port, margining->target, margining->index,
-                                         margining->lanes, margining->time,
-                                         margining->right_high,
-                                         USB4_MARGIN_SW_COUNTER_CLEAR);
+                                         margining->lanes, margining->time, margining->right_high,
+                                         USB4_MARGIN_SW_COUNTER_CLEAR, &margining->results[0]);
                if (ret)
                        goto out_clx;
 
index b47f7873c847fe71d5e390f40c14c1060980ca9d..321db407657389ccc0b67996caf56f8a68c30c4e 100644 (file)
@@ -1360,7 +1360,7 @@ int usb4_port_hw_margin(struct tb_port *port, enum usb4_sb_target target,
                        bool timing, bool right_high, u32 *results);
 int usb4_port_sw_margin(struct tb_port *port, enum usb4_sb_target target,
                        u8 index, unsigned int lanes, bool timing,
-                       bool right_high, u32 counter);
+                       bool right_high, u32 counter, u32 *results);
 int usb4_port_sw_margin_errors(struct tb_port *port, enum usb4_sb_target target,
                               u8 index, u32 *errors);
 
index 4d83b65afb5b6998b92c3a20a05f5ad0703a4e1e..5505aa95c2eae401d137b0eab9f8e00810711b89 100644 (file)
@@ -1703,6 +1703,7 @@ int usb4_port_hw_margin(struct tb_port *port, enum usb4_sb_target target,
  * @timing: Perform timing margining instead of voltage
  * @right_high: Use Right/high margin instead of left/low
  * @counter: What to do with the error counter
+ * @results: Data word for the operation completion data
  *
  * Runs software lane margining on USB4 port. Read back the error
  * counters by calling usb4_port_sw_margin_errors(). Returns %0 in
@@ -1710,7 +1711,7 @@ int usb4_port_hw_margin(struct tb_port *port, enum usb4_sb_target target,
  */
 int usb4_port_sw_margin(struct tb_port *port, enum usb4_sb_target target,
                        u8 index, unsigned int lanes, bool timing,
-                       bool right_high, u32 counter)
+                       bool right_high, u32 counter, u32 *results)
 {
        u32 val;
        int ret;
@@ -1728,8 +1729,14 @@ int usb4_port_sw_margin(struct tb_port *port, enum usb4_sb_target target,
        if (ret)
                return ret;
 
-       return usb4_port_sb_op(port, target, index,
-                              USB4_SB_OPCODE_RUN_SW_LANE_MARGINING, 2500);
+       ret = usb4_port_sb_op(port, target, index,
+                             USB4_SB_OPCODE_RUN_SW_LANE_MARGINING, 2500);
+       if (ret)
+               return ret;
+
+       return usb4_port_sb_read(port, target, index, USB4_SB_DATA, results,
+                                sizeof(*results));
+
 }
 
 /**