All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Abbott <abbotti@mev.co.uk>
To: Marcelo Tosatti <marcelo.tosatti@cyclades.com>
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 2.4] serial closing_wait and close_delay
Date: Tue, 30 Nov 2004 19:06:02 +0000	[thread overview]
Message-ID: <41ACC49A.20807@mev.co.uk> (raw)

[-- 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);
 	}

             reply	other threads:[~2004-11-30 19:10 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-11-30 19:06 Ian Abbott [this message]
2004-11-30 18:57 ` [PATCH 2.4] serial closing_wait and close_delay 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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=41ACC49A.20807@mev.co.uk \
    --to=abbotti@mev.co.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marcelo.tosatti@cyclades.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.