diff options
author | Pali Rohár | 2021-01-18 12:30:04 +0100 |
---|---|---|
committer | Marek Vasut | 2021-02-10 22:23:24 +0100 |
commit | 5a5024fee073fea1b2f72601c4f3f006451fd176 (patch) | |
tree | 55ef04dc622e5334c33e5ce4734e9d15459aab1a /drivers | |
parent | eb885c98ed57dd319e734a4c7d777c15a8007873 (diff) |
usb: xhci-pci: Check for errors from dm_pci_map_bar()
Function dm_pci_map_bar() may fail and returns NULL. Check this to prevent
dereferencing a NULL pointer.
In xhci-pci this may happen when board does not enable CONFIG_PCI_PNP and
PCI_BASE_ADDRESS_0 contains unconfigured zero address.
Signed-off-by: Pali Rohár <pali@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/host/xhci-pci.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 2b445f21b55..6c5024d3f19 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -13,8 +13,8 @@ #include <usb.h> #include <usb/xhci.h> -static void xhci_pci_init(struct udevice *dev, struct xhci_hccr **ret_hccr, - struct xhci_hcor **ret_hcor) +static int xhci_pci_init(struct udevice *dev, struct xhci_hccr **ret_hccr, + struct xhci_hcor **ret_hcor) { struct xhci_hccr *hccr; struct xhci_hcor *hcor; @@ -22,6 +22,11 @@ static void xhci_pci_init(struct udevice *dev, struct xhci_hccr **ret_hccr, hccr = (struct xhci_hccr *)dm_pci_map_bar(dev, PCI_BASE_ADDRESS_0, PCI_REGION_MEM); + if (!hccr) { + printf("xhci-pci init cannot map PCI mem bar\n"); + return -EIO; + } + hcor = (struct xhci_hcor *)((uintptr_t) hccr + HC_LENGTH(xhci_readl(&hccr->cr_capbase))); @@ -35,14 +40,18 @@ static void xhci_pci_init(struct udevice *dev, struct xhci_hccr **ret_hccr, dm_pci_read_config32(dev, PCI_COMMAND, &cmd); cmd |= PCI_COMMAND_MASTER; dm_pci_write_config32(dev, PCI_COMMAND, cmd); + return 0; } static int xhci_pci_probe(struct udevice *dev) { struct xhci_hccr *hccr; struct xhci_hcor *hcor; + int ret; - xhci_pci_init(dev, &hccr, &hcor); + ret = xhci_pci_init(dev, &hccr, &hcor); + if (ret) + return ret; return xhci_register(dev, hccr, hcor); } |