mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
[usb/usbehci]
- Add back WorkItem code but use it for calling the hub drivers callback routine (telling hub driver it needs check port status). - Add missing break for case URB_FUNCTION_GET_STATUS_FROM_DEVICE. - RootHubInitNotification: BusContext is the Device Object not the Device Objects Extensions. - UsbEhci now receives URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER IN requests, which is where we want to be for informing hub driver which port a device has been connected. svn path=/trunk/; revision=45668
This commit is contained in:
parent
713671e519
commit
04c5c8fb69
4 changed files with 47 additions and 7 deletions
|
@ -13,6 +13,24 @@
|
||||||
|
|
||||||
//#include "ntstrsafe.h"
|
//#include "ntstrsafe.h"
|
||||||
|
|
||||||
|
VOID NTAPI
|
||||||
|
DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context)
|
||||||
|
{
|
||||||
|
PWORKITEM_DATA WorkItemData;
|
||||||
|
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
|
||||||
|
|
||||||
|
WorkItemData = (PWORKITEM_DATA)Context;
|
||||||
|
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
|
||||||
|
|
||||||
|
if (PdoDeviceExtension->CallbackRoutine)
|
||||||
|
PdoDeviceExtension->CallbackRoutine(PdoDeviceExtension->CallbackContext);
|
||||||
|
else
|
||||||
|
DPRINT1("PdoDeviceExtension->CallbackRoutine is NULL!\n");
|
||||||
|
|
||||||
|
IoFreeWorkItem(WorkItemData->IoWorkItem);
|
||||||
|
ExFreePool(WorkItemData);
|
||||||
|
}
|
||||||
|
|
||||||
VOID NTAPI
|
VOID NTAPI
|
||||||
EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
|
EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)
|
||||||
{
|
{
|
||||||
|
@ -42,6 +60,7 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
|
||||||
/* Check for port change on this port */
|
/* Check for port change on this port */
|
||||||
if (tmp & 0x02)
|
if (tmp & 0x02)
|
||||||
{
|
{
|
||||||
|
PWORKITEM_DATA WorkItemData = NULL;
|
||||||
/* Connect or Disconnect? */
|
/* Connect or Disconnect? */
|
||||||
if (tmp & 0x01)
|
if (tmp & 0x01)
|
||||||
{
|
{
|
||||||
|
@ -84,7 +103,14 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
|
||||||
DPRINT("port tmp %x\n", tmp);
|
DPRINT("port tmp %x\n", tmp);
|
||||||
GetDeviceDescriptor(FdoDeviceExtension, 0, 0, FALSE);
|
GetDeviceDescriptor(FdoDeviceExtension, 0, 0, FALSE);
|
||||||
PdoDeviceExtension->ChildDeviceCount++;
|
PdoDeviceExtension->ChildDeviceCount++;
|
||||||
//PdoDeviceExtension->CallbackRoutine(PdoDeviceExtension->CallbackContext);
|
WorkItemData = ExAllocatePool(NonPagedPool, sizeof(WORKITEM_DATA));
|
||||||
|
if (!WorkItemData) ASSERT(FALSE);
|
||||||
|
WorkItemData->IoWorkItem = IoAllocateWorkItem(PdoDeviceExtension->DeviceObject);
|
||||||
|
WorkItemData->PdoDeviceExtension = PdoDeviceExtension;
|
||||||
|
IoQueueWorkItem(WorkItemData->IoWorkItem,
|
||||||
|
(PIO_WORKITEM_ROUTINE)DeviceArrivalWorkItem,
|
||||||
|
DelayedWorkQueue,
|
||||||
|
WorkItemData);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -92,12 +92,24 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension)
|
||||||
{
|
{
|
||||||
case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
|
case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
|
||||||
{
|
{
|
||||||
/* We should not get here yet! */
|
/* Are we suppose to only return on this request when a device is connected
|
||||||
ASSERT(FALSE);
|
or is it the RootHubInitNotification Callback */
|
||||||
|
DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n");
|
||||||
|
DPRINT1("--->TransferBufferLength %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBufferLength);
|
||||||
|
DPRINT1("--->TransferBuffer %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBuffer);
|
||||||
|
DPRINT1("--->PipeHandle %x\n",Urb->UrbBulkOrInterruptTransfer.PipeHandle);
|
||||||
|
DPRINT1("--->TransferFlags %x\n", Urb->UrbBulkOrInterruptTransfer.TransferFlags);
|
||||||
|
/* FIXME */
|
||||||
|
RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength);
|
||||||
|
((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1;
|
||||||
|
/* Turn off Irp handling as nothing is handled beyond this */
|
||||||
|
DeviceExtension->HaltUrbHandling = TRUE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case URB_FUNCTION_GET_STATUS_FROM_DEVICE:
|
case URB_FUNCTION_GET_STATUS_FROM_DEVICE:
|
||||||
{
|
{
|
||||||
DPRINT1("Get Status from Device\n");
|
DPRINT1("Get Status from Device\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
|
case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
|
||||||
{
|
{
|
||||||
|
@ -320,8 +332,6 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension)
|
||||||
Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
|
Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
|
||||||
Urb->UrbHeader.UsbdDeviceHandle = UsbDevice;
|
Urb->UrbHeader.UsbdDeviceHandle = UsbDevice;
|
||||||
Urb->UrbHeader.UsbdFlags = 0;
|
Urb->UrbHeader.UsbdFlags = 0;
|
||||||
/* Stop handling the URBs now as its not coded yet */
|
|
||||||
//DeviceExtension->HaltUrbHandling = TRUE;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -420,3 +430,4 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension)
|
||||||
|
|
||||||
KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
|
KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -363,7 +363,7 @@ typedef struct _PDO_DEVICE_EXTENSION
|
||||||
typedef struct _WORKITEM_DATA
|
typedef struct _WORKITEM_DATA
|
||||||
{
|
{
|
||||||
PIO_WORKITEM IoWorkItem;
|
PIO_WORKITEM IoWorkItem;
|
||||||
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
|
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
|
||||||
PDEVICE_OBJECT PortDeviceObject;
|
PDEVICE_OBJECT PortDeviceObject;
|
||||||
} WORKITEM_DATA, *PWORKITEM_DATA;
|
} WORKITEM_DATA, *PWORKITEM_DATA;
|
||||||
|
|
||||||
|
@ -419,4 +419,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension);
|
||||||
VOID
|
VOID
|
||||||
URBRequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
URBRequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp);
|
||||||
|
|
||||||
|
VOID NTAPI
|
||||||
|
DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -188,7 +188,7 @@ RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBA
|
||||||
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
|
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
|
||||||
DPRINT1("RootHubInitNotification %x, %x, %x\n", BusContext, CallbackContext, CallbackRoutine);
|
DPRINT1("RootHubInitNotification %x, %x, %x\n", BusContext, CallbackContext, CallbackRoutine);
|
||||||
|
|
||||||
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)BusContext;
|
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension;
|
||||||
PdoDeviceExtension->CallbackContext = CallbackContext;
|
PdoDeviceExtension->CallbackContext = CallbackContext;
|
||||||
PdoDeviceExtension->CallbackRoutine = CallbackRoutine;
|
PdoDeviceExtension->CallbackRoutine = CallbackRoutine;
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
|
Loading…
Reference in a new issue