linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH 2.4] serial closing_wait and close_delay
  2004-11-30 19:06 [PATCH 2.4] serial closing_wait and close_delay Ian Abbott
@ 2004-11-30 18:57 ` Alan Cox
  2004-12-01  9:32   ` Ian Abbott
  2004-12-01 10:48 ` Russell King
  2004-12-13 11:56 ` Marcelo Tosatti
  2 siblings, 1 reply; 6+ messages in thread
From: Alan Cox @ 2004-11-30 18:57 UTC (permalink / raw)
  To: Ian Abbott; +Cc: Marcelo Tosatti, Linux Kernel Mailing List

On Maw, 2004-11-30 at 19:06, Ian Abbott wrote:
> Dear Marcelo,
> 
> This patch should fix various problems with the closing_wait and 
> close_delay serial parameters, but I can only test the standard serial 
> driver.

Thanks - I've added that to my 2.6.x serial todo pile if nobody else
does it first.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2.4] serial closing_wait and close_delay
@ 2004-11-30 19:06 Ian Abbott
  2004-11-30 18:57 ` Alan Cox
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Ian Abbott @ 2004-11-30 19:06 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1345 bytes --]

Dear Marcelo,

This patch should fix various problems with the closing_wait and 
close_delay serial parameters, but I can only test the standard serial 
driver.

There are various scaling problems when HZ != 100:

* In several drivers, the values set by TIOCSSERIAL are scaled by 
HZ/100, but the values got by TIOCGSERIAL are not scaled back.

* Invariably, the scaled closing_wait value is compared with an unscaled 
constant ASYNC_CLOSING_WAIT_NONE or the same value by another name 
(depending on the specific driver).

My patch stores the values set by TIOCSSERIAL without scaling and scales 
the values by HZ/100 at the point of use.  (This is not as bad as it 
sounds, as each value is scaled once per 'close'.)  There seems to be a 
general consensus amongst the serial drivers that the closing_wait and 
close_delay values from the user are in units of .01 seconds.

There is another problem, not related to HZ scaling:

* In several drivers, the closing_wait and close_delay values are 
written to a struct serial_state by TIOCSSERIAL, but the values used in 
the close routine are read from a struct async_struct, with no code to 
transfer of values between the two structures.  My patch ignores the 
members in struct async_struct and uses the values from struct serial_state.

-- Ian.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>

[-- Attachment #2: serial-closing-wait.patch --]
[-- Type: text/x-patch, Size: 51739 bytes --]

diff -urN linux-2.4.29-pre1/arch/cris/drivers/serial.c linux-2.4.29-pre1-ia/arch/cris/drivers/serial.c
--- linux-2.4.29-pre1/arch/cris/drivers/serial.c	2004-02-18 13:36:30.000000000 +0000
+++ linux-2.4.29-pre1-ia/arch/cris/drivers/serial.c	2004-11-29 13:01:26.707580416 +0000
@@ -4552,7 +4552,7 @@
 	 */
 	tty->closing = 1;
 	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the serial receiver and the DMA receive interrupt.
@@ -4586,7 +4586,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			set_current_state(TASK_INTERRUPTIBLE);
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -5155,8 +5155,8 @@
 		info->baud_base = DEF_BAUD_BASE;
 		info->custom_divisor = 0;		
 		info->flags = 0;
-		info->close_delay = 5*HZ/10;
-		info->closing_wait = 30*HZ;
+		info->close_delay = 50;		/* .5 seconds */
+		info->closing_wait = 3000;	/* 30 seconds */
 		info->x_char = 0;
 		info->event = 0;
 		info->count = 0;
diff -urN linux-2.4.29-pre1/arch/ppc/8xx_io/uart.c linux-2.4.29-pre1-ia/arch/ppc/8xx_io/uart.c
--- linux-2.4.29-pre1/arch/ppc/8xx_io/uart.c	2003-11-28 18:26:19.000000000 +0000
+++ linux-2.4.29-pre1-ia/arch/ppc/8xx_io/uart.c	2004-11-29 13:01:26.712579656 +0000
@@ -1760,8 +1760,8 @@
 	 * the line discipline to only process XON/XOFF characters.
 	 */
 	tty->closing = 1;
-	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+	if (state->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+		tty_wait_until_sent(tty, state->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1797,9 +1797,9 @@
 	info->event = 0;
 	info->tty = 0;
 	if (info->blocked_open) {
-		if (info->close_delay) {
+		if (state->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(state->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2743,8 +2743,8 @@
 		state->line = i;
 		state->type = PORT_UNKNOWN;
 		state->custom_divisor = 0;
-		state->close_delay = 5*HZ/10;
-		state->closing_wait = 30*HZ;
+		state->close_delay = 50;	/* .5 seconds */
+		state->closing_wait = 3000;	/* 30 seconds */
 		state->callout_termios = callout_driver.init_termios;
 		state->normal_termios = serial_driver.init_termios;
 		state->icount.cts = state->icount.dsr =
diff -urN linux-2.4.29-pre1/arch/ppc/cpm2_io/uart.c linux-2.4.29-pre1-ia/arch/ppc/cpm2_io/uart.c
--- linux-2.4.29-pre1/arch/ppc/cpm2_io/uart.c	2004-04-14 14:05:27.000000000 +0100
+++ linux-2.4.29-pre1-ia/arch/ppc/cpm2_io/uart.c	2004-11-29 13:01:26.716579048 +0000
@@ -1754,8 +1754,8 @@
 	 * the line discipline to only process XON/XOFF characters.
 	 */
 	tty->closing = 1;
-	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+	if (state->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+		tty_wait_until_sent(tty, state->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1790,9 +1790,9 @@
 	info->event = 0;
 	info->tty = 0;
 	if (info->blocked_open) {
-		if (info->close_delay) {
+		if (state->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(state->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2714,8 +2714,8 @@
 		state->line = i;
 		state->type = PORT_UNKNOWN;
 		state->custom_divisor = 0;
-		state->close_delay = 5*HZ/10;
-		state->closing_wait = 30*HZ;
+		state->close_delay = 50;	/* .5 seconds */
+		state->closing_wait = 3000;	/* 30 seconds */
 		state->callout_termios = callout_driver.init_termios;
 		state->normal_termios = serial_driver.init_termios;
 		state->icount.cts = state->icount.dsr =
diff -urN linux-2.4.29-pre1/drivers/char/amiserial.c linux-2.4.29-pre1-ia/drivers/char/amiserial.c
--- linux-2.4.29-pre1/drivers/char/amiserial.c	2002-11-28 23:53:12.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/amiserial.c	2004-11-29 13:01:26.719578592 +0000
@@ -1215,8 +1215,8 @@
 	info->flags = ((state->flags & ~ASYNC_INTERNAL_FLAGS) |
 		       (info->flags & ASYNC_INTERNAL_FLAGS));
 	state->custom_divisor = new_serial.custom_divisor;
-	state->close_delay = new_serial.close_delay * HZ/100;
-	state->closing_wait = new_serial.closing_wait * HZ/100;
+	state->close_delay = new_serial.close_delay;
+	state->closing_wait = new_serial.closing_wait;
 	info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
 check_and_exit:
@@ -1581,8 +1581,8 @@
 	 * the line discipline to only process XON/XOFF characters.
 	 */
 	tty->closing = 1;
-	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+	if (state->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+		tty_wait_until_sent(tty, state->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1614,9 +1614,9 @@
 	info->event = 0;
 	info->tty = 0;
 	if (info->blocked_open) {
-		if (info->close_delay) {
+		if (state->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(state->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2185,8 +2185,8 @@
 	state->port = (int)&custom.serdatr; /* Just to give it a value */
 	state->line = 0;
 	state->custom_divisor = 0;
-	state->close_delay = 5*HZ/10;
-	state->closing_wait = 30*HZ;
+	state->close_delay = 50;	/* .5 seconds */
+	state->closing_wait = 3000;	/* 30 seconds */
 	state->callout_termios = callout_driver.init_termios;
 	state->normal_termios = serial_driver.init_termios;
 	state->icount.cts = state->icount.dsr = 
diff -urN linux-2.4.29-pre1/drivers/char/au1x00-serial.c linux-2.4.29-pre1-ia/drivers/char/au1x00-serial.c
--- linux-2.4.29-pre1/drivers/char/au1x00-serial.c	2003-08-25 12:44:41.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/au1x00-serial.c	2004-11-29 13:01:26.767571296 +0000
@@ -1494,8 +1494,8 @@
 	info->flags = ((state->flags & ~ASYNC_INTERNAL_FLAGS) |
 		       (info->flags & ASYNC_INTERNAL_FLAGS));
 	state->custom_divisor = new_serial.custom_divisor;
-	state->close_delay = new_serial.close_delay * HZ/100;
-	state->closing_wait = new_serial.closing_wait * HZ/100;
+	state->close_delay = new_serial.close_delay;
+	state->closing_wait = new_serial.closing_wait;
 	info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 	info->xmit_fifo_size = state->xmit_fifo_size =
 		new_serial.xmit_fifo_size;
@@ -1948,8 +1948,8 @@
 	 * the line discipline to only process XON/XOFF characters.
 	 */
 	tty->closing = 1;
-	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+	if (state->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+		tty_wait_until_sent(tty, state->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1976,9 +1976,9 @@
 	info->event = 0;
 	info->tty = 0;
 	if (info->blocked_open) {
-		if (info->close_delay) {
+		if (state->close_delay) {
 			set_current_state(TASK_INTERRUPTIBLE);
-			schedule_timeout(info->close_delay);
+			schedule_timeout(state->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2655,8 +2655,8 @@
 		state->line = i;
 		state->type = PORT_UNKNOWN;
 		state->custom_divisor = 0;
-		state->close_delay = 5*HZ/10;
-		state->closing_wait = 30*HZ;
+		state->close_delay = 50;	/* .5 seconds */
+		state->closing_wait = 3000;	/* 30 seconds */
 		state->callout_termios = callout_driver.init_termios;
 		state->normal_termios = serial_driver.init_termios;
 		state->icount.cts = state->icount.dsr =
diff -urN linux-2.4.29-pre1/drivers/char/cyclades.c linux-2.4.29-pre1-ia/drivers/char/cyclades.c
--- linux-2.4.29-pre1/drivers/char/cyclades.c	2003-06-13 15:51:32.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/cyclades.c	2004-11-29 13:01:26.775570080 +0000
@@ -2866,7 +2866,7 @@
     tty->closing = 1;
     CY_UNLOCK(info, flags);
     if (info->closing_wait != CY_CLOSING_WAIT_NONE) {
-	tty_wait_until_sent(tty, info->closing_wait);
+	tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
     }
     CY_LOCK(info, flags);
 
@@ -2929,7 +2929,7 @@
 	CY_UNLOCK(info, flags);
         if (info->close_delay) {
             current->state = TASK_INTERRUPTIBLE;
-            schedule_timeout(info->close_delay);
+            schedule_timeout(info->close_delay * HZ / 100);
         }
         wake_up_interruptible(&info->open_wait);
 	CY_LOCK(info, flags);
@@ -3659,8 +3659,8 @@
     info->custom_divisor = new_serial.custom_divisor;
     info->flags = ((info->flags & ~ASYNC_FLAGS) |
                     (new_serial.flags & ASYNC_FLAGS));
-    info->close_delay = new_serial.close_delay * HZ/100;
-    info->closing_wait = new_serial.closing_wait * HZ/100;
+    info->close_delay = new_serial.close_delay;
+    info->closing_wait = new_serial.closing_wait;
 
 check_and_exit:
     if (info->flags & ASYNC_INITIALIZED){
@@ -4314,11 +4314,11 @@
 	    break;
 #endif /* CONFIG_CYZ_INTR */
 	case CYSETWAIT:
-    	    info->closing_wait = (unsigned short)arg * HZ/100;
+    	    info->closing_wait = (unsigned short)arg;
 	    ret_val = 0;
 	    break;
 	case CYGETWAIT:
-	    ret_val = info->closing_wait / (HZ/100);
+	    ret_val = info->closing_wait;
 	    break;
         case TIOCMGET:
             ret_val = get_modem_info(info, (unsigned int *) arg);
@@ -5637,7 +5637,7 @@
                     info->rbpr = 0;
                     info->rco = 0;
 		    info->custom_divisor = 0;
-                    info->close_delay = 5*HZ/10;
+                    info->close_delay = 50;	/* .5 seconds */
 		    info->closing_wait = CLOSING_WAIT_DELAY;
 		    info->icount.cts = info->icount.dsr = 
 			info->icount.rng = info->icount.dcd = 0;
@@ -5696,7 +5696,7 @@
                     info->cor4 = 0;
                     info->cor5 = 0;
 		    info->custom_divisor = 0;
-                    info->close_delay = 5*HZ/10;
+                    info->close_delay = 50;	/* .5 seconds */
 		    info->closing_wait = CLOSING_WAIT_DELAY;
 		    info->icount.cts = info->icount.dsr = 
 			info->icount.rng = info->icount.dcd = 0;
diff -urN linux-2.4.29-pre1/drivers/char/dz.c linux-2.4.29-pre1-ia/drivers/char/dz.c
--- linux-2.4.29-pre1/drivers/char/dz.c	2004-02-18 13:36:31.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/dz.c	2004-11-29 13:01:26.778569624 +0000
@@ -1095,7 +1095,7 @@
 	tty->closing = 1;
 
 	if (info->closing_wait != DZ_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 
 	/*
 	 * At this point we stop accepting input.  To do this, we
@@ -1123,7 +1123,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
diff -urN linux-2.4.29-pre1/drivers/char/esp.c linux-2.4.29-pre1-ia/drivers/char/esp.c
--- linux-2.4.29-pre1/drivers/char/esp.c	2002-08-03 01:39:43.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/esp.c	2004-11-29 13:01:26.822562936 +0000
@@ -1570,8 +1570,8 @@
 		info->flags = ((info->flags & ~ASYNC_FLAGS) |
 			       (new_serial.flags & ASYNC_FLAGS));
 		info->custom_divisor = new_serial.custom_divisor;
-		info->close_delay = new_serial.close_delay * HZ/100;
-		info->closing_wait = new_serial.closing_wait * HZ/100;
+		info->close_delay = new_serial.close_delay;
+		info->closing_wait = new_serial.closing_wait;
 
 		if (change_irq) {
 			/*
@@ -2087,7 +2087,7 @@
 	 */
 	tty->closing = 1;
 	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -2124,7 +2124,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			set_current_state(TASK_INTERRUPTIBLE);
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2636,8 +2636,8 @@
 		if (info->custom_divisor)
 			info->flags |= ASYNC_SPD_CUST;
 		info->magic = ESP_MAGIC;
-		info->close_delay = 5*HZ/10;
-		info->closing_wait = 30*HZ;
+		info->close_delay = 50;		/* .5 seconds */
+		info->closing_wait = 3000;	/* 30 seconds */
 		info->tqueue.routine = do_softint;
 		info->tqueue.data = info;
 		info->tqueue_hangup.routine = do_serial_hangup;
diff -urN linux-2.4.29-pre1/drivers/char/generic_serial.c linux-2.4.29-pre1-ia/drivers/char/generic_serial.c
--- linux-2.4.29-pre1/drivers/char/generic_serial.c	2002-11-28 23:53:12.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/generic_serial.c	2004-11-29 13:01:26.825562480 +0000
@@ -784,7 +784,7 @@
 	 */
 	tty->closing = 1;
 	/* if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-	   tty_wait_until_sent(tty, port->closing_wait); */
+	   tty_wait_until_sent(tty, port->closing_wait * HZ / 100); */
 
 	/*
 	 * At this point we stop accepting input.  To do this, we
@@ -797,7 +797,7 @@
 
 	/* close has no way of returning "EINTR", so discard return value */
 	if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		gs_wait_tx_flushed (port, port->closing_wait); 
+		gs_wait_tx_flushed (port, port->closing_wait * HZ / 100); 
 
 	port->flags &= ~GS_ACTIVE;
 
@@ -815,7 +815,7 @@
 	if (port->blocked_open) {
 		if (port->close_delay) {
 			set_current_state (TASK_INTERRUPTIBLE);
-			schedule_timeout(port->close_delay);
+			schedule_timeout(port->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&port->open_wait);
 	}
diff -urN linux-2.4.29-pre1/drivers/char/ip2main.c linux-2.4.29-pre1-ia/drivers/char/ip2main.c
--- linux-2.4.29-pre1/drivers/char/ip2main.c	2004-11-17 11:54:21.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/ip2main.c	2004-11-29 13:01:26.830561720 +0000
@@ -1831,7 +1831,7 @@
 		 * This uses an timeout, after which the close
 		 * completes.
 		 */
-		ip2_wait_until_sent(tty, pCh->ClosingWaitTime );
+		ip2_wait_until_sent(tty, pCh->ClosingWaitTime * HZ / 100);
 	}
 	/*
 	 * At this point we stop accepting input. Here we flush the channel
@@ -1862,7 +1862,7 @@
 	if (pCh->wopen) {
 		if (pCh->ClosingDelay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(pCh->ClosingDelay);
+			schedule_timeout(pCh->ClosingDelay * HZ / 100);
 		}
 		wake_up_interruptible(&pCh->open_wait);
 	}
@@ -2673,8 +2673,8 @@
 		pCh->flags = (pCh->flags & ~ASYNC_FLAGS) |
 			       (ns.flags & ASYNC_FLAGS);
 		pCh->BaudDivisor = ns.custom_divisor;
-		pCh->ClosingDelay = ns.close_delay * HZ/100;
-		pCh->ClosingWaitTime = ns.closing_wait * HZ/100;
+		pCh->ClosingDelay = ns.close_delay;
+		pCh->ClosingWaitTime = ns.closing_wait;
 	}
 
 	if ( ( (old_flags & ASYNC_SPD_MASK) != (pCh->flags & ASYNC_SPD_MASK) )
diff -urN linux-2.4.29-pre1/drivers/char/isicom.c linux-2.4.29-pre1-ia/drivers/char/isicom.c
--- linux-2.4.29-pre1/drivers/char/isicom.c	2003-06-13 15:51:33.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/isicom.c	2004-11-29 13:01:26.833561264 +0000
@@ -1189,7 +1189,7 @@
 	
 	tty->closing = 1;
 	if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, port->closing_wait);
+		tty_wait_until_sent(tty, port->closing_wait * HZ / 100);
 	/* indicate to the card that no more data can be received 
 	   on this port */
 	if (port->flags & ASYNC_INITIALIZED) {   
@@ -1209,7 +1209,7 @@
 #ifdef ISICOM_DEBUG			
 			printk(KERN_DEBUG "ISICOM: scheduling until time out.\n");
 #endif			
-			schedule_timeout(port->close_delay);
+			schedule_timeout(port->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&port->open_wait);
 	}	
@@ -1905,8 +1905,8 @@
 			port->channel = channel;		
 			port->normal_termios = isicom_normal.init_termios;
 			port->callout_termios = isicom_callout.init_termios;
-		 	port->close_delay = 50 * HZ/100;
-		 	port->closing_wait = 3000 * HZ/100;
+		 	port->close_delay = 50;		/* .5 seconds */
+		 	port->closing_wait = 3000;	/* 30 seconds */
 			port->hangup_tq.routine = do_isicom_hangup;
 		 	port->hangup_tq.data = port;
 		 	port->bh_tqueue.routine = isicom_bottomhalf;
diff -urN linux-2.4.29-pre1/drivers/char/istallion.c linux-2.4.29-pre1-ia/drivers/char/istallion.c
--- linux-2.4.29-pre1/drivers/char/istallion.c	2004-11-29 13:00:15.466410720 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/istallion.c	2004-11-29 13:01:26.885553360 +0000
@@ -623,7 +623,7 @@
  */
 #define	STL_MAXBAUD	460800
 #define	STL_BAUDBASE	115200
-#define	STL_CLOSEDELAY	(5 * HZ / 10)
+#define	STL_CLOSEDELAY	50	/* .5 seconds */
 
 /*****************************************************************************/
 
@@ -1198,7 +1198,7 @@
 		stli_flushchars(tty);
 	tty->closing = 1;
 	if (portp->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, portp->closing_wait);
+		tty_wait_until_sent(tty, portp->closing_wait * HZ / 100);
 
 	portp->flags &= ~ASYNC_INITIALIZED;
 	brdp = stli_brds[portp->brdnr];
@@ -1224,7 +1224,7 @@
 
 	if (portp->openwaitcnt) {
 		if (portp->close_delay)
-			stli_delay(portp->close_delay);
+			stli_delay(portp->close_delay * HZ / 1000);
 		wake_up_interruptible(&portp->open_wait);
 	}
 
@@ -3368,7 +3368,7 @@
 		portp->panelnr = panelnr;
 		portp->baud_base = STL_BAUDBASE;
 		portp->close_delay = STL_CLOSEDELAY;
-		portp->closing_wait = 30 * HZ;
+		portp->closing_wait = 3000;	/* 30 seconds */
 		portp->tqhangup.routine = stli_dohangup;
 		portp->tqhangup.data = portp;
 		init_waitqueue_head(&portp->open_wait);
diff -urN linux-2.4.29-pre1/drivers/char/moxa.c linux-2.4.29-pre1-ia/drivers/char/moxa.c
--- linux-2.4.29-pre1/drivers/char/moxa.c	2001-10-25 21:53:47.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/moxa.c	2004-11-29 13:01:26.889552752 +0000
@@ -390,8 +390,8 @@
 		ch->tqueue.routine = do_moxa_softint;
 		ch->tqueue.data = ch;
 		ch->tty = 0;
-		ch->close_delay = 5 * HZ / 10;
-		ch->closing_wait = 30 * HZ;
+		ch->close_delay = 50;		/* .5 seconds */
+		ch->closing_wait = 3000;	/* 30 seconds */
 		ch->count = 0;
 		ch->blocked_open = 0;
 		ch->callout_termios = moxaCallout.init_termios;
@@ -668,7 +668,8 @@
 		ch->callout_termios = *tty->termios;
 	if (ch->asyncflags & ASYNC_INITIALIZED) {
 		setup_empty_event(tty);
-		tty_wait_until_sent(tty, 30 * HZ);	/* 30 seconds timeout */
+		if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+			tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 		moxaEmptyTimer_on[ch->port] = 0;
 		del_timer(&moxaEmptyTimer[ch->port]);
 	}
@@ -685,7 +686,7 @@
 	if (ch->blocked_open) {
 		if (ch->close_delay) {
 			set_current_state(TASK_INTERRUPTIBLE);
-			schedule_timeout(ch->close_delay);
+			schedule_timeout(ch->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&ch->open_wait);
 	}
@@ -2805,8 +2806,8 @@
 		     (info->asyncflags & ~ASYNC_USR_MASK)))
 			return (-EPERM);
 	} else {
-		info->close_delay = new_serial.close_delay * HZ / 100;
-		info->closing_wait = new_serial.closing_wait * HZ / 100;
+		info->close_delay = new_serial.close_delay;
+		info->closing_wait = new_serial.closing_wait;
 	}
 
 	new_serial.flags = (new_serial.flags & ~ASYNC_FLAGS);
diff -urN linux-2.4.29-pre1/drivers/char/mxser.c linux-2.4.29-pre1-ia/drivers/char/mxser.c
--- linux-2.4.29-pre1/drivers/char/mxser.c	2004-11-17 11:54:21.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/mxser.c	2004-11-29 13:01:26.893552144 +0000
@@ -450,8 +450,8 @@
 		else
 			info->xmit_fifo_size = 16;
 		info->custom_divisor = hwconf->baud_base[i] * 16;
-		info->close_delay = 5 * HZ / 10;
-		info->closing_wait = 30 * HZ;
+		info->close_delay = 50;		/* .5 seconds */
+		info->closing_wait = 3000;	/* 30 seconds */
 		info->tqueue.routine = mxser_do_softint;
 		info->tqueue.data = info;
 		info->callout_termios = mxvar_cdriver.init_termios;
@@ -861,7 +861,7 @@
 	 */
 	tty->closing = 1;
 	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -898,7 +898,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			set_current_state(TASK_INTERRUPTIBLE);
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2215,8 +2215,8 @@
 		 */
 		info->flags = ((info->flags & ~ASYNC_FLAGS) |
 			       (new_serial.flags & ASYNC_FLAGS));
-		info->close_delay = new_serial.close_delay * HZ / 100;
-		info->closing_wait = new_serial.closing_wait * HZ / 100;
+		info->close_delay = new_serial.close_delay;
+		info->closing_wait = new_serial.closing_wait;
 	}
 
 	if (info->flags & ASYNC_INITIALIZED) {
diff -urN linux-2.4.29-pre1/drivers/char/riscom8.c linux-2.4.29-pre1-ia/drivers/char/riscom8.c
--- linux-2.4.29-pre1/drivers/char/riscom8.c	2001-09-13 23:21:32.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/riscom8.c	2004-11-29 13:01:26.896551688 +0000
@@ -1171,7 +1171,7 @@
 	 */
 	tty->closing = 1;
 	if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, port->closing_wait);
+		tty_wait_until_sent(tty, port->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1208,7 +1208,7 @@
 	if (port->blocked_open) {
 		if (port->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(port->close_delay);
+			schedule_timeout(port->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&port->open_wait);
 	}
@@ -1518,8 +1518,8 @@
 	tmp.irq  = bp->irq;
 	tmp.flags = port->flags;
 	tmp.baud_base = (RC_OSCFREQ + CD180_TPC/2) / CD180_TPC;
-	tmp.close_delay = port->close_delay * HZ/100;
-	tmp.closing_wait = port->closing_wait * HZ/100;
+	tmp.close_delay = port->close_delay;
+	tmp.closing_wait = port->closing_wait;
 	tmp.xmit_fifo_size = CD180_NFIFO;
 	return copy_to_user(retinfo, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 }
@@ -1815,8 +1815,8 @@
 		rc_port[i].tqueue.data = &rc_port[i];
 		rc_port[i].tqueue_hangup.routine = do_rc_hangup;
 		rc_port[i].tqueue_hangup.data = &rc_port[i];
-		rc_port[i].close_delay = 50 * HZ/100;
-		rc_port[i].closing_wait = 3000 * HZ/100;
+		rc_port[i].close_delay = 50;	/* .5 seconds */
+		rc_port[i].closing_wait = 3000;	/* 30 seconds */
 		init_waitqueue_head(&rc_port[i].open_wait);
 		init_waitqueue_head(&rc_port[i].close_wait);
 	}
diff -urN linux-2.4.29-pre1/drivers/char/rocket.c linux-2.4.29-pre1-ia/drivers/char/rocket.c
--- linux-2.4.29-pre1/drivers/char/rocket.c	2003-11-28 18:26:20.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/rocket.c	2004-11-29 13:01:26.900551080 +0000
@@ -1103,7 +1103,7 @@
 	 * Wait for the transmit buffer to clear
 	 */
 	if (info->closing_wait != ROCKET_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	/*
 	 * Before we drop DTR, make sure the UART transmitter
 	 * has completely drained; this is especially
@@ -1135,7 +1135,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	} else {
diff -urN linux-2.4.29-pre1/drivers/char/ser_a2232.c linux-2.4.29-pre1-ia/drivers/char/ser_a2232.c
--- linux-2.4.29-pre1/drivers/char/ser_a2232.c	2003-11-28 18:26:20.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/ser_a2232.c	2004-11-29 13:01:26.943544544 +0000
@@ -698,8 +698,8 @@
 		port->gs.callout_termios = tty_std_termios;
 		port->gs.normal_termios = tty_std_termios;
 		port->gs.magic = A2232_MAGIC;
-		port->gs.close_delay = HZ/2;
-		port->gs.closing_wait = 30 * HZ;
+		port->gs.close_delay = 50;	/* .5 seconds */
+		port->gs.closing_wait = 3000;	/* 30 seconds */
 		port->gs.rd = &a2232_real_driver;
 #ifdef NEW_WRITE_LOCKING
 		init_MUTEX(&(port->gs.port_write_sem));
diff -urN linux-2.4.29-pre1/drivers/char/serial.c linux-2.4.29-pre1-ia/drivers/char/serial.c
--- linux-2.4.29-pre1/drivers/char/serial.c	2004-11-17 11:54:21.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/serial.c	2004-11-29 13:01:26.954542872 +0000
@@ -2177,8 +2177,8 @@
 	info->flags = ((state->flags & ~ASYNC_INTERNAL_FLAGS) |
 		       (info->flags & ASYNC_INTERNAL_FLAGS));
 	state->custom_divisor = new_serial.custom_divisor;
-	state->close_delay = new_serial.close_delay * HZ/100;
-	state->closing_wait = new_serial.closing_wait * HZ/100;
+	state->close_delay = new_serial.close_delay;
+	state->closing_wait = new_serial.closing_wait;
 #if (LINUX_VERSION_CODE > 0x20100)
 	info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 #endif
@@ -2845,8 +2845,8 @@
 	 * the line discipline to only process XON/XOFF characters.
 	 */
 	tty->closing = 1;
-	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+	if (state->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+		tty_wait_until_sent(tty, state->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -2873,9 +2873,9 @@
 	info->event = 0;
 	info->tty = 0;
 	if (info->blocked_open) {
-		if (info->close_delay) {
+		if (state->close_delay) {
 			set_current_state(TASK_INTERRUPTIBLE);
-			schedule_timeout(info->close_delay);
+			schedule_timeout(state->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -5522,8 +5522,8 @@
 		state->line = i;
 		state->type = PORT_UNKNOWN;
 		state->custom_divisor = 0;
-		state->close_delay = 5*HZ/10;
-		state->closing_wait = 30*HZ;
+		state->close_delay = 50;	/* .5 seconds */
+		state->closing_wait = 3000;	/* 30 seconds */
 		state->callout_termios = callout_driver.init_termios;
 		state->normal_termios = serial_driver.init_termios;
 		state->icount.cts = state->icount.dsr = 
diff -urN linux-2.4.29-pre1/drivers/char/serial_amba.c linux-2.4.29-pre1-ia/drivers/char/serial_amba.c
--- linux-2.4.29-pre1/drivers/char/serial_amba.c	2002-08-03 01:39:43.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/serial_amba.c	2004-11-29 13:01:26.946544088 +0000
@@ -1102,8 +1102,8 @@
 	info->flags = ((state->flags & ~ASYNC_INTERNAL_FLAGS) |
 		       (info->flags & ASYNC_INTERNAL_FLAGS));
 	state->custom_divisor = new_serial.custom_divisor;
-	state->close_delay = new_serial.close_delay * HZ / 100;
-	state->closing_wait = new_serial.closing_wait * HZ / 100;
+	state->close_delay = new_serial.close_delay;
+	state->closing_wait = new_serial.closing_wait;
 	info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 	port->fifosize = new_serial.xmit_fifo_size;
 
@@ -1442,7 +1442,7 @@
 	 */
 	tty->closing = 1;
 	if (info->state->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->state->closing_wait);
+		tty_wait_until_sent(tty, info->state->closing_wait * HZ / 100);
 	/*
 	 * At this point, we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts.
@@ -1467,7 +1467,7 @@
 	if (info->blocked_open) {
 		if (info->state->close_delay) {
 			set_current_state(TASK_INTERRUPTIBLE);
-			schedule_timeout(info->state->close_delay);
+			schedule_timeout(info->state->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -1829,8 +1829,8 @@
 	for (i = 0; i < SERIAL_AMBA_NR; i++) {
 		struct amba_state *state = amba_state + i;
 		state->line		= i;
-		state->close_delay	= 5 * HZ / 10;
-		state->closing_wait	= 30 * HZ;
+		state->close_delay	= 50;	/* .5 seconds */
+		state->closing_wait	= 3000;	/* 30 seconds */
 		state->callout_termios	= ambacallout_driver.init_termios;
 		state->normal_termios	= ambanormal_driver.init_termios;
 	}
diff -urN linux-2.4.29-pre1/drivers/char/serial_tx3912.c linux-2.4.29-pre1-ia/drivers/char/serial_tx3912.c
--- linux-2.4.29-pre1/drivers/char/serial_tx3912.c	2003-08-25 12:44:41.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/serial_tx3912.c	2004-11-29 13:01:26.956542568 +0000
@@ -624,8 +624,8 @@
 	rs_port->gs.callout_termios = tty_std_termios;
 	rs_port->gs.normal_termios	= tty_std_termios;
 	rs_port->gs.magic = SERIAL_MAGIC;
-	rs_port->gs.close_delay = HZ/2;
-	rs_port->gs.closing_wait = 30 * HZ;
+	rs_port->gs.close_delay = 50;		/* .5 seconds */
+	rs_port->gs.closing_wait = 3000;	/* 30 seconds */
 	rs_port->gs.rd = &rs_real_driver;
 #ifdef NEW_WRITE_LOCKING
 	rs_port->gs.port_write_sem = MUTEX;
diff -urN linux-2.4.29-pre1/drivers/char/serial_txx9.c linux-2.4.29-pre1-ia/drivers/char/serial_txx9.c
--- linux-2.4.29-pre1/drivers/char/serial_txx9.c	2003-08-25 12:44:41.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/serial_txx9.c	2004-11-29 13:01:27.047528736 +0000
@@ -1153,8 +1153,8 @@
 		port->gs.callout_termios = tty_std_termios;
 		port->gs.normal_termios	= tty_std_termios;
 		port->gs.magic = TXX9_SERIAL_MAGIC;
-		port->gs.close_delay = HZ/2;
-		port->gs.closing_wait = 30 * HZ;
+		port->gs.close_delay = 50;	/* .5 seconds */
+		port->gs.closing_wait = 3000;	/* 30 seconds */
 		port->gs.rd = &rs_real_driver;
 #ifdef NEW_WRITE_LOCKING
 		port->gs.port_write_sem = MUTEX;
diff -urN linux-2.4.29-pre1/drivers/char/serial_txx927.c linux-2.4.29-pre1-ia/drivers/char/serial_txx927.c
--- linux-2.4.29-pre1/drivers/char/serial_txx927.c	2002-08-03 01:39:43.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/serial_txx927.c	2004-11-29 13:01:26.959542112 +0000
@@ -1442,8 +1442,8 @@
 	 * the line discipline to only process XON/XOFF characters.
 	 */
 	tty->closing = 1;
-	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+	if (state->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+		tty_wait_until_sent(tty, state->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1473,7 +1473,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2059,8 +2059,8 @@
 		state->line = i;
 		state->type = PORT_UNKNOWN;
 		state->custom_divisor = 0;
-		state->close_delay = 5*HZ/10;
-		state->closing_wait = 30*HZ;
+		state->close_delay = 50;	/* .5 seconds */
+		state->closing_wait = 3000;	/* 30 seconds */
 		state->callout_termios = callout_driver.init_termios;
 		state->normal_termios = serial_driver.init_termios;
 		state->icount.cts = state->icount.dsr = 
diff -urN linux-2.4.29-pre1/drivers/char/sgiserial.c linux-2.4.29-pre1-ia/drivers/char/sgiserial.c
--- linux-2.4.29-pre1/drivers/char/sgiserial.c	2004-02-18 13:36:31.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/sgiserial.c	2004-11-29 13:01:27.050528280 +0000
@@ -1476,7 +1476,7 @@
 	 */
 	tty->closing = 1;
 	if (info->closing_wait != ZILOG_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1509,7 +1509,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
diff -urN linux-2.4.29-pre1/drivers/char/sh-sci.c linux-2.4.29-pre1-ia/drivers/char/sh-sci.c
--- linux-2.4.29-pre1/drivers/char/sh-sci.c	2003-11-28 18:26:20.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/sh-sci.c	2004-11-29 13:01:27.053527824 +0000
@@ -1429,8 +1429,8 @@
 		port->gs.callout_termios = sci_callout_driver.init_termios;
 		port->gs.normal_termios	= sci_driver.init_termios;
 		port->gs.magic = SCI_MAGIC;
-		port->gs.close_delay = HZ/2;
-		port->gs.closing_wait = 30 * HZ;
+		port->gs.close_delay = 50;	/* .5 seconds */
+		port->gs.closing_wait = 3000;	/* 30 seconds */
 		port->gs.rd = &sci_real_driver;
 		init_waitqueue_head(&port->gs.open_wait);
 		init_waitqueue_head(&port->gs.close_wait);
diff -urN linux-2.4.29-pre1/drivers/char/specialix.c linux-2.4.29-pre1-ia/drivers/char/specialix.c
--- linux-2.4.29-pre1/drivers/char/specialix.c	2002-08-03 01:39:43.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/specialix.c	2004-11-29 13:01:27.056527368 +0000
@@ -1547,7 +1547,7 @@
 	 */
 	tty->closing = 1;
 	if (port->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, port->closing_wait);
+		tty_wait_until_sent(tty, port->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1587,7 +1587,7 @@
 	if (port->blocked_open) {
 		if (port->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(port->close_delay);
+			schedule_timeout(port->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&port->open_wait);
 	}
@@ -1960,8 +1960,8 @@
 	tmp.irq  = bp->irq;
 	tmp.flags = port->flags;
 	tmp.baud_base = (SX_OSCFREQ + CD186x_TPC/2) / CD186x_TPC;
-	tmp.close_delay = port->close_delay * HZ/100;
-	tmp.closing_wait = port->closing_wait * HZ/100;
+	tmp.close_delay = port->close_delay;
+	tmp.closing_wait = port->closing_wait;
 	tmp.custom_divisor =  port->custom_divisor;
 	tmp.xmit_fifo_size = CD186x_NFIFO;
 	if (copy_to_user(retinfo, &tmp, sizeof(tmp)))
@@ -2291,8 +2291,8 @@
 		sx_port[i].tqueue.data = &sx_port[i];
 		sx_port[i].tqueue_hangup.routine = do_sx_hangup;
 		sx_port[i].tqueue_hangup.data = &sx_port[i];
-		sx_port[i].close_delay = 50 * HZ/100;
-		sx_port[i].closing_wait = 3000 * HZ/100;
+		sx_port[i].close_delay = 50;	/* .5 seconds */
+		sx_port[i].closing_wait = 3000;	/* 30 seconds */
 		init_waitqueue_head(&sx_port[i].open_wait);
 		init_waitqueue_head(&sx_port[i].close_wait);
 	}
diff -urN linux-2.4.29-pre1/drivers/char/stallion.c linux-2.4.29-pre1-ia/drivers/char/stallion.c
--- linux-2.4.29-pre1/drivers/char/stallion.c	2004-11-29 13:00:15.485407832 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/stallion.c	2004-11-29 13:01:27.063526304 +0000
@@ -403,7 +403,7 @@
 #define	STL_SC26198MAXBAUD	460800
 
 #define	STL_BAUDBASE		115200
-#define	STL_CLOSEDELAY		(5 * HZ / 10)
+#define	STL_CLOSEDELAY		50	/* .5 seconds */
 
 /*****************************************************************************/
 
@@ -1221,7 +1221,7 @@
  */
 	tty->closing = 1;
 	if (portp->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, portp->closing_wait);
+		tty_wait_until_sent(tty, portp->closing_wait * HZ / 100);
 	stl_waituntilsent(tty, (HZ / 2));
 
 	portp->flags &= ~ASYNC_INITIALIZED;
@@ -1246,7 +1246,7 @@
 
 	if (portp->openwaitcnt) {
 		if (portp->close_delay)
-			stl_delay(portp->close_delay);
+			stl_delay(portp->close_delay * HZ / 100);
 		wake_up_interruptible(&portp->open_wait);
 	}
 
@@ -2287,7 +2287,7 @@
 		portp->clk = brdp->clk;
 		portp->baud_base = STL_BAUDBASE;
 		portp->close_delay = STL_CLOSEDELAY;
-		portp->closing_wait = 30 * HZ;
+		portp->closing_wait = 3000;	/* 30 seconds */
 		portp->normaltermios = stl_deftermios;
 		portp->callouttermios = stl_deftermios;
 		portp->tqueue.routine = stl_offintr;
diff -urN linux-2.4.29-pre1/drivers/char/sx.c linux-2.4.29-pre1-ia/drivers/char/sx.c
--- linux-2.4.29-pre1/drivers/char/sx.c	2003-06-13 15:51:33.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/sx.c	2004-11-29 13:01:27.107519616 +0000
@@ -2370,8 +2370,8 @@
 			port->gs.callout_termios = tty_std_termios;
 			port->gs.normal_termios	= tty_std_termios;
 			port->gs.magic = SX_MAGIC;
-			port->gs.close_delay = HZ/2;
-			port->gs.closing_wait = 30 * HZ;
+			port->gs.close_delay = 50;	/* .5 seconds */
+			port->gs.closing_wait = 3000;	/* 30 seconds */
 			port->board = board;
 			port->gs.rd = &sx_real_driver;
 #ifdef NEW_WRITE_LOCKING
diff -urN linux-2.4.29-pre1/drivers/char/synclink.c linux-2.4.29-pre1-ia/drivers/char/synclink.c
--- linux-2.4.29-pre1/drivers/char/synclink.c	2003-11-28 18:26:20.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/synclink.c	2004-11-29 13:01:27.117518096 +0000
@@ -3334,7 +3334,7 @@
 		if (debug_level >= DEBUG_LEVEL_INFO)
 			printk("%s(%d):mgsl_close(%s) calling tty_wait_until_sent\n",
 				 __FILE__,__LINE__, info->device_name );
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	}
 		
  	if (info->flags & ASYNC_INITIALIZED)
@@ -3354,7 +3354,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			set_current_state(TASK_INTERRUPTIBLE);
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -4581,8 +4581,8 @@
 		info->task.routine = mgsl_bh_handler;
 		info->task.data    = info;
 		info->max_frame_size = 4096;
-		info->close_delay = 5*HZ/10;
-		info->closing_wait = 30*HZ;
+		info->close_delay = 50;		/* .5 seconds */
+		info->closing_wait = 3000;	/* 30 seconds */
 		init_waitqueue_head(&info->open_wait);
 		init_waitqueue_head(&info->close_wait);
 		init_waitqueue_head(&info->status_event_wait_q);
diff -urN linux-2.4.29-pre1/drivers/char/synclinkmp.c linux-2.4.29-pre1-ia/drivers/char/synclinkmp.c
--- linux-2.4.29-pre1/drivers/char/synclinkmp.c	2004-11-17 11:54:21.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/synclinkmp.c	2004-11-29 13:01:27.162511256 +0000
@@ -897,7 +897,7 @@
 		if (debug_level >= DEBUG_LEVEL_INFO)
 			printk("%s(%d):%s close() calling tty_wait_until_sent\n",
 				 __FILE__,__LINE__, info->device_name );
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	}
 
  	if (info->flags & ASYNC_INITIALIZED)
@@ -917,7 +917,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			set_current_state(TASK_INTERRUPTIBLE);
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -3758,8 +3758,8 @@
 		info->task.routine = bh_handler;
 		info->task.data    = info;
 		info->max_frame_size = 4096;
-		info->close_delay = 5*HZ/10;
-		info->closing_wait = 30*HZ;
+		info->close_delay = 50;		/* .5 seconds */
+		info->closing_wait = 3000;	/* 30 seconds */
 		init_waitqueue_head(&info->open_wait);
 		init_waitqueue_head(&info->close_wait);
 		init_waitqueue_head(&info->status_event_wait_q);
diff -urN linux-2.4.29-pre1/drivers/char/vac-serial.c linux-2.4.29-pre1-ia/drivers/char/vac-serial.c
--- linux-2.4.29-pre1/drivers/char/vac-serial.c	2004-02-18 13:36:31.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/char/vac-serial.c	2004-11-29 13:01:27.166510648 +0000
@@ -1340,8 +1340,8 @@
 		       (info->flags & ASYNC_INTERNAL_FLAGS));
 	state->custom_divisor = new_serial.custom_divisor;
 	state->type = new_serial.type;
-	state->close_delay = new_serial.close_delay * HZ/100;
-	state->closing_wait = new_serial.closing_wait * HZ/100;
+	state->close_delay = new_serial.close_delay;
+	state->closing_wait = new_serial.closing_wait;
 	info->tty->low_latency = (info->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 	info->xmit_fifo_size = state->xmit_fifo_size =
 		new_serial.xmit_fifo_size;
@@ -1699,8 +1699,8 @@
 	 * the line discipline to only process XON/XOFF characters.
 	 */
 	tty->closing = 1;
-	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+	if (state->closing_wait != ASYNC_CLOSING_WAIT_NONE)
+		tty_wait_until_sent(tty, state->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1727,9 +1727,9 @@
 	info->event = 0;
 	info->tty = 0;
 	if (info->blocked_open) {
-		if (info->close_delay) {
+		if (state->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(state->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2417,8 +2417,8 @@
 		state->line = i;
 		state->type = PORT_UNKNOWN;
 		state->custom_divisor = 0;
-		state->close_delay = 5*HZ/10;
-		state->closing_wait = 30*HZ;
+		state->close_delay = 50;	/* .5 seconds */
+		state->closing_wait = 3000;	/* 30 seconds */
 		state->callout_termios = callout_driver.init_termios;
 		state->normal_termios = serial_driver.init_termios;
 		state->icount.cts = state->icount.dsr =
diff -urN linux-2.4.29-pre1/drivers/char/vme_scc.c linux-2.4.29-pre1-ia/drivers/char/vme_scc.c
--- linux-2.4.29-pre1/drivers/char/vme_scc.c	2002-08-03 01:39:43.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/char/vme_scc.c	2004-11-29 13:01:27.168510344 +0000
@@ -205,8 +205,8 @@
 		port->gs.callout_termios = tty_std_termios;
 		port->gs.normal_termios = tty_std_termios;
 		port->gs.magic = SCC_MAGIC;
-		port->gs.close_delay = HZ/2;
-		port->gs.closing_wait = 30 * HZ;
+		port->gs.close_delay = 50;	/* .5 seconds */
+		port->gs.closing_wait = 3000;	/* 30 seconds */
 		port->gs.rd = &scc_real_driver;
 #ifdef NEW_WRITE_LOCKING
 		port->gs.port_write_sem = MUTEX;
diff -urN linux-2.4.29-pre1/drivers/macintosh/macserial.c linux-2.4.29-pre1-ia/drivers/macintosh/macserial.c
--- linux-2.4.29-pre1/drivers/macintosh/macserial.c	2002-08-03 01:39:44.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/macintosh/macserial.c	2004-11-29 13:01:27.172509736 +0000
@@ -1996,7 +1996,7 @@
 	tty->closing = 1;
 	if (info->closing_wait != ZILOG_CLOSING_WAIT_NONE) {
 		restore_flags(flags);
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 		save_flags(flags); cli();
 	}
 
@@ -2038,7 +2038,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
diff -urN linux-2.4.29-pre1/drivers/sbus/char/aurora.c linux-2.4.29-pre1-ia/drivers/sbus/char/aurora.c
--- linux-2.4.29-pre1/drivers/sbus/char/aurora.c	2002-11-28 23:53:14.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/sbus/char/aurora.c	2004-11-29 13:01:27.216503048 +0000
@@ -1538,7 +1538,7 @@
 #ifdef AURORA_DEBUG
 		printk("aurora_close: waiting to flush...\n");
 #endif
-		tty_wait_until_sent(tty, port->closing_wait);
+		tty_wait_until_sent(tty, port->closing_wait * HZ / 100);
 	}
 
 	/* At this point we stop accepting input.  To do this, we
@@ -1581,7 +1581,7 @@
 	if (port->blocked_open) {
 		if (port->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(port->close_delay);
+			schedule_timeout(port->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&port->open_wait);
 	}
@@ -1988,8 +1988,8 @@
 	tmp.irq  = bp->irq;
 	tmp.flags = port->flags;
 	tmp.baud_base = (bp->oscfreq + CD180_TPC/2) / CD180_TPC;
-	tmp.close_delay = port->close_delay * HZ/100;
-	tmp.closing_wait = port->closing_wait * HZ/100;
+	tmp.close_delay = port->close_delay;
+	tmp.closing_wait = port->closing_wait;
 	tmp.xmit_fifo_size = CD180_NFIFO;
 	copy_to_user(retinfo, &tmp, sizeof(tmp));
 #ifdef AURORA_DEBUG
@@ -2359,8 +2359,8 @@
 		aurora_port[i].tqueue.data = &aurora_port[i];
 		aurora_port[i].tqueue_hangup.routine = do_aurora_hangup;
 		aurora_port[i].tqueue_hangup.data = &aurora_port[i];
-		aurora_port[i].close_delay = 50 * HZ/100;
-		aurora_port[i].closing_wait = 3000 * HZ/100;
+		aurora_port[i].close_delay = 50;	/* .5 seconds */
+		aurora_port[i].closing_wait = 3000;	/* 30 seconds */
 		init_waitqueue_head(&aurora_port[i].open_wait);
 		init_waitqueue_head(&aurora_port[i].close_wait);
 	}
diff -urN linux-2.4.29-pre1/drivers/sbus/char/sab82532.c linux-2.4.29-pre1-ia/drivers/sbus/char/sab82532.c
--- linux-2.4.29-pre1/drivers/sbus/char/sab82532.c	2002-08-03 01:39:44.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/sbus/char/sab82532.c	2004-11-29 13:01:27.220502440 +0000
@@ -1647,7 +1647,7 @@
 	 */
 	tty->closing = 1;
 	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 
 	/*
 	 * At this point we stop accepting input.  To do this, we
@@ -1675,7 +1675,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2310,8 +2310,8 @@
 		writeb(readb(&info->regs->rw.mode) | SAB82532_MODE_RTS, &info->regs->rw.mode);
 
 		info->custom_divisor = 16;
-		info->close_delay = 5*HZ/10;
-		info->closing_wait = 30*HZ;
+		info->close_delay = 50;		/* .5 seconds */
+		info->closing_wait = 3000;	/* 30 seconds */
 		info->tec_timeout = SAB82532_MAX_TEC_TIMEOUT;
 		info->cec_timeout = SAB82532_MAX_CEC_TIMEOUT;
 		info->x_char = 0;
diff -urN linux-2.4.29-pre1/drivers/sbus/char/su.c linux-2.4.29-pre1-ia/drivers/sbus/char/su.c
--- linux-2.4.29-pre1/drivers/sbus/char/su.c	2002-08-03 01:39:44.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/sbus/char/su.c	2004-11-29 13:01:27.224501832 +0000
@@ -1794,7 +1794,7 @@
 	 */
 	tty->closing = 1;
 	if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1823,7 +1823,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
@@ -2553,8 +2553,8 @@
 		info->baud_base = BAUD_BASE;
 		/* info->flags = 0; */
 		info->custom_divisor = 0;
-		info->close_delay = 5*HZ/10;
-		info->closing_wait = 30*HZ;
+		info->close_delay = 50;		/* .5 seconds */
+		info->closing_wait = 3000;	/* 30 seconds */
 		info->callout_termios = callout_driver.init_termios;
 		info->normal_termios = serial_driver.init_termios;
 		info->icount.cts = info->icount.dsr = 
diff -urN linux-2.4.29-pre1/drivers/sbus/char/zs.c linux-2.4.29-pre1-ia/drivers/sbus/char/zs.c
--- linux-2.4.29-pre1/drivers/sbus/char/zs.c	2002-08-03 01:39:44.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/sbus/char/zs.c	2004-11-29 13:01:27.228501224 +0000
@@ -1583,7 +1583,7 @@
 	 */
 	tty->closing = 1;
 	if (info->closing_wait != ZILOG_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receive line status interrupts, and tell the
@@ -1616,7 +1616,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
diff -urN linux-2.4.29-pre1/drivers/tc/zs.c linux-2.4.29-pre1-ia/drivers/tc/zs.c
--- linux-2.4.29-pre1/drivers/tc/zs.c	2004-02-18 13:36:31.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/tc/zs.c	2004-11-29 13:01:27.271494688 +0000
@@ -1408,7 +1408,7 @@
 	 */
 	tty->closing = 1;
 	if (info->closing_wait != ZILOG_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, info->closing_wait);
+		tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 	/*
 	 * At this point we stop accepting input.  To do this, we
 	 * disable the receiver and receive interrupts.
@@ -1437,7 +1437,7 @@
 	if (info->blocked_open) {
 		if (info->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(info->close_delay);
+			schedule_timeout(info->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&info->open_wait);
 	}
diff -urN linux-2.4.29-pre1/drivers/usb/serial/io_edgeport.c linux-2.4.29-pre1-ia/drivers/usb/serial/io_edgeport.c
--- linux-2.4.29-pre1/drivers/usb/serial/io_edgeport.c	2004-08-08 00:26:05.000000000 +0100
+++ linux-2.4.29-pre1-ia/drivers/usb/serial/io_edgeport.c	2004-11-29 13:01:27.276493928 +0000
@@ -1830,8 +1830,8 @@
 	tmp.flags		= ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
 	tmp.xmit_fifo_size	= edge_port->maxTxCredits;
 	tmp.baud_base		= 9600;
-	tmp.close_delay		= 5*HZ;
-	tmp.closing_wait	= 30*HZ;
+	tmp.close_delay		= 50;	/* .5 seconds */
+	tmp.closing_wait	= 3000;	/* 30 seconds */
 //	tmp.custom_divisor	= state->custom_divisor;
 //	tmp.hub6		= state->hub6;
 //	tmp.io_type		= state->io_type;
diff -urN linux-2.4.29-pre1/drivers/usb/serial/io_ti.c linux-2.4.29-pre1-ia/drivers/usb/serial/io_ti.c
--- linux-2.4.29-pre1/drivers/usb/serial/io_ti.c	2003-11-28 18:26:20.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/usb/serial/io_ti.c	2004-11-29 13:01:27.280493320 +0000
@@ -2461,8 +2461,8 @@
 	tmp.flags		= ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
 	tmp.xmit_fifo_size	= edge_port->port->bulk_out_size;
 	tmp.baud_base		= 9600;
-	tmp.close_delay		= 5*HZ;
-	tmp.closing_wait	= 30*HZ;
+	tmp.close_delay		= 50;	/* .5 seconds */
+	tmp.closing_wait	= 3000;	/* 30 seconds */
 //	tmp.custom_divisor	= state->custom_divisor;
 //	tmp.hub6		= state->hub6;
 //	tmp.io_type		= state->io_type;
diff -urN linux-2.4.29-pre1/drivers/usb/serial/usbserial.c linux-2.4.29-pre1-ia/drivers/usb/serial/usbserial.c
--- linux-2.4.29-pre1/drivers/usb/serial/usbserial.c	2004-11-17 11:54:21.000000000 +0000
+++ linux-2.4.29-pre1-ia/drivers/usb/serial/usbserial.c	2004-11-29 13:01:27.282493016 +0000
@@ -675,7 +675,7 @@
 		tty->closing = 1;
 		up (&port->sem);
 		if (info->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-			tty_wait_until_sent(tty, info->closing_wait);
+			tty_wait_until_sent(tty, info->closing_wait * HZ / 100);
 		down (&port->sem);
 		if (!tty->driver_data) /* woopsie, disconnect, now what */ ;
 #endif
diff -urN linux-2.4.29-pre1/net/irda/ircomm/ircomm_tty.c linux-2.4.29-pre1-ia/net/irda/ircomm/ircomm_tty.c
--- linux-2.4.29-pre1/net/irda/ircomm/ircomm_tty.c	2003-08-25 12:44:44.000000000 +0100
+++ linux-2.4.29-pre1-ia/net/irda/ircomm/ircomm_tty.c	2004-11-29 13:01:27.329485872 +0000
@@ -419,8 +419,8 @@
 		self->tqueue.data = self;
 		self->max_header_size = IRCOMM_TTY_HDR_UNINITIALISED;
 		self->max_data_size = IRCOMM_TTY_DATA_UNINITIALISED;
-		self->close_delay = 5*HZ/10;
-		self->closing_wait = 30*HZ;
+		self->close_delay = 50;		/* .5 seconds */
+		self->closing_wait = 3000;	/* 30 seconds */
 
 		/* Init some important stuff */
 		init_timer(&self->watchdog_timer);
@@ -560,7 +560,7 @@
 	 */
 	tty->closing = 1;
 	if (self->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, self->closing_wait);
+		tty_wait_until_sent(tty, self->closing_wait * HZ / 100);
 
 	ircomm_tty_shutdown(self);
 
@@ -575,7 +575,7 @@
 	if (self->blocked_open) {
 		if (self->close_delay) {
 			current->state = TASK_INTERRUPTIBLE;
-			schedule_timeout(self->close_delay);
+			schedule_timeout(self->close_delay * HZ / 100);
 		}
 		wake_up_interruptible(&self->open_wait);
 	}

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2.4] serial closing_wait and close_delay
  2004-11-30 18:57 ` Alan Cox
