Timer modifications, turning on debug messages, implementing more functions (but spinlocks are disabled now).
Now it detects attached device(s) and show info in debug messages.
Modified: trunk/reactos/drivers/usb/cromwell/core/hcd.c
Modified: trunk/reactos/drivers/usb/cromwell/core/hub.c
Modified: trunk/reactos/drivers/usb/cromwell/core/message.c
Modified: trunk/reactos/drivers/usb/cromwell/core/urb.c
Modified: trunk/reactos/drivers/usb/cromwell/core/usb.c
Modified: trunk/reactos/drivers/usb/cromwell/host/ohci_main.c
Modified: trunk/reactos/drivers/usb/cromwell/linux/linux_wrapper.h
Modified: trunk/reactos/drivers/usb/cromwell/sys/linuxwrapper.c

Modified: trunk/reactos/drivers/usb/cromwell/core/hcd.c
--- trunk/reactos/drivers/usb/cromwell/core/hcd.c	2005-07-27 13:18:11 UTC (rev 16799)
+++ trunk/reactos/drivers/usb/cromwell/core/hcd.c	2005-07-27 14:57:33 UTC (rev 16800)
@@ -100,7 +100,7 @@
 EXPORT_SYMBOL_GPL (usb_bus_list_lock);
 
 /* used when updating hcd data */
-static spinlock_t hcd_data_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t hcd_data_lock;// = SPIN_LOCK_UNLOCKED;
 
 /*-------------------------------------------------------------------------*/
 
@@ -476,7 +476,7 @@
 	hcd->rh_timer.function = rh_report_status;
 	hcd->rh_timer.data = (unsigned long) urb;
 	/* USB 2.0 spec says 256msec; this is close enough */
-	hcd->rh_timer.expires = jiffies + HZ/4;
+	hcd->rh_timer.expires = HZ/4;
 	add_timer (&hcd->rh_timer);
 	urb->hcpriv = hcd;	/* nonzero to indicate it's queued */
 	return 0;
@@ -515,7 +515,7 @@
 		urb->status = 0;
 		urb->hcpriv = 0;
 	} else
-		mod_timer (&hcd->rh_timer, jiffies + HZ/4);
+		mod_timer (&hcd->rh_timer, HZ/4);
 	spin_unlock (&hcd_data_lock);
 	spin_unlock (&urb->lock);
 
@@ -982,7 +982,7 @@
 
 	if (!hcd || !dev)
 		return -ENODEV;
-//	printk("submit_urb %p, # %i, t %i\n",urb,urb->dev->devnum,usb_pipetype(urb->pipe));
+	printk("submit_urb %p, # %i, t %i\n",urb,urb->dev->devnum,usb_pipetype(urb->pipe));
 	/*
 	 * FIXME:  make urb timeouts be generic, keeping the HCD cores
 	 * as simple as possible.
@@ -1053,10 +1053,12 @@
 
 	status = hcd->driver->urb_enqueue (hcd, urb, mem_flags);
 done:
+
 	if (status) {
 		usb_put_urb (urb);
 		urb_unlink (urb);
 	}
+
 	return status;
 }
 

Modified: trunk/reactos/drivers/usb/cromwell/core/hub.c
--- trunk/reactos/drivers/usb/cromwell/core/hub.c	2005-07-27 13:18:11 UTC (rev 16799)
+++ trunk/reactos/drivers/usb/cromwell/core/hub.c	2005-07-27 14:57:33 UTC (rev 16800)
@@ -42,7 +42,7 @@
 #endif
 
 /* Wakes up khubd */
-//static spinlock_t hub_event_lock = SPIN_LOCK_UNLOCKED;
+static spinlock_t hub_event_lock;
 //static DECLARE_MUTEX(usb_address0_sem);
 
 static LIST_HEAD(hub_event_list);	/* List of hubs needing servicing */
@@ -141,13 +141,24 @@
 	case -ECONNRESET:	/* async unlink */
 	case -ESHUTDOWN:	/* hardware going away */
 		return;
-
+	case -EOVERFLOW:
+		if (hub->RestCounter>0) {
+		// we already resetted one time ...
+			hub->error = 0;
+			hub->nerrors = 0;		
+			break;
+		}
+		hub->RestCounter++;
+		
 	default:		/* presumably an error */
 		/* Cause a hub reset after 10 consecutive errors */
+		//printe("hub_irq got ...: error %d URB: %d",hub->error,urb->status);
+		
 		dev_dbg (&hub->intf->dev, "transfer --> %d\n", urb->status);
 		if ((++hub->nerrors < 10) || hub->error)
 			goto resubmit;
 		hub->error = urb->status;
+
 		/* FALL THROUGH */
 	
 	/* let khubd handle things */
