All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sunsu.c
@ 2004-10-20  3:04 RChan
  2004-10-21  5:19 ` David S. Miller
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: RChan @ 2004-10-20  3:04 UTC (permalink / raw)
  To: sparclinux

The following patch fixes an oops in the serial subsystem
when using a agetty/login on ttyS[01] reported by me on the
mailing list. I suspect member values from the uart_sunsu_port structure are
not correctly transferred to the uart_port structure?

System: Sun Fire V210
Kernel: 2.6.[89]
Problem report: 
http://marc.theaimsgroup.com/?l=linux-sparc&m\x109819243824775&w=2

--- linux.old/drivers/serial/sunsu.c.ORIG        2004-10-20 
10:03:52.000000000 +0800
+++ linux/drivers/serial/sunsu.c     2004-10-20 10:43:40.000000000 +0800
@@ -689,6 +690,7 @@
        } else {
                retval = request_irq(up->irq, sunsu_serial_interrupt,
                                     SA_SHIRQ, su_typev[up->su_type], up);
+               port->irq = up->irq;
        }
        if (retval) {
                printk("su: Cannot register IRQ %d\n", up->irq);


Somehow the irq setting is not transferred to the uart_port structure 
causing
a later oops in synchronize_irq due to NULL pointer dereference. I am 
now able to login on ttyS[01].
The kernel still reports irq as 0 during booting; I am still trying to 
track this
one down. Any pointers as to the earliest stage at which port->irq has 
supposedly been
set to a "good" value, and where does 2.4.2[67] get values for 
interrupts such as 4,7ac
from? (BTW I am a total newbie to the Sparc architecture so please forgive
the dumb questions.)




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

* Re: [PATCH] sunsu.c
  2004-10-20  3:04 [PATCH] sunsu.c RChan
@ 2004-10-21  5:19 ` David S. Miller
  2004-10-21  8:30 ` RChan
  2004-10-31 21:45 ` David S. Miller
  2 siblings, 0 replies; 4+ messages in thread
From: David S. Miller @ 2004-10-21  5:19 UTC (permalink / raw)
  To: sparclinux

On Wed, 20 Oct 2004 11:04:52 +0800
RChan <rspchan@starhub.net.sg> wrote:

> The following patch fixes an oops in the serial subsystem
> when using a agetty/login on ttyS[01] reported by me on the
> mailing list. I suspect member values from the uart_sunsu_port structure are
> not correctly transferred to the uart_port structure?

Thanks a lot, I'll take a closer look at your bug fix
soon.  I think the propagation should be occuring
automatically and I want to find out why that might
not be occuring.

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

* Re: [PATCH] sunsu.c
  2004-10-20  3:04 [PATCH] sunsu.c RChan
  2004-10-21  5:19 ` David S. Miller
@ 2004-10-21  8:30 ` RChan
  2004-10-31 21:45 ` David S. Miller
  2 siblings, 0 replies; 4+ messages in thread
From: RChan @ 2004-10-21  8:30 UTC (permalink / raw)
  To: sparclinux

Here's a fix-up earlier in the code path so that the irq is not reported 
as 0;
this occurs in sunsu_serial_init (actually that makes more sense) then where
I originally put it in sunsu_startup.

I now get
 
ttyS0 at MMIO 0x7fe010003f8 (irq = 7607552) is a 16550A
ttyS1 at MMIO 0x7fe010002e8 (irq = 7607552) is a 16550A

serial_core.c obviously isn't going to use __irq_itoa() to get a "nice" 
representation
of the irq so these irq numbers look weird but more reassuring than 0.



--- /usr/src/linux.old/drivers/serial/sunsu.c.ORIG        2004-10-20 
10:03:52.000000000 +0800
+++ /usr/src/linux/drivers/serial/sunsu.c     2004-10-20 
18:14:23.000000000 +0800
@@ -1092,6 +1092,7 @@
                                up->port.membase = (char *) 
isa_dev->resource.start;
                                up->port.mapbase = isa_dev->resource.start;
                                up->irq = isa_dev->irq;
+                               up->port.irq = up->irq;
                                goto ebus_done;
                        }
                }




David S. Miller wrote:

>On Wed, 20 Oct 2004 11:04:52 +0800
>RChan <rspchan@starhub.net.sg> wrote:
>
>  
>
>>The following patch fixes an oops in the serial subsystem
>>when using a agetty/login on ttyS[01] reported by me on the
>>mailing list. I suspect member values from the uart_sunsu_port structure are
>>not correctly transferred to the uart_port structure?
>>    
>>
>
>Thanks a lot, I'll take a closer look at your bug fix
>soon.  I think the propagation should be occuring
>automatically and I want to find out why that might
>not be occuring.
>
>  
>


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

* Re: [PATCH] sunsu.c
  2004-10-20  3:04 [PATCH] sunsu.c RChan
  2004-10-21  5:19 ` David S. Miller
  2004-10-21  8:30 ` RChan
@ 2004-10-31 21:45 ` David S. Miller
  2 siblings, 0 replies; 4+ messages in thread