@ 2004-12-01  9:32   ` Ian Abbott
  0 siblings, 0 replies; 6+ messages in thread
From: Ian Abbott @ 2004-12-01  9:32 UTC (permalink / raw)
  To: Alan Cox; +Cc: Marcelo Tosatti, Linux Kernel Mailing List

On 30/11/2004 18:57, Alan Cox wrote:
> On Maw, 2004-11-30 at 19:06, Ian Abbott wrote:
> 
>>Dear Marcelo,
>>
>>This patch should fix various problems with the closing_wait and 
>>close_delay serial parameters, but I can only test the standard serial 
>>driver.
> 
> 
> Thanks - I've added that to my 2.6.x serial todo pile if nobody else
> does it first.

I've already submitted a patch to the linux-serial list, but only 
for the serial_core driver.  (Apologies to Russell King and the 
linux-serial subscribers for submitting it twice!)

-- 
-=( Ian Abbott @ MEV Ltd.    E-mail: <abbotti@mev.co.uk>        )=-
-=( Tel: +44 (0)161 477 1898   FAX: +44 (0)161 718 3587         )=-

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2.4] serial closing_wait and close_delay
  2004-11-30 19:06 [PATCH 2.4] serial closing_wait and close_delay Ian Abbott
  2004-11-30 18:57 ` Alan Cox
