Skip to content

Commit b398f3f

Browse files
committed
[USBCCGP]
- Send unconfigure request when the device is removed [USBOHCI] - Handle unconfigure request svn path=/trunk/; revision=55775
1 parent 5b71379 commit b398f3f

File tree

2 files changed

+81
-10
lines changed

2 files changed

+81
-10
lines changed

reactos/drivers/usb/usbccgp/fdo.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,52 @@ FDO_StartDevice(
408408
return Status;
409409
}
410410

411+
NTSTATUS
412+
FDO_CloseConfiguration(
413+
IN PDEVICE_OBJECT DeviceObject)
414+
{
415+
NTSTATUS Status;
416+
PURB Urb;
417+
PFDO_DEVICE_EXTENSION FDODeviceExtension;
418+
419+
// get device extension
420+
FDODeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
421+
ASSERT(FDODeviceExtension->Common.IsFDO);
422+
423+
//
424+
// now allocate the urb
425+
//
426+
Urb = USBD_CreateConfigurationRequestEx(FDODeviceExtension->ConfigurationDescriptor, FDODeviceExtension->InterfaceList);
427+
if (!Urb)
428+
{
429+
//
430+
// no memory
431+
//
432+
return STATUS_INSUFFICIENT_RESOURCES;
433+
}
434+
435+
//
436+
// clear configuration descriptor to make it an unconfigure request
437+
//
438+
Urb->UrbSelectConfiguration.ConfigurationDescriptor = NULL;
439+
440+
//
441+
// submit urb
442+
//
443+
Status = USBCCGP_SyncUrbRequest(FDODeviceExtension->NextDeviceObject, Urb);
444+
if (!NT_SUCCESS(Status))
445+
{
446+
//
447+
// failed to set configuration
448+
//
449+
DPRINT1("USBCCGP_SyncUrbRequest failed to unconfigure device\n", Status);
450+
}
451+
452+
ExFreePool(Urb);
453+
return Status;
454+
}
455+
456+
411457
NTSTATUS
412458
FDO_HandlePnp(
413459
PDEVICE_OBJECT DeviceObject,
@@ -429,6 +475,12 @@ FDO_HandlePnp(
429475
{
430476
case IRP_MN_REMOVE_DEVICE:
431477
{
478+
//
479+
// unconfigure device
480+
//
481+
DPRINT1("[USBCCGP] FDO IRP_MN_REMOVE\n");
482+
FDO_CloseConfiguration(DeviceObject);
483+
432484
/* Send the IRP down the stack */
433485
Status = USBCCGP_SyncForwardIrp(FDODeviceExtension->NextDeviceObject, Irp);
434486
if (NT_SUCCESS(Status))

reactos/drivers/usb/usbohci/usb_device.cpp

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,30 +1103,49 @@ CUSBDevice::SelectConfiguration(
11031103
ULONG InterfaceIndex, PipeIndex;
11041104
USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup;
11051105
NTSTATUS Status;
1106+
UCHAR bConfigurationValue = 0;
11061107

1107-
//
1108-
// sanity checks
1109-
//
1110-
ASSERT(ConfigurationDescriptor->iConfiguration < m_DeviceDescriptor.bNumConfigurations);
1111-
ASSERT(ConfigurationDescriptor->iConfiguration == m_ConfigurationDescriptors[ConfigurationDescriptor->iConfiguration].ConfigurationDescriptor->iConfiguration);
1108+
if (ConfigurationDescriptor)
1109+
{
1110+
//
1111+
// sanity checks
1112+
//
1113+
ASSERT(ConfigurationDescriptor->iConfiguration < m_DeviceDescriptor.bNumConfigurations);
1114+
ASSERT(ConfigurationDescriptor->iConfiguration == m_ConfigurationDescriptors[ConfigurationDescriptor->iConfiguration].ConfigurationDescriptor->iConfiguration);
11121115

1113-
//
1114-
// sanity check
1115-
//
1116-
ASSERT(ConfigurationDescriptor->bNumInterfaces <= m_ConfigurationDescriptors[ConfigurationDescriptor->iConfiguration].ConfigurationDescriptor->bNumInterfaces);
1116+
//
1117+
// sanity check
1118+
//
1119+
ASSERT(ConfigurationDescriptor->bNumInterfaces <= m_ConfigurationDescriptors[ConfigurationDescriptor->iConfiguration].ConfigurationDescriptor->bNumInterfaces);
1120+
1121+
//
1122+
// get configuration value
1123+
//
1124+
bConfigurationValue = ConfigurationDescriptor->bConfigurationValue;
1125+
}
11171126

11181127
//
11191128
// now build setup packet
11201129
//
11211130
RtlZeroMemory(&CtrlSetup, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET));
11221131
CtrlSetup.bRequest = USB_REQUEST_SET_CONFIGURATION;
1123-
CtrlSetup.wValue.W = ConfigurationDescriptor->bConfigurationValue;
1132+
CtrlSetup.wValue.W = bConfigurationValue;
11241133

11251134
//
11261135
// select configuration
11271136
//
11281137
Status = CommitSetupPacket(&CtrlSetup, 0, 0, 0);
11291138

1139+
if (!ConfigurationDescriptor)
1140+
{
1141+
//
1142+
// unconfigure request
1143+
//
1144+
DPRINT1("CUsbDevice::SelectConfiguration Unconfigure Request Status %x\n", Status);
1145+
m_ConfigurationIndex = 0;
1146+
return Status;
1147+
}
1148+
11301149
//
11311150
// informal debug print
11321151
//

0 commit comments

Comments
 (0)