Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 7 Aug 2009 09:22:11 GMT
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 167084 for review
Message-ID:  <200908070922.n779MBSG001032@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=167084

Change 167084 by hselasky@hselasky_laptop001 on 2009/08/07 09:21:13

	
	USB core:
	 - patch to allow USB controller to resume operation after being polled.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb/controller/usb_controller.c#26 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_process.c#10 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_process.h#8 edit
.. //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#163 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb/controller/usb_controller.c#26 (text+ko) ====

@@ -226,6 +226,15 @@
 			/* avoid zero, hence that is memory default */
 			bus->driver_added_refcount = 1;
 		}
+
+		/*
+		 * The following three lines of code are only here to
+		 * recover from DDB:
+		 */
+		usb_proc_rewakeup(&bus->control_xfer_proc);
+		usb_proc_rewakeup(&bus->giant_callback_proc);
+		usb_proc_rewakeup(&bus->non_giant_callback_proc);
+
 		USB_BUS_UNLOCK(bus);
 
 		mtx_lock(&Giant);
@@ -297,6 +306,12 @@
 	usb_callout_reset(&bus->power_wdog,
 	    4 * hz, usb_power_wdog, arg);
 
+	/*
+	 * The following line of code is only here to recover from
+	 * DDB:
+	 */
+	usb_proc_rewakeup(&bus->explore_proc);	/* recover from DDB */
+
 	USB_BUS_UNLOCK(bus);
 
 	usb_bus_power_update(bus);

==== //depot/projects/usb/src/sys/dev/usb/usb_process.c#10 (text+ko) ====

@@ -446,3 +446,29 @@
 	}
 	mtx_unlock(up->up_mtx);
 }
+
+/*------------------------------------------------------------------------*
+ *	usb_proc_rewakeup
+ *
+ * This function is called to re-wakeup the the given USB
+ * process. This usually happens after that the USB system has been in
+ * polling mode, like during a panic. This function must be called
+ * having "up->up_mtx" locked.
+ *------------------------------------------------------------------------*/
+void
+usb_proc_rewakeup(struct usb_process *up)
+{
+	/* check if not initialised */
+	if (up->up_mtx == NULL)
+		return;
+	/* check if gone */
+	if (up->up_gone)
+		return;
+
+	mtx_assert(up->up_mtx, MA_OWNED);
+
+	if (up->up_msleep == 0) {
+		/* re-wakeup */
+		cv_signal(&up->up_cv);
+	}
+}

==== //depot/projects/usb/src/sys/dev/usb/usb_process.h#8 (text+ko) ====

@@ -71,5 +71,6 @@
 void	usb_proc_mwait(struct usb_process *up, void *pm0, void *pm1);
 void	usb_proc_free(struct usb_process *up);
 void   *usb_proc_msignal(struct usb_process *up, void *pm0, void *pm1);
+void	usb_proc_rewakeup(struct usb_process *up);
 
 #endif					/* _USB_PROCESS_H_ */

==== //depot/projects/usb/src/sys/dev/usb/usb_transfer.c#163 (text+ko) ====

@@ -2907,13 +2907,9 @@
 		}
 
 		/* Make sure cv_signal() and cv_broadcast() is not called */
-		udev->bus->control_xfer_proc.up_dsleep = 0;
 		udev->bus->control_xfer_proc.up_msleep = 0;
-		udev->bus->explore_proc.up_dsleep = 0;
 		udev->bus->explore_proc.up_msleep = 0;
-		udev->bus->giant_callback_proc.up_dsleep = 0;
 		udev->bus->giant_callback_proc.up_msleep = 0;
-		udev->bus->non_giant_callback_proc.up_dsleep = 0;
 		udev->bus->non_giant_callback_proc.up_msleep = 0;
 
 		/* poll USB hardware */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908070922.n779MBSG001032>