@ 2004-12-01 10:48 ` Russell King
  2004-12-13 11:56 ` Marcelo Tosatti
  2 siblings, 0 replies; 6+ messages in thread
From: Russell King @ 2004-12-01 10:48 UTC (permalink / raw)
  To: Ian Abbott; +Cc: Marcelo Tosatti, linux-kernel

On Tue, Nov 30, 2004 at 07:06:02PM +0000, Ian Abbott wrote:
> * In several drivers, the values set by TIOCSSERIAL are scaled by 
> HZ/100, but the values got by TIOCGSERIAL are not scaled back.

See the attached patch for 2.6.  I'd rather keep state->clos* delays
in a sanely sized unit rather than whatever the setserial interface
wants.

> My patch stores the values set by TIOCSSERIAL without scaling and scales 
> the values by HZ/100 at the point of use.  (This is not as bad as it 
> sounds, as each value is scaled once per 'close'.)  There seems to be a 
> general consensus amongst the serial drivers that the closing_wait and 
> close_delay values from the user are in units of .01 seconds.

setserial documentation indicates that these are supposed to be in units
of 0.01 seconds, so I suspect this is what everyone has come to expect.

===== drivers/serial/serial_core.c 1.94 vs edited =====
--- 1.94/drivers/serial/serial_core.c	2004-11-01 12:29:41 +00:00
+++ edited/drivers/serial/serial_core.c	2004-12-01 10:41:10 +00:00
@@ -584,8 +584,10 @@
 	tmp.flags	    = port->flags;
 	tmp.xmit_fifo_size  = port->fifosize;
 	tmp.baud_base	    = port->uartclk / 16;
