]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
thunderbolt: Don't hardcode margining capabilities size
authorAapo Vienamo <aapo.vienamo@iki.fi>
Thu, 15 Aug 2024 18:45:13 +0000 (21:45 +0300)
committerMika Westerberg <mika.westerberg@linux.intel.com>
Fri, 1 Nov 2024 05:55:37 +0000 (07:55 +0200)
Use or pass ARRAY_SIZE() of the capabilities array instead of hardcoding
it. USB4 Gen 4 introduces an additional data word, which requires
expanding the capabilities array.

Signed-off-by: Aapo Vienamo <aapo.vienamo@iki.fi>
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
drivers/thunderbolt/debugfs.c
drivers/thunderbolt/tb.h
drivers/thunderbolt/usb4.c

index 350310bd0feea70656f6c18f28906c59c5acfea7..972f1948725f664cce3cc8b151276ce45fce0ccc 100644 (file)
@@ -7,6 +7,7 @@
  *         Mika Westerberg <mika.westerberg@linux.intel.com>
  */
 
+#include <linux/array_size.h>
 #include <linux/bitfield.h>
 #include <linux/debugfs.h>
 #include <linux/delay.h>
@@ -570,16 +571,13 @@ static int margining_caps_show(struct seq_file *s, void *not_used)
 {
        struct tb_margining *margining = s->private;
        struct tb *tb = margining->port->sw->tb;
-       u32 cap0, cap1;
 
        if (mutex_lock_interruptible(&tb->lock))
                return -ERESTARTSYS;
 
        /* Dump the raw caps first */
-       cap0 = margining->caps[0];
-       seq_printf(s, "0x%08x\n", cap0);
-       cap1 = margining->caps[1];
-       seq_printf(s, "0x%08x\n", cap1);
+       for (int i = 0; i < ARRAY_SIZE(margining->caps); i++)
+               seq_printf(s, "0x%08x\n", margining->caps[i]);
 
        seq_printf(s, "# software margining: %s\n",
                   supports_software(margining) ? "yes" : "no");
@@ -623,7 +621,7 @@ static int margining_caps_show(struct seq_file *s, void *not_used)
        if (supports_time(margining)) {
                seq_puts(s, "# time margining: yes\n");
                seq_printf(s, "# time margining is destructive: %s\n",
-                          cap1 & USB4_MARGIN_CAP_1_TIME_DESTR ? "yes" : "no");
+                          str_yes_no(margining->caps[1] & USB4_MARGIN_CAP_1_TIME_DESTR));
 
                switch (independent_time_margins(margining)) {
                case USB4_MARGIN_CAP_1_TIME_MIN:
@@ -1401,7 +1399,8 @@ static struct tb_margining *margining_alloc(struct tb_port *port,
        margining->index = index;
        margining->dev = dev;
 
-       ret = usb4_port_margining_caps(port, target, index, margining->caps);
+       ret = usb4_port_margining_caps(port, target, index, margining->caps,
+                                      ARRAY_SIZE(margining->caps));
        if (ret) {
                kfree(margining);
                return NULL;
index 6737188f25815748118a0316e74092531e855343..fa7fc9bba70f0998923289176ea30639fe157919 100644 (file)
@@ -1388,7 +1388,7 @@ struct usb4_port_margining_params {
 };
 
 int usb4_port_margining_caps(struct tb_port *port, enum usb4_sb_target target,
-                            u8 index, u32 *caps);
+                            u8 index, u32 *caps, size_t ncaps);
 int usb4_port_hw_margin(struct tb_port *port, enum usb4_sb_target target,
                        u8 index, const struct usb4_port_margining_params *params,
                        u32 *results);
index 0a9b4aeb3fa140f2bcfdbb03a4e27426e6c7f8f2..1fb72ff1268e3971c343f5b9c378ac35108f7eec 100644 (file)
@@ -1631,11 +1631,12 @@ int usb4_port_asym_start(struct tb_port *port)
  * @target: Sideband target
  * @index: Retimer index if taget is %USB4_SB_TARGET_RETIMER
  * @caps: Array with at least two elements to hold the results
+ * @ncaps: Number of elements in the caps array
  *
  * Reads the USB4 port lane margining capabilities into @caps.
  */
 int usb4_port_margining_caps(struct tb_port *port, enum usb4_sb_target target,
-                            u8 index, u32 *caps)
+                            u8 index, u32 *caps, size_t ncaps)
 {
        int ret;
 
@@ -1645,7 +1646,7 @@ int usb4_port_margining_caps(struct tb_port *port, enum usb4_sb_target target,
                return ret;
 
        return usb4_port_sb_read(port, target, index, USB4_SB_DATA, caps,
-                                sizeof(*caps) * 2);
+                                sizeof(*caps) * ncaps);
 }
 
 /**