a5bd9f6
From 018defe9d63f3a44e87b3345a8e5daeaa389a2bf Mon Sep 17 00:00:00 2001
a5bd9f6
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
a5bd9f6
Date: Wed, 20 Mar 2013 17:07:08 +0100
a5bd9f6
Subject: [PATCH 216/364] 	Fix a conflict between ports structures with 2
a5bd9f6
 controllers of 	same kind.
a5bd9f6
a5bd9f6
---
a5bd9f6
 ChangeLog                  |  5 +++++
a5bd9f6
 grub-core/bus/usb/usbhub.c | 39 ++++++++++++++++++++++-----------------
a5bd9f6
 include/grub/usb.h         |  2 --
a5bd9f6
 3 files changed, 27 insertions(+), 19 deletions(-)
a5bd9f6
a5bd9f6
diff --git a/ChangeLog b/ChangeLog
a5bd9f6
index 0c28b11..0fcaa65 100644
a5bd9f6
--- a/ChangeLog
a5bd9f6
+++ b/ChangeLog
a5bd9f6
@@ -1,5 +1,10 @@
a5bd9f6
 2013-03-20  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
 
a5bd9f6
+	Fix a conflict between ports structures with 2 controllers of
a5bd9f6
+	same kind.
a5bd9f6
+
a5bd9f6
+2013-03-20  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
+
a5bd9f6
 	* include/grub/boottime.h: Add missing file.
a5bd9f6
 
a5bd9f6
 2013-03-19  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
diff --git a/grub-core/bus/usb/usbhub.c b/grub-core/bus/usb/usbhub.c
a5bd9f6
index d0be80d..fd7b94e 100644
a5bd9f6
--- a/grub-core/bus/usb/usbhub.c
a5bd9f6
+++ b/grub-core/bus/usb/usbhub.c
a5bd9f6
@@ -37,6 +37,7 @@ struct grub_usb_hub
a5bd9f6
   grub_usb_controller_t controller;
a5bd9f6
   int nports;
a5bd9f6
   struct grub_usb_device **devices;
a5bd9f6
+  struct grub_usb_hub_port *ports;
a5bd9f6
   grub_usb_device_t dev;
a5bd9f6
 };
a5bd9f6
 