-	tmp.close_delay	    = state->close_delay;
-	tmp.closing_wait    = state->closing_wait;
+	tmp.close_delay	    = state->close_delay / 10;
+	tmp.closing_wait    = state->closing_wait == USF_CLOSING_WAIT_NONE ?
+				ASYNC_CLOSING_WAIT_NONE :
+			        state->closing_wait / 10;
 	tmp.custom_divisor  = port->custom_divisor;
 	tmp.hub6	    = port->hub6;
 	tmp.io_type         = port->iotype;
@@ -603,8 +605,8 @@
 	struct serial_struct new_serial;
 	struct uart_port *port = state->port;
 	unsigned long new_port;
-	unsigned int change_irq, change_port, old_flags;
-	unsigned int old_custom_divisor;
+	unsigned int change_irq, change_port, old_flags, closing_wait;
+	unsigned int old_custom_divisor, close_delay;
 	int retval = 0;
 
 	if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
@@ -615,6 +617,9 @@
 		new_port += (unsigned long) new_serial.port_high << HIGH_BITS_OFFSET;
 
 	new_serial.irq = irq_canonicalize(new_serial.irq);
+	close_delay = new_serial.close_delay * 10;
+	closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
+			USF_CLOSING_WAIT_NONE : new_serial.closing_wait * 10;
 
 	/*
 	 * This semaphore protects state->count.  It is also
@@ -646,8 +651,8 @@
 		retval = -EPERM;
 		if (change_irq || change_port ||
 		    (new_serial.baud_base != port->uartclk / 16) ||
-		    (new_serial.close_delay != state->close_delay) ||
-		    (new_serial.closing_wait != state->closing_wait) ||
+		    (close_delay != state->close_delay) ||
+		    (closing_wait != state->closing_wait) ||
 		    (new_serial.xmit_fifo_size != port->fifosize) ||
 		    (((new_serial.flags ^ old_flags) & ~UPF_USR_MASK) != 0))
 			goto exit;
@@ -751,8 +756,8 @@
 	port->flags            = (port->flags & ~UPF_CHANGE_MASK) |
 				 (new_serial.flags & UPF_CHANGE_MASK);
 	port->custom_divisor   = new_serial.custom_divisor;
-	state->close_delay     = new_serial.close_delay * HZ / 100;
-	state->closing_wait    = new_serial.closing_wait * HZ / 100;
+	state->close_delay     = close_delay;
+	state->closing_wait    = closing_wait;
 	port->fifosize         = new_serial.xmit_fifo_size;
 	if (state->info->tty)
 		state->info->tty->low_latency =
@@ -1191,7 +1196,7 @@
 	tty->closing = 1;
 
 	if (state->closing_wait != USF_CLOSING_WAIT_NONE)
-		tty_wait_until_sent(tty, state->closing_wait);
+		tty_wait_until_sent(tty, msecs_to_jiffies(state->closing_wait));
 
 	/*
 	 * At this point, we stop accepting input.  To do this, we
@@ -1219,9 +1224,8 @@
 	state->info->tty = NULL;
 
 	if (state->info->blocked_open) {
-		if (state->close_delay) {
-			msleep_interruptible(jiffies_to_msecs(state->close_delay));
-		}
+		if (state->close_delay)
+			msleep_interruptible(state->close_delay);
 	} else if (!uart_console(port)) {
 		uart_change_pm(state, 3);
 	}
@@ -2082,8 +2086,8 @@
 	for (i = 0; i < drv->nr; i++) {
 		struct uart_state *state = drv->state + i;
 
-		state->close_delay     = 5 * HZ / 10;
-		state->closing_wait    = 30 * HZ;
+		state->close_delay     = 500;	/* .5 seconds */
+		state->closing_wait    = 30000;	/* 30 seconds */
 
 		init_MUTEX(&state->sem);
 	}
