|
@@ -971,10 +971,9 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- xhci->devs[slot_id] = kzalloc(sizeof(*xhci->devs[slot_id]), flags);
|
|
|
- if (!xhci->devs[slot_id])
|
|
|
+ dev = kzalloc(sizeof(*dev), flags);
|
|
|
+ if (!dev)
|
|
|
return 0;
|
|
|
- dev = xhci->devs[slot_id];
|
|
|
|
|
|
/* Allocate the (output) device context that will be used in the HC. */
|
|
|
dev->out_ctx = xhci_alloc_container_ctx(xhci, XHCI_CTX_TYPE_DEVICE, flags);
|
|
@@ -1015,9 +1014,17 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id,
|
|
|
|
|
|
trace_xhci_alloc_virt_device(dev);
|
|
|
|
|
|
+ xhci->devs[slot_id] = dev;
|
|
|
+
|
|
|
return 1;
|
|
|
fail:
|
|
|
- xhci_free_virt_device(xhci, slot_id);
|
|
|
+
|
|
|
+ if (dev->in_ctx)
|
|
|
+ xhci_free_container_ctx(xhci, dev->in_ctx);
|
|
|
+ if (dev->out_ctx)
|
|
|
+ xhci_free_container_ctx(xhci, dev->out_ctx);
|
|
|
+ kfree(dev);
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|