Skip to content

Commit 087e7ad

Browse files
committed
usb: HUB: Refactor power dispatcher, add remove synch
Refactored power dispatcher, added remove sychronization to avoid early remove or call on removed device. svn path=/branches/GSoC_2016/USB/; revision=72391
1 parent 01a0ce0 commit 087e7ad

File tree

1 file changed

+36
-23
lines changed

1 file changed

+36
-23
lines changed

drivers/usb/usbhub/usbhub.c

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -197,45 +197,58 @@ USBHUB_DispatchPower(
197197
{
198198
PIO_STACK_LOCATION IoStack;
199199
PHUB_DEVICE_EXTENSION DeviceExtension;
200-
200+
NTSTATUS Status;
201201
IoStack = IoGetCurrentIrpStackLocation(Irp);
202202
DeviceExtension = DeviceObject->DeviceExtension;
203-
DPRINT1("Power Function %x\n", IoStack->MinorFunction);
204203

205-
if (DeviceExtension->Common.IsFDO)
204+
Status = IoAcquireRemoveLock(&DeviceExtension->Common.RemoveLock, Irp);
205+
if (!NT_SUCCESS(Status))
206206
{
207-
PoStartNextPowerIrp(Irp);
208-
IoSkipCurrentIrpStackLocation(Irp);
209-
return PoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
207+
Irp->IoStatus.Status = Status;
208+
IoCompleteRequest(Irp, IO_NO_INCREMENT);
209+
return Status;
210210
}
211211

212-
if (IoStack->MinorFunction == IRP_MN_SET_POWER)
213-
{
214-
PoStartNextPowerIrp(Irp);
215-
Irp->IoStatus.Status = STATUS_SUCCESS;
216-
IoCompleteRequest(Irp, IO_NO_INCREMENT);
217-
return STATUS_SUCCESS;
212+
DPRINT1("Power Function %x\n", IoStack->MinorFunction);
218213

219-
}
220-
else if (IoStack->MinorFunction == IRP_MN_QUERY_POWER)
214+
if (DeviceExtension->Common.IsFDO)
221215
{
222216
PoStartNextPowerIrp(Irp);
223-
Irp->IoStatus.Status = STATUS_SUCCESS;
224-
IoCompleteRequest(Irp, IO_NO_INCREMENT);
225-
return STATUS_SUCCESS;
226-
217+
IoSkipCurrentIrpStackLocation(Irp);
218+
Status = PoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
219+
IoReleaseRemoveLock(&DeviceExtension->Common.RemoveLock, Irp);
220+
return Status;
227221
}
228-
else if (IoStack->MinorFunction == IRP_MN_WAIT_WAKE)
222+
223+
switch (IoStack->MinorFunction)
229224
{
230-
PoStartNextPowerIrp(Irp);
231-
Irp->IoStatus.Status = STATUS_SUCCESS;
232-
IoCompleteRequest(Irp, IO_NO_INCREMENT);
233-
return STATUS_SUCCESS;
225+
case IRP_MN_SET_POWER:
226+
{
227+
DPRINT("IRP_MN_SET_POWER\n");
228+
break;
229+
}
230+
case IRP_MN_QUERY_POWER:
231+
{
232+
DPRINT("IRP_MN_QUERY_POWER\n");
233+
break;
234+
}
235+
case IRP_MN_WAIT_WAKE:
236+
{
237+
DPRINT("IRP_MN_WAIT_WAKE\n");
238+
break;
239+
}
240+
default:
241+
{
242+
DPRINT1("PDO IRP_MJ_POWER / unknown minor function 0x%lx\n", IoStack->MinorFunction);
243+
IoCompleteRequest(Irp, IO_NO_INCREMENT);
244+
return Irp->IoStatus.Status;
245+
}
234246
}
235247

236248
PoStartNextPowerIrp(Irp);
237249
Irp->IoStatus.Status = STATUS_SUCCESS;
238250
IoCompleteRequest(Irp, IO_NO_INCREMENT);
251+
IoReleaseRemoveLock(&DeviceExtension->Common.RemoveLock, Irp);
239252
return STATUS_SUCCESS;
240253
}
241254

0 commit comments

Comments
 (0)