diff options
Diffstat (limited to 'drivers/infiniband/hw/qib/qib_init.c')
-rw-r--r-- | drivers/infiniband/hw/qib/qib_init.c | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/drivers/infiniband/hw/qib/qib_init.c b/drivers/infiniband/hw/qib/qib_init.c index 4443adfcd9ee..50e33aa0b4e3 100644 --- a/drivers/infiniband/hw/qib/qib_init.c +++ b/drivers/infiniband/hw/qib/qib_init.c | |||
@@ -1060,22 +1060,23 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra) | |||
1060 | struct qib_devdata *dd; | 1060 | struct qib_devdata *dd; |
1061 | int ret; | 1061 | int ret; |
1062 | 1062 | ||
1063 | if (!idr_pre_get(&qib_unit_table, GFP_KERNEL)) { | ||
1064 | dd = ERR_PTR(-ENOMEM); | ||
1065 | goto bail; | ||
1066 | } | ||
1067 | |||
1068 | dd = (struct qib_devdata *) ib_alloc_device(sizeof(*dd) + extra); | 1063 | dd = (struct qib_devdata *) ib_alloc_device(sizeof(*dd) + extra); |
1069 | if (!dd) { | 1064 | if (!dd) { |
1070 | dd = ERR_PTR(-ENOMEM); | 1065 | dd = ERR_PTR(-ENOMEM); |
1071 | goto bail; | 1066 | goto bail; |
1072 | } | 1067 | } |
1073 | 1068 | ||
1069 | idr_preload(GFP_KERNEL); | ||
1074 | spin_lock_irqsave(&qib_devs_lock, flags); | 1070 | spin_lock_irqsave(&qib_devs_lock, flags); |
1075 | ret = idr_get_new(&qib_unit_table, dd, &dd->unit); | 1071 | |
1076 | if (ret >= 0) | 1072 | ret = idr_alloc(&qib_unit_table, dd, 0, 0, GFP_NOWAIT); |
1073 | if (ret >= 0) { | ||
1074 | dd->unit = ret; | ||
1077 | list_add(&dd->list, &qib_dev_list); | 1075 | list_add(&dd->list, &qib_dev_list); |
1076 | } | ||
1077 | |||
1078 | spin_unlock_irqrestore(&qib_devs_lock, flags); | 1078 | spin_unlock_irqrestore(&qib_devs_lock, flags); |
1079 | idr_preload_end(); | ||
1079 | 1080 | ||
1080 | if (ret < 0) { | 1081 | if (ret < 0) { |
1081 | qib_early_err(&pdev->dev, | 1082 | qib_early_err(&pdev->dev, |
@@ -1134,9 +1135,8 @@ void qib_disable_after_error(struct qib_devdata *dd) | |||
1134 | *dd->devstatusp |= QIB_STATUS_HWERROR; | 1135 | *dd->devstatusp |= QIB_STATUS_HWERROR; |
1135 | } | 1136 | } |
1136 | 1137 | ||
1137 | static void __devexit qib_remove_one(struct pci_dev *); | 1138 | static void qib_remove_one(struct pci_dev *); |
1138 | static int __devinit qib_init_one(struct pci_dev *, | 1139 | static int qib_init_one(struct pci_dev *, const struct pci_device_id *); |
1139 | const struct pci_device_id *); | ||
1140 | 1140 | ||
1141 | #define DRIVER_LOAD_MSG "QLogic " QIB_DRV_NAME " loaded: " | 1141 | #define DRIVER_LOAD_MSG "QLogic " QIB_DRV_NAME " loaded: " |
1142 | #define PFX QIB_DRV_NAME ": " | 1142 | #define PFX QIB_DRV_NAME ": " |
@@ -1153,7 +1153,7 @@ MODULE_DEVICE_TABLE(pci, qib_pci_tbl); | |||
1153 | struct pci_driver qib_driver = { | 1153 | struct pci_driver qib_driver = { |
1154 | .name = QIB_DRV_NAME, | 1154 | .name = QIB_DRV_NAME, |
1155 | .probe = qib_init_one, | 1155 | .probe = qib_init_one, |
1156 | .remove = __devexit_p(qib_remove_one), | 1156 | .remove = qib_remove_one, |
1157 | .id_table = qib_pci_tbl, | 1157 | .id_table = qib_pci_tbl, |
1158 | .err_handler = &qib_pci_err_handler, | 1158 | .err_handler = &qib_pci_err_handler, |
1159 | }; | 1159 | }; |
@@ -1181,11 +1181,6 @@ static int __init qlogic_ib_init(void) | |||
1181 | * the PCI subsystem. | 1181 | * the PCI subsystem. |
1182 | */ | 1182 | */ |
1183 | idr_init(&qib_unit_table); | 1183 | idr_init(&qib_unit_table); |
1184 | if (!idr_pre_get(&qib_unit_table, GFP_KERNEL)) { | ||
1185 | pr_err("idr_pre_get() failed\n"); | ||
1186 | ret = -ENOMEM; | ||
1187 | goto bail_cq_wq; | ||
1188 | } | ||
1189 | 1184 | ||
1190 | ret = pci_register_driver(&qib_driver); | 1185 | ret = pci_register_driver(&qib_driver); |
1191 | if (ret < 0) { | 1186 | if (ret < 0) { |
@@ -1200,7 +1195,6 @@ static int __init qlogic_ib_init(void) | |||
1200 | 1195 | ||
1201 | bail_unit: | 1196 | bail_unit: |
1202 | idr_destroy(&qib_unit_table); | 1197 | idr_destroy(&qib_unit_table); |
1203 | bail_cq_wq: | ||
1204 | destroy_workqueue(qib_cq_wq); | 1198 | destroy_workqueue(qib_cq_wq); |
1205 | bail_dev: | 1199 | bail_dev: |
1206 | qib_dev_cleanup(); | 1200 | qib_dev_cleanup(); |
@@ -1342,8 +1336,7 @@ static void qib_postinit_cleanup(struct qib_devdata *dd) | |||
1342 | qib_free_devdata(dd); | 1336 | qib_free_devdata(dd); |
1343 | } | 1337 | } |
1344 | 1338 | ||
1345 | static int __devinit qib_init_one(struct pci_dev *pdev, | 1339 | static int qib_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
1346 | const struct pci_device_id *ent) | ||
1347 | { | 1340 | { |
1348 | int ret, j, pidx, initfail; | 1341 | int ret, j, pidx, initfail; |
1349 | struct qib_devdata *dd = NULL; | 1342 | struct qib_devdata *dd = NULL; |
@@ -1448,7 +1441,7 @@ bail: | |||
1448 | return ret; | 1441 | return ret; |
1449 | } | 1442 | } |
1450 | 1443 | ||
1451 | static void __devexit qib_remove_one(struct pci_dev *pdev) | 1444 | static void qib_remove_one(struct pci_dev *pdev) |
1452 | { | 1445 | { |
1453 | struct qib_devdata *dd = pci_get_drvdata(pdev); | 1446 | struct qib_devdata *dd = pci_get_drvdata(pdev); |
1454 | int ret; | 1447 | int ret; |