@@ -155,6 +166,7 @@
 		break;
 	}
 
+
 	hub->nerrors = 0;
 
 	/* Something happened, let khubd figure it out */
@@ -269,17 +281,40 @@
 {
 	struct usb_device *dev;
 	int i;
+	int DelayPerPort;
+	int DelayAfterPort;
+	
+	DelayAfterPort = hub->descriptor->bPwrOn2PwrGood * 2;
+	DelayPerPort = 0;
+	
+	switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_LPSM) {
+		case 0x00:
+			DelayAfterPort = hub->descriptor->bPwrOn2PwrGood * 2;
+			DelayPerPort = 0;
+			break;
+		case 0x01:
+			DelayAfterPort = hub->descriptor->bPwrOn2PwrGood;
+			DelayPerPort = hub->descriptor->bPwrOn2PwrGood /4;
+			break;
+		case 0x02:
+		case 0x03:
+			//dev_dbg(hub_dev, "unknown reserved power switching mode\n");
+			break;
+	}
 
+
 	/* Enable power to the ports */
 	dev_dbg(hubdev(interface_to_usbdev(hub->intf)),
 		"enabling power on all ports\n");
 	dev = interface_to_usbdev(hub->intf);
 
-	for (i = 0; i < hub->descriptor->bNbrPorts; i++)
+	for (i = 0; i < hub->descriptor->bNbrPorts; i++) {
 		set_port_feature(dev, i + 1, USB_PORT_FEAT_POWER);
+		wait_ms(DelayPerPort);
+	}
 
 	/* Wait for power to be enabled */
-	wait_ms(hub->descriptor->bPwrOn2PwrGood * 2);
+	wait_ms(DelayAfterPort);
 }
 
 static int hub_hub_status(struct usb_hub *hub,
@@ -435,6 +470,9 @@
 	    (hub->descriptor->wHubCharacteristics & HUB_CHAR_PORTIND)
 	    	? "" : "not");
 
+	if (hub->descriptor->bPwrOn2PwrGood<3) hub->descriptor->bPwrOn2PwrGood = 3;
+	if (hub->descriptor->bPwrOn2PwrGood>20) hub->descriptor->bPwrOn2PwrGood = 20;
+
 	dev_dbg(hub_dev, "power on to power good time: %dms\n",
 		hub->descriptor->bPwrOn2PwrGood * 2);
 	dev_dbg(hub_dev, "hub controller current requirement: %dmA\n",
@@ -560,27 +598,31 @@
 	if ((desc->desc.bInterfaceSubClass != 0) &&
 	    (desc->desc.bInterfaceSubClass != 1)) {
 descriptor_error:
+		desc->desc.bInterfaceSubClass =0;
 		dev_err (&intf->dev, "bad descriptor, ignoring hub\n");
-		return -EIO;
+		//return -EIO;
 	}
 
 	/* Multiple endpoints? What kind of mutant ninja-hub is this? */
 	if (desc->desc.bNumEndpoints != 1) {
-		goto descriptor_error;
+		desc->desc.bNumEndpoints = 1;
+		//goto descriptor_error;
 	}
 
 	endpoint = &desc->endpoint[0].desc;
 
 	/* Output endpoint? Curiouser and curiouser.. */
 	if (!(endpoint->bEndpointAddress & USB_DIR_IN)) {
-		goto descriptor_error;
+		//goto descriptor_error;
+		endpoint->bEndpointAddress |= USB_DIR_IN;
 	}
 
 	/* If it's not an interrupt endpoint, we'd better punt! */
 	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
 			!= USB_ENDPOINT_XFER_INT) {
-		goto descriptor_error;
-		return -EIO;
+			endpoint->bmAttributes	|= USB_ENDPOINT_XFER_INT;
+		//goto descriptor_error;
+		//return -EIO;
 	}
 
 	/* We found a hub */
@@ -594,6 +636,8 @@
 
 	memset(hub, 0, sizeof(*hub));
 
+	hub->RestCounter = 0;
+
 	INIT_LIST_HEAD(&hub->event_list);
 	hub->intf = intf;
 	init_MUTEX(&hub->khubd_sem);
@@ -606,12 +650,13 @@
 
 	usb_set_intfdata (intf, hub);
 
-	if (hub_configure(hub, endpoint) >= 0) {
+	if (hub_configure(hub, endpoint) >= 0)
+	{
 		strcpy (intf->dev.name, "Hub");
 		return 0;
 	}
 
-	hub_disconnect (intf);
+	//hub_disconnect (intf);
 	return -ENODEV;
 }
 
@@ -703,6 +748,9 @@
 	struct usb_hub *hub = usb_get_intfdata (dev->actconfig->interface);
 	int ret;
 
