mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 10:45:49 +00:00
thunderbolt: Fixes for v6.13-rc4
This includes following USB4/Thunderbolt fixes for v6.13-rc4: - Add Intel Panther Lake PCI IDs - Do not show nvm_version for retimers that are not supported - Fix redrive mode handling. All these have been in linux-next with no reported issues. -----BEGIN PGP SIGNATURE----- iQJUBAABCgA+FiEEVTdhRGBbNzLrSUBaAP2fSd+ZWKAFAmdj6pYgHG1pa2Eud2Vz dGVyYmVyZ0BsaW51eC5pbnRlbC5jb20ACgkQAP2fSd+ZWKCV6A/+IGah8VGAFYLX xPwxBE0cChV/dpaVaGBgoG+z8iQxx2yiMbN9zueF54unsO8Ryq0lHdamAFJ6XLba RAJ/db0TD0ZpKfxGzILlpueZrqMchK4mDT7GS1FKb7IUFPwiav28qpt498x7IOyG DA1OjE+Ut1UIdzB7zL8YDh762R9Z45MPSWCoiaYv6j+0E8+WnskYBEmJ6Cie3nHT WOKhd07k3RYGzrez45pvLsDBH+cyI2o15Q1roUK+bDeKW3xwVFHoVmYe4wjgoRXT djZJQyFLWYe6G7mdNVl0DdYtOmOFDqMy4qFP/Tx2uch5wtw1yte0+rvWZ0DSo4D8 hdqDp6MS12b45n/lp0QFfudMoZ3UB0ZBQlnfN8akP5sFSFx6JyU6KPBzyVqxUnml ZYsQdpg6lu1bCWsVcVYOP7UOTLvEbd4ui9kH0M91SGi4ivCoZeEGVn9JO5XuMzIm O5Swt62rdUhh/yU+yUFJfJzuse5DPFrIJFMdVTj+knBA0DaxMht2rRaFmfJVFui3 KANR9R2pW4QoSBgKm6wmUGp7JnVRpr6oxUcrzudiONsq3uXdU0SCiJk03RHv58In wTnC6VrwZwZMQsfmMBoSt4D2ovW74W12YwUo6gpaIRkLDgAqvMVOIRORwBIs2N3j zEB6NJ6e2Yd0hlGlEEU5Wglhep+do+g= =urZC -----END PGP SIGNATURE----- Merge tag 'thunderbolt-for-v6.13-rc4' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt into usb-linus Mika writes: thunderbolt: Fixes for v6.13-rc4 This includes following USB4/Thunderbolt fixes for v6.13-rc4: - Add Intel Panther Lake PCI IDs - Do not show nvm_version for retimers that are not supported - Fix redrive mode handling. All these have been in linux-next with no reported issues. * tag 'thunderbolt-for-v6.13-rc4' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt: thunderbolt: Improve redrive mode handling thunderbolt: Don't display nvm_version unless upgrade supported thunderbolt: Add support for Intel Panther Lake-M/P
This commit is contained in:
commit
1b62f3cb74
@ -1520,6 +1520,14 @@ static struct pci_device_id nhi_ids[] = {
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_LNL_NHI1),
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI0),
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_M_NHI1),
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI0),
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI1),
|
||||
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI) },
|
||||
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI) },
|
||||
|
||||
|
@ -92,6 +92,10 @@ extern const struct tb_nhi_ops icl_nhi_ops;
|
||||
#define PCI_DEVICE_ID_INTEL_RPL_NHI1 0xa76d
|
||||
#define PCI_DEVICE_ID_INTEL_LNL_NHI0 0xa833
|
||||
#define PCI_DEVICE_ID_INTEL_LNL_NHI1 0xa834
|
||||
#define PCI_DEVICE_ID_INTEL_PTL_M_NHI0 0xe333
|
||||
#define PCI_DEVICE_ID_INTEL_PTL_M_NHI1 0xe334
|
||||
#define PCI_DEVICE_ID_INTEL_PTL_P_NHI0 0xe433
|
||||
#define PCI_DEVICE_ID_INTEL_PTL_P_NHI1 0xe434
|
||||
|
||||
#define PCI_CLASS_SERIAL_USB_USB4 0x0c0340
|
||||
|
||||
|
@ -103,6 +103,7 @@ static int tb_retimer_nvm_add(struct tb_retimer *rt)
|
||||
|
||||
err_nvm:
|
||||
dev_dbg(&rt->dev, "NVM upgrade disabled\n");
|
||||
rt->no_nvm_upgrade = true;
|
||||
if (!IS_ERR(nvm))
|
||||
tb_nvm_free(nvm);
|
||||
|
||||
@ -182,8 +183,6 @@ static ssize_t nvm_authenticate_show(struct device *dev,
|
||||
|
||||
if (!rt->nvm)
|
||||
ret = -EAGAIN;
|
||||
else if (rt->no_nvm_upgrade)
|
||||
ret = -EOPNOTSUPP;
|
||||
else
|
||||
ret = sysfs_emit(buf, "%#x\n", rt->auth_status);
|
||||
|
||||
@ -323,8 +322,6 @@ static ssize_t nvm_version_show(struct device *dev,
|
||||
|
||||
if (!rt->nvm)
|
||||
ret = -EAGAIN;
|
||||
else if (rt->no_nvm_upgrade)
|
||||
ret = -EOPNOTSUPP;
|
||||
else
|
||||
ret = sysfs_emit(buf, "%x.%x\n", rt->nvm->major, rt->nvm->minor);
|
||||
|
||||
@ -342,6 +339,19 @@ static ssize_t vendor_show(struct device *dev, struct device_attribute *attr,
|
||||
}
|
||||
static DEVICE_ATTR_RO(vendor);
|
||||
|
||||
static umode_t retimer_is_visible(struct kobject *kobj, struct attribute *attr,
|
||||
int n)
|
||||
{
|
||||
struct device *dev = kobj_to_dev(kobj);
|
||||
struct tb_retimer *rt = tb_to_retimer(dev);
|
||||
|
||||
if (attr == &dev_attr_nvm_authenticate.attr ||
|
||||
attr == &dev_attr_nvm_version.attr)
|
||||
return rt->no_nvm_upgrade ? 0 : attr->mode;
|
||||
|
||||
return attr->mode;
|
||||
}
|
||||
|
||||
static struct attribute *retimer_attrs[] = {
|
||||
&dev_attr_device.attr,
|
||||
&dev_attr_nvm_authenticate.attr,
|
||||
@ -351,6 +361,7 @@ static struct attribute *retimer_attrs[] = {
|
||||
};
|
||||
|
||||
static const struct attribute_group retimer_group = {
|
||||
.is_visible = retimer_is_visible,
|
||||
.attrs = retimer_attrs,
|
||||
};
|
||||
|
||||
|
@ -2059,6 +2059,37 @@ static void tb_exit_redrive(struct tb_port *port)
|
||||
}
|
||||
}
|
||||
|
||||
static void tb_switch_enter_redrive(struct tb_switch *sw)
|
||||
{
|
||||
struct tb_port *port;
|
||||
|
||||
tb_switch_for_each_port(sw, port)
|
||||
tb_enter_redrive(port);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called during system and runtime suspend to forcefully exit redrive
|
||||
* mode without querying whether the resource is available.
|
||||
*/
|
||||
static void tb_switch_exit_redrive(struct tb_switch *sw)
|
||||
{
|
||||
struct tb_port *port;
|
||||
|
||||
if (!(sw->quirks & QUIRK_KEEP_POWER_IN_DP_REDRIVE))
|
||||
return;
|
||||
|
||||
tb_switch_for_each_port(sw, port) {
|
||||
if (!tb_port_is_dpin(port))
|
||||
continue;
|
||||
|
||||
if (port->redrive) {
|
||||
port->redrive = false;
|
||||
pm_runtime_put(&sw->dev);
|
||||
tb_port_dbg(port, "exit redrive mode\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void tb_dp_resource_unavailable(struct tb *tb, struct tb_port *port)
|
||||
{
|
||||
struct tb_port *in, *out;
|
||||
@ -2909,6 +2940,7 @@ static int tb_start(struct tb *tb, bool reset)
|
||||
tb_create_usb3_tunnels(tb->root_switch);
|
||||
/* Add DP IN resources for the root switch */
|
||||
tb_add_dp_resources(tb->root_switch);
|
||||
tb_switch_enter_redrive(tb->root_switch);
|
||||
/* Make the discovered switches available to the userspace */
|
||||
device_for_each_child(&tb->root_switch->dev, NULL,
|
||||
tb_scan_finalize_switch);
|
||||
@ -2924,6 +2956,7 @@ static int tb_suspend_noirq(struct tb *tb)
|
||||
|
||||
tb_dbg(tb, "suspending...\n");
|
||||
tb_disconnect_and_release_dp(tb);
|
||||
tb_switch_exit_redrive(tb->root_switch);
|
||||
tb_switch_suspend(tb->root_switch, false);
|
||||
tcm->hotplug_active = false; /* signal tb_handle_hotplug to quit */
|
||||
tb_dbg(tb, "suspend finished\n");
|
||||
@ -3016,6 +3049,7 @@ static int tb_resume_noirq(struct tb *tb)
|
||||
tb_dbg(tb, "tunnels restarted, sleeping for 100ms\n");
|
||||
msleep(100);
|
||||
}
|
||||
tb_switch_enter_redrive(tb->root_switch);
|
||||
/* Allow tb_handle_hotplug to progress events */
|
||||
tcm->hotplug_active = true;
|
||||
tb_dbg(tb, "resume finished\n");
|
||||
@ -3079,6 +3113,12 @@ static int tb_runtime_suspend(struct tb *tb)
|
||||
struct tb_cm *tcm = tb_priv(tb);
|
||||
|
||||
mutex_lock(&tb->lock);
|
||||
/*
|
||||
* The below call only releases DP resources to allow exiting and
|
||||
* re-entering redrive mode.
|
||||
*/
|
||||
tb_disconnect_and_release_dp(tb);
|
||||
tb_switch_exit_redrive(tb->root_switch);
|
||||
tb_switch_suspend(tb->root_switch, true);
|
||||
tcm->hotplug_active = false;
|
||||
mutex_unlock(&tb->lock);
|
||||
@ -3110,6 +3150,7 @@ static int tb_runtime_resume(struct tb *tb)
|
||||
tb_restore_children(tb->root_switch);
|
||||
list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list)
|
||||
tb_tunnel_restart(tunnel);
|
||||
tb_switch_enter_redrive(tb->root_switch);
|
||||
tcm->hotplug_active = true;
|
||||
mutex_unlock(&tb->lock);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user