a5bd9f6
@@ -263,11 +264,11 @@ grub_usb_controller_dev_register_iter (grub_usb_controller_t controller, void *d
a5bd9f6
   /* Query the number of ports the root Hub has.  */
a5bd9f6
   hub->nports = controller->dev->hubports (controller);
a5bd9f6
   hub->devices = grub_zalloc (sizeof (hub->devices[0]) * hub->nports);
a5bd9f6
-  usb->ports = grub_zalloc (sizeof (usb->ports[0]) * hub->nports);
a5bd9f6
-  if (!hub->devices || !usb->ports)
a5bd9f6
+  hub->ports = grub_zalloc (sizeof (hub->ports[0]) * hub->nports);
a5bd9f6
+  if (!hub->devices || !hub->ports)
a5bd9f6
     {
a5bd9f6
       grub_free (hub->devices);
a5bd9f6
-      grub_free (usb->ports);
a5bd9f6
+      grub_free (hub->ports);
a5bd9f6
       grub_free (hub->controller);
a5bd9f6
       grub_free (hub);
a5bd9f6
       grub_print_error ();
a5bd9f6
@@ -323,33 +324,37 @@ grub_usb_controller_dev_register (grub_usb_controller_dev_t usb)
a5bd9f6
 		speed = hub->controller->dev->detect_dev (hub->controller, portno,
a5bd9f6
 							  &changed);
a5bd9f6
       
a5bd9f6
-		if (usb->ports[portno].state == PORT_STATE_NORMAL
a5bd9f6
+		if (hub->ports[portno].state == PORT_STATE_NORMAL
a5bd9f6
 		    && speed != GRUB_USB_SPEED_NONE)
a5bd9f6
 		  {
a5bd9f6
-		    usb->ports[portno].soft_limit_time = grub_get_time_ms () + 250;
a5bd9f6
-		    usb->ports[portno].hard_limit_time = usb->ports[portno].soft_limit_time + 1750;
a5bd9f6
-		    usb->ports[portno].state = PORT_STATE_WAITING_FOR_STABLE_POWER;
a5bd9f6
+		    hub->ports[portno].soft_limit_time = grub_get_time_ms () + 250;
a5bd9f6
+		    hub->ports[portno].hard_limit_time = hub->ports[portno].soft_limit_time + 1750;
a5bd9f6
+		    hub->ports[portno].state = PORT_STATE_WAITING_FOR_STABLE_POWER;
a5bd9f6
+		    grub_boot_time ("Scheduling stable power wait for port %p:%d",
a5bd9f6
+				    usb, portno);
a5bd9f6
 		    continue_waiting++;
a5bd9f6
 		    continue;
a5bd9f6
 		  }
a5bd9f6
 
a5bd9f6
-		if (usb->ports[portno].state == PORT_STATE_WAITING_FOR_STABLE_POWER
a5bd9f6
+		if (hub->ports[portno].state == PORT_STATE_WAITING_FOR_STABLE_POWER
a5bd9f6
 		    && speed == GRUB_USB_SPEED_NONE)
a5bd9f6
 		  {
a5bd9f6
-		    usb->ports[portno].soft_limit_time = grub_get_time_ms () + 250;
a5bd9f6
+		    hub->ports[portno].soft_limit_time = grub_get_time_ms () + 250;
a5bd9f6
 		    continue;
a5bd9f6
 		  }
a5bd9f6
-		if (usb->ports[portno].state == PORT_STATE_WAITING_FOR_STABLE_POWER
a5bd9f6
-		    && grub_get_time_ms () > usb->ports[portno].soft_limit_time)
a5bd9f6
+		if (hub->ports[portno].state == PORT_STATE_WAITING_FOR_STABLE_POWER
a5bd9f6
+		    && grub_get_time_ms () > hub->ports[portno].soft_limit_time)
a5bd9f6
 		  {
a5bd9f6
-		    usb->ports[portno].state = PORT_STATE_STABLE_POWER;
a5bd9f6
+		    hub->ports[portno].state = PORT_STATE_STABLE_POWER;
a5bd9f6
+		    grub_boot_time ("Got stable power wait for port %p:%d",
a5bd9f6
+				    usb, portno);
a5bd9f6
 		    continue_waiting--;
a5bd9f6
 		    continue;
a5bd9f6
 		  }
a5bd9f6
-		if (usb->ports[portno].state == PORT_STATE_WAITING_FOR_STABLE_POWER
a5bd9f6
-		    && grub_get_time_ms () > usb->ports[portno].hard_limit_time)
a5bd9f6
+		if (hub->ports[portno].state == PORT_STATE_WAITING_FOR_STABLE_POWER
a5bd9f6
+		    && grub_get_time_ms () > hub->ports[portno].hard_limit_time)
a5bd9f6
 		  {
a5bd9f6
-		    usb->ports[portno].state = PORT_STATE_FAILED_DEVICE;
a5bd9f6
+		    hub->ports[portno].state = PORT_STATE_FAILED_DEVICE;
a5bd9f6
 		    continue_waiting--;
a5bd9f6
 		    continue;
a5bd9f6
 		  }
a5bd9f6
@@ -365,11 +370,11 @@ grub_usb_controller_dev_register (grub_usb_controller_dev_t usb)
a5bd9f6
   for (hub = hubs; hub; hub = hub->next)
a5bd9f6
     if (hub->controller->dev == usb)
a5bd9f6
       for (portno = 0; portno < hub->nports; portno++)
a5bd9f6
-	if (usb->ports[portno].state == PORT_STATE_STABLE_POWER)
a5bd9f6
+	if (hub->ports[portno].state == PORT_STATE_STABLE_POWER)
a5bd9f6
 	  {
a5bd9f6
 	    grub_usb_speed_t speed;
a5bd9f6
 	    int changed = 0;
a5bd9f6
-	    usb->ports[portno].state = PORT_STATE_NORMAL;
a5bd9f6
+	    hub->ports[portno].state = PORT_STATE_NORMAL;
a5bd9f6
 	    speed = hub->controller->dev->detect_dev (hub->controller, portno, &changed);
a5bd9f6
 	    attach_root_port (hub, portno, speed);
a5bd9f6
 	  }
a5bd9f6
diff --git a/include/grub/usb.h b/include/grub/usb.h
a5bd9f6
index 12a456b..9e2c221 100644
a5bd9f6
--- a/include/grub/usb.h
a5bd9f6
+++ b/include/grub/usb.h
a5bd9f6
@@ -121,8 +121,6 @@ struct grub_usb_controller_dev
a5bd9f6
 
a5bd9f6
   grub_usb_speed_t (*detect_dev) (grub_usb_controller_t dev, int port, int *changed);
a5bd9f6
 
a5bd9f6
-  struct grub_usb_hub_port *ports;
a5bd9f6
-
a5bd9f6
   /* Per controller flag - port reset pending, don't do another reset */
a5bd9f6
   grub_uint64_t pending_reset;
a5bd9f6
 
a5bd9f6
-- 
a5bd9f6
1.8.1.4
a5bd9f6