+	if (!hub)
+		return -ENODEV;
+
 	ret = get_port_status(dev, port + 1, &hub->status->port);
         if (ret < 0) {
 		dev_err (hubdev (dev),
@@ -717,9 +765,10 @@
 }
 
 #define HUB_RESET_TRIES		5
-#define HUB_PROBE_TRIES		2
+#define HUB_PROBE_TRIES		5
+#define HUB_ROOT_RESET_TIME	40
 #define HUB_SHORT_RESET_TIME	10
-#define HUB_LONG_RESET_TIME	200
+#define HUB_LONG_RESET_TIME	70
 #define HUB_RESET_TIMEOUT	500
 
 /* return: -1 on error, 0 on success, 1 on disconnect.  */
@@ -835,8 +884,8 @@
  */
 
 #define HUB_DEBOUNCE_TIMEOUT	400
-#define HUB_DEBOUNCE_STEP	 25
-#define HUB_DEBOUNCE_STABLE	  4
+#define HUB_DEBOUNCE_STEP	 5
+#define HUB_DEBOUNCE_STABLE	  3
 
 /* return: -1 on error, 0 on success, 1 on disconnect.  */
 static int hub_port_debounce(struct usb_device *hub, int port)
@@ -885,7 +934,11 @@
 	struct usb_device *dev;
 	unsigned int delay = HUB_SHORT_RESET_TIME;
 	int i;
-
+	int DevcoosenAdress = 0;
+	
+	//printe("port %d, status %x, change %x,\n",port + 1, portstatus, portchange);
+		
+		
 	dev_dbg (&hubstate->intf->dev,
 		"port %d, status %x, change %x, %s\n",
 		port + 1, portstatus, portchange, portspeed (portstatus));
@@ -909,10 +962,17 @@
 		dev_err (&hubstate->intf->dev,
 			"connect-debounce failed, port %d disabled\n",
 			port+1);
+		//printe("connect-debounce failed, port %d disabled\n",	port+1);
 		hub_port_disable(hub, port);
 		return;
 	}
 
+	/* root hub ports have a slightly longer reset period
+	 * (from USB 2.0 spec, section 7.1.7.5)
+	 */
+	if (!hub->parent)
+		delay = HUB_ROOT_RESET_TIME;
+		
 	/* Some low speed devices have problems with the quick delay, so */
 	/*  be a bit pessimistic with those devices. RHbug #23670 */
 	if (portstatus & USB_PORT_STAT_LOW_SPEED)
@@ -932,7 +992,7 @@
 			break;
 		}
 
-		hub->children[port] = dev;
+		
 		dev->state = USB_STATE_POWERED;
 
 		/* Reset the device, and detect its speed */
@@ -942,8 +1002,12 @@
 		}
 
 		/* Find a new address for it */
-		usb_connect(dev);
-
+		if (DevcoosenAdress==0) {
+			usb_choose_address(dev);
+			DevcoosenAdress = dev->devnum;
+		}
+		dev->devnum = DevcoosenAdress ;
+		
 		/* Set up TT records, if needed  */
 		if (hub->tt) {
 			dev->tt = hub->tt;
@@ -985,8 +1049,10 @@
 		dev->dev.parent = dev->parent->dev.parent->parent;
 
 		/* Run it through the hoops (find a driver, etc) */
-		if (!usb_new_device(dev, &hub->dev))
+		if (!usb_new_device(dev, &hub->dev)) {
+			hub->children[port] = dev;
 			goto done;
+		}
 
 		/* Free the configuration if there was an error */
 		usb_put_dev(dev);
@@ -995,7 +1061,7 @@
 		delay = HUB_LONG_RESET_TIME;
 	}
 
-	hub->children[port] = NULL;
+
 	hub_port_disable(hub, port);
 done:
 	up(&usb_address0_sem);
@@ -1149,34 +1215,39 @@
 
 	daemonize("khubd");
 	allow_signal(SIGKILL);
+
+	// Initialize khubd spinlock
+	KeInitializeSpinLock((PKSPIN_LOCK)&hub_event_lock);
+
 	/* Send me a signal to get me die (for debugging) */
 	do {
+		LARGE_INTEGER delay;
 
 		/* The following is just for debug */
 		inc_jiffies(1);
         do_all_timers();
         handle_irqs(-1);
 		/* End of debug hack*/
-
 		hub_events();
-
 		/* The following is just for debug */
         handle_irqs(-1);
 		/* End of debug hack*/
 
-
 		//FIXME: Correct this
 		//wait_event_interruptible(khubd_wait, !list_empty(&hub_event_list)); // interruptable_sleep_on analog - below
 		//while (!list_empty(&hub_event_list)) {
 		//	interruptible_sleep_on(&khubd_wait);
 		//}
 
+		delay.QuadPart = -10000*100; // convert to 100ns units
+		KeDelayExecutionThread(KernelMode, FALSE, &delay); //wait_us(1);
+
 		if (current->flags & PF_FREEZE)
 			refrigerator(PF_IOTHREAD);
 
 	} while (!signal_pending(current));
 