===== include/linux/serial_core.h 1.49 vs edited =====
--- 1.49/include/linux/serial_core.h	2004-11-29 13:41:34 +00:00
+++ edited/include/linux/serial_core.h	2004-12-01 10:13:06 +00:00
@@ -244,11 +244,11 @@
  * within.
  */
 struct uart_state {
-	unsigned int		close_delay;
-	unsigned int		closing_wait;
+	unsigned int		close_delay;		/* msec */
+	unsigned int		closing_wait;		/* msec */
 
 #define USF_CLOSING_WAIT_INF	(0)
-#define USF_CLOSING_WAIT_NONE	(65535)
+#define USF_CLOSING_WAIT_NONE	(~0U)
 
 	int			count;
 	int			pm_state;

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 PCMCIA      - http://pcmcia.arm.linux.org.uk/
                 2.6 Serial core

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2.4] serial closing_wait and close_delay
  2004-11-30 19:06 [PATCH 2.4] serial closing_wait and close_delay Ian Abbott
  2004-11-30 18:57 ` Alan Cox
  2004-12-01 10:48 ` Russell King
@ 2004-12-13 11:56 ` Marcelo Tosatti
  2004-12-16 13:17   ` Ian Abbott
  2 siblings, 1 reply; 6+ messages in thread
