Message ID | 2972befa36441a5dea1de9efb1e1355f8406d7b6.1539801494.git.sathyanarayanan.kuppuswamy@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v1,1/1] usb: dwc3: Fix NULL pointer exception in dwc3_pci_remove() | expand |
Felipe/Greg, Any comments ? On 10/17/18 11:40 AM, Kuppuswamy Sathyanarayanan wrote: > In dwc3_pci_quirks() function, gpiod lookup table is only registered for > baytrail SOC. But in dwc3_pci_remove(), we try to unregistered it > without any checks. This leads to NULL pointer de-reference exception in > gpiod_remove_lookup_table() when unloading the module for non baytrail > SOCs. This patch fixes this issue. > > Fixes: 5741022cbdf3 ("usb: dwc3: pci: Add GPIO lookup table on platforms > without ACPI GPIO resources") > Cc: <stable@vger.kernel.org> > Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> > Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> > --- > drivers/usb/dwc3/dwc3-pci.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c > index 1286076a8890..842795856bf4 100644 > --- a/drivers/usb/dwc3/dwc3-pci.c > +++ b/drivers/usb/dwc3/dwc3-pci.c > @@ -283,8 +283,10 @@ static int dwc3_pci_probe(struct pci_dev *pci, const struct pci_device_id *id) > static void dwc3_pci_remove(struct pci_dev *pci) > { > struct dwc3_pci *dwc = pci_get_drvdata(pci); > + struct pci_dev *pdev = dwc->pci; > > - gpiod_remove_lookup_table(&platform_bytcr_gpios); > + if (pdev->device == PCI_DEVICE_ID_INTEL_BYT) > + gpiod_remove_lookup_table(&platform_bytcr_gpios); > #ifdef CONFIG_PM > cancel_work_sync(&dwc->wakeup_work); > #endif
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 1286076a8890..842795856bf4 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c @@ -283,8 +283,10 @@ static int dwc3_pci_probe(struct pci_dev *pci, const struct pci_device_id *id) static void dwc3_pci_remove(struct pci_dev *pci) { struct dwc3_pci *dwc = pci_get_drvdata(pci); + struct pci_dev *pdev = dwc->pci; - gpiod_remove_lookup_table(&platform_bytcr_gpios); + if (pdev->device == PCI_DEVICE_ID_INTEL_BYT) + gpiod_remove_lookup_table(&platform_bytcr_gpios); #ifdef CONFIG_PM cancel_work_sync(&dwc->wakeup_work); #endif