On 18.01.21 12:13, Pali Rohár wrote:
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 <[email protected]>

Reviewed-by: Stefan Roese <[email protected]>

Thanks,
Stefan

---
  drivers/usb/host/xhci-pci.c | 13 +++++++++++--
  1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index 2b445f21b5..7f5be95f6c 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -13,7 +13,7 @@
  #include <usb.h>
  #include <usb/xhci.h>
-static void xhci_pci_init(struct udevice *dev, struct xhci_hccr **ret_hccr,
+static int xhci_pci_init(struct udevice *dev, struct xhci_hccr **ret_hccr,
                          struct xhci_hcor **ret_hcor)
  {
        struct xhci_hccr *hccr;
@@ -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);
  }



Viele Grüße,
Stefan

--
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: [email protected]

Reply via email to