ACK: [SRU] [Bionic] [PATCH 1/1] thunderbolt: Prevent crash when ICM firmware is not running
Kleber Souza
kleber.souza at canonical.com
Tue May 8 14:39:45 UTC 2018
On 05/03/18 07:13, Kai-Heng Feng wrote:
> From: Mika Westerberg <mika.westerberg at linux.intel.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1768292
>
> On Lenovo ThinkPad Yoga 370 (and possibly some other Lenovo models as
> well) the Thunderbolt host controller sometimes comes up in such way
> that the ICM firmware is not running properly. This is most likely an
> issue in BIOS/firmware but as side-effect driver crashes the kernel due
> to NULL pointer dereference:
>
> BUG: unable to handle kernel NULL pointer dereference at 0000000000000980
> IP: pci_write_config_dword+0x5/0x20
> Call Trace:
> pcie2cio_write+0x3b/0x70 [thunderbolt]
> icm_driver_ready+0x168/0x260 [thunderbolt]
> ? tb_ctl_start+0x50/0x70 [thunderbolt]
> tb_domain_add+0x73/0xf0 [thunderbolt]
> nhi_probe+0x182/0x300 [thunderbolt]
> local_pci_probe+0x42/0xa0
> ? pci_match_device+0xd9/0x100
> pci_device_probe+0x146/0x1b0
> driver_probe_device+0x315/0x480
> ...
>
> Instead of crashing update the driver to bail out gracefully if we
> encounter such situation.
>
> Fixes: f67cf491175a ("thunderbolt: Add support for Internal Connection Manager (ICM)")
> Reported-by: Jordan Glover <Golden_Miller83 at protonmail.ch>
> Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
> Acked-by: Yehezkel Bernat <yehezkel.bernat at intel.com>
> Cc: stable at vger.kernel.org
> (cherry picked from commit ea9d7bb798900096f26c585957d6ad9c532417e6)
> Signed-off-by: Kai-Heng Feng <kai.heng.feng at canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza at canonical.com>
> ---
> drivers/thunderbolt/icm.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/thunderbolt/icm.c b/drivers/thunderbolt/icm.c
> index 6b1041677604..2d2ceda9aa26 100644
> --- a/drivers/thunderbolt/icm.c
> +++ b/drivers/thunderbolt/icm.c
> @@ -1452,6 +1452,9 @@ static int icm_firmware_reset(struct tb *tb, struct tb_nhi *nhi)
> struct icm *icm = tb_priv(tb);
> u32 val;
>
> + if (!icm->upstream_port)
> + return -ENODEV;
> +
> /* Put ARC to wait for CIO reset event to happen */
> val = ioread32(nhi->iobase + REG_FW_STS);
> val |= REG_FW_STS_CIO_RESET_REQ;
>
More information about the kernel-team
mailing list