⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbtty-irq-racecondition-fix.patch

📁 Uboot常用的移植patches, 方便定制移植到s3c2440
💻 PATCH
字号:
This patch adds some local_irq_{save,restore}() code to usbtty to cope with thelack of lacking in the case of irq-accelerated usb device drivers (such as ours3c24xx udc driver).Index: u-boot/drivers/serial/usbtty.c===================================================================--- u-boot.orig/drivers/serial/usbtty.c+++ u-boot/drivers/serial/usbtty.c@@ -26,6 +26,7 @@ #ifdef CONFIG_USB_TTY  #include <asm/io.h>+#include <asm/proc/system.h> #include <circbuf.h> #include <devices.h> #include "usbtty.h"@@ -1039,16 +1040,26 @@ 	struct usb_endpoint_instance *endpoint = 			&endpoint_instance[tx_endpoint]; 	struct urb *current_urb = NULL;+	unsigned long flags; +	local_irq_save(flags); 	current_urb = next_urb (device_instance, endpoint); 	/* TX data still exists - send it now 	 */++	/* I don't really understand what this logic is supposed to do,+	 * at least on the s3c24xx usb driver it causes all data to be+	 * transmitted twice !?! - Harald Welte */+#if !(defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || \+     defined(CONFIG_S3C2442) || defined(CONFIG_S3C2443)) 	if(endpoint->sent < current_urb->actual_length){ 		if(udc_endpoint_write (endpoint)){ 			/* Write pre-empted by RX */+			local_irq_restore(flags); 			return -1; 		} 	}+#endif  	if (buf->size) { 		char *dest;@@ -1065,6 +1076,7 @@ 			if (!current_urb) { 				TTYERR ("current_urb is NULL, buf->size %d\n", 					buf->size);+				local_irq_restore(flags); 				return total; 			} @@ -1090,14 +1102,17 @@ 			if (endpoint->last == 0) { 				if(udc_endpoint_write (endpoint)){ 					/* Write pre-empted by RX */+					local_irq_restore(flags); 					return -1; 				} 			}  		}/* end while */+		local_irq_restore(flags); 		return total; 	} +	local_irq_restore(flags); 	return 0; } @@ -1105,9 +1120,11 @@ { 	struct usb_endpoint_instance *endpoint = 		&endpoint_instance[rx_endpoint];+	unsigned int nb = 0;+	unsigned long flags; +	local_irq_save(flags); 	if (endpoint->rcv_urb && endpoint->rcv_urb->actual_length) {-		unsigned int nb = 0; 		char *src = (char *) endpoint->rcv_urb->buffer; 		unsigned int rx_avail = buf->totalsize - buf->size; @@ -1118,9 +1135,9 @@ 			endpoint->rcv_urb->actual_length = 0;  		}-		return nb; 	}-	return 0;+	local_irq_restore(flags);+	return nb; }  static int usbtty_configured (void)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -