199 if (!idr_pre_get(&unit_table, GFP_KERNEL)) {
200 dd = ERR_PTR(-ENOMEM);
201 goto bail;
202 }
203
204 dd = vmalloc(sizeof(*dd));
205 if (!dd) {
206 dd = ERR_PTR(-ENOMEM);
207 goto bail;
208 }
209 memset(dd, 0, sizeof(*dd));
210 dd->ipath_unit = -1;
211
212 spin_lock_irqsave(&ipath_devs_lock, flags);
213
214 ret = idr_get_new(&unit_table, dd, &dd->ipath_unit);
215 if (ret < 0) {
216 printk(KERN_ERR IPATH_DRV_NAME
217 ": Could not allocate unit ID: error %d\n", -ret);
218 ipath_free_devdata(pdev, dd);
219 dd = ERR_PTR(ret);
220 goto bail_unlock;
221 }
222
223 dd->pcidev = pdev;
224 pci_set_drvdata(pdev, dd);
225
226 list_add(&dd->ipath_list, &ipath_dev_list);
227
228bail_unlock:
229 spin_unlock_irqrestore(&ipath_devs_lock, flags);
230
231bail:
232 return dd;
233}
234
235static inline struct ipath_devdata *__ipath_lookup(int unit)
236{
237 return idr_find(&unit_table, unit);
238}
239