From: Marcelo Tosatti @ 2004-12-13 11:56 UTC (permalink / raw)
  To: Ian Abbott; +Cc: linux-kernel, Alan Cox, Russell King

On Tue, Nov 30, 2004 at 07:06:02PM +0000, Ian Abbott wrote:
> Dear Marcelo,
> 
> This patch should fix various problems with the closing_wait and 
> close_delay serial parameters, but I can only test the standard serial 
> driver.
> 
> There are various scaling problems when HZ != 100:
> 
> * In several drivers, the values set by TIOCSSERIAL are scaled by 
> HZ/100, but the values got by TIOCGSERIAL are not scaled back.
> 
> * Invariably, the scaled closing_wait value is compared with an unscaled 
> constant ASYNC_CLOSING_WAIT_NONE or the same value by another name 
> (depending on the specific driver).
> 
> My patch stores the values set by TIOCSSERIAL without scaling and scales 
> the values by HZ/100 at the point of use.  (This is not as bad as it 
> sounds, as each value is scaled once per 'close'.)  There seems to be a 
> general consensus amongst the serial drivers that the closing_wait and 
> close_delay values from the user are in units of .01 seconds.

OK, it seems Russell's fix is simpler (and I'm not familiar with the code). 

I'll wait for that one to settle down.

