[PCI][HIDCLASS][HIDUSB][KBDHID][MOUHID][USBCCGP][USBOHCI][USBEHCI][USBHUB][USBSTOR]

- Handle query remove IRPs
- Fix some other removal bugs

svn path=/branches/usb-bringup-trunk/; revision=55399
This commit is contained in:
Cameron Gutman 2012-02-03 22:59:53 +00:00
parent 9eed4afb3d
commit e7484d185a
14 changed files with 162 additions and 17 deletions

View file

@ -96,7 +96,6 @@ FdoEnumerateDevices(
{ {
PFDO_DEVICE_EXTENSION DeviceExtension; PFDO_DEVICE_EXTENSION DeviceExtension;
PCI_COMMON_CONFIG PciConfig; PCI_COMMON_CONFIG PciConfig;
PLIST_ENTRY CurrentEntry;
PPCI_DEVICE Device; PPCI_DEVICE Device;
PCI_SLOT_NUMBER SlotNumber; PCI_SLOT_NUMBER SlotNumber;
ULONG DeviceNumber; ULONG DeviceNumber;
@ -108,15 +107,6 @@ FdoEnumerateDevices(
DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
/* Mark all devices to be removed. If we don't discover them again during
enumeration, assume that they have been surprise removed */
CurrentEntry = DeviceExtension->DeviceListHead.Flink;
while (CurrentEntry != &DeviceExtension->DeviceListHead) {
Device = CONTAINING_RECORD(CurrentEntry, PCI_DEVICE, ListEntry);
Device->RemovePending = TRUE;
CurrentEntry = CurrentEntry->Flink;
}
DeviceExtension->DeviceListCount = 0; DeviceExtension->DeviceListCount = 0;
/* Enumerate devices on the PCI bus */ /* Enumerate devices on the PCI bus */
@ -190,9 +180,6 @@ FdoEnumerateDevices(
&DeviceExtension->DeviceListLock); &DeviceExtension->DeviceListLock);
} }
/* Don't remove this device */
Device->RemovePending = FALSE;
DeviceExtension->DeviceListCount++; DeviceExtension->DeviceListCount++;
/* Skip to next device if the current one is not a multifunction device */ /* Skip to next device if the current one is not a multifunction device */

View file

@ -1443,11 +1443,34 @@ PdoPnpControl(
case IRP_MN_STOP_DEVICE: case IRP_MN_STOP_DEVICE:
case IRP_MN_QUERY_REMOVE_DEVICE: case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_CANCEL_REMOVE_DEVICE: case IRP_MN_CANCEL_REMOVE_DEVICE:
case IRP_MN_REMOVE_DEVICE:
case IRP_MN_SURPRISE_REMOVAL: case IRP_MN_SURPRISE_REMOVAL:
Status = STATUS_SUCCESS; Status = STATUS_SUCCESS;
break; break;
case IRP_MN_REMOVE_DEVICE:
{
PPDO_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
PFDO_DEVICE_EXTENSION FdoDeviceExtension = DeviceExtension->Fdo->DeviceExtension;
KIRQL OldIrql;
/* Remove it from the device list */
KeAcquireSpinLock(&FdoDeviceExtension->DeviceListLock, &OldIrql);
RemoveEntryList(&DeviceExtension->PciDevice->ListEntry);
FdoDeviceExtension->DeviceListCount--;
KeReleaseSpinLock(&FdoDeviceExtension->DeviceListLock, OldIrql);
/* Free the device */
ExFreePool(DeviceExtension->PciDevice);
/* Complete the IRP */
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
/* Delete the DO */
IoDeleteDevice(DeviceObject);
return STATUS_SUCCESS;
}
case IRP_MN_QUERY_INTERFACE: case IRP_MN_QUERY_INTERFACE:
DPRINT("IRP_MN_QUERY_INTERFACE received\n"); DPRINT("IRP_MN_QUERY_INTERFACE received\n");
Status = PdoQueryInterface(DeviceObject, Irp, IrpSp); Status = PdoQueryInterface(DeviceObject, Irp, IrpSp);

View file

@ -554,6 +554,7 @@ HidClassFDO_PnP(
{ {
return HidClassFDO_RemoveDevice(DeviceObject, Irp); return HidClassFDO_RemoveDevice(DeviceObject, Irp);
} }
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE: case IRP_MN_QUERY_STOP_DEVICE:
{ {
// //
@ -567,6 +568,7 @@ HidClassFDO_PnP(
IoSkipCurrentIrpStackLocation(Irp); IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject, Irp); return IoCallDriver(FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject, Irp);
} }
case IRP_MN_CANCEL_REMOVE_DEVICE:
case IRP_MN_CANCEL_STOP_DEVICE: case IRP_MN_CANCEL_STOP_DEVICE:
{ {
// //

View file

@ -1561,8 +1561,11 @@ HidPnp(
} }
// //
// done // delete and detach device
// //
IoDetachDevice(DeviceExtension->NextDeviceObject);
IoDeleteDevice(DeviceObject);
return Status; return Status;
} }
case IRP_MN_QUERY_PNP_DEVICE_STATE: case IRP_MN_QUERY_PNP_DEVICE_STATE:
@ -1583,6 +1586,25 @@ HidPnp(
// //
return Status; return Status;
} }
case IRP_MN_QUERY_STOP_DEVICE:
case IRP_MN_QUERY_REMOVE_DEVICE:
{
//
// we're fine with it
//
Irp->IoStatus.Status = STATUS_SUCCESS;
//
// pass request to next driver
//
IoSkipCurrentIrpStackLocation(Irp);
Status = IoCallDriver(DeviceExtension->NextDeviceObject, Irp);
//
// done
//
return Status;
}
case IRP_MN_STOP_DEVICE: case IRP_MN_STOP_DEVICE:
{ {
// //

View file

@ -737,7 +737,11 @@ KbdHid_Pnp(
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
DPRINT1("[KBDHID] IRP_MJ_PNP Request: %x\n", IoStack->MinorFunction); DPRINT1("[KBDHID] IRP_MJ_PNP Request: %x\n", IoStack->MinorFunction);
if (IoStack->MinorFunction == IRP_MN_STOP_DEVICE || IoStack->MinorFunction == IRP_MN_CANCEL_REMOVE_DEVICE || IoStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE || IoStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE) if (IoStack->MinorFunction == IRP_MN_STOP_DEVICE ||
IoStack->MinorFunction == IRP_MN_CANCEL_REMOVE_DEVICE ||
IoStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE ||
IoStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE ||
IoStack->MinorFunction == IRP_MN_QUERY_REMOVE_DEVICE)
{ {
/* indicate success */ /* indicate success */
Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Status = STATUS_SUCCESS;

View file

@ -788,7 +788,11 @@ MouHid_Pnp(
IoStack = IoGetCurrentIrpStackLocation(Irp); IoStack = IoGetCurrentIrpStackLocation(Irp);
DPRINT1("[MOUHID] IRP_MJ_PNP Request: %x\n", IoStack->MinorFunction); DPRINT1("[MOUHID] IRP_MJ_PNP Request: %x\n", IoStack->MinorFunction);
if (IoStack->MinorFunction == IRP_MN_STOP_DEVICE || IoStack->MinorFunction == IRP_MN_CANCEL_REMOVE_DEVICE || IoStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE || IoStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE) if (IoStack->MinorFunction == IRP_MN_STOP_DEVICE ||
IoStack->MinorFunction == IRP_MN_CANCEL_REMOVE_DEVICE ||
IoStack->MinorFunction == IRP_MN_QUERY_STOP_DEVICE ||
IoStack->MinorFunction == IRP_MN_CANCEL_STOP_DEVICE ||
IoStack->MinorFunction == IRP_MN_QUERY_REMOVE_DEVICE)
{ {
/* indicate success */ /* indicate success */
Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Status = STATUS_SUCCESS;

View file

@ -481,6 +481,20 @@ FDO_HandlePnp(
} }
break; break;
} }
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE:
{
//
// sure
//
Irp->IoStatus.Status = STATUS_SUCCESS;
//
// forward irp to next device object
//
IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(FDODeviceExtension->NextDeviceObject, Irp);
}
default: default:
{ {
// //

View file

@ -391,6 +391,15 @@ PDO_HandlePnp(
IoCompleteRequest(Irp, IO_NO_INCREMENT); IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE:
{
//
// sure
//
Status = STATUS_SUCCESS;
break;
}
case IRP_MN_START_DEVICE: case IRP_MN_START_DEVICE:
{ {
// //
@ -406,6 +415,7 @@ PDO_HandlePnp(
// do nothing // do nothing
// //
Status = Irp->IoStatus.Status; Status = Irp->IoStatus.Status;
break;
} }
} }

View file

@ -434,6 +434,15 @@ CHubController::HandlePnp(
Status = SetDeviceInterface(TRUE); Status = SetDeviceInterface(TRUE);
break; break;
} }
case IRP_MN_QUERY_STOP_DEVICE:
case IRP_MN_QUERY_REMOVE_DEVICE:
{
//
// sure
//
Status = STATUS_SUCCESS;
break;
}
case IRP_MN_QUERY_ID: case IRP_MN_QUERY_ID:
{ {
DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack->Parameters.QueryId.IdType); DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack->Parameters.QueryId.IdType);

View file

@ -1883,6 +1883,22 @@ USBHUB_FdoHandlePnp(
} }
break; break;
} }
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE:
{
Irp->IoStatus.Status = STATUS_SUCCESS;
return ForwardIrpAndForget(DeviceObject, Irp);
}
case IRP_MN_REMOVE_DEVICE:
{
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
IoDetachDevice(HubDeviceExtension->LowerDeviceObject);
IoDeleteDevice(DeviceObject);
return STATUS_SUCCESS;
}
case IRP_MN_QUERY_BUS_INFORMATION: case IRP_MN_QUERY_BUS_INFORMATION:
{ {
DPRINT1("IRP_MN_QUERY_BUS_INFORMATION\n"); DPRINT1("IRP_MN_QUERY_BUS_INFORMATION\n");

View file

@ -586,6 +586,14 @@ USBHUB_PdoHandlePnp(
IoDeleteDevice(DeviceObject); IoDeleteDevice(DeviceObject);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
case IRP_MN_QUERY_STOP_DEVICE:
case IRP_MN_QUERY_REMOVE_DEVICE:
{
/* Sure, no problem */
Status = STATUS_SUCCESS;
Information = 0;
break;
}
default: default:
{ {
DPRINT1("PDO IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction); DPRINT1("PDO IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction);

View file

@ -437,6 +437,15 @@ CHubController::HandlePnp(
Status = SetDeviceInterface(TRUE); Status = SetDeviceInterface(TRUE);
break; break;
} }
case IRP_MN_QUERY_STOP_DEVICE:
case IRP_MN_QUERY_REMOVE_DEVICE:
{
//
// sure
//
Status = STATUS_SUCCESS;
break;
}
case IRP_MN_QUERY_ID: case IRP_MN_QUERY_ID:
{ {
DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack->Parameters.QueryId.IdType); DPRINT1("CHubController::HandlePnp IRP_MN_QUERY_ID Type %x\n", IoStack->Parameters.QueryId.IdType);

View file

@ -339,9 +339,11 @@ USBSTOR_FdoHandlePnp(
break; break;
} }
case IRP_MN_STOP_DEVICE: case IRP_MN_STOP_DEVICE:
{
DPRINT1("USBSTOR_FdoHandlePnp: IRP_MN_STOP_DEVICE unimplemented\n"); DPRINT1("USBSTOR_FdoHandlePnp: IRP_MN_STOP_DEVICE unimplemented\n");
Status = STATUS_NOT_SUPPORTED; Status = STATUS_NOT_SUPPORTED;
break; break;
}
case IRP_MN_REMOVE_DEVICE: case IRP_MN_REMOVE_DEVICE:
{ {
DPRINT1("IRP_MN_REMOVE_DEVICE\n"); DPRINT1("IRP_MN_REMOVE_DEVICE\n");
@ -356,6 +358,29 @@ USBSTOR_FdoHandlePnp(
IoSkipCurrentIrpStackLocation(Irp); IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp); return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
} }
case IRP_MN_QUERY_STOP_DEVICE:
case IRP_MN_QUERY_REMOVE_DEVICE:
{
//
// we can if nothing is pending
//
if (DeviceExtension->IrpPendingCount != 0 ||
DeviceExtension->ActiveSrb != NULL)
{
/* We have pending requests */
DPRINT1("Failing removal/stop request due to pending requests present\n");
Status = STATUS_UNSUCCESSFUL;
}
else
{
/* We're all clear */
Irp->IoStatus.Status = STATUS_SUCCESS;
IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(DeviceExtension->LowerDeviceObject, Irp);
}
break;
}
case IRP_MN_START_DEVICE: case IRP_MN_START_DEVICE:
{ {
Status = USBSTOR_FdoHandleStartDevice(DeviceObject, DeviceExtension, Irp); Status = USBSTOR_FdoHandleStartDevice(DeviceObject, DeviceExtension, Irp);

View file

@ -873,6 +873,18 @@ USBSTOR_PdoHandlePnp(
} }
break; break;
} }
case IRP_MN_QUERY_REMOVE_DEVICE:
case IRP_MN_QUERY_STOP_DEVICE:
{
//
// if we're not claimed it's ok
//
if (DeviceExtension->Claimed)
Status = STATUS_UNSUCCESSFUL;
else
Status = STATUS_SUCCESS;
break;
}
case IRP_MN_START_DEVICE: case IRP_MN_START_DEVICE:
{ {
// //