[Fwd: Patch 2.4.18-pre9-SERIAL:Address in use error, mem based cards]
PATCH 1/1 [Fwd: Patch 2.4.18-pre9-SERIAL:Address in use error, mem based cards]
Quoted 5 lines · Roman Kurakin
Quoted 4 lines
I have found a bug. It is in support of serial cards which uses
memory for I/O insted of ports. I made a patch forserial.cand fix one place, but probably the problem like this one could be somewhere else.
I've got this fish caught in the my serial driver rewrite - the driver always handles the requesting and freeing of the resources. If it is unable to request the resources, then you will receive a suitable error when trying to configure two ports.
Please note that I'm not about to take on maintainence of the current serial.c driver, except where I spot obvious bugs.
I'd recommend that you pass this one to Marcelo to incorporate (only after he's got his feet on the ground again. 8)) It looks sensible.
--
Russell King ([email protected]) The developer of ARM Linux
http://www.arm.linux.org.uk/personal/aboutme.html
-------- Original Message --------
Subject: Patch 2.4.18-pre9-SERIAL:Address in use error, mem based cards
Date: Mon, 11 Feb 2002 12:08:07 +0300
From: Roman Kurakin <[email protected]>
To: [email protected]
Hi,
I have found a bug. It is in support of serial cards which uses memory
for I/O
insted of ports. I made a patch for serial.c and fix one place, but probably the problem like this one could be somewhere else.
Description:
If you try to use setserial with such cards you will get "Address in
use" (-EADDRINUSE)
Best regards,
Kurakin Roman
serial.c renamed from serial.c.orig +4 -0
@@ -2084,6 +2084,7 @@unsigned int i,change_irq,change_port;int retval =0 ;unsigned long new_port; +unsigned long new_mem;if (copy_from_user (&new_serial,new_info,sizeof (new_serial)))return -EFAULT ;
@@ -2094,6 +2095,8 @@if (HIGH_BITS_OFFSET ) new_port += (unsigned long ) new_serial.port_high <<HIGH_BITS_OFFSET ; + new_mem = new_serial.iomem_base; + change_irq = new_serial.irq != state->irq; change_port = (new_port != ((int ) state->port)) || (new_serial.hub6 != state->hub6);
@@ -2134,6 +2137,7 @@for (i =0 ; i <NR_PORTS ; i++)if ((state != &rs_table[i]) && (rs_table[i].port == new_port) && + (rs_table[i].iomem_base == new_mem) && rs_table[i].type)return -EADDRINUSE ; }