Commit 480ebc2e authored by Aapo Vienamo's avatar Aapo Vienamo Committed by Mika Westerberg
Browse files

thunderbolt: Don't hardcode margining capabilities size



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: default avatarAapo Vienamo <aapo.vienamo@iki.fi>
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent 81983758
Loading
Loading
Loading
Loading
+6 −7
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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);
+3 −2
Original line number Diff line number Diff line
@@ -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);
}

/**