IB/ipath: Unregister from IB core early

This gives upper-level protocols a chance to unregister while the device
is still usable.

Signed-off-by: Bryan O'Sullivan <bryan.osullivan@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c
index 0fe37c5..a260acf 100644
--- a/drivers/infiniband/hw/ipath/ipath_driver.c
+++ b/drivers/infiniband/hw/ipath/ipath_driver.c
@@ -536,7 +536,12 @@
 		return;
 
 	dd = pci_get_drvdata(pdev);
-	ipath_unregister_ib_device(dd->verbs_dev);
+
+	if (dd->verbs_dev) {
+		ipath_unregister_ib_device(dd->verbs_dev);
+		dd->verbs_dev = NULL;
+	}
+
 	ipath_diag_remove(dd);
 	ipath_user_remove(dd);
 	ipathfs_remove_device(dd);
@@ -2027,6 +2032,11 @@
 	list_for_each_entry_safe(dd, tmp, &ipath_dev_list, ipath_list) {
 		spin_unlock_irqrestore(&ipath_devs_lock, flags);
 
+		if (dd->verbs_dev) {
+			ipath_unregister_ib_device(dd->verbs_dev);
+			dd->verbs_dev = NULL;
+		}
+
 		if (dd->ipath_kregbase)
 			cleanup_device(dd);