PERFORCE change 167084 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Fri Aug 7 09:22:13 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167084
Change 167084 by hselasky at 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 */
More information about the p4-projects
mailing list