[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:
Michael Martin 2010-02-23 11:20:15 +00:00
parent 713671e519
commit 04c5c8fb69
4 changed files with 47 additions and 7 deletions

View file

@ -13,6 +13,24 @@
//#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
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 */
if (tmp & 0x02)
{
PWORKITEM_DATA WorkItemData = NULL;
/* Connect or Disconnect? */
if (tmp & 0x01)
{
@ -84,7 +103,14 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
DPRINT("port tmp %x\n", tmp);
GetDeviceDescriptor(FdoDeviceExtension, 0, 0, FALSE);
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
{

View file

@ -92,12 +92,24 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension)
{
case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
{
/* We should not get here yet! */
ASSERT(FALSE);
/* Are we suppose to only return on this request when a device is connected
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:
{
DPRINT1("Get Status from Device\n");
break;
}
case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
{
@ -320,8 +332,6 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension)
Urb->UrbHeader.Status = USBD_STATUS_SUCCESS;
Urb->UrbHeader.UsbdDeviceHandle = UsbDevice;
Urb->UrbHeader.UsbdFlags = 0;
/* Stop handling the URBs now as its not coded yet */
//DeviceExtension->HaltUrbHandling = TRUE;
break;
}
default:
@ -420,3 +430,4 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension)
KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
}

View file

@ -363,7 +363,7 @@ typedef struct _PDO_DEVICE_EXTENSION
typedef struct _WORKITEM_DATA
{
PIO_WORKITEM IoWorkItem;
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
PDEVICE_OBJECT PortDeviceObject;
} WORKITEM_DATA, *PWORKITEM_DATA;
@ -419,4 +419,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension);
VOID
URBRequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp);
VOID NTAPI
DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context);
#endif

View file

@ -188,7 +188,7 @@ RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBA
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
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->CallbackRoutine = CallbackRoutine;
return STATUS_SUCCESS;