-//	dbg("hub_thread exiting");
+	dbg("hub_thread exiting");
 	complete_and_exit(&khubd_exited, 0);
 }
 
@@ -1361,20 +1432,24 @@
 			return 1;
 		}
 
-		dev->actconfig = dev->config;
-		usb_set_maxpacket(dev);
+		usb_set_configuration(dev, dev->config[0].desc.bConfigurationValue);
 
+
 		return 1;
 	}
 
 	kfree(descriptor);
 
-	ret = usb_set_configuration(dev, dev->actconfig->desc.bConfigurationValue);
+	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
+			USB_REQ_SET_CONFIGURATION, 0,
+			dev->actconfig->desc.bConfigurationValue, 0,
+			NULL, 0, HZ * USB_CTRL_SET_TIMEOUT);
 	if (ret < 0) {
 		err("failed to set dev %s active configuration (error=%d)",
 			dev->devpath, ret);
 		return ret;
 	}
+	dev->state = USB_STATE_CONFIGURED;
 
 	for (i = 0; i < dev->actconfig->desc.bNumInterfaces; i++) {
 		struct usb_interface *intf = &dev->actconfig->interface[i];

Modified: trunk/reactos/drivers/usb/cromwell/core/message.c
--- trunk/reactos/drivers/usb/cromwell/core/message.c	2005-07-27 13:18:11 UTC (rev 16799)
+++ trunk/reactos/drivers/usb/cromwell/core/message.c	2005-07-27 14:57:33 UTC (rev 16800)
@@ -40,6 +40,8 @@
 	struct usb_api_data awd;
 	int status;
 
+	printk("usb_start_wait_urb(): urb devnum=%d, timeout=%d, urb->actual_length=%d\n", urb->dev->devnum, timeout, urb->actual_length);
+
 	init_waitqueue_head((PKEVENT)&awd.wqh); 	
 	awd.done = 0;
 
@@ -48,6 +50,7 @@
 
 	urb->context = &awd;
 	status = usb_submit_urb(urb, GFP_ATOMIC);
+
 	if (status) {
 		// something went wrong
 		usb_free_urb(urb);
@@ -55,7 +58,7 @@
 		remove_wait_queue(&awd.wqh, &wait);
 		return status;
 	}
-	
+	printk("TRACE 3.1, timeout=%d, awd.done=%d\n", timeout, awd.done);
 	while (timeout && !awd.done)
 	{		
 		timeout = schedule_timeout(timeout);
@@ -84,6 +87,7 @@
 		*actual_length = urb->actual_length;
 
 	usb_free_urb(urb);
+
   	return status;
 }
 
@@ -152,12 +156,10 @@
 	dr->wIndex = cpu_to_le16p(&index);
 	dr->wLength = cpu_to_le16p(&size);
 
-	//dbg("usb_control_msg");	
+	printk("usb_control_msg: devnum=%d, size=%d, timeout=%d\n", dev->devnum, size, timeout);
 
 	ret = usb_internal_control_msg(dev, pipe, dr, data, size, timeout);
-
 	kfree(dr);
-
 	return ret;
 }
 

Modified: trunk/reactos/drivers/usb/cromwell/core/urb.c
--- trunk/reactos/drivers/usb/cromwell/core/urb.c	2005-07-27 13:18:11 UTC (rev 16799)
+++ trunk/reactos/drivers/usb/cromwell/core/urb.c	2005-07-27 14:57:33 UTC (rev 16800)
@@ -201,8 +201,8 @@
 	struct usb_device	*dev;
 	struct usb_operations	*op;
 	int			is_out;
