Skip to content

Commit 76da906

Browse files
Schmid, Carstengregkh
authored andcommitted
usb: hcd: use managed device resources
Using managed device resources in usb_hcd_pci_probe() allows devm usage for resource subranges, such as the mmio resource for the platform device created to control host/device mode mux, which is a xhci extended capability, and sits inside the xhci mmio region. If managed device resources are not used then "parent" resource is released before subrange at driver removal as .remove callback is called before the devres list of resources for this device is walked and released. This has been observed with the xhci extended capability driver causing a use-after-free which is now fixed. An additional nice benefit is that error handling on driver initialisation is simplified much. Signed-off-by: Carsten Schmid <[email protected]> Tested-by: Carsten Schmid <[email protected]> Reviewed-by: Mathias Nyman <[email protected]> Fixes: fa31b3c ("xhci: Add Intel extended cap / otg phy mux handling") Cc: <[email protected]> # v4.19+ Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent a684d8f commit 76da906

File tree

1 file changed

+8
-22
lines changed

1 file changed

+8
-22
lines changed

drivers/usb/core/hcd-pci.c

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -216,17 +216,18 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
216216
/* EHCI, OHCI */
217217
hcd->rsrc_start = pci_resource_start(dev, 0);
218218
hcd->rsrc_len = pci_resource_len(dev, 0);
219-
if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len,
220-
driver->description)) {
219+
if (!devm_request_mem_region(&dev->dev, hcd->rsrc_start,
220+
hcd->rsrc_len, driver->description)) {
221221
dev_dbg(&dev->dev, "controller already in use\n");
222222
retval = -EBUSY;
223223
goto put_hcd;
224224
}
225-
hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len);
225+
hcd->regs = devm_ioremap_nocache(&dev->dev, hcd->rsrc_start,
226+
hcd->rsrc_len);
226227
if (hcd->regs == NULL) {
227228
dev_dbg(&dev->dev, "error mapping memory\n");
228229
retval = -EFAULT;
229-
goto release_mem_region;
230+
goto put_hcd;
230231
}
231232

232233
} else {
@@ -240,8 +241,8 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
240241

241242
hcd->rsrc_start = pci_resource_start(dev, region);
242243
hcd->rsrc_len = pci_resource_len(dev, region);
243-
if (request_region(hcd->rsrc_start, hcd->rsrc_len,
244-
driver->description))
244+
if (devm_request_region(&dev->dev, hcd->rsrc_start,
245+
hcd->rsrc_len, driver->description))
245246
break;
246247
}
247248
if (region == PCI_ROM_RESOURCE) {
@@ -275,20 +276,13 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
275276
}
276277

277278
if (retval != 0)
278-
goto unmap_registers;
279+
goto put_hcd;
279280
device_wakeup_enable(hcd->self.controller);
280281

281282
if (pci_dev_run_wake(dev))
282283
pm_runtime_put_noidle(&dev->dev);
283284
return retval;
284285

285-
unmap_registers:
286-
if (driver->flags & HCD_MEMORY) {
287-
iounmap(hcd->regs);
288-
release_mem_region:
289-
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
290-
} else
291-
release_region(hcd->rsrc_start, hcd->rsrc_len);
292286
put_hcd:
293287
usb_put_hcd(hcd);
294288
disable_pci:
@@ -347,14 +341,6 @@ void usb_hcd_pci_remove(struct pci_dev *dev)
347341
dev_set_drvdata(&dev->dev, NULL);
348342
up_read(&companions_rwsem);
349343
}
350-
351-
if (hcd->driver->flags & HCD_MEMORY) {
352-
iounmap(hcd->regs);
353-
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
354-
} else {
355-
release_region(hcd->rsrc_start, hcd->rsrc_len);
356-
}
357-
358344
usb_put_hcd(hcd);
359345
pci_disable_device(dev);
360346
}

0 commit comments

Comments
 (0)