Author: fireball
Date: Tue Nov 20 15:58:23 2007
New Revision: 30593
URL:
http://svn.reactos.org/svn/reactos?rev=30593&view=rev
Log:
- Implement more OHCI helper routines.
Modified:
trunk/reactos/drivers/usb/nt4compat/usbdriver/ohci.c
trunk/reactos/drivers/usb/nt4compat/usbdriver/ohci.h
Modified: trunk/reactos/drivers/usb/nt4compat/usbdriver/ohci.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/nt4compat/usbd…
==============================================================================
--- trunk/reactos/drivers/usb/nt4compat/usbdriver/ohci.c (original)
+++ trunk/reactos/drivers/usb/nt4compat/usbdriver/ohci.c Tue Nov 20 15:58:23 2007
@@ -21,6 +21,7 @@
*/
#include "usbdriver.h"
+#include "ehci.h"
#include "ohci.h"
PDEVICE_OBJECT ohci_alloc(PDRIVER_OBJECT drvr_obj, PUNICODE_STRING reg_path,
@@ -29,14 +30,20 @@
//static VOID ohci_stop(PEHCI_DEV ehci);
PDEVICE_OBJECT ohci_probe(PDRIVER_OBJECT drvr_obj, PUNICODE_STRING reg_path,
PUSB_DEV_MANAGER dev_mgr);
-//PDEVICE_OBJECT ohci_create_device(PDRIVER_OBJECT drvr_obj, PUSB_DEV_MANAGER dev_mgr);
+PDEVICE_OBJECT ohci_create_device(PDRIVER_OBJECT drvr_obj, PUSB_DEV_MANAGER dev_mgr);
//BOOLEAN ohci_delete_device(PDEVICE_OBJECT pdev);
//VOID ohci_get_capabilities(PEHCI_DEV ehci, PBYTE base);
//BOOLEAN NTAPI ohci_isr(PKINTERRUPT interrupt, PVOID context);
//BOOLEAN ohci_start(PHCD hcd);
+VOID ohci_init_hcd_interface(POHCI_DEV ohci);
+
+// shared with EHCI
+NTSTATUS ehci_dispatch_irp(IN PDEVICE_OBJECT DeviceObject, IN PIRP irp);
+VOID ehci_set_dev_mgr(PHCD hcd, PUSB_DEV_MANAGER dev_mgr);
+VOID ehci_set_id(PHCD hcd, UCHAR id);
+BOOLEAN NTAPI ehci_cal_cpu_freq(PVOID context);
extern USB_DEV_MANAGER g_dev_mgr;
-
PDEVICE_OBJECT ohci_probe(PDRIVER_OBJECT drvr_obj, PUNICODE_STRING reg_path,
PUSB_DEV_MANAGER dev_mgr)
@@ -91,7 +98,7 @@
if (pdev_ext)
{
// acquire higher irql to eliminate pre-empty
- //KeSynchronizeExecution(pdev_ext->ehci_int, ehci_cal_cpu_freq, NULL);
+ KeSynchronizeExecution(pdev_ext->ohci_int, ehci_cal_cpu_freq, NULL);
}
}
return NULL;
@@ -100,25 +107,33 @@
PDEVICE_OBJECT
ohci_alloc(PDRIVER_OBJECT drvr_obj, PUNICODE_STRING reg_path, ULONG bus_addr,
PUSB_DEV_MANAGER dev_mgr)
{
- //LONG frd_num, prd_num;
+ LONG frd_num, prd_num;
PDEVICE_OBJECT pdev = NULL;
- //POHCI_DEVICE_EXTENSION pdev_ext;
- //ULONG vector, addr_space;
+ POHCI_DEVICE_EXTENSION pdev_ext;
+ ULONG addr_space;
+ //ULONG vector;
LONG bus;
//KIRQL irql;
//KAFFINITY affinity;
DEVICE_DESCRIPTION dev_desc;
- //CM_PARTIAL_RESOURCE_DESCRIPTOR *pprd;
+ CM_PARTIAL_RESOURCE_DESCRIPTOR *pprd;
PCI_SLOT_NUMBER slot_num;
- //NTSTATUS status;
-
+ NTSTATUS status;
+
+ pdev = ohci_create_device(drvr_obj, dev_mgr);
+
+ if (pdev == NULL)
+ return NULL;
+
+ pdev_ext = pdev->DeviceExtension;
+
+ pdev_ext->pci_addr = bus_addr;
bus = (bus_addr >> 8);
slot_num.u.AsULONG = 0;
slot_num.u.bits.DeviceNumber = ((bus_addr & 0xff) >> 3);
slot_num.u.bits.FunctionNumber = (bus_addr & 0x07);
-
//now create adapter object
RtlZeroMemory(&dev_desc, sizeof(dev_desc));
@@ -135,7 +150,7 @@
ohci_alloc(): bus=0x%x, bus_addr=0x%x \n \
ohci_alloc(): slot_num=0x%x \n \
", (DWORD) reg_path, (DWORD) bus, (DWORD) bus_addr, (DWORD)
slot_num.u.AsULONG);
-#if 0
+
//let's allocate resources for this device
DbgPrint("ohci_alloc(): about to assign slot res\n");
if ((status = HalAssignSlotResources(reg_path, NULL, //no class name yet
@@ -144,9 +159,11 @@
bus, slot_num.u.AsULONG,
&pdev_ext->res_list)) != STATUS_SUCCESS)
{
DbgPrint("ohci_alloc(): error assign slot res, 0x%x\n", status);
+#if 0
release_adapter(pdev_ext->padapter);
pdev_ext->padapter = NULL;
ohci_delete_device(pdev);
+#endif
return NULL;
}
@@ -176,44 +193,48 @@
//for port, translate them to system address
addr_space = 0;
if (HalTranslateBusAddress(PCIBus, bus, pdev_ext->res_port.Start, &addr_space,
//io space
- &pdev_ext->ehci->ehci_reg_base) != (BOOLEAN)
TRUE)
- {
- DbgPrint("ehci_alloc(): error, can not translate bus address\n");
+ &pdev_ext->ohci->ohci_reg_base) != (BOOLEAN)
TRUE)
+ {
+ DbgPrint("ohci_alloc(): error, can not translate bus address\n");
+#if 0
release_adapter(pdev_ext->padapter);
pdev_ext->padapter = NULL;
ehci_delete_device(pdev);
- return NULL;
- }
-
- DbgPrint("ehci_alloc(): address space=0x%x\n, reg_base=0x%x\n",
- addr_space, pdev_ext->ehci->ehci_reg_base.u.LowPart);
+#endif
+ return NULL;
+ }
+
+ DbgPrint("ohci_alloc(): address space=0x%x\n, reg_base=0x%x\n",
+ addr_space, pdev_ext->ohci->ohci_reg_base.u.LowPart);
if (addr_space == 0)
{
//port has been mapped to memory space
- pdev_ext->ehci->port_mapped = TRUE;
- pdev_ext->ehci->port_base = (PBYTE)
MmMapIoSpace(pdev_ext->ehci->ehci_reg_base,
+ pdev_ext->ohci->port_mapped = TRUE;
+ pdev_ext->ohci->port_base = (PBYTE)
MmMapIoSpace(pdev_ext->ohci->ohci_reg_base,
pdev_ext->res_port.Length,
FALSE);
//fatal error can not map the registers
- if (pdev_ext->ehci->port_base == NULL)
+ if (pdev_ext->ohci->port_base == NULL)
{
+#if 0
release_adapter(pdev_ext->padapter);
pdev_ext->padapter = NULL;
ehci_delete_device(pdev);
+#endif
return NULL;
}
}
else
{
//io space
- pdev_ext->ehci->port_mapped = FALSE;
- pdev_ext->ehci->port_base = (PBYTE)
pdev_ext->ehci->ehci_reg_base.LowPart;
- }
-
- //before we connect the interrupt, we have to init ehci
- pdev_ext->ehci->pdev_ext = pdev_ext;
-
+ pdev_ext->ohci->port_mapped = FALSE;
+ pdev_ext->ohci->port_base = (PBYTE)
pdev_ext->ohci->ohci_reg_base.LowPart;
+ }
+
+ //before we connect the interrupt, we have to init ohci
+ pdev_ext->ohci->pdev_ext = pdev_ext;
+#if 0
//init ehci_caps
// i = ( ( PEHCI_HCS_CONTENT )( &pdev_ext->ehci->ehci_caps.hcs_params )
)->length;
@@ -266,6 +287,99 @@
PDEVICE_OBJECT
ohci_create_device(PDRIVER_OBJECT drvr_obj, PUSB_DEV_MANAGER dev_mgr)
{
- return NULL;
+ NTSTATUS status;
+ PDEVICE_OBJECT pdev;
+ POHCI_DEVICE_EXTENSION pdev_ext;
+
+ UNICODE_STRING dev_name;
+ UNICODE_STRING symb_name;
+
+ STRING string, another_string;
+ CHAR str_dev_name[64], str_symb_name[64];
+ UCHAR hcd_id;
+
+ if (drvr_obj == NULL)
+ return NULL;
+
+ //note: hcd count wont increment till the hcd is registered in dev_mgr
+ sprintf(str_dev_name, "%s%d", OHCI_DEVICE_NAME, dev_mgr->hcd_count);
+ sprintf(str_symb_name, "%s%d", OHCI_DOS_DEVICE_NAME,
dev_mgr->hcd_count);
+
+ RtlInitString(&string, str_dev_name);
+ RtlAnsiStringToUnicodeString(&dev_name, &string, TRUE);
+
+ pdev = NULL;
+ status = IoCreateDevice(drvr_obj,
+ sizeof(OHCI_DEVICE_EXTENSION) + sizeof(OHCI_DEV),
+ &dev_name, FILE_OHCI_DEV_TYPE, 0, FALSE, &pdev);
+
+ if (status != STATUS_SUCCESS || pdev == NULL)
+ {
+ RtlFreeUnicodeString(&dev_name);
+ ehci_dbg_print(DBGLVL_MAXIMUM, ("ohci_create_device(): error create device
0x%x\n", status));
+ return NULL;
+ }
+
+ pdev_ext = pdev->DeviceExtension;
+ RtlZeroMemory(pdev_ext, sizeof(OHCI_DEVICE_EXTENSION) + sizeof(OHCI_DEV));
+
+ pdev_ext->dev_ext_hdr.type = NTDEV_TYPE_HCD;
+ pdev_ext->dev_ext_hdr.dispatch = ehci_dispatch_irp;
+ pdev_ext->dev_ext_hdr.start_io = NULL; //we do not support startio
+ pdev_ext->dev_ext_hdr.dev_mgr = dev_mgr;
+
+ pdev_ext->pdev_obj = pdev;
+ pdev_ext->pdrvr_obj = drvr_obj;
+
+ pdev_ext->ohci = (POHCI_DEV) & (pdev_ext[1]);
+
+ RtlInitString(&another_string, str_symb_name);
+ RtlAnsiStringToUnicodeString(&symb_name, &another_string, TRUE);
+ //RtlInitUnicodeString( &symb_name, DOS_DEVICE_NAME );
+
+ IoCreateSymbolicLink(&symb_name, &dev_name);
+
+ ehci_dbg_print(DBGLVL_MAXIMUM,
+ ("ohci_create_device(): dev=0x%x\n, pdev_ext= 0x%x, ehci=0x%x,
dev_mgr=0x%x\n", pdev,
+ pdev_ext, pdev_ext->ohci, dev_mgr));
+
+ RtlFreeUnicodeString(&dev_name);
+ RtlFreeUnicodeString(&symb_name);
+
+ //register with dev_mgr though it is not initilized
+ ohci_init_hcd_interface(pdev_ext->ohci);
+ hcd_id = dev_mgr_register_hcd(dev_mgr, &pdev_ext->ohci->hcd_interf);
+
+ pdev_ext->ohci->hcd_interf.hcd_set_id(&pdev_ext->ohci->hcd_interf,
hcd_id);
+
pdev_ext->ohci->hcd_interf.hcd_set_dev_mgr(&pdev_ext->ohci->hcd_interf,
dev_mgr);
+
+ return pdev;
}
+VOID
+ohci_init_hcd_interface(POHCI_DEV ohci)
+{
+ ohci->hcd_interf.hcd_set_dev_mgr = ehci_set_dev_mgr;
+#if 0
+ ohci->hcd_interf.hcd_get_dev_mgr = ehci_get_dev_mgr;
+ ohci->hcd_interf.hcd_get_type = ehci_get_type;
+#endif
+ ohci->hcd_interf.hcd_set_id = ehci_set_id;
+#if 0
+ ohci->hcd_interf.hcd_get_id = ehci_get_id;
+ ohci->hcd_interf.hcd_alloc_addr = ehci_alloc_addr;
+ ohci->hcd_interf.hcd_free_addr = ehci_free_addr;
+ ohci->hcd_interf.hcd_submit_urb = ehci_submit_urb2;
+ ohci->hcd_interf.hcd_generic_urb_completion = ehci_generic_urb_completion;
+ ohci->hcd_interf.hcd_get_root_hub = ehci_get_root_hub;
+ ohci->hcd_interf.hcd_set_root_hub = ehci_set_root_hub;
+ ohci->hcd_interf.hcd_remove_device = ehci_remove_device2;
+ ohci->hcd_interf.hcd_rh_reset_port = ehci_rh_reset_port;
+ ohci->hcd_interf.hcd_release = ehci_hcd_release;
+ ohci->hcd_interf.hcd_cancel_urb = ehci_cancel_urb2;
+ ohci->hcd_interf.hcd_start = ehci_start;
+ ohci->hcd_interf.hcd_dispatch = ehci_hcd_dispatch;
+#endif
+ ohci->hcd_interf.flags = HCD_TYPE_OHCI; //hcd types | hcd id
+}
+
Modified: trunk/reactos/drivers/usb/nt4compat/usbdriver/ohci.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/nt4compat/usbd…
==============================================================================
--- trunk/reactos/drivers/usb/nt4compat/usbdriver/ohci.h (original)
+++ trunk/reactos/drivers/usb/nt4compat/usbdriver/ohci.h Tue Nov 20 15:58:23 2007
@@ -18,9 +18,20 @@
#ifndef __OHCI_H__
#define __OHCI_H__
+#define OHCI_DEVICE_NAME "\\Device\\OHCI"
+#define OHCI_DOS_DEVICE_NAME "\\DosDevices\\OHCI"
+
typedef struct _OHCI_DEV
{
HCD hcd_interf;
+
+ PHYSICAL_ADDRESS ohci_reg_base; // io space
+ BOOLEAN port_mapped;
+ PBYTE port_base; // note: added by ehci_caps.length, operational regs base
addr, not the actural base
+
+ KTIMER reset_timer; //used to reset the host controller
+ struct _OHCI_DEVICE_EXTENSION *pdev_ext;
+ PUSB_DEV root_hub; //root hub
} OHCI_DEV, *POHCI_DEV;
typedef struct _OHCI_DEVICE_EXTENSION
@@ -30,11 +41,20 @@
PDRIVER_OBJECT pdrvr_obj;
POHCI_DEV ohci;
+ //device resources
+ PADAPTER_OBJECT padapter;
+ ULONG map_regs;
+ PCM_RESOURCE_LIST res_list;
ULONG pci_addr; // bus number | slot number | funciton number
UHCI_INTERRUPT res_interrupt;
+ union
+ {
+ UHCI_PORT res_port;
+ EHCI_MEMORY res_memory;
+ };
- PKINTERRUPT ohci_int;
- KDPC ohci_dpc;
+ PKINTERRUPT ohci_int;
+ KDPC ohci_dpc;
} OHCI_DEVICE_EXTENSION, *POHCI_DEVICE_EXTENSION;