-//	printk("sub dev %p bus %p num %i op %p sub %p\n",
-//	       urb->dev, urb->dev->bus,urb->dev->devnum,urb->dev->bus->op, urb->dev->bus->op->submit_urb);
+	printk("sub dev %p bus %p num %i op %p sub %p\n",
+	       urb->dev, urb->dev->bus,urb->dev->devnum,urb->dev->bus->op, urb->dev->bus->op->submit_urb);
 	if (!urb || urb->hcpriv || !urb->complete)
 		return -EINVAL;
 	if (!(dev = urb->dev) ||

Modified: trunk/reactos/drivers/usb/cromwell/core/usb.c
--- trunk/reactos/drivers/usb/cromwell/core/usb.c	2005-07-27 13:18:11 UTC (rev 16799)
+++ trunk/reactos/drivers/usb/cromwell/core/usb.c	2005-07-27 14:57:33 UTC (rev 16800)
@@ -54,6 +54,7 @@
 #include "hcd.h"
 #endif
 
+#define DEBUG
 
 extern int  usb_hub_init(void);
 extern void usb_hub_cleanup(void);
@@ -95,6 +96,9 @@
 
 	if (!driver->probe)
 		return error;
+	/* driver claim() doesn't yet affect dev->driver... */
+	if (intf->driver)
+		return error;
 
 	id = usb_match_id (intf, driver->id_table);
 	if (id) {
@@ -396,6 +400,14 @@
 {
 	struct usb_host_interface *intf;
 	struct usb_device *dev;
+	struct usb_device_id *save_id;
+	int firsttime;
+	
+	firsttime = 1;
+	
+	save_id = (struct usb_device_id*)id;
+retry_id:	
+	id = (struct usb_device_id*)save_id;
 
 	/* proc_connectinfo in devio.c may call us with id == NULL. */
 	if (id == NULL)
@@ -967,7 +979,36 @@
 	}
 }
 
+/**
+ * usb_choose_address - pick device address (usbcore-internal)
+ * @dev: newly detected device (in DEFAULT state)
+ *
+ * Picks a device address.  It's up to the hub (or root hub) driver
+ * to handle and manage enumeration, starting from the DEFAULT state.
+ * Only hub drivers (but not virtual root hub drivers for host
+ * controllers) should ever call this.
+ */
+void usb_choose_address(struct usb_device *dev)
+{
+	int devnum;
+	// FIXME needs locking for SMP!!
+	/* why? this is called only from the hub thread, 
+	 * which hopefully doesn't run on multiple CPU's simultaneously 8-)
+	 */
 
+	/* Try to allocate the next devnum beginning at bus->devnum_next. */
+	devnum = find_next_zero_bit(dev->bus->devmap.devicemap, 128, dev->bus->devnum_next);
+	if (devnum >= 128)
+		devnum = find_next_zero_bit(dev->bus->devmap.devicemap, 128, 1);
+
+	dev->bus->devnum_next = ( devnum >= 127 ? 1 : devnum + 1);
+
+	if (devnum < 128) {
+		set_bit(devnum, dev->bus->devmap.devicemap);
+		dev->devnum = devnum;
+	}
+}
+
 // hub-only!! ... and only exported for reset/reinit path.
 // otherwise used internally, for usb_new_device()
 int usb_set_address(struct usb_device *dev)
@@ -1062,10 +1103,10 @@
  * controllers) should ever call this.
  */
 #define NEW_DEVICE_RETRYS	2
-#define SET_ADDRESS_RETRYS	2
+#define SET_ADDRESS_RETRYS	20
 int usb_new_device(struct usb_device *dev, struct device *parent)
 {
-	int err = 0;
+	int err = -EINVAL;
 	int i;
 	int j;
 
@@ -1108,7 +1149,7 @@
 		i = 8;
 		break;
 	default:
-		return -EINVAL;
+		goto fail;
 	}
 	dev->epmaxpacketin [0] = i;
 	dev->epmaxpacketout[0] = i;
@@ -1119,15 +1160,12 @@
 			err = usb_set_address(dev);
 			if (err >= 0)
 				break;
-			wait_ms(200);
+			wait_ms(5);
 		}
 		if (err < 0) {
 			dev_err(&dev->dev, "USB device not accepting new address=%d (error=%d)\n",
 				dev->devnum, err);
-			dev->state = USB_STATE_DEFAULT;
-			clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-			dev->devnum = -1;
-			return 1;
+			goto fail;
 		}
 
 		wait_ms(10);	/* Let the SET_ADDRESS settle */
@@ -1140,17 +1178,13 @@
 	}
 
 	if (err < 8) {
-                if (err < 0) {
-			dev_err(&dev->dev, "USB device not responding, giving up (error=%d)\n", err);
-                }
-                else {
-			dev_err(&dev->dev, "USB device descriptor short read (expected %i, got %i)\n", 8, err);
-                }
-		clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-		dev->devnum = -1;
-		return 1;
+		dev_err(&dev->dev, "device descriptor read/8, error %d\n", err);
+		goto fail;
 	}
 	if (dev->speed == USB_SPEED_FULL) {
+		//usb_disable_endpoint(dev, 0);
+		usb_endpoint_running(dev, 0, 1);
+		usb_endpoint_running(dev, 0, 0);
 		dev->epmaxpacketin [0] = dev->descriptor.bMaxPacketSize0;
 		dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
 	}
