[kernel] r16906 - in dists/squeeze/linux-2.6/debian: . patches/bugfix/sparc patches/series

Jurij Smakov jurij-guest at alioth.debian.org
Thu Feb 17 22:23:15 UTC 2011


Author: jurij-guest
Date: Thu Feb 17 22:22:59 2011
New Revision: 16906

Log:
Add sparc-console-handover.patch to fix kernel hang on sparc machines 
using atyfb driver.

Added:
   dists/squeeze/linux-2.6/debian/patches/bugfix/sparc/sparc-console-handover.patch
Modified:
   dists/squeeze/linux-2.6/debian/changelog
   dists/squeeze/linux-2.6/debian/patches/series/31

Modified: dists/squeeze/linux-2.6/debian/changelog
==============================================================================
--- dists/squeeze/linux-2.6/debian/changelog	Thu Feb 17 18:18:03 2011	(r16905)
+++ dists/squeeze/linux-2.6/debian/changelog	Thu Feb 17 22:22:59 2011	(r16906)
@@ -33,6 +33,13 @@
   * Orion: add support for Buffalo LS-CHL (Closes: #590105).
   * Kirkwood: initialize PCIE1 for QNAP TS-419P+ (Closes: #613499).
 
+  [ Jurij Smakov ]
+  * sparc: add sparc-console-handover.patch to address problems with
+    console handover on sparc causing kernel to hang during boot on
+    systems using atyfb driver.
+    Thanks to Fabio M. Di Nitto <fabbione at fabbione.net> for the patch.
+    (Closes: #602853)
+
  -- Ian Campbell <ijc at hellion.org.uk>  Thu, 13 Jan 2011 07:07:54 +0000
 
 linux-2.6 (2.6.32-30) unstable; urgency=high

Added: dists/squeeze/linux-2.6/debian/patches/bugfix/sparc/sparc-console-handover.patch
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ dists/squeeze/linux-2.6/debian/patches/bugfix/sparc/sparc-console-handover.patch	Thu Feb 17 22:22:59 2011	(r16906)
@@ -0,0 +1,729 @@
+diff -Naurd source.orig//arch/sparc/include/asm/openprom.h source/arch/sparc/include/asm/openprom.h
+--- source.orig//arch/sparc/include/asm/openprom.h	2009-12-03 04:51:21.000000000 +0100
++++ source/arch/sparc/include/asm/openprom.h	2011-01-06 10:18:49.000000000 +0100
+@@ -37,7 +37,7 @@
+ 	int (*v2_dev_open)(char *devpath);
+ 	void (*v2_dev_close)(int d);
+ 	int (*v2_dev_read)(int d, char *buf, int nbytes);
+-	int (*v2_dev_write)(int d, char *buf, int nbytes);
++	int (*v2_dev_write)(int d, const char *buf, int nbytes);
+ 	int (*v2_dev_seek)(int d, int hi, int lo);
+ 
+ 	/* Never issued (multistage load support) */
+diff -Naurd source.orig//arch/sparc/include/asm/oplib_32.h source/arch/sparc/include/asm/oplib_32.h
+--- source.orig//arch/sparc/include/asm/oplib_32.h	2009-12-03 04:51:21.000000000 +0100
++++ source/arch/sparc/include/asm/oplib_32.h	2011-01-06 10:18:49.000000000 +0100
+@@ -60,25 +60,6 @@
+ extern char *prom_mapio(char *virt_hint, int io_space, unsigned int phys_addr, unsigned int num_bytes);
+ extern void prom_unmapio(char *virt_addr, unsigned int num_bytes);
+ 
+-/* Device operations. */
+-
+-/* Open the device described by the passed string.  Note, that the format
+- * of the string is different on V0 vs. V2->higher proms.  The caller must
+- * know what he/she is doing!  Returns the device descriptor, an int.
+- */
+-extern int prom_devopen(char *device_string);
+-
+-/* Close a previously opened device described by the passed integer
+- * descriptor.
+- */
+-extern int prom_devclose(int device_handle);
+-
+-/* Do a seek operation on the device described by the passed integer
+- * descriptor.
+- */
+-extern void prom_seek(int device_handle, unsigned int seek_hival,
+-		      unsigned int seek_lowval);
+-
+ /* Miscellaneous routines, don't really fit in any category per se. */
+ 
+ /* Reboot the machine with the command line passed. */
+@@ -121,19 +102,8 @@
+ /* Get the prom firmware revision. */
+ extern int prom_getprev(void);
+ 
+-/* Character operations to/from the console.... */
+-
+-/* Non-blocking get character from console. */
+-extern int prom_nbgetchar(void);
+-
+-/* Non-blocking put character to console. */
+-extern int prom_nbputchar(char character);
+-
+-/* Blocking get character from console. */
+-extern char prom_getchar(void);
+-
+-/* Blocking put character to console. */
+-extern void prom_putchar(char character);
++/* Write a buffer of characters to the console. */
++extern void prom_console_write_buf(const char *buf, int len);
+ 
+ /* Prom's internal routines, don't use in kernel/boot code. */
+ extern void prom_printf(const char *fmt, ...);
+@@ -238,7 +208,6 @@
+ extern int prom_setprop(int node, const char *prop_name, char *prop_value,
+ 			int value_size);
+ 
+-extern int prom_pathtoinode(char *path);
+ extern int prom_inst2pkg(int);
+ 
+ /* Dorking with Bus ranges... */
+diff -Naurd source.orig//arch/sparc/include/asm/oplib_64.h source/arch/sparc/include/asm/oplib_64.h
+--- source.orig//arch/sparc/include/asm/oplib_64.h	2011-01-06 10:18:05.000000000 +0100
++++ source/arch/sparc/include/asm/oplib_64.h	2011-01-06 10:18:49.000000000 +0100
+@@ -67,27 +67,6 @@
+ /* Boot argument acquisition, returns the boot command line string. */
+ extern char *prom_getbootargs(void);
+ 
+-/* Device utilities. */
+-
+-/* Device operations. */
+-
+-/* Open the device described by the passed string.  Note, that the format
+- * of the string is different on V0 vs. V2->higher proms.  The caller must
+- * know what he/she is doing!  Returns the device descriptor, an int.
+- */
+-extern int prom_devopen(const char *device_string);
+-
+-/* Close a previously opened device described by the passed integer
+- * descriptor.
+- */
+-extern int prom_devclose(int device_handle);
+-
+-/* Do a seek operation on the device described by the passed integer
+- * descriptor.
+- */
+-extern void prom_seek(int device_handle, unsigned int seek_hival,
+-		      unsigned int seek_lowval);
+-
+ /* Miscellaneous routines, don't really fit in any category per se. */
+ 
+ /* Reboot the machine with the command line passed. */
+@@ -109,33 +88,14 @@
+ /* Halt and power-off the machine. */
+ extern void prom_halt_power_off(void) __attribute__ ((noreturn));
+ 
+-/* Set the PROM 'sync' callback function to the passed function pointer.
+- * When the user gives the 'sync' command at the prom prompt while the
+- * kernel is still active, the prom will call this routine.
+- *
+- */
+-typedef int (*callback_func_t)(long *cmd);
+-extern void prom_setcallback(callback_func_t func_ptr);
+-
+ /* Acquire the IDPROM of the root node in the prom device tree.  This
+  * gets passed a buffer where you would like it stuffed.  The return value
+  * is the format type of this idprom or 0xff on error.
+  */
+ extern unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size);
+ 
+-/* Character operations to/from the console.... */
+-
+-/* Non-blocking get character from console. */
+-extern int prom_nbgetchar(void);
+-
+-/* Non-blocking put character to console. */
+-extern int prom_nbputchar(char character);
+-
+-/* Blocking get character from console. */
+-extern char prom_getchar(void);
+-
+-/* Blocking put character to console. */
+-extern void prom_putchar(char character);
++/* Write a buffer of characters to the console. */
++extern void prom_console_write_buf(const char *buf, int len);
+ 
+ /* Prom's internal routines, don't use in kernel/boot code. */
+ extern void prom_printf(const char *fmt, ...);
+@@ -278,9 +238,7 @@
+ extern int prom_setprop(int node, const char *prop_name, char *prop_value,
+ 			int value_size);
+ 
+-extern int prom_pathtoinode(const char *path);
+ extern int prom_inst2pkg(int);
+-extern int prom_service_exists(const char *service_name);
+ extern void prom_sun4v_guest_soft_state(void);
+ 
+ extern int prom_ihandle2path(int handle, char *buffer, int bufsize);
+diff -Naurd source.orig//arch/sparc/kernel/leon_kernel.c source/arch/sparc/kernel/leon_kernel.c
+--- source.orig//arch/sparc/kernel/leon_kernel.c	2009-12-03 04:51:21.000000000 +0100
++++ source/arch/sparc/kernel/leon_kernel.c	2011-01-06 10:18:49.000000000 +0100
+@@ -112,7 +112,7 @@
+ 	if (leon3_gptimer_regs && leon3_irqctrl_regs) {
+ 		LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].val, 0);
+ 		LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].rld,
+-				      (((1000000 / 100) - 1)));
++				      (((1000000 / HZ) - 1)));
+ 		LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].ctrl, 0);
+ 
+ 	} else {
+diff -Naurd source.orig//arch/sparc/prom/console_32.c source/arch/sparc/prom/console_32.c
+--- source.orig//arch/sparc/prom/console_32.c	2009-12-03 04:51:21.000000000 +0100
++++ source/arch/sparc/prom/console_32.c	2011-01-06 10:18:49.000000000 +0100
+@@ -16,63 +16,26 @@
+ 
+ extern void restore_current(void);
+ 
+-/* Non blocking get character from console input device, returns -1
+- * if no input was taken.  This can be used for polling.
+- */
+-int
+-prom_nbgetchar(void)
+-{
+-	static char inc;
+-	int i = -1;
+-	unsigned long flags;
+-
+-	spin_lock_irqsave(&prom_lock, flags);
+-	switch(prom_vers) {
+-	case PROM_V0:
+-		i = (*(romvec->pv_nbgetchar))();
+-		break;
+-	case PROM_V2:
+-	case PROM_V3:
+-		if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) {
+-			i = inc;
+-		} else {
+-			i = -1;
+-		}
+-		break;
+-	default:
+-		i = -1;
+-		break;
+-	};
+-	restore_current();
+-	spin_unlock_irqrestore(&prom_lock, flags);
+-	return i; /* Ugh, we could spin forever on unsupported proms ;( */
+-}
+-
+ /* Non blocking put character to console device, returns -1 if
+  * unsuccessful.
+  */
+-int
+-prom_nbputchar(char c)
++static int prom_nbputchar(const char *buf)
+ {
+-	static char outc;
+ 	unsigned long flags;
+ 	int i = -1;
+ 
+ 	spin_lock_irqsave(&prom_lock, flags);
+ 	switch(prom_vers) {
+ 	case PROM_V0:
+-		i = (*(romvec->pv_nbputchar))(c);
++		i = (*(romvec->pv_nbputchar))(*buf);
+ 		break;
+ 	case PROM_V2:
+ 	case PROM_V3:
+-		outc = c;
+-		if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1)
++		if ((*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout,
++							  buf, 0x1) == 1)
+ 			i = 0;
+-		else
+-			i = -1;
+ 		break;
+ 	default:
+-		i = -1;
+ 		break;
+ 	};
+ 	restore_current();
+@@ -80,19 +43,14 @@
+ 	return i; /* Ugh, we could spin forever on unsupported proms ;( */
+ }
+ 
+-/* Blocking version of get character routine above. */
+-char
+-prom_getchar(void)
++void prom_console_write_buf(const char *buf, int len)
+ {
+-	int character;
+-	while((character = prom_nbgetchar()) == -1) ;
+-	return (char) character;
++	while (len) {
++		int n = prom_nbputchar(buf);
++		if (n)
++			continue;
++		len--;
++		buf++;
++	}
+ }
+ 
+-/* Blocking version of put character routine above. */
+-void
+-prom_putchar(char c)
+-{
+-	while(prom_nbputchar(c) == -1) ;
+-	return;
+-}
+diff -Naurd source.orig//arch/sparc/prom/console_64.c source/arch/sparc/prom/console_64.c
+--- source.orig//arch/sparc/prom/console_64.c	2011-01-06 10:18:05.000000000 +0100
++++ source/arch/sparc/prom/console_64.c	2011-01-06 10:18:49.000000000 +0100
+@@ -15,86 +15,34 @@
+ 
+ extern int prom_stdin, prom_stdout;
+ 
+-/* Non blocking get character from console input device, returns -1
+- * if no input was taken.  This can be used for polling.
+- */
+-inline int
+-prom_nbgetchar(void)
+-{
+-	unsigned long args[7];
+-	char inc;
+-
+-	args[0] = (unsigned long) "read";
+-	args[1] = 3;
+-	args[2] = 1;
+-	args[3] = (unsigned int) prom_stdin;
+-	args[4] = (unsigned long) &inc;
+-	args[5] = 1;
+-	args[6] = (unsigned long) -1;
+-
+-	p1275_cmd_direct(args);
+-
+-	if (args[6] == 1)
+-		return inc;
+-	return -1;
+-}
+-
+-/* Non blocking put character to console device, returns -1 if
+- * unsuccessful.
+- */
+-inline int
+-prom_nbputchar(char c)
++static int __prom_console_write_buf(const char *buf, int len)
+ {
+ 	unsigned long args[7];
+-	char outc;
+-	
+-	outc = c;
++	int ret;
+ 
+ 	args[0] = (unsigned long) "write";
+ 	args[1] = 3;
+ 	args[2] = 1;
+ 	args[3] = (unsigned int) prom_stdout;
+-	args[4] = (unsigned long) &outc;
+-	args[5] = 1;
++	args[4] = (unsigned long) buf;
++	args[5] = (unsigned int) len;
+ 	args[6] = (unsigned long) -1;
+ 
+ 	p1275_cmd_direct(args);
+ 
+-	if (args[6] == 1)
+-		return 0;
+-	else
++	ret = (int) args[6];
++	if (ret < 0)
+ 		return -1;
++	return ret;
+ }
+ 
+-/* Blocking version of get character routine above. */
+-char
+-prom_getchar(void)
+-{
+-	int character;
+-	while((character = prom_nbgetchar()) == -1) ;
+-	return (char) character;
+-}
+-
+-/* Blocking version of put character routine above. */
+-void
+-prom_putchar(char c)
+-{
+-	prom_nbputchar(c);
+-	return;
+-}
+-
+-void
+-prom_puts(const char *s, int len)
++void prom_console_write_buf(const char *buf, int len)
+ {
+-	unsigned long args[7];
+-
+-	args[0] = (unsigned long) "write";
+-	args[1] = 3;
+-	args[2] = 1;
+-	args[3] = (unsigned int) prom_stdout;
+-	args[4] = (unsigned long) s;
+-	args[5] = len;
+-	args[6] = (unsigned long) -1;
+-
+-	p1275_cmd_direct(args);
++	while (len) {
++		int n = __prom_console_write_buf(buf, len);
++		if (n < 0)
++			continue;
++		len -= n;
++		buf += len;
++	}
+ }
+diff -Naurd source.orig//arch/sparc/prom/devops_32.c source/arch/sparc/prom/devops_32.c
+--- source.orig//arch/sparc/prom/devops_32.c	2009-12-03 04:51:21.000000000 +0100
++++ source/arch/sparc/prom/devops_32.c	1970-01-01 01:00:00.000000000 +0100
+@@ -1,89 +0,0 @@
+-/*
+- * devops.c:  Device operations using the PROM.
+- *
+- * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+- */
+-#include <linux/types.h>
+-#include <linux/kernel.h>
+-#include <linux/sched.h>
+-
+-#include <asm/openprom.h>
+-#include <asm/oplib.h>
+-
+-extern void restore_current(void);
+-
+-/* Open the device described by the string 'dstr'.  Returns the handle
+- * to that device used for subsequent operations on that device.
+- * Returns -1 on failure.
+- */
+-int
+-prom_devopen(char *dstr)
+-{
+-	int handle;
+-	unsigned long flags;
+-	spin_lock_irqsave(&prom_lock, flags);
+-	switch(prom_vers) {
+-	case PROM_V0:
+-		handle = (*(romvec->pv_v0devops.v0_devopen))(dstr);
+-		if(handle == 0) handle = -1;
+-		break;
+-	case PROM_V2:
+-	case PROM_V3:
+-		handle = (*(romvec->pv_v2devops.v2_dev_open))(dstr);
+-		break;
+-	default:
+-		handle = -1;
+-		break;
+-	};
+-	restore_current();
+-	spin_unlock_irqrestore(&prom_lock, flags);
+-
+-	return handle;
+-}
+-
+-/* Close the device described by device handle 'dhandle'. */
+-int
+-prom_devclose(int dhandle)
+-{
+-	unsigned long flags;
+-	spin_lock_irqsave(&prom_lock, flags);
+-	switch(prom_vers) {
+-	case PROM_V0:
+-		(*(romvec->pv_v0devops.v0_devclose))(dhandle);
+-		break;
+-	case PROM_V2:
+-	case PROM_V3:
+-		(*(romvec->pv_v2devops.v2_dev_close))(dhandle);
+-		break;
+-	default:
+-		break;
+-	};
+-	restore_current();
+-	spin_unlock_irqrestore(&prom_lock, flags);
+-	return 0;
+-}
+-
+-/* Seek to specified location described by 'seekhi' and 'seeklo'
+- * for device 'dhandle'.
+- */
+-void
+-prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo)
+-{
+-	unsigned long flags;
+-	spin_lock_irqsave(&prom_lock, flags);
+-	switch(prom_vers) {
+-	case PROM_V0:
+-		(*(romvec->pv_v0devops.v0_seekdev))(dhandle, seekhi, seeklo);
+-		break;
+-	case PROM_V2:
+-	case PROM_V3:
+-		(*(romvec->pv_v2devops.v2_dev_seek))(dhandle, seekhi, seeklo);
+-		break;
+-	default:
+-		break;
+-	};
+-	restore_current();
+-	spin_unlock_irqrestore(&prom_lock, flags);
+-
+-	return;
+-}
+diff -Naurd source.orig//arch/sparc/prom/devops_64.c source/arch/sparc/prom/devops_64.c
+--- source.orig//arch/sparc/prom/devops_64.c	2011-01-06 10:18:05.000000000 +0100
++++ source/arch/sparc/prom/devops_64.c	1970-01-01 01:00:00.000000000 +0100
+@@ -1,67 +0,0 @@
+-/*
+- * devops.c:  Device operations using the PROM.
+- *
+- * Copyright (C) 1995 David S. Miller (davem at caip.rutgers.edu)
+- * Copyright (C) 1996,1997 Jakub Jelinek (jj at sunsite.mff.cuni.cz)
+- */
+-#include <linux/types.h>
+-#include <linux/kernel.h>
+-#include <linux/sched.h>
+-
+-#include <asm/openprom.h>
+-#include <asm/oplib.h>
+-
+-/* Open the device described by the string 'dstr'.  Returns the handle
+- * to that device used for subsequent operations on that device.
+- * Returns 0 on failure.
+- */
+-int
+-prom_devopen(const char *dstr)
+-{
+-	unsigned long args[5];
+-
+-	args[0] = (unsigned long) "open";
+-	args[1] = 1;
+-	args[2] = 1;
+-	args[3] = (unsigned long) dstr;
+-	args[4] = (unsigned long) -1;
+-
+-	p1275_cmd_direct(args);
+-
+-	return (int) args[4];
+-}
+-
+-/* Close the device described by device handle 'dhandle'. */
+-int
+-prom_devclose(int dhandle)
+-{
+-	unsigned long args[4];
+-
+-	args[0] = (unsigned long) "close";
+-	args[1] = 1;
+-	args[2] = 0;
+-	args[3] = (unsigned int) dhandle;
+-
+-	p1275_cmd_direct(args);
+-
+-	return 0;
+-}
+-
+-/* Seek to specified location described by 'seekhi' and 'seeklo'
+- * for device 'dhandle'.
+- */
+-void
+-prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo)
+-{
+-	unsigned long args[7];
+-
+-	args[0] = (unsigned long) "seek";
+-	args[1] = 3;
+-	args[2] = 1;
+-	args[3] = (unsigned int) dhandle;
+-	args[4] = seekhi;
+-	args[5] = seeklo;
+-	args[6] = (unsigned long) -1;
+-
+-	p1275_cmd_direct(args);
+-}
+diff -Naurd source.orig//arch/sparc/prom/Makefile source/arch/sparc/prom/Makefile
+--- source.orig//arch/sparc/prom/Makefile	2009-12-03 04:51:21.000000000 +0100
++++ source/arch/sparc/prom/Makefile	2011-01-06 10:18:49.000000000 +0100
+@@ -6,7 +6,6 @@
+ 
+ lib-y                 := bootstr_$(BITS).o
+ lib-$(CONFIG_SPARC32) += devmap.o
+-lib-y                 += devops_$(BITS).o
+ lib-y                 += init_$(BITS).o
+ lib-$(CONFIG_SPARC32) += memory.o
+ lib-y                 += misc_$(BITS).o
+diff -Naurd source.orig//arch/sparc/prom/misc_64.c source/arch/sparc/prom/misc_64.c
+--- source.orig//arch/sparc/prom/misc_64.c	2011-01-06 10:18:05.000000000 +0100
++++ source/arch/sparc/prom/misc_64.c	2011-01-06 10:18:49.000000000 +0100
+@@ -18,7 +18,7 @@
+ #include <asm/system.h>
+ #include <asm/ldc.h>
+ 
+-int prom_service_exists(const char *service_name)
++static int prom_service_exists(const char *service_name)
+ {
+ 	unsigned long args[5];
+ 
+@@ -150,20 +150,6 @@
+ 	prom_halt();
+ }
+ 
+-/* Set prom sync handler to call function 'funcp'. */
+-void prom_setcallback(callback_func_t funcp)
+-{
+-	unsigned long args[5];
+-	if (!funcp)
+-		return;
+-	args[0] = (unsigned long) "set-callback";
+-	args[1] = 1;
+-	args[2] = 1;
+-	args[3] = (unsigned long) funcp;
+-	args[4] = (unsigned long) -1;
+-	p1275_cmd_direct(args);
+-}
+-
+ /* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
+  * format type.  'num_bytes' is the number of bytes that your idbuf
+  * has space for.  Returns 0xff on error.
+diff -Naurd source.orig//arch/sparc/prom/printf.c source/arch/sparc/prom/printf.c
+--- source.orig//arch/sparc/prom/printf.c	2009-12-03 04:51:21.000000000 +0100
++++ source/arch/sparc/prom/printf.c	2011-01-06 10:23:30.000000000 +0100
+@@ -15,22 +15,45 @@
+ 
+ #include <linux/kernel.h>
+ #include <linux/compiler.h>
++#include <linux/spinlock.h>
+ 
+ #include <asm/openprom.h>
+ #include <asm/oplib.h>
+ 
++#define CONSOLE_WRITE_BUF_SIZE	1024
++
+ static char ppbuf[1024];
++static char console_write_buf[CONSOLE_WRITE_BUF_SIZE];
++static raw_spinlock_t console_write_lock;
+ 
+ void notrace prom_write(const char *buf, unsigned int n)
+ {
+-	char ch;
++	unsigned int dest_len;
++	unsigned long flags;
++	char *dest;
+ 
+-	while (n != 0) {
+-		--n;
+-		if ((ch = *buf++) == '\n')
+-			prom_putchar('\r');
+-		prom_putchar(ch);
++	dest = console_write_buf;
++	spin_lock_irqsave(&console_write_lock, flags);
++
++	dest_len = 0;
++	while (n-- != 0) {
++		char ch = *buf++;
++		if (ch == '\n') {
++			*dest++ = '\r';
++			dest_len++;
++		}
++		*dest++ = ch;
++		dest_len++;
++		if (dest_len >= CONSOLE_WRITE_BUF_SIZE - 1) {
++			prom_console_write_buf(console_write_buf, dest_len);
++			dest = console_write_buf;
++			dest_len = 0;
++		}
+ 	}
++	if (dest_len)
++		prom_console_write_buf(console_write_buf, dest_len);
++
++	spin_unlock_irqrestore(&console_write_lock, flags);
+ }
+ 
+ void notrace prom_printf(const char *fmt, ...)
+diff -Naurd source.orig//arch/sparc/prom/tree_32.c source/arch/sparc/prom/tree_32.c
+--- source.orig//arch/sparc/prom/tree_32.c	2009-12-03 04:51:21.000000000 +0100
++++ source/arch/sparc/prom/tree_32.c	2011-01-06 10:18:49.000000000 +0100
+@@ -342,18 +342,3 @@
+ 	if (node == -1) return 0;
+ 	return node;
+ }
+-
+-/* Return 'node' assigned to a particular prom 'path'
+- * FIXME: Should work for v0 as well
+- */
+-int prom_pathtoinode(char *path)
+-{
+-	int node, inst;
+-	
+-	inst = prom_devopen (path);
+-	if (inst == -1) return 0;
+-	node = prom_inst2pkg (inst);
+-	prom_devclose (inst);
+-	if (node == -1) return 0;
+-	return node;
+-}
+diff -Naurd source.orig//arch/sparc/prom/tree_64.c source/arch/sparc/prom/tree_64.c
+--- source.orig//arch/sparc/prom/tree_64.c	2011-01-06 10:18:05.000000000 +0100
++++ source/arch/sparc/prom/tree_64.c	2011-01-06 10:18:49.000000000 +0100
+@@ -375,24 +375,6 @@
+ 	return node;
+ }
+ 
+-/* Return 'node' assigned to a particular prom 'path'
+- * FIXME: Should work for v0 as well
+- */
+-int
+-prom_pathtoinode(const char *path)
+-{
+-	int node, inst;
+-
+-	inst = prom_devopen (path);
+-	if (inst == 0)
+-		return 0;
+-	node = prom_inst2pkg(inst);
+-	prom_devclose(inst);
+-	if (node == -1)
+-		return 0;
+-	return node;
+-}
+-
+ int prom_ihandle2path(int handle, char *buffer, int bufsize)
+ {
+ 	unsigned long args[7];
+diff -Naurd source.orig//drivers/video/aty/atyfb_base.c source/drivers/video/aty/atyfb_base.c
+--- source.orig//drivers/video/aty/atyfb_base.c	2009-12-03 04:51:21.000000000 +0100
++++ source/drivers/video/aty/atyfb_base.c	2011-01-06 10:23:56.000000000 +0100
+@@ -2970,9 +2970,8 @@
+ {
+ 	struct atyfb_par *par = info->par;
+ 	struct device_node *dp;
+-	char prop[128];
+-	int node, len, i, j, ret;
+ 	u32 mem, chip_id;
++	int i, j, ret;
+ 
+ 	/*
+ 	 * Map memory-mapped registers.
+@@ -3088,23 +3087,8 @@
+ 		aty_st_le32(MEM_CNTL, mem, par);
+ 	}
+ 
+-	/*
+-	 * If this is the console device, we will set default video
+-	 * settings to what the PROM left us with.
+-	 */
+-	node = prom_getchild(prom_root_node);
+-	node = prom_searchsiblings(node, "aliases");
+-	if (node) {
+-		len = prom_getproperty(node, "screen", prop, sizeof(prop));
+-		if (len > 0) {
+-			prop[len] = '\0';
+-			node = prom_finddevice(prop);
+-		} else
+-			node = 0;
+-	}
+-
+ 	dp = pci_device_to_OF_node(pdev);
+-	if (node == dp->node) {
++	if (dp == of_console_device) {
+ 		struct fb_var_screeninfo *var = &default_var;
+ 		unsigned int N, P, Q, M, T, R;
+ 		u32 v_total, h_total;
+@@ -3112,9 +3096,9 @@
+ 		u8 pll_regs[16];
+ 		u8 clock_cntl;
+ 
+-		crtc.vxres = prom_getintdefault(node, "width", 1024);
+-		crtc.vyres = prom_getintdefault(node, "height", 768);
+-		var->bits_per_pixel = prom_getintdefault(node, "depth", 8);
++		crtc.vxres = of_getintprop_default(dp, "width", 1024);
++		crtc.vyres = of_getintprop_default(dp, "height", 768);
++		var->bits_per_pixel = of_getintprop_default(dp, "depth", 8);
+ 		var->xoffset = var->yoffset = 0;
+ 		crtc.h_tot_disp = aty_ld_le32(CRTC_H_TOTAL_DISP, par);
+ 		crtc.h_sync_strt_wid = aty_ld_le32(CRTC_H_SYNC_STRT_WID, par);

Modified: dists/squeeze/linux-2.6/debian/patches/series/31
==============================================================================
--- dists/squeeze/linux-2.6/debian/patches/series/31	Thu Feb 17 18:18:03 2011	(r16905)
+++ dists/squeeze/linux-2.6/debian/patches/series/31	Thu Feb 17 22:22:59 2011	(r16906)
@@ -20,3 +20,4 @@
 + features/all/aufs2/aufs-bugfix-separate-the-workqueue-for-preprocessing.patch
 + bugfix/all/rt2500usb-fallback-to-SW-encryption-for-TKIP-AES.patch
 + features/arm/ts419p-plus-pcie1.patch
++ bugfix/sparc/sparc-console-handover.patch



More information about the Kernel-svn-changes mailing list