> There is another problem, not related to HZ scaling:
> 
> * In several drivers, the closing_wait and close_delay values are 
> written to a struct serial_state by TIOCSSERIAL, but the values used in 
> the close routine are read from a struct async_struct, with no code to 
> transfer of values between the two structures.  My patch ignores the 
> members in struct async_struct and uses the values from struct serial_state.

Can you please split this part of the patch? (and send as a separate patch
to me CC Alan and Russell).

Thanks

> 
> -- Ian.
> 
> Signed-off-by: Ian Abbott <abbotti@mev.co.uk>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2.4] serial closing_wait and close_delay
  2004-12-13 11:56 ` Marcelo Tosatti
@ 2004-12-16 13:17   ` Ian Abbott
  0 siblings, 0 replies; 6+ messages in thread
From: Ian Abbott @ 2004-12-16 13:17 UTC (permalink / raw)
  To: Marcelo Tosatti; +Cc: linux-kernel, Alan Cox, Russell King

On 13/12/04 11:56, Marcelo Tosatti wrote:
> On Tue, Nov 30, 2004 at 07:06:02PM +0000, Ian Abbott wrote:
>>* In several drivers, the closing_wait and close_delay values are 
>>written to a struct serial_state by TIOCSSERIAL, but the values used in 
>>the close routine are read from a struct async_struct, with no code to 
>>transfer of values between the two structures.  My patch ignores the 
>>members in struct async_struct and uses the values from struct serial_state.
> 
> 
> Can you please split this part of the patch? (and send as a separate patch
> to me CC Alan and Russell).

Okay, I'm about to send that.  By the way, while going through my 
original patch, I noticed that one of its changes to drivers/char/moxa.c 
was incorrect.  Line 671 of the original used a fixed 30 second timeout. 
  My change replaced that to use closing_wait but I got the name of the 
variable wrong; it should have been 'ch', not 'info'.  My split-off 
patch doesn't change moxa.c.

-- 
-=( Ian Abbott @ MEV Ltd.    E-mail: <abbotti@mev.co.uk>        )=-
-=( Tel: +44 (0)161 477 1898   FAX: +44 (0)161 718 3587         )=-

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2004-12-16 13:22 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-11-30 19:06 [PATCH 2.4] serial closing_wait and close_delay Ian Abbott
2004-11-30 18:57 ` Alan Cox
2004-12-01  9:32   ` Ian Abbott
2004-12-01 10:48 ` Russell King
2004-12-13 11:56 ` Marcelo Tosatti
2004-12-16 13:17   ` Ian Abbott

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).