]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
usb: tegra: Fix allocation for the FPCI context
authorJon Hunter <jonathanh@nvidia.com>
Wed, 15 Jul 2020 11:38:42 +0000 (12:38 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Jul 2020 08:19:55 +0000 (10:19 +0200)
commit 0b987032f8b58ef51cc8a042f46cc0cf1f277172 upstream.

Commit 5c4e8d3781bc ("usb: host: xhci-tegra: Add support for XUSB
context save/restore") is using the IPFS 'num_offsets' value when
allocating memory for FPCI context instead of the FPCI 'num_offsets'.

After commit cad064f1bd52 ("devres: handle zero size in devm_kmalloc()")
was added system suspend started failing on Tegra186. The kernel log
showed that the Tegra XHCI driver was crashing on entry to suspend when
attempting the save the USB context. On Tegra186, the IPFS context has a
zero length but the FPCI content has a non-zero length, and because of
the bug in the Tegra XHCI driver we are incorrectly allocating a zero
length array for the FPCI context. The crash seen on entering suspend
when we attempt to save the FPCI context and following commit
cad064f1bd52 ("devres: handle zero size in devm_kmalloc()") this now
causes a NULL pointer deference when we access the memory. Fix this by
correcting the amount of memory we are allocating for FPCI contexts.

Cc: stable@vger.kernel.org
Fixes: 5c4e8d3781bc ("usb: host: xhci-tegra: Add support for XUSB context save/restore")
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Acked-by: Thierry Reding <treding@nvidia.com>
Link: https://lore.kernel.org/r/20200715113842.30680-1-jonathanh@nvidia.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-tegra.c

index 2eaf5c0af80ce156b609a85c8239e199c1e478eb..ee6bf01775bba1a61d91c86b3eae27d85c7e16b2 100644 (file)
@@ -856,7 +856,7 @@ static int tegra_xusb_init_context(struct tegra_xusb *tegra)
        if (!tegra->context.ipfs)
                return -ENOMEM;
 
-       tegra->context.fpci = devm_kcalloc(tegra->dev, soc->ipfs.num_offsets,
+       tegra->context.fpci = devm_kcalloc(tegra->dev, soc->fpci.num_offsets,
                                           sizeof(u32), GFP_KERNEL);
        if (!tegra->context.fpci)
                return -ENOMEM;