> -----Original Message-----
> From: [email protected] [mailto:linux-scsi-
> [email protected]] On Behalf Of Tomas Henzl
...
> + /* kdump kernel is loading, we don't know in which state is
> + * the pci interface. The dev->enable_cnt is equal zero
> + * so we call enable+disable, wait a while and switch it on.
> + */
> + rc = pci_enable_device(pdev);
> + if (rc) {
> + dev_warn(&pdev->dev, "Failed to enable PCI device\n");
> + return -ENODEV;
> + }
> + pci_disable_device(pdev);
> + msleep(260); /* a randomly chosen number */
> + rc = pci_enable_device(pdev);
> + if (rc) {
> + dev_warn(&pdev->dev, "failed to enable device.\n");
> + return -ENODEV;
> + }
> +
> /* Reset the controller with a PCI power-cycle or via doorbell
> */
I tested this patch by adding:
reset_devices
to the kernel command line, which sets a kernel global variable that
triggers the driver to take this path.
Controller initialization failed with:
[ 21.822789] hpsa 0000:02:00.0: Waiting for controller to respond to no-op
[ 121.822219] hpsa 0000:02:00.0: controller message 03:00 timed out
[ 121.854814] hpsa 0000:02:00.0: no-op failed; re-trying
...
The reason is that pci_disable_device clears the Bus Master Enable bit,
and there is no call to pci_set_master after pci_enable. The controller is
unable to return the response for the command sent by hpsa_noop down
below. Adding pci_set_master(pdev) got it working.
A call to pci_request_regions is also missing (that's supposed to
be called before accessing the controller's memory space), but
that's not fatal here.
---
Rob Elliott HP Server Storage
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html