|
@@ -841,6 +841,10 @@ static void qib_shutdown_device(struct qib_devdata *dd)
|
|
|
struct qib_pportdata *ppd;
|
|
|
unsigned pidx;
|
|
|
|
|
|
+ if (dd->flags & QIB_SHUTDOWN)
|
|
|
+ return;
|
|
|
+ dd->flags |= QIB_SHUTDOWN;
|
|
|
+
|
|
|
for (pidx = 0; pidx < dd->num_pports; ++pidx) {
|
|
|
ppd = dd->pport + pidx;
|
|
|
|
|
@@ -1182,6 +1186,7 @@ void qib_disable_after_error(struct qib_devdata *dd)
|
|
|
|
|
|
static void qib_remove_one(struct pci_dev *);
|
|
|
static int qib_init_one(struct pci_dev *, const struct pci_device_id *);
|
|
|
+static void qib_shutdown_one(struct pci_dev *);
|
|
|
|
|
|
#define DRIVER_LOAD_MSG "Intel " QIB_DRV_NAME " loaded: "
|
|
|
#define PFX QIB_DRV_NAME ": "
|
|
@@ -1199,6 +1204,7 @@ static struct pci_driver qib_driver = {
|
|
|
.name = QIB_DRV_NAME,
|
|
|
.probe = qib_init_one,
|
|
|
.remove = qib_remove_one,
|
|
|
+ .shutdown = qib_shutdown_one,
|
|
|
.id_table = qib_pci_tbl,
|
|
|
.err_handler = &qib_pci_err_handler,
|
|
|
};
|
|
@@ -1549,6 +1555,13 @@ static void qib_remove_one(struct pci_dev *pdev)
|
|
|
qib_postinit_cleanup(dd);
|
|
|
}
|
|
|
|
|
|
+static void qib_shutdown_one(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ struct qib_devdata *dd = pci_get_drvdata(pdev);
|
|
|
+
|
|
|
+ qib_shutdown_device(dd);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* qib_create_rcvhdrq - create a receive header queue
|
|
|
* @dd: the qlogic_ib device
|