From: David S. Miller @ 2004-10-31 21:45 UTC (permalink / raw)
  To: sparclinux


Thanks again for your report and patch.

The up->irq value was just duplicating up->port.irq so
I've fixed this by deleting the former entirely.

=== drivers/serial/sunsu.c 1.45 vs edited ==--- 1.45/drivers/serial/sunsu.c	2004-09-20 13:46:03 -07:00
+++ edited/drivers/serial/sunsu.c	2004-10-31 13:30:54 -08:00
@@ -95,7 +95,6 @@
 	enum su_type		su_type;
 	unsigned int		type_probed;	/* XXX Stupid */
 	int			port_node;
-	unsigned int		irq;
 
 #ifdef CONFIG_SERIO
 	struct serio		*serio;
@@ -684,14 +683,14 @@
 	}
 
 	if (up->su_type != SU_PORT_PORT) {
-		retval = request_irq(up->irq, sunsu_kbd_ms_interrupt,
+		retval = request_irq(up->port.irq, sunsu_kbd_ms_interrupt,
 				     SA_SHIRQ, su_typev[up->su_type], up);
 	} else {
-		retval = request_irq(up->irq, sunsu_serial_interrupt,
+		retval = request_irq(up->port.irq, sunsu_serial_interrupt,
 				     SA_SHIRQ, su_typev[up->su_type], up);
 	}
 	if (retval) {
-		printk("su: Cannot register IRQ %d\n", up->irq);
+		printk("su: Cannot register IRQ %d\n", up->port.irq);
 		return retval;
 	}
 
@@ -779,7 +778,7 @@
 	 */
 	(void) serial_in(up, UART_RX);
 
-	free_irq(up->irq, up);
+	free_irq(up->port.irq, up);
 }
 
 static void
@@ -1078,7 +1077,7 @@
 				 * This is correct on both architectures.
 				 */
 				up->port.mapbase = dev->resource[0].start;
-				up->irq = dev->irqs[0];
+				up->port.irq = dev->irqs[0];
 				goto ebus_done;
 			}
 		}
@@ -1091,7 +1090,7 @@
 				/* Same on sparc64. Cool architecure... */
 				up->port.membase = (char *) isa_dev->resource.start;
 				up->port.mapbase = isa_dev->resource.start;
-				up->irq = isa_dev->irq;
+				up->port.irq = isa_dev->irq;
 				goto ebus_done;
 			}
 		}
@@ -1133,7 +1132,7 @@
 	/*
 	 * There is no intr property on MrCoffee, so hardwire it.
 	 */
-	up->irq = IRQ_4M(13);
+	up->port.irq = IRQ_4M(13);
 #endif
 
 ebus_done:
@@ -1303,7 +1302,7 @@
 
 	printk(KERN_INFO "su%d at 0x%p (irq = %s) is a %s\n",
 	       channel,
-	       up->port.membase, __irq_itoa(up->irq),
+	       up->port.membase, __irq_itoa(up->port.irq),
 	       sunsu_type(&up->port));
 
 #ifdef CONFIG_SERIO

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

end of thread, other threads:[~2004-10-31 21:45 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-10-20  3:04 [PATCH] sunsu.c RChan
2004-10-21  5:19 ` David S. Miller
2004-10-21  8:30 ` RChan
2004-10-31 21:45 ` David S. Miller

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.