@@ -1159,26 +1193,15 @@
 
 	err = usb_get_device_descriptor(dev);
 	if (err < (signed)sizeof(dev->descriptor)) {
-                if (err < 0) {
-			dev_err(&dev->dev, "unable to get device descriptor (error=%d)\n", err);
-                }
-                else {
-			dev_err(&dev->dev, "USB device descriptor short read (expected %Zi, got %i)\n",
-				sizeof(dev->descriptor), err);
-                }
-	
-		clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-		dev->devnum = -1;
-		return 1;
+		dev_err(&dev->dev, "device descriptor read/all, error %d\n", err);
+		goto fail;
 	}
 
 	err = usb_get_configuration(dev);
 	if (err < 0) {
-		dev_err(&dev->dev, "unable to get device %d configuration (error=%d)\n",
-			dev->devnum, err);
-		clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-		dev->devnum = -1;
-		return 1;
+		dev_err(&dev->dev, "can't read configurations, error %d\n",
+			err);
+		goto fail;
 	}
 
 	/* we set the default configuration here */
@@ -1186,9 +1209,7 @@
 	if (err) {
 		dev_err(&dev->dev, "failed to set device %d default configuration (error=%d)\n",
 			dev->devnum, err);
-		clear_bit(dev->devnum, dev->bus->devmap.devicemap);
-		dev->devnum = -1;
-		return 1;
+		goto fail;
 	}
 
 	/* USB device state == configured ... tell the world! */
@@ -1234,7 +1255,7 @@
 				"usb-%s-%s interface %d",
 				dev->bus->bus_name, dev->devpath,
 				desc->bInterfaceNumber);
-			DPRINT1("usb_new_device: %s\n", interface->dev.name);
+			DPRINT1(".........................usb_new_device: %s\n", interface->dev.name);
 		}
 		dev_dbg (&dev->dev, "%s - registering interface %s\n", __FUNCTION__, interface->dev.bus_id);
 		device_add (&interface->dev);
@@ -1244,6 +1265,11 @@
 	usbfs_add_device(dev);
 
 	return 0;
+fail:
+	dev->state = USB_STATE_DEFAULT;
+	clear_bit(dev->devnum, dev->bus->devmap.devicemap);
+	dev->devnum = -1;
+	return err;
 }
 
 /**

Modified: trunk/reactos/drivers/usb/cromwell/host/ohci_main.c
--- trunk/reactos/drivers/usb/cromwell/host/ohci_main.c	2005-07-27 13:18:11 UTC (rev 16799)
+++ trunk/reactos/drivers/usb/cromwell/host/ohci_main.c	2005-07-27 14:57:33 UTC (rev 16800)
@@ -125,6 +125,27 @@
 	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)
 {
@@ -154,6 +175,9 @@
 	// 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;
@@ -169,6 +193,9 @@
 	POHCI_DEVICE_EXTENSION DeviceExtension;
 	PCM_RESOURCE_LIST AllocatedResources;
 
+	NTSTATUS Status; // debug
+	LONGLONG delay; // debug
+
 	/*
 	* Get the initialization data we saved in VideoPortInitialize.
 	*/
@@ -236,7 +263,13 @@
 	/*
 	* Init wrapper with this object
 	*/
-	return InitLinuxWrapper(DeviceObject);
+	//return InitLinuxWrapper(DeviceObject);
+	Status = InitLinuxWrapper(DeviceObject);
+
+	delay = -10000000*60*2; // wait 2 minutes
+	KeDelayExecutionThread(KernelMode, FALSE, (LARGE_INTEGER *)&delay); //wait_us(1);
+
+	return Status;
 }
 
 // Dispatch PNP

Modified: trunk/reactos/drivers/usb/cromwell/linux/linux_wrapper.h
--- trunk/reactos/drivers/usb/cromwell/linux/linux_wrapper.h	2005-07-27 13:18:11 UTC (rev 16799)
+++ trunk/reactos/drivers/usb/cromwell/linux/linux_wrapper.h	2005-07-27 14:57:33 UTC (rev 16800)
@@ -34,7 +34,12 @@
 
 typedef u32 dma_addr_t;
 
-typedef int spinlock_t;
+typedef struct
+{
+	KSPIN_LOCK SpinLock;
+	KIRQL  OldIrql;
+} spinlock_t;
+
 typedef int atomic_t;
 #ifndef STANDALONE
 #ifndef _MODE_T_
@@ -156,7 +161,8 @@
 };
 struct completion {
         unsigned int done;
-        wait_queue_head_t wait;
+		KEVENT wait;
+        //wait_queue_head_t wait;
 };
 
 // windows lookaside list head
@@ -383,13 +389,20 @@
 #define init_MUTEX(x)
 
 #define SPIN_LOCK_UNLOCKED 0
-#define spin_lock_init(a)  do {} while(0)
-#define spin_lock(a) *(int*)a=1
-#define spin_unlock(a) do {} while(0)
 
-#define spin_lock_irqsave(a,b) b=0
-#define spin_unlock_irqrestore(a,b)
+#define spin_lock_init(a)  my_spin_lock_init(a)
+void my_spin_lock_init(spinlock_t *sl);
 
+#define spin_lock(a) my_spin_lock(a)
+void my_spin_lock(spinlock_t *sl);
+
+#define spin_unlock(a) my_spin_unlock(a)
+void my_spin_unlock(spinlock_t *sl);
+
+#define spin_lock_irqsave(a,b) my_spin_lock_irqsave(a,b)
+void my_spin_lock_irqsave(spinlock_t *sl, int flags);
+#define spin_unlock_irqrestore(a,b) my_spin_unlock(a)
+
 #if 0
 #define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ; cli":"=g" (x): /* no input */ :"memory")
 #define local_irq_restore(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc")
@@ -526,12 +539,15 @@
 VOID KeMemoryBarrier(VOID);
 
 #define mb() KeMemoryBarrier()
-#define wmb() __asm__ __volatile__ ("": : :"memory")
-#define rmb() __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory")
+#define wmb() do {} while (0)
+#define rmb() do {} while (0)
+/*#define wmb() __asm__ __volatile__ ("": : :"memory")
+#define rmb() __asm__ __volatile__ ("lock; addl $0,0(%%esp)": : :"memory")*/
 
 #define in_interrupt() 0
 
-#define init_completion(x) (x)->done=0
+#define init_completion(x) my_init_completion(x)
+void my_init_completion(struct completion *);
 #define wait_for_completion(x) my_wait_for_completion(x)
 void my_wait_for_completion(struct completion*);
 
@@ -790,9 +806,10 @@
 // cannot be mapped via macro due to collision with urb->complete
 static void __inline__ complete(struct completion *p)
 {
+	printk("completing event 0x%08x\n", (ULONG)p);
 	/* Wake up x->wait */
 	p->done++;
-	wake_up((PKEVENT)&p->wait);
+	wake_up((PKEVENT)&p->wait); 
 }
 
 #define kernel_thread(a,b,c) my_kernel_thread(a,b,c)
@@ -832,7 +849,5 @@
 void init_wrapper(struct pci_dev *pci_dev);
 void do_all_timers(void);
 
-#define __KERNEL_DS   0x18
-
 int my_pci_write_config_word(struct pci_dev *, int, u16);
 

Modified: trunk/reactos/drivers/usb/cromwell/sys/linuxwrapper.c
--- trunk/reactos/drivers/usb/cromwell/sys/linuxwrapper.c	2005-07-27 13:18:11 UTC (rev 16799)
+++ trunk/reactos/drivers/usb/cromwell/sys/linuxwrapper.c	2005-07-27 14:57:33 UTC (rev 16800)
@@ -242,56 +242,65 @@
 int my_schedule_timeout(int x)
 {
 	LONGLONG HH;
-	LONGLONG temp;
-	LONGLONG delay;
-	extern unsigned int LAST_USB_EVENT_TICK;
+	//LONGLONG temp;
+	LARGE_INTEGER delay;
+	//PULONG tmp_debug=NULL;
+	//extern unsigned int LAST_USB_EVENT_TICK;
 
+	//*tmp_debug = 0xFFAAFFAA;
+
 	printk("schedule_timeout: %d ms\n", x);
 
+		//delay.QuadPart = -x*10000; // convert to 100ns units
+		//KeDelayExecutionThread(KernelMode, FALSE, &delay); //wait_us(1);
+
+	/*
 	x+=5; // safety
 	x = x*1000;	// to us format
+	*/
+	x = 300; // it's enough for most purposes
 
 	while(x>0)
 	{
 		KeQueryTickCount((LARGE_INTEGER *)&HH);//IoInputDword(0x8008);
-    	temp = HH - LAST_USB_EVENT_TICK;
+    	//temp = HH - LAST_USB_EVENT_TICK;
     	
 		//if (temp>(3579)) { //3579 = 1ms!
-		if (temp>1000) {
+		//if (temp>1000) {
 			do_all_timers();
-			LAST_USB_EVENT_TICK = HH;
-		}
+		//	LAST_USB_EVENT_TICK = HH;
+		//}
 
-       		//if (LAST_USB_IRQ != OHCI_1_INTERRUPT ) {
-       	//		LAST_USB_IRQ = OHCI_1_INTERRUPT;
-			handle_irqs(-1);
-		//}
+		handle_irqs(-1);
 		
 		if (need_wakeup)
 			break;
 
-		delay = 10;
-		KeDelayExecutionThread(KernelMode, FALSE, (LARGE_INTEGER *)&delay); //wait_us(1);
+		delay.QuadPart = -10;
+		KeDelayExecutionThread(KernelMode, FALSE, &delay); //wait_us(1);
 		x-=1;
+		//DPRINT("schedule_timeout(): time left: %d\n", x);
 	}
 	need_wakeup=0;
+
 	printk("schedule DONE!!!!!!\n");
 
-	return x;
+	return 0;//x;
 }
 /*------------------------------------------------------------------------*/ 
 void my_wait_for_completion(struct completion *x)
 {
 	LONGLONG HH;
 	LONGLONG temp;
-	LONGLONG delay;
+	LARGE_INTEGER delay;
+
 	extern unsigned int LAST_USB_EVENT_TICK;
 
-	printk("wait for completion\n");
+	printk("wait for completion11, x=0x%08x\n", (DWORD)x);
 
 	int n=10;
 	n = n*1000;	// to us format
-	
+
 	while(!x->done && (n>0))
 	{
 		KeQueryTickCount((LARGE_INTEGER *)&HH);//IoInputDword(0x8008);
@@ -299,23 +308,26 @@
 
 		//if (temp>(3579)) {
 		if (temp>(1000)) {
-			do_all_timers();
+		//	do_all_timers();
 			LAST_USB_EVENT_TICK = HH;
 		}
 
-		//if (LAST_USB_IRQ != OHCI_1_INTERRUPT ) {
-		//	LAST_USB_IRQ = OHCI_1_INTERRUPT;
-			handle_irqs(-1);
-		//}
+		//	handle_irqs(-1);
 
-		delay = 10;
-		KeDelayExecutionThread(KernelMode, FALSE, (LARGE_INTEGER *)&delay); //wait_us(1);
+		delay.QuadPart = -10;
+		KeDelayExecutionThread(KernelMode, FALSE, &delay); //wait_us(1);
 		n--;
 	}
 	printk("wait for completion done %i\n",x->done);
 
 }
 /*------------------------------------------------------------------------*/ 
+void my_init_completion(struct completion *x)
+{
+	x->done=0;
+	KeInitializeEvent(&x->wait, NotificationEvent, FALSE);
+}
+/*------------------------------------------------------------------------*/ 
 void my_interruptible_sleep_on(PKEVENT evnt)
 {
 	KeWaitForSingleObject(evnt, Executive, KernelMode, FALSE, NULL);
@@ -364,6 +376,7 @@
 		num_irqs++;
 		return 0;
 	}
+	
 	return 1;
 }
 /*------------------------------------------------------------------------*/ 
@@ -609,8 +622,8 @@
 		return 0;
 		
 	retval = ExAllocatePool(NonPagedPool, sizeof(struct pci_pool)); // Non-paged because could be
-									// pci_pool is rather big struct
-	
+																	// accesses at IRQL < PASSIVE
+
 	// fill retval structure
 	strncpy (retval->name, name, sizeof retval->name);
 	retval->name[sizeof retval->name - 1] = 0;
@@ -623,7 +636,7 @@
 	retval->pages_allocated = 0;
 	retval->blocks_allocated = 0;
 	
-	DPRINT1("pci_pool_create(): %s/%s size %d, %d/page (%d alloc)\n",
+	DPRINT("pci_pool_create(): %s/%s size %d, %d/page (%d alloc)\n",
 		pdev ? pdev->slot_name : NULL, retval->name, size,
 		retval->blocks_per_page, allocation);
 
@@ -652,11 +665,12 @@
 {
 	PVOID result;
 	POHCI_DEVICE_EXTENSION devExt = (POHCI_DEVICE_EXTENSION)pool->pdev->dev_ext;
-	//PHYSICAL_ADDRESS logicalAddr;
-	DPRINT1("pci_pool_alloc() called, blocks already allocated=%d\n", pool->blocks_allocated);
-	//size_t current_block_in_page;
-	int page,map,i,block,offset;
+	int page=0, offset;
+	int map, i, block;
 
+	//DPRINT1("pci_pool_alloc() called, blocks already allocated=%d, dma_handle=%p\n", pool->blocks_allocated, dma_handle);
+	//ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+
 	if (pool->pages_allocated == 0)
 	{
 		// we need to allocate at least one page
@@ -665,7 +679,7 @@
 				PAGE_SIZE, &pool->pages[pool->pages_allocated].dmaAddress, FALSE); //FIXME: Cache-enabled?
 
 		// mark all blocks as free (bit=set)
-		memset(pool->pages[pool->pages_allocated].bitmap, 0xFF, 128*sizeof(long));
+		memset(pool->pages[pool->pages_allocated].bitmap, 0xFF, 128*sizeof(unsigned long));
 
 		/* FIXME: the next line replaces physical address by virtual address:
 		* this change is needed to boot VMWare, but I'm really not sure this
[truncated at 1000 lines; 69 more skipped]