Let OHCI miniport use shared code in drivers/usb/miniport/common/*,
instead of duplicating it
Modified: trunk/reactos/drivers/usb/miniport/common/fdo.c
Modified: trunk/reactos/drivers/usb/miniport/common/main.c
Modified: trunk/reactos/drivers/usb/miniport/common/usbcommon.h
Modified: trunk/reactos/drivers/usb/miniport/usbohci/ohci-hcd.c
Modified: trunk/reactos/drivers/usb/miniport/usbohci/ohci-pci.c
Added: trunk/reactos/drivers/usb/miniport/usbohci/ohci.c
Deleted: trunk/reactos/drivers/usb/miniport/usbohci/ohci.def
Modified: trunk/reactos/drivers/usb/miniport/usbohci/ohci.h
Deleted: trunk/reactos/drivers/usb/miniport/usbohci/ohci_main.c
Deleted: trunk/reactos/drivers/usb/miniport/usbohci/ohci_main.h
Modified: trunk/reactos/drivers/usb/miniport/usbohci/usbohci.xml
_____
Modified: trunk/reactos/drivers/usb/miniport/common/fdo.c
--- trunk/reactos/drivers/usb/miniport/common/fdo.c 2005-09-11
09:23:16 UTC (rev 17794)
+++ trunk/reactos/drivers/usb/miniport/common/fdo.c 2005-09-11
11:40:43 UTC (rev 17795)
@@ -59,6 +59,9 @@
PUSBMP_DEVICE_EXTENSION DeviceExtension;
PCM_RESOURCE_LIST AllocatedResources;
+ if (DeviceObject == KeyboardFdo || DeviceObject == MouseFdo)
+ return STATUS_SUCCESS;
+
/*
* Get the initialization data we saved in VideoPortInitialize.
*/
@@ -350,3 +353,218 @@
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
}
+
+NTSTATUS
+UsbMpInternalDeviceControlFdo(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status = STATUS_INVALID_DEVICE_REQUEST;
+
+ DPRINT("USBMP: UsbMpDeviceInternalControlFdo(DO %p, code 0x%lx)
called\n",
+ DeviceObject,
+
IoGetCurrentIrpStackLocation(Irp)->Parameters.DeviceIoControl.IoControlC
ode);
+
+ if (DeviceObject == KeyboardFdo)
+ {
+ // it's keyboard's IOCTL
+ PIO_STACK_LOCATION Stk;
+
+ Irp->IoStatus.Information = 0;
+ Stk = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (Stk->Parameters.DeviceIoControl.IoControlCode)
+ {
+ case IOCTL_INTERNAL_KEYBOARD_CONNECT:
+ DPRINT("USBMP:
IOCTL_INTERNAL_KEYBOARD_CONNECT\n");
+ if
(Stk->Parameters.DeviceIoControl.InputBufferLength <
sizeof(CONNECT_DATA)) {
+ DPRINT1("USBMP: Keyboard
IOCTL_INTERNAL_KEYBOARD_CONNECT "
+ "invalid buffer
size\n");
+ Irp->IoStatus.Status =
STATUS_INVALID_PARAMETER;
+ goto intcontfailure;
+ }
+
+ RtlCopyMemory(&KbdClassInformation,
+
Stk->Parameters.DeviceIoControl.Type3InputBuffer,
+ sizeof(CONNECT_DATA));
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+
+ case IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER:
+ DPRINT("USBMP:
IOCTL_INTERNAL_I8042_KEYBOARD_WRITE_BUFFER\n");
+ if
(Stk->Parameters.DeviceIoControl.InputBufferLength < 1) {
+ Irp->IoStatus.Status =
STATUS_INVALID_PARAMETER;
+ goto intcontfailure;
+ }
+/* if (!DevExt->KeyboardInterruptObject) {
+ Irp->IoStatus.Status =
STATUS_DEVICE_NOT_READY;
+ goto intcontfailure;
+ }*/
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+ case IOCTL_KEYBOARD_QUERY_ATTRIBUTES:
+ DPRINT("USBMP:
IOCTL_KEYBOARD_QUERY_ATTRIBUTES\n");
+ if
(Stk->Parameters.DeviceIoControl.OutputBufferLength <
+ sizeof(KEYBOARD_ATTRIBUTES)) {
+ DPRINT("USBMP: Keyboard
IOCTL_KEYBOARD_QUERY_ATTRIBUTES "
+ "invalid buffer
size\n");
+ Irp->IoStatus.Status =
STATUS_BUFFER_TOO_SMALL;
+ goto intcontfailure;
+ }
+
/*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
+ &DevExt->KeyboardAttributes,
+ sizeof(KEYBOARD_ATTRIBUTES));*/
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+ case IOCTL_KEYBOARD_QUERY_INDICATORS:
+ DPRINT("USBMP:
IOCTL_KEYBOARD_QUERY_INDICATORS\n");
+ if
(Stk->Parameters.DeviceIoControl.OutputBufferLength <
+ sizeof(KEYBOARD_INDICATOR_PARAMETERS)) {
+ DPRINT("USBMP: Keyboard
IOCTL_KEYBOARD_QUERY_INDICATORS "
+ "invalid buffer
size\n");
+ Irp->IoStatus.Status =
STATUS_BUFFER_TOO_SMALL;
+ goto intcontfailure;
+ }
+
/*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
+ &DevExt->KeyboardIndicators,
+
sizeof(KEYBOARD_INDICATOR_PARAMETERS));*/
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+ case IOCTL_KEYBOARD_QUERY_TYPEMATIC:
+ DPRINT("USBMP:
IOCTL_KEYBOARD_QUERY_TYPEMATIC\n");
+ if
(Stk->Parameters.DeviceIoControl.OutputBufferLength <
+ sizeof(KEYBOARD_TYPEMATIC_PARAMETERS)) {
+ DPRINT("USBMP: Keyboard
IOCTL_KEYBOARD_QUERY_TYPEMATIC "
+ "invalid buffer
size\n");
+ Irp->IoStatus.Status =
STATUS_BUFFER_TOO_SMALL;
+ goto intcontfailure;
+ }
+
/*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
+ &DevExt->KeyboardTypematic,
+
sizeof(KEYBOARD_TYPEMATIC_PARAMETERS));*/
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+ case IOCTL_KEYBOARD_SET_INDICATORS:
+ DPRINT("USBMP:
IOCTL_KEYBOARD_SET_INDICATORS\n");
+ if
(Stk->Parameters.DeviceIoControl.InputBufferLength <
+ sizeof(KEYBOARD_INDICATOR_PARAMETERS)) {
+ DPRINT("USBMP: Keyboard
IOCTL_KEYBOARD_SET_INDICTATORS "
+ "invalid buffer
size\n");
+ Irp->IoStatus.Status =
STATUS_BUFFER_TOO_SMALL;
+ goto intcontfailure;
+ }
+
+
/*RtlCopyMemory(&DevExt->KeyboardIndicators,
+ Irp->AssociatedIrp.SystemBuffer,
+
sizeof(KEYBOARD_INDICATOR_PARAMETERS));*/
+
+ //DPRINT("%x\n",
DevExt->KeyboardIndicators.LedFlags);
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+ case IOCTL_KEYBOARD_SET_TYPEMATIC:
+ DPRINT("USBMP: IOCTL_KEYBOARD_SET_TYPEMATIC\n");
+ if
(Stk->Parameters.DeviceIoControl.InputBufferLength <
+ sizeof(KEYBOARD_TYPEMATIC_PARAMETERS)) {
+ DPRINT("USBMP: Keyboard
IOCTL_KEYBOARD_SET_TYPEMATIC "
+ "invalid buffer
size\n");
+ Irp->IoStatus.Status =
STATUS_BUFFER_TOO_SMALL;
+ goto intcontfailure;
+ }
+
+
/*RtlCopyMemory(&DevExt->KeyboardTypematic,
+ Irp->AssociatedIrp.SystemBuffer,
+
sizeof(KEYBOARD_TYPEMATIC_PARAMETERS));*/
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+ case IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION:
+ /* We should check the UnitID, but it's kind of
pointless as
+ * all keyboards are supposed to have the same
one
+ */
+#if 0
+ DPRINT("USBMP:
IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION\n");
+ if
(Stk->Parameters.DeviceIoControl.OutputBufferLength <
+
sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION)) {
+ DPRINT("USBMP:
IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION: "
+ "invalid buffer size
(expected)\n");
+ /* It's to query the buffer size
*/
+ Irp->IoStatus.Status =
STATUS_BUFFER_TOO_SMALL;
+ goto intcontfailure;
+ }
+ Irp->IoStatus.Information =
+
sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION);
+#endif
+
/*RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
+ &IndicatorTranslation,
+
sizeof(LOCAL_KEYBOARD_INDICATOR_TRANSLATION));*/
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+ case IOCTL_INTERNAL_I8042_HOOK_KEYBOARD:
+ /* Nothing to do here */
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+ default:
+ Irp->IoStatus.Status =
STATUS_INVALID_DEVICE_REQUEST;
+ break;
+ }
+
+ intcontfailure:
+ Status = Irp->IoStatus.Status;
+ }
+ else if (DeviceObject == MouseFdo)
+ {
+ // it's mouse's IOCTL
+ PIO_STACK_LOCATION Stk;
+
+ Irp->IoStatus.Information = 0;
+ Stk = IoGetCurrentIrpStackLocation(Irp);
+
+ switch (Stk->Parameters.DeviceIoControl.IoControlCode)
+ {
+ case IOCTL_INTERNAL_MOUSE_CONNECT:
+ DPRINT("USBMP:
IOCTL_INTERNAL_MOUSE_CONNECT\n");
+ if
(Stk->Parameters.DeviceIoControl.InputBufferLength <
sizeof(CONNECT_DATA)) {
+ DPRINT1("USBMP:
IOCTL_INTERNAL_MOUSE_CONNECT "
+ "invalid buffer
size\n");
+ Irp->IoStatus.Status =
STATUS_INVALID_PARAMETER;
+ goto intcontfailure2;
+ }
+
+ RtlCopyMemory(&MouseClassInformation,
+
Stk->Parameters.DeviceIoControl.Type3InputBuffer,
+ sizeof(CONNECT_DATA));
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ break;
+
+ default:
+ Irp->IoStatus.Status =
STATUS_SUCCESS;//STATUS_INVALID_DEVICE_REQUEST;
+ break;
+ }
+ intcontfailure2:
+ Status = Irp->IoStatus.Status;
+ }
+ else
+ {
+ DPRINT("USBMP: We got IOCTL for UsbCore\n");
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+ }
+
+
+ if (Status == STATUS_INVALID_DEVICE_REQUEST) {
+ DPRINT1("USBMP: Invalid internal device request!\n");
+ }
+
+ if (Status != STATUS_PENDING)
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return Status;
+}
_____
Modified: trunk/reactos/drivers/usb/miniport/common/main.c
--- trunk/reactos/drivers/usb/miniport/common/main.c 2005-09-11
09:23:16 UTC (rev 17794)
+++ trunk/reactos/drivers/usb/miniport/common/main.c 2005-09-11
11:40:43 UTC (rev 17795)
@@ -17,7 +17,11 @@
#define INITGUID
#include "usbcommon.h"
-static ULONG DeviceNumber = 0; /* FIXME: what is that? */
+// data for embedded drivers
+CONNECT_DATA KbdClassInformation;
+CONNECT_DATA MouseClassInformation;
+PDEVICE_OBJECT KeyboardFdo = NULL;
+PDEVICE_OBJECT MouseFdo = NULL;
static NTSTATUS
CreateRootHubPdo(
@@ -61,6 +65,64 @@
return STATUS_SUCCESS;
}
+static NTSTATUS
+AddDevice_Keyboard(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT Pdo)
+{
+ UNICODE_STRING DeviceName =
RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");
+ PDEVICE_OBJECT Fdo;
+ NTSTATUS Status;
+
+ Status = IoCreateDevice(DriverObject,
+ 8, // debug
+ &DeviceName,
+ FILE_DEVICE_KEYBOARD,
+ FILE_DEVICE_SECURE_OPEN,
+ TRUE,
+ &Fdo);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("USBMP: IoCreateDevice() for usb keyboard driver
failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+ KeyboardFdo = Fdo;
+ Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
+ DPRINT("USBMP: Created keyboard Fdo: %p\n", Fdo);
+
+ return STATUS_SUCCESS;
+}
+
+static NTSTATUS
+AddDevice_Mouse(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT Pdo)
+{
+ UNICODE_STRING DeviceName =
RTL_CONSTANT_STRING(L"\\Device\\PointerClass0");
+ PDEVICE_OBJECT Fdo;
+ NTSTATUS Status;
+
+ Status = IoCreateDevice(DriverObject,
+ 8, // debug
+ &DeviceName,
+ FILE_DEVICE_MOUSE,
+ FILE_DEVICE_SECURE_OPEN,
+ TRUE,
+ &Fdo);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("USBMP: IoCreateDevice() for usb mouse driver
failed with status 0x%08lx\n", Status);
+ return Status;
+ }
+ MouseFdo = Fdo;
+ Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
+ DPRINT("USBMP: Created mouse Fdo: %p\n", Fdo);
+
+ return STATUS_SUCCESS;
+}
+
NTSTATUS STDCALL
AddDevice(
IN PDRIVER_OBJECT DriverObject,
@@ -74,8 +136,17 @@
UNICODE_STRING LinkDeviceName;
PUSBMP_DRIVER_EXTENSION DriverExtension;
PUSBMP_DEVICE_EXTENSION DeviceExtension;
+ ULONG DeviceNumber;
+ /* FIXME: actually, we prevent multiple USB controllers on a
computer */
+ static BOOLEAN xbox_workaround = FALSE;
+
DPRINT("USBMP: AddDevice called\n");
+
+ if (xbox_workaround)
+ // Fail for any other host controller than the first
+ return STATUS_INSUFFICIENT_RESOURCES;
+ xbox_workaround = TRUE;
// Allocate driver extension now
DriverExtension = IoGetDriverObjectExtension(DriverObject,
DriverObject);
@@ -142,8 +213,6 @@
DeviceExtension->NextDeviceObject =
IoAttachDeviceToDeviceStack(fdo, pdo);
- fdo->Flags &= ~DO_DEVICE_INITIALIZING;
-
// Initialize device extension
DeviceExtension->IsFDO = TRUE;
DeviceExtension->DeviceNumber = DeviceNumber;
@@ -151,6 +220,8 @@
DeviceExtension->FunctionalDeviceObject = fdo;
DeviceExtension->DriverExtension = DriverExtension;
+ fdo->Flags &= ~DO_DEVICE_INITIALIZING;
+
/* FIXME: do a loop to find an available number */
swprintf(LinkDeviceBuffer, L"\\??\\HCD%lu", 0);
@@ -158,13 +229,19 @@
Status = IoCreateSymbolicLink(&LinkDeviceName, &DeviceName);
+ if (NT_SUCCESS(Status))
+ Status = AddDevice_Keyboard(DriverObject, pdo);
+ if (NT_SUCCESS(Status))
+ Status = AddDevice_Mouse(DriverObject, pdo);
+
if (!NT_SUCCESS(Status))
{
- DPRINT("USBMP: IoCreateSymbolicLink call failed with
status 0x%08x\n", Status);
+ DPRINT("USBMP: IoCreateSymbolicLink() call failed with
status 0x%08x\n", Status);
IoDeleteDevice(DeviceExtension->RootHubPdo);
IoDeleteDevice(fdo);
return Status;
}
+
return STATUS_SUCCESS;
}
@@ -239,6 +316,15 @@
}
static NTSTATUS STDCALL
+DispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+ if
(((PUSBMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsFDO)
+ return UsbMpInternalDeviceControlFdo(DeviceObject, Irp);
+ else
+ return IrpStub(DeviceObject, Irp);
+}
+
+static NTSTATUS STDCALL
DispatchPnp(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
if
(((PUSBMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->IsFDO)
@@ -263,6 +349,7 @@
NTSTATUS STDCALL
DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath)
{
+ USBPORT_INTERFACE UsbPortInterface;
ULONG i;
DriverObject->DriverUnload = DriverUnload;
@@ -275,8 +362,20 @@
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DispatchCleanup;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
DispatchDeviceControl;
+ DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] =
DispatchInternalDeviceControl;
DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
+ // Register in usbcore.sys
+ UsbPortInterface.KbdConnectData = &KbdClassInformation;
+ UsbPortInterface.MouseConnectData = &MouseClassInformation;
+
+ KbdClassInformation.ClassService = NULL;
+ KbdClassInformation.ClassDeviceObject = NULL;
+ MouseClassInformation.ClassService = NULL;
+ MouseClassInformation.ClassDeviceObject = NULL;
+
+ RegisterPortDriver(DriverObject, &UsbPortInterface);
+
return STATUS_SUCCESS;
}
_____
Modified: trunk/reactos/drivers/usb/miniport/common/usbcommon.h
--- trunk/reactos/drivers/usb/miniport/common/usbcommon.h
2005-09-11 09:23:16 UTC (rev 17794)
+++ trunk/reactos/drivers/usb/miniport/common/usbcommon.h
2005-09-11 11:40:43 UTC (rev 17795)
@@ -7,6 +7,7 @@
#include <usbdi.h>
#include <usbiodef.h>
#include <initguid.h>
+#include <ntdd8042.h>
#define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) +
((D)<<24))
#define USB_MINIPORT_TAG TAG('u','s','b','m')
@@ -14,6 +15,11 @@
#include "../../usbport/hcd.h"
#include "usbcommon_types.h"
+extern CONNECT_DATA KbdClassInformation;
+extern CONNECT_DATA MouseClassInformation;
+extern PDEVICE_OBJECT KeyboardFdo;
+extern PDEVICE_OBJECT MouseFdo;
+
/* cleanup.c */
NTSTATUS STDCALL
UsbMpCleanup(
@@ -43,6 +49,11 @@
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
+NTSTATUS
+UsbMpInternalDeviceControlFdo(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
+
/* misc.c */
NTSTATUS
ForwardIrpAndWait(
_____
Modified: trunk/reactos/drivers/usb/miniport/usbohci/ohci-hcd.c
--- trunk/reactos/drivers/usb/miniport/usbohci/ohci-hcd.c
2005-09-11 09:23:16 UTC (rev 17794)
+++ trunk/reactos/drivers/usb/miniport/usbohci/ohci-hcd.c
2005-09-11 11:40:43 UTC (rev 17795)
@@ -107,8 +107,7 @@
#else
#include "ohci_config.h"
-#include "../usb_wrapper.h"
-#include "hcd.h"
+#include "../../usbport/hcd.h"
//#define OHCI_VERBOSE_DEBUG
#endif
@@ -626,6 +625,18 @@
/*----------------------------------------------------------------------
---*/
+// HCFS itself
+static char *hcfs2string (int state)
+{
+ switch (state) {
+ case OHCI_USB_RESET: return "reset";
+ case OHCI_USB_RESUME: return "resume";
+ case OHCI_USB_OPER: return "operational";
+ case OHCI_USB_SUSPEND: return "suspend";
+ }
+ return "?";
+}
+
static void ohci_stop (struct usb_hcd *hcd)
{
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
_____
Modified: trunk/reactos/drivers/usb/miniport/usbohci/ohci-pci.c
--- trunk/reactos/drivers/usb/miniport/usbohci/ohci-pci.c
2005-09-11 09:23:16 UTC (rev 17794)
+++ trunk/reactos/drivers/usb/miniport/usbohci/ohci-pci.c
2005-09-11 11:40:43 UTC (rev 17795)
@@ -358,7 +358,7 @@
/*----------------------------------------------------------------------
---*/
-const struct pci_device_id __devinitdata pci_ids [] = { {
+const struct pci_device_id __devinitdata ohci_pci_ids [] = { {
/* handle any USB OHCI controller */
.class = (PCI_CLASS_SERIAL_USB << 8) | 0x10,
@@ -373,12 +373,12 @@
}, { /* end: all zeroes */ }
};
-MODULE_DEVICE_TABLE (pci, pci_ids);
+MODULE_DEVICE_TABLE (pci, ohci_pci_ids);
/* pci driver glue; this is a "new style" PCI driver module */
struct pci_driver ohci_pci_driver = {
.name = (char *) hcd_name,
- .id_table = pci_ids,
+ .id_table = ohci_pci_ids,
.probe = usb_hcd_pci_probe,
.remove = usb_hcd_pci_remove,
_____
Added: trunk/reactos/drivers/usb/miniport/usbohci/ohci.c
--- trunk/reactos/drivers/usb/miniport/usbohci/ohci.c 2005-09-11
09:23:16 UTC (rev 17794)
+++ trunk/reactos/drivers/usb/miniport/usbohci/ohci.c 2005-09-11
11:40:43 UTC (rev 17795)
@@ -0,0 +1,76 @@
+#define NDEBUG
+#include <debug.h>
+
+#include "ohci.h"
+
+extern struct pci_driver ohci_pci_driver;
+extern struct pci_device_id ohci_pci_ids[];
+struct pci_device_id* pci_ids = &ohci_pci_ids[0];
+
+NTSTATUS
+InitLinuxWrapper(PDEVICE_OBJECT DeviceObject)
+{
+ NTSTATUS Status;
+ PUSBMP_DEVICE_EXTENSION DeviceExtension =
(PUSBMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ /* Create generic linux structure */
+ struct pci_dev *dev;
+ dev = ExAllocatePoolWithTag(PagedPool, sizeof(struct pci_dev),
USB_OHCI_TAG);
+ DeviceExtension->pdev = dev;
+
+ /* Initialize generic linux structure */
+ dev->irq = DeviceExtension->InterruptVector;
+ dev->dev_ext = (PVOID)DeviceExtension;
+ dev->dev.dev_ext = (PVOID)DeviceExtension;
+ dev->slot_name = ExAllocatePoolWithTag(NonPagedPool, 128,
USB_OHCI_TAG); // 128 max len for slot name
+
+ // Init wrapper
+ init_wrapper(dev);
+
+ strcpy(dev->dev.name, "OpenHCI PCI-USB Controller");
+ strcpy(dev->slot_name, "OHCD PCI Slot");
+
+ // Init the OHCI HCD. Probe will be called automatically, but
will fail because id=NULL
+ Status = ohci_hcd_pci_init();
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("OHCI: ohci_hcd_pci_init() failed with status
0x%08lx\n", Status);
+ /* FIXME: deinitialize linux wrapper */
+ ExFreePoolWithTag(dev, USB_OHCI_TAG);
+ return Status;
+ }
+
+ // Init core usb
+ usb_init();
+
+ // Probe device with real id now
+ ohci_pci_driver.probe(dev, ohci_pci_ids);
+
+ return STATUS_SUCCESS;
+}
+
+VOID STDCALL DriverUnload(PDRIVER_OBJECT DriverObject)
+{
+ PUSBMP_DEVICE_EXTENSION DeviceExtension;
+ PDEVICE_OBJECT DeviceObject;
+ struct pci_dev *dev;
+
+ DeviceObject = DriverObject->DeviceObject;
+ DeviceExtension =
(PUSBMP_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ dev = DeviceExtension->pdev;
+
+ DPRINT1("DriverUnload()\n");
+
+ // Exit usb device
+ usb_exit();
+
+ // Remove device (ohci_pci_driver.remove)
+ ohci_pci_driver.remove(dev);
+
+ ExFreePool(dev->slot_name);
+ ExFreePool(dev);
+
+ // Perform some cleanup
+ ohci_hcd_pci_cleanup();
+}
_____
Deleted: trunk/reactos/drivers/usb/miniport/usbohci/ohci.def
--- trunk/reactos/drivers/usb/miniport/usbohci/ohci.def 2005-09-11
09:23:16 UTC (rev 17794)
+++ trunk/reactos/drivers/usb/miniport/usbohci/ohci.def 2005-09-11
11:40:43 UTC (rev 17795)
@@ -1,2 +0,0 @@
-LIBRARY ohci.sys
-EXPORTS
_____
Modified: trunk/reactos/drivers/usb/miniport/usbohci/ohci.h
--- trunk/reactos/drivers/usb/miniport/usbohci/ohci.h 2005-09-11
09:23:16 UTC (rev 17794)
+++ trunk/reactos/drivers/usb/miniport/usbohci/ohci.h 2005-09-11
11:40:43 UTC (rev 17795)
@@ -6,7 +6,16 @@
*
* This file is licenced under the GPL.
*/
-
+
+#include "usbcommon.h"
+#define USB_OHCI_TAG TAG('u','s','b','o')
+
+/* declare basic init functions and structures */
+int ohci_hcd_pci_init(void);
+void ohci_hcd_pci_cleanup(void);
+int STDCALL usb_init(void);
+void STDCALL usb_exit(void);
+
/*
* OHCI Endpoint Descriptor (ED) ... holds TD queue
* See OHCI spec, section 4.2
@@ -245,18 +254,6 @@
#define OHCI_USB_OPER (2 << 6)
#define OHCI_USB_SUSPEND (3 << 6)
-// HCFS itself
-static char *hcfs2string (int state)
-{
- switch (state) {
- case OHCI_USB_RESET: return "reset";
- case OHCI_USB_RESUME: return "resume";
- case OHCI_USB_OPER: return "operational";
- case OHCI_USB_SUSPEND: return "suspend";
- }
- return "?";
-}
-
/*
* HcCommandStatus (cmdstatus) register masks
*/
_____
Deleted: trunk/reactos/drivers/usb/miniport/usbohci/ohci_main.c
--- trunk/reactos/drivers/usb/miniport/usbohci/ohci_main.c
2005-09-11 09:23:16 UTC (rev 17794)
+++ trunk/reactos/drivers/usb/miniport/usbohci/ohci_main.c
2005-09-11 11:40:43 UTC (rev 17795)
@@ -1,666 +0,0 @@
-/*
- ReactOS specific functions for OHCI module
- by Aleksey Bragin (aleksey(a)reactos.com)
- Some parts of code are inspired (or even just copied) from ReactOS
Videoport driver
-*/
-
-#include <ddk/ntddk.h>
-#include <ddk/ntddkbd.h>
-#include <ddk/ntdd8042.h>
-
-#include <debug.h>
-#include "../usb_wrapper.h"
-#include "hcd.h"
-#include "ohci_main.h"
-
-// declare basic init funcs
-void init_wrapper(struct pci_dev *probe_dev);
-int ohci_hcd_pci_init (void);
-void ohci_hcd_pci_cleanup (void);
-int STDCALL usb_init(void);
-void STDCALL usb_exit(void);
-extern struct pci_driver ohci_pci_driver;
-extern const struct pci_device_id pci_ids[];
-
-
-// This should be removed, but for testing purposes it's here
-struct pci_dev *dev;
-//struct pci_device_id *dev_id;
-static bool xbox_workaround=false;
-
-// data for embedded drivers
-CONNECT_DATA KbdClassInformation;
-CONNECT_DATA MouseClassInformation;
-PDEVICE_OBJECT KeyboardFdo = NULL;
-PDEVICE_OBJECT MouseFdo = NULL;
-
-
-#define USB_OHCI_TAG TAG('u','s','b','o')
-
-NTSTATUS AddDevice_Keyboard(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT
pdo)
-{
- UNICODE_STRING DeviceName =
RTL_CONSTANT_STRING(L"\\Device\\KeyboardClass0");
- PDEVICE_OBJECT fdo;
- NTSTATUS Status;
-
- Status = IoCreateDevice(DriverObject,
- 8, // debug
- &DeviceName,
- FILE_DEVICE_KEYBOARD,
- FILE_DEVICE_SECURE_OPEN,
- TRUE,
- &fdo);
-
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("IoCreateDevice for usb keyboard driver
failed\n");
- return Status;
- }
- KeyboardFdo = fdo;
- fdo->Flags &= ~DO_DEVICE_INITIALIZING;
- DPRINT1("Created keyboard fdo: %p\n", fdo);
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS AddDevice_Mouse(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT
pdo)
-{
- UNICODE_STRING DeviceName =
RTL_CONSTANT_STRING(L"\\Device\\PointerClass0");
- PDEVICE_OBJECT fdo;
- NTSTATUS Status;
-
- Status = IoCreateDevice(DriverObject,
- 8, // debug
- &DeviceName,
- FILE_DEVICE_MOUSE,
- FILE_DEVICE_SECURE_OPEN,
- TRUE,
- &fdo);
-
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("IoCreateDevice for usb mouse driver failed\n");
- return Status;
- }
- MouseFdo = fdo;
- fdo->Flags &= ~DO_DEVICE_INITIALIZING;
-
- DPRINT1("Created mouse fdo: %p\n", fdo);
-
- return STATUS_SUCCESS;
-}
-
-
-NTSTATUS STDCALL AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT
pdo)
-{
- PDEVICE_OBJECT fdo;
- NTSTATUS Status;
- WCHAR DeviceBuffer[20];
- UNICODE_STRING DeviceName;
- POHCI_DRIVER_EXTENSION DriverExtension;
- POHCI_DEVICE_EXTENSION DeviceExtension;
- ULONG Size, DeviceNumber;
-
- DPRINT1("ohci: AddDevice called\n");
-
- if (xbox_workaround)
- return STATUS_INSUFFICIENT_RESOURCES; // Fail for any
other host controller than the first
-
- xbox_workaround = true;
-
- // Allocate driver extension now
- DriverExtension = IoGetDriverObjectExtension(DriverObject,
DriverObject);
- if (DriverExtension == NULL)
- {
- Status = IoAllocateDriverObjectExtension(
- DriverObject,
- DriverObject,
- sizeof(OHCI_DRIVER_EXTENSION),
- (PVOID *)&DriverExtension);
-
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("Allocating DriverObjectExtension
failed.\n");
- return Status;
- }
- }
-
- // Create a unicode device name
- DeviceNumber = 0; //TODO: Allocate new device number every time
- swprintf(DeviceBuffer, L"\\Device\\USBFDO-%lu", DeviceNumber);
- RtlInitUnicodeString(&DeviceName, DeviceBuffer);
-
- Status = IoCreateDevice(DriverObject,
- sizeof(OHCI_DEVICE_EXTENSION)/* +
DriverExtension->InitializationData.HwDeviceExtensionSize*/,
- &DeviceName,
-
FILE_DEVICE_CONTROLLER,
- 0,
- FALSE,
- &fdo);
-
- if (!NT_SUCCESS(Status))
- {
- DPRINT("IoCreateDevice call failed with status
0x%08x\n", Status);
- return Status;
- }
-
- // zerofill device extension
- DeviceExtension = (POHCI_DEVICE_EXTENSION)fdo->DeviceExtension;
- RtlZeroMemory(DeviceExtension, sizeof(OHCI_DEVICE_EXTENSION));
- DeviceExtension->NextDeviceObject =
IoAttachDeviceToDeviceStack(fdo, pdo);
-
- fdo->Flags &= ~DO_DEVICE_INITIALIZING;
-
- // Initialize device extension
- DeviceExtension->DeviceNumber = DeviceNumber;
- DeviceExtension->PhysicalDeviceObject = pdo;
- DeviceExtension->FunctionalDeviceObject = fdo;
- DeviceExtension->DriverExtension = DriverExtension;
-
- /* Get bus number from the upper level bus driver. */
- Size = sizeof(ULONG);
- Status = IoGetDeviceProperty(
- pdo,
- DevicePropertyBusNumber,
- Size,
- &DeviceExtension->SystemIoBusNumber,
- &Size);
-
- if (!NT_SUCCESS(Status))
- {
- DPRINT("Couldn't get an information from bus driver.
Panic!!!\n");
- return Status;
- }
-
- DPRINT("Done AddDevice\n");
-
- // create embedded keyboard driver
- Status = AddDevice_Keyboard(DriverObject, pdo);
- Status = AddDevice_Mouse(DriverObject, pdo);
-
- return Status;
-}
-
-
-VOID STDCALL DriverUnload(PDRIVER_OBJECT DriverObject)
-{
- DPRINT1("DriverUnload()\n");
-
- // Exit usb device
- usb_exit();
-
- // Remove device (ohci_pci_driver.remove)
- ohci_pci_driver.remove(dev);
-
- ExFreePool(dev->slot_name);
- ExFreePool(dev);
-
- // Perform some cleanup
- ohci_hcd_pci_cleanup();
-}
-
-void RegisterISR(PDEVICE_OBJECT DeviceObject)
-{
-#if 0
- NTSTATUS Status;
- POHCI_DEVICE_EXTENSION DeviceExtension =
(POHCI_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- /* Connect interrupt and enable them */
- Status = IoConnectInterrupt(
- &DeviceExtension->InterruptObject,
SerialInterruptService,
- DeviceObject, NULL,
- Vector, Dirql, Dirql,
- InterruptMode, ShareInterrupt,
- Affinity, FALSE);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("hci: IoConnectInterrupt() failed with status
0x%08x\n", Status);
- return 1;
- }
-#endif
-}
-
-NTSTATUS
-InitLinuxWrapper(PDEVICE_OBJECT DeviceObject)
-{
- NTSTATUS Status;
- POHCI_DEVICE_EXTENSION DeviceExtension =
(POHCI_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- // Allocate and fill generic linux structs
- dev = ExAllocatePoolWithTag(PagedPool, sizeof(struct pci_dev),
USB_OHCI_TAG);
- dev->irq = DeviceExtension->InterruptVector;
- dev->dev_ext = (PVOID)DeviceExtension;
- dev->dev.dev_ext = (PVOID)DeviceExtension;
- dev->slot_name = ExAllocatePoolWithTag(NonPagedPool, 128,
USB_OHCI_TAG); // 128 max len for slot name
-
- // Init wrapper
- init_wrapper(dev);
-
- strcpy(dev->dev.name, "OpenHCI PCI-USB Controller");
- strcpy(dev->slot_name, "OHCD PCI Slot");
-
- // Init the OHCI HCD. Probe will be called automatically, but
will fail because id=NULL
- Status = ohci_hcd_pci_init();
- //FIXME: Check status returned value
-
- // Init core usb
- usb_init();
-
- // Probe device with real id now
- ohci_pci_driver.probe(dev, pci_ids);
-
- // Register interrupt here
- RegisterISR(DeviceObject);
-
- DPRINT1("InitLinuxWrapper() done\n");
-
- return STATUS_SUCCESS;
-}
-
-NTSTATUS STDCALL
-OHCD_PnPStartDevice(IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
- PDRIVER_OBJECT DriverObject;
- POHCI_DRIVER_EXTENSION DriverExtension;
- POHCI_DEVICE_EXTENSION DeviceExtension;
- PCM_RESOURCE_LIST AllocatedResources;
-
- NTSTATUS Status; // debug
- //LONGLONG delay; // debug
-
- if (DeviceObject == KeyboardFdo || DeviceObject == MouseFdo)
- return STATUS_SUCCESS;
-
- /*
- * Get the initialization data we saved in VideoPortInitialize.
- */
- DriverObject = DeviceObject->DriverObject;
- DriverExtension = IoGetDriverObjectExtension(DriverObject,
DriverObject);
- DeviceExtension =
(POHCI_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- /*
- * Store some resources in the DeviceExtension.
- */
- AllocatedResources =
Stack->Parameters.StartDevice.AllocatedResources;
- if (AllocatedResources != NULL)
- {
- CM_FULL_RESOURCE_DESCRIPTOR *FullList;
- CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor;
- ULONG ResourceCount;
- ULONG ResourceListSize;
-
- /* Save the resource list */
- ResourceCount =
AllocatedResources->List[0].PartialResourceList.Count;
- ResourceListSize =
- FIELD_OFFSET(CM_RESOURCE_LIST,
List[0].PartialResourceList.
- PartialDescriptors[ResourceCount]);
- DeviceExtension->AllocatedResources =
ExAllocatePool(PagedPool, ResourceListSize);
- if (DeviceExtension->AllocatedResources == NULL)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- RtlCopyMemory(DeviceExtension->AllocatedResources,
- AllocatedResources,
- ResourceListSize);
-
- /* Get the interrupt level/vector - needed by
HwFindAdapter sometimes */
- for (FullList = AllocatedResources->List;
- FullList < AllocatedResources->List +
AllocatedResources->Count;
- FullList++)
- {
- /* FIXME: Is this ASSERT ok for
resources from the PNP manager? */
- /*ASSERT(FullList->InterfaceType == PCIBus &&
- FullList->BusNumber ==
DeviceExtension->SystemIoBusNumber &&
- 1 ==
FullList->PartialResourceList.Version &&
- 1 ==
FullList->PartialResourceList.Revision);*/
- for (Descriptor =
FullList->PartialResourceList.PartialDescriptors;
- Descriptor <
FullList->PartialResourceList.PartialDescriptors +
FullList->PartialResourceList.Count;
- Descriptor++)
- {
- if (Descriptor->Type ==
CmResourceTypeInterrupt)
- {
- DeviceExtension->InterruptLevel
= Descriptor->u.Interrupt.Level;
- DeviceExtension->InterruptVector
= Descriptor->u.Interrupt.Vector;
- }
- else if (Descriptor->Type ==
CmResourceTypeMemory)
- {
- DeviceExtension->BaseAddress
= Descriptor->u.Memory.Start;
- DeviceExtension->BaseAddrLength
= Descriptor->u.Memory.Length;
- }
- }
- }
- }
- DPRINT1("Interrupt level: 0x%x Interrupt Vector: 0x%x\n",
- DeviceExtension->InterruptLevel,
- DeviceExtension->InterruptVector);
-
- /*
- * Init wrapper with this object
- */
- //return InitLinuxWrapper(DeviceObject);
-
- // debug wait
- Status = InitLinuxWrapper(DeviceObject);
-
- //delay = -10000000*30; // wait 30 secs
- //KeDelayExecutionThread(KernelMode, FALSE, (LARGE_INTEGER
*)&delay); //wait_us(1);
-
- return Status;
-}
[truncated at 1000 lines; 408 more skipped]