[ros-diffs] [cgutman] 47136: [USBDRIVER] - Fix an off-by-one error in the probing code - Scan all PCI buses instead of just the first two - Fix a horrible bug that resulted in reinitializing EHCI controllers as UHCI controllers which caused a crash on VirtualBox (with _MULTI_UHCI) - Implement support for multiple EHCI controllers and enable support for multiple UHCI controllers (greatly increases compatibility with real hardware because the first controller detected is often internal)
cgutman at svn.reactos.org
cgutman at svn.reactos.org
Sat May 8 23:53:57 CEST 2010
Author: cgutman
Date: Sat May 8 23:53:57 2010
New Revision: 47136
URL: http://svn.reactos.org/svn/reactos?rev=47136&view=rev
Log:
[USBDRIVER]
- Fix an off-by-one error in the probing code
- Scan all PCI buses instead of just the first two
- Fix a horrible bug that resulted in reinitializing EHCI controllers as UHCI controllers which caused a crash on VirtualBox (with _MULTI_UHCI)
- Implement support for multiple EHCI controllers and enable support for multiple UHCI controllers (greatly increases compatibility with real hardware because the first controller detected is often internal)
Modified:
trunk/reactos/drivers/usb/nt4compat/usbdriver/ehci.c
trunk/reactos/drivers/usb/nt4compat/usbdriver/uhci.c
trunk/reactos/drivers/usb/nt4compat/usbdriver/usbdriver.rbuild
Modified: trunk/reactos/drivers/usb/nt4compat/usbdriver/ehci.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/nt4compat/usbdriver/ehci.c?rev=47136&r1=47135&r2=47136&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/nt4compat/usbdriver/ehci.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/nt4compat/usbdriver/ehci.c [iso-8859-1] Sat May 8 23:53:57 2010
@@ -3461,18 +3461,19 @@
PDEVICE_OBJECT pdev;
BYTE buffer[sizeof(PCI_COMMON_CONFIG)];
PEHCI_DEVICE_EXTENSION pdev_ext;
+ LONG count = 0;
slot_num.u.AsULONG = 0;
pci_config = (PPCI_COMMON_CONFIG) buffer;
pdev = NULL;
- //scan the bus to find ehci controller
- for(bus = 0; bus < 3; bus++) /* enum bus0-bus2 */
- {
- for(i = 0; i < PCI_MAX_DEVICES; i++)
+ //scan the PCI buses to find ehci controller
+ for (bus = 0; bus <= PCI_MAX_BRIDGE_NUMBER; bus++) //Yes, it should be <=
+ {
+ for(i = 0; i <= PCI_MAX_DEVICES; i++)
{
slot_num.u.bits.DeviceNumber = i;
- for(j = 0; j < PCI_MAX_FUNCTIONS; j++)
+ for(j = 0; j <= PCI_MAX_FUNCTION; j++)
{
slot_num.u.bits.FunctionNumber = j;
@@ -3490,9 +3491,12 @@
{
//well, we find our usb host controller( EHCI ), create device
pdev = ehci_alloc(drvr_obj, reg_path, ((bus << 8) | (i << 3) | j), dev_mgr);
-
- if (!pdev)
- continue;
+ if (pdev)
+#ifdef _MULTI_EHCI
+ count++;
+#else
+ goto LBL_LOOPOUT;
+#endif
}
}
@@ -3500,6 +3504,11 @@
break;
}
}
+
+#ifndef _MULTI_EHCI
+LBL_LOOPOUT:
+#endif
+ DbgPrint("Found %d EHCI controllers\n", count);
if (pdev)
{
Modified: trunk/reactos/drivers/usb/nt4compat/usbdriver/uhci.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/nt4compat/usbdriver/uhci.c?rev=47136&r1=47135&r2=47136&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/nt4compat/usbdriver/uhci.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/nt4compat/usbdriver/uhci.c [iso-8859-1] Sat May 8 23:53:57 2010
@@ -626,13 +626,13 @@
count = 0;
pdev = NULL;
- //scan the bus to find uhci controller
- for(bus = 0; bus < 3; bus++) /* enum bus0-bus2 */
- {
- for(i = 0; i < PCI_MAX_DEVICES; i++)
+ //scan the PCI buses to find uhci controller
+ for (bus = 0; bus <= PCI_MAX_BRIDGE_NUMBER; bus++)
+ {
+ for(i = 0; i <= PCI_MAX_DEVICES; i++)
{
slot_num.u.bits.DeviceNumber = i;
- for(j = 0; j < PCI_MAX_FUNCTIONS; j++)
+ for(j = 0; j <= PCI_MAX_FUNCTION; j++)
{
slot_num.u.bits.FunctionNumber = j;
@@ -645,18 +645,15 @@
if (ret == 2) /*no device on the slot */
break;
- if (pci_config->BaseClass == 0x0c && pci_config->SubClass == 0x03)
+ if (pci_config->BaseClass == 0x0c && pci_config->SubClass == 0x03 &&
+ pci_config->ProgIf == 0x00)
{
// well, we find our usb host controller, create device
-#ifdef _MULTI_UHCI
- {
- pdev = uhci_alloc(drvr_obj, reg_path, ((bus << 8) | (i << 3) | j), dev_mgr);
- if (pdev)
- count++;
- }
-#else
pdev = uhci_alloc(drvr_obj, reg_path, ((bus << 8) | (i << 3) | j), dev_mgr);
if (pdev)
+#ifdef _MULTI_UHCI
+ count++;
+#else
goto LBL_LOOPOUT;
#endif
}
@@ -669,6 +666,8 @@
#ifndef _MULTI_UHCI
LBL_LOOPOUT:
#endif
+ DbgPrint("Found %d UHCI controllers\n", count);
+
if (pdev)
{
pdev_ext = pdev->DeviceExtension;
Modified: trunk/reactos/drivers/usb/nt4compat/usbdriver/usbdriver.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/nt4compat/usbdriver/usbdriver.rbuild?rev=47136&r1=47135&r2=47136&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/nt4compat/usbdriver/usbdriver.rbuild [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/nt4compat/usbdriver/usbdriver.rbuild [iso-8859-1] Sat May 8 23:53:57 2010
@@ -2,6 +2,8 @@
<!DOCTYPE module SYSTEM "../../../../tools/rbuild/project.dtd">
<module name="usbdriver" type="kernelmodedriver" installbase="system32/drivers" installname="usbdriver.sys">
<define name="INCLUDE_EHCI" />
+ <define name="_MULTI_UHCI" />
+ <define name="_MULTI_EHCI" />
<define name="_X86" />
<include base="usbdriver">.</include>
<library>ntoskrnl</library>
More information about the Ros-diffs
mailing list