[PATCH 3/3] fix-stop-sitting-printing-in-time-critical-context.patch

Andy Green andy at openmoko.com
Fri Aug 1 08:54:23 CEST 2008


Someone left us a big fat warning in USB device code

	/* Don't ever put [serial] debugging in non-error codepaths here, it
	 * will violate the tight timing constraints of this USB Device
	 * controller (and lead to bus enumeration failures) */

these "non-error codepaths" go all over the shop, this patch nukes some
serial printf()s that can do what we must never do.

Signed-off-by: Andy Green <andy at openmoko.com>
---

 board/neo1973/gta02/gta02.c    |    4 ++--
 drivers/serial/usbtty.c        |   16 ++++++++++++++--
 drivers/usb/usbdcore.c         |    6 ++++++
 drivers/usb/usbdcore_s3c2410.c |    4 ++--
 4 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/board/neo1973/gta02/gta02.c b/board/neo1973/gta02/gta02.c
index c4766b0..84eb8c5 100644
--- a/board/neo1973/gta02/gta02.c
+++ b/board/neo1973/gta02/gta02.c
@@ -398,8 +398,8 @@ static void wait_for_power(void)
 		poll_charger();
 
 		/* track what the time-critical udc callback allows us */
-		if (pcf50633_usb_last_maxcurrent != udc_usb_maxcurrent)
-			pcf50633_usb_maxcurrent(udc_usb_maxcurrent);
+//		if (pcf50633_usb_last_maxcurrent != udc_usb_maxcurrent)
+//			pcf50633_usb_maxcurrent(udc_usb_maxcurrent);
 
 		/* we have plenty of external power -> try to boot */
 		if (pcf50633_usb_last_maxcurrent >= 500)
diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c
index b6c0403..7ef7eb5 100644
--- a/drivers/serial/usbtty.c
+++ b/drivers/serial/usbtty.c
@@ -1162,7 +1162,13 @@ static void usbtty_event_handler (struct usb_device_instance *device,
 		usbtty_configured_flag = 0;
 		break;
 	case DEVICE_CONFIGURED:
-		printf("DEVICE_CONFIGURED: %u\n", device->configuration);
+#if 0
+	/* we can't afford sitting here and printing stuff.  This code runs
+	 * in a time-critical context and printing stuff is a synchronous
+	 * serial activity... bad things can happen to USB peripheral
+	 */
+	printf("DEVICE_CONFIGURED: %u\n", device->configuration);
+#endif
 		if (device->configuration == 1)
 			udc_ctrl(UDC_CTRL_500mA_ENABLE, 1);
 		else
@@ -1170,7 +1176,13 @@ static void usbtty_event_handler (struct usb_device_instance *device,
 		usbtty_configured_flag = 1;
 		break;
 	case DEVICE_DE_CONFIGURED:
-		printf("DEVICE_DE_CONFIGURED\n");
+#if 0
+	/* we can't afford sitting here and printing stuff.  This code runs
+	 * in a time-critical context and printing stuff is a synchronous
+	 * serial activity... bad things can happen to USB peripheral
+	 */
+		printf("DEVICE_DECONFIGURED: %u\n", device->configuration);
+#endif
 		udc_ctrl(UDC_CTRL_500mA_ENABLE, 0);
 		break;
 	case DEVICE_ADDRESS_ASSIGNED:
diff --git a/drivers/usb/usbdcore.c b/drivers/usb/usbdcore.c
index a2e6711..28b1a9a 100644
--- a/drivers/usb/usbdcore.c
+++ b/drivers/usb/usbdcore.c
@@ -616,7 +616,13 @@ void usbd_device_event_irq (struct usb_device_instance *device, usb_device_event
 
 	state = device->device_state;
 
+#if 0
+	/* we can't afford sitting here and printing stuff.  This code can run
+	 * in a time-critical context and printing stuff is a synchronous
+	 * serial activity... bad things can happen to USB peripheral
+	 */
 	usbinfo("%s", usbd_device_events[event]);
+#endif
 
 	switch (event) {
 	case DEVICE_UNKNOWN:
diff --git a/drivers/usb/usbdcore_s3c2410.c b/drivers/usb/usbdcore_s3c2410.c
index a18e7e1..13cd3d6 100644
--- a/drivers/usb/usbdcore_s3c2410.c
+++ b/drivers/usb/usbdcore_s3c2410.c
@@ -191,7 +191,7 @@ static void s3c2410_udc_ep0(void)
 
 	/* clear stall status */
 	if (ep0csr & S3C2410_UDC_EP0_CSR_SENTSTL) {
-	    	serial_printf("Clearing SENT_STALL\n");
+	    	/* serial_printf("Clearing SENT_STALL\n"); */
 		clear_ep0_sst();
 		if (ep0csr & S3C2410_UDC_EP0_CSR_SOPKTRDY)
 			clear_ep0_opr();
@@ -202,7 +202,7 @@ static void s3c2410_udc_ep0(void)
 	/* clear setup end */
 	if (ep0csr & S3C2410_UDC_EP0_CSR_SE
 	    /* && ep0->state != EP0_IDLE */) {
-	    	serial_printf("Clearing SETUP_END\n");
+	    	/* serial_printf("Clearing SETUP_END\n"); */
 		clear_ep0_se();
 #if 1
 		if (ep0csr & S3C2410_UDC_EP0_CSR_SOPKTRDY) {





More information about the openmoko-kernel mailing list