I thought some more about this, and looked over some things and found a few other problems. The changes for those also fixed this problem (though I'm keeping the original patch because these changes won't work in 2.6.24 and the original patch will). You might want to use these patches, too, otherwise you may get short serial stalls on transmission. Though that's actually unlikely because the serial buffer is a lot bigger than IPMI messages.

-corey

David Jenkins wrote:
Corey,

Did you mean uartdrv_console_write() (and not uart_console_write())?

If so, I found a call to uart_write_wakeup() at the end of uartdrv_console_write() and put

if (port->info->flags & UIF_INITIALIZED)

in front of it. That is working. My board will now reboot without getting an oops. I did some quick ipmi tests (kernel finds IPMI device, query manufacturer and product id) and those still work as well. I will be doing more complete testing later.
So it looks good.  Thanks very much for the help.

David


From: Corey Minyard <[EMAIL PROTECTED]>
Serial: clear tasklet init flag when done

A serial direct connection may create it's own tasklet, so we need to
clear the tasklet setup flag when we shutdown the port so that if a
serial direct driver grabs the port sets a tasklet, and releases it,
the tasklet will get re-initialized if the port is re-opened.

Signed-off-by: Corey Minyard <[EMAIL PROTECTED]>
---

Index: linux-2.6.23/drivers/serial/serial_core.c
===================================================================
--- linux-2.6.23.orig/drivers/serial/serial_core.c
+++ linux-2.6.23/drivers/serial/serial_core.c
@@ -253,8 +253,10 @@ static void uart_shutdown(struct uart_st
 	/*
 	 * kill off our tasklet
 	 */
-	if (info->flags & UIF_TASKLET_SETUP)
+	if (info->flags & UIF_TASKLET_SETUP) {
+		info->flags &= ~UIF_TASKLET_SETUP;
 		tasklet_kill(&info->tlet);
+	}
 
 	/*
 	 * Free the transmit buffer page.
From: Corey Minyard <[EMAIL PROTECTED]>
IPMI: serial set tasklet flag

The tasklets will not work properly unless the flag is set.  So
set the flag, and clear it on shutdown.

Signed-off-by: Corey Minyard <[EMAIL PROTECTED]>
Index: linux-2.6.23/drivers/char/ipmi/ipmi_serial.c
===================================================================
--- linux-2.6.23.orig/drivers/char/ipmi/ipmi_serial.c
+++ linux-2.6.23/drivers/char/ipmi/ipmi_serial.c
@@ -1874,6 +1874,7 @@ static void ipmi_serial_setup_one(const 
 	info->uinfo.direct = &info->direct;
 	tasklet_init(&info->uinfo.tlet, ipmi_serial_tx_ready,
 		     (unsigned long) info);
+	info->uinfo.flags |= UIF_TASKLET_SETUP;
 
 	mutex_lock(&list_lock);
 	/* Check for dups. */
@@ -2094,9 +2095,9 @@ static void ipmi_serial_cleanup_one(stru
 	}
 
 	if (to_clean->port) {
-		to_clean->port->ops->shutdown(to_clean->port);
+		to_clean->uinfo.flags &= ~UIF_TASKLET_SETUP;
 		tasklet_kill(&to_clean->uinfo.tlet);
-
+		to_clean->port->ops->shutdown(to_clean->port);
 		to_clean->port->info = to_clean->orig_port_info;
 		uart_put_direct_port(to_clean->port, 0);
 	}
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Openipmi-developer mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openipmi-developer

Reply via email to