[kernel] r17252 - in dists/sid/linux-2.6/debian: . config/m68k patches/bugfix/m68k
Ben Hutchings
benh at alioth.debian.org
Mon Apr 25 01:17:07 UTC 2011
Author: benh
Date: Mon Apr 25 01:17:00 2011
New Revision: 17252
Log:
Apply m68k fixes from Thorsten Glaser
Added:
dists/sid/linux-2.6/debian/patches/bugfix/m68k/0001-m68k-Add-helper-function-handle_kernel_fault.patch
dists/sid/linux-2.6/debian/patches/bugfix/m68k/0002-m68k-Use-base_trap_init-to-initialize-vectors.patch
dists/sid/linux-2.6/debian/patches/bugfix/m68k/0003-m68k-Allow-all-kernel-traps-to-be-handled-via-except.patch
dists/sid/linux-2.6/debian/patches/bugfix/m68k/0004-m68k-atari-Initial-ARAnyM-support.patch
dists/sid/linux-2.6/debian/patches/bugfix/m68k/0005-m68k-atari-ARAnyM-Add-support-for-block-access.patch
dists/sid/linux-2.6/debian/patches/bugfix/m68k/0006-m68k-atari-ARAnyM-Add-support-for-console-access.patch
dists/sid/linux-2.6/debian/patches/bugfix/m68k/0007-m68k-atari-ARAnyM-Add-support-for-network-access.patch
dists/sid/linux-2.6/debian/patches/bugfix/m68k/0008-m68k-atari-Reserve-some-ST-RAM-early-on-for-device-b.patch
dists/sid/linux-2.6/debian/patches/bugfix/m68k/0009-m68k-mm-set-all-online-nodes-in-N_NORMAL_MEMORY.patch
Modified:
dists/sid/linux-2.6/debian/changelog
dists/sid/linux-2.6/debian/config/m68k/config.atari
Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog Mon Apr 25 01:10:06 2011 (r17251)
+++ dists/sid/linux-2.6/debian/changelog Mon Apr 25 01:17:00 2011 (r17252)
@@ -1,3 +1,14 @@
+linux-2.6 (2.6.38-5) UNRELEASED; urgency=low
+
+ [ Thorsten Glaser ]
+ * [m68k] atari: Enable and compile in generic RTC
+ * [m68k] Backport the most urgent fixes from 2.6.39
+ * [m68k] Add patch from queue fixing atarifb console output on
+ machines with a lot of FastRAM by reserving some ST-RAM early
+ * [m68k] Add patch from mm mailing list to fix SLUB breakage
+
+ -- Ben Hutchings <ben at decadent.org.uk> Mon, 25 Apr 2011 02:15:23 +0100
+
linux-2.6 (2.6.38-4) unstable; urgency=low
* usb-audio: Define another USB ID for a buggy USB MIDI cable
Modified: dists/sid/linux-2.6/debian/config/m68k/config.atari
==============================================================================
--- dists/sid/linux-2.6/debian/config/m68k/config.atari Mon Apr 25 01:10:06 2011 (r17251)
+++ dists/sid/linux-2.6/debian/config/m68k/config.atari Mon Apr 25 01:17:00 2011 (r17252)
@@ -38,8 +38,8 @@
# CONFIG_LP_CONSOLE is not set
# CONFIG_PPDEV is not set
CONFIG_NVRAM=y
-CONFIG_RTC=m
-CONFIG_GEN_RTC=m
+CONFIG_RTC=y
+CONFIG_GEN_RTC=y
##
## file: drivers/ide/Kconfig
@@ -107,6 +107,7 @@
## file: drivers/rtc/Kconfig
##
CONFIG_RTC_CLASS=y
+CONFIG_RTC_DRV_GENERIC=y
##
## file: drivers/scsi/Kconfig
Added: dists/sid/linux-2.6/debian/patches/bugfix/m68k/0001-m68k-Add-helper-function-handle_kernel_fault.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/0001-m68k-Add-helper-function-handle_kernel_fault.patch Mon Apr 25 01:17:00 2011 (r17252)
@@ -0,0 +1,116 @@
+From b8d10d8540e1d2eece5f2e8d629e0a8c3368965a Mon Sep 17 00:00:00 2001
+From: Roman Zippel <zippel at linux-m68k.org>
+Date: Tue, 18 Nov 2008 21:25:17 +0100
+Subject: [PATCH 1/9] m68k: Add helper function handle_kernel_fault()
+
+Add helper function handle_kernel_fault() in signal.c, so frame_extra_sizes
+can become static, and to avoid future code duplication.
+
+Signed-off-by: Roman Zippel <zippel at linux-m68k.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/include/asm/processor.h | 2 ++
+ arch/m68k/kernel/signal.c | 24 +++++++++++++++++++++++-
+ arch/m68k/mm/fault.c | 16 +---------------
+ 3 files changed, 26 insertions(+), 16 deletions(-)
+
+diff --git a/arch/m68k/include/asm/processor.h b/arch/m68k/include/asm/processor.h
+index 278c69b..f111b02 100644
+--- a/arch/m68k/include/asm/processor.h
++++ b/arch/m68k/include/asm/processor.h
+@@ -113,6 +113,8 @@ static inline void start_thread(struct pt_regs * regs, unsigned long pc,
+ wrusp(usp);
+ }
+
++extern int handle_kernel_fault(struct pt_regs *regs);
++
+ #else
+
+ /*
+diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
+index d12c3b0..a0afc23 100644
+--- a/arch/m68k/kernel/signal.c
++++ b/arch/m68k/kernel/signal.c
+@@ -42,6 +42,7 @@
+ #include <linux/personality.h>
+ #include <linux/tty.h>
+ #include <linux/binfmts.h>
++#include <linux/module.h>
+
+ #include <asm/setup.h>
+ #include <asm/uaccess.h>
+@@ -51,7 +52,7 @@
+
+ #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
+
+-const int frame_extra_sizes[16] = {
++static const int frame_extra_sizes[16] = {
+ [1] = -1, /* sizeof(((struct frame *)0)->un.fmt1), */
+ [2] = sizeof(((struct frame *)0)->un.fmt2),
+ [3] = sizeof(((struct frame *)0)->un.fmt3),
+@@ -69,6 +70,27 @@ const int frame_extra_sizes[16] = {
+ [15] = -1, /* sizeof(((struct frame *)0)->un.fmtf), */
+ };
+
++int handle_kernel_fault(struct pt_regs *regs)
++{
++ const struct exception_table_entry *fixup;
++ struct pt_regs *tregs;
++
++ /* Are we prepared to handle this kernel fault? */
++ fixup = search_exception_tables(regs->pc);
++ if (!fixup)
++ return 0;
++
++ /* Create a new four word stack frame, discarding the old one. */
++ regs->stkadj = frame_extra_sizes[regs->format];
++ tregs = (struct pt_regs *)((long)regs + regs->stkadj);
++ tregs->vector = regs->vector;
++ tregs->format = 0;
++ tregs->pc = fixup->fixup;
++ tregs->sr = regs->sr;
++
++ return 1;
++}
++
+ /*
+ * Atomically swap in the new signal mask, and wait for a signal.
+ */
+diff --git a/arch/m68k/mm/fault.c b/arch/m68k/mm/fault.c
+index a96394a..2db6099 100644
+--- a/arch/m68k/mm/fault.c
++++ b/arch/m68k/mm/fault.c
+@@ -18,7 +18,6 @@
+ #include <asm/pgalloc.h>
+
+ extern void die_if_kernel(char *, struct pt_regs *, long);
+-extern const int frame_extra_sizes[]; /* in m68k/kernel/signal.c */
+
+ int send_fault_sig(struct pt_regs *regs)
+ {
+@@ -35,21 +34,8 @@ int send_fault_sig(struct pt_regs *regs)
+ force_sig_info(siginfo.si_signo,
+ &siginfo, current);
+ } else {
+- const struct exception_table_entry *fixup;
+-
+- /* Are we prepared to handle this kernel fault? */
+- if ((fixup = search_exception_tables(regs->pc))) {
+- struct pt_regs *tregs;
+- /* Create a new four word stack frame, discarding the old
+- one. */
+- regs->stkadj = frame_extra_sizes[regs->format];
+- tregs = (struct pt_regs *)((ulong)regs + regs->stkadj);
+- tregs->vector = regs->vector;
+- tregs->format = 0;
+- tregs->pc = fixup->fixup;
+- tregs->sr = regs->sr;
++ if (handle_kernel_fault(regs))
+ return -1;
+- }
+
+ //if (siginfo.si_signo == SIGBUS)
+ // force_sig_info(siginfo.si_signo,
+--
+1.7.4.4
+
Added: dists/sid/linux-2.6/debian/patches/bugfix/m68k/0002-m68k-Use-base_trap_init-to-initialize-vectors.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/0002-m68k-Use-base_trap_init-to-initialize-vectors.patch Mon Apr 25 01:17:00 2011 (r17252)
@@ -0,0 +1,51 @@
+From 2a36e907a8bb57c90a3addd94993f4e73b571ada Mon Sep 17 00:00:00 2001
+From: Roman Zippel <zippel at linux-m68k.org>
+Date: Tue, 18 Nov 2008 21:25:17 +0100
+Subject: [PATCH 2/9] m68k: Use base_trap_init() to initialize vectors
+
+So basic initialization is all in one place.
+
+Signed-off-by: Roman Zippel <zippel at linux-m68k.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/kernel/traps.c | 10 +++++-----
+ 1 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c
+index ada4f4c..cd802d4 100644
+--- a/arch/m68k/kernel/traps.c
++++ b/arch/m68k/kernel/traps.c
+@@ -48,10 +48,7 @@ asmlinkage void nmihandler(void);
+ asmlinkage void fpu_emu(void);
+ #endif
+
+-e_vector vectors[256] = {
+- [VEC_BUSERR] = buserr,
+- [VEC_SYS] = system_call,
+-};
++e_vector vectors[256];
+
+ /* nmi handler for the Amiga */
+ asm(".text\n"
+@@ -64,7 +61,7 @@ asm(".text\n"
+ */
+ void __init base_trap_init(void)
+ {
+- if(MACH_IS_SUN3X) {
++ if (MACH_IS_SUN3X) {
+ extern e_vector *sun3x_prom_vbr;
+
+ __asm__ volatile ("movec %%vbr, %0" : "=r" (sun3x_prom_vbr));
+@@ -79,6 +76,9 @@ void __init base_trap_init(void)
+
+ vectors[VEC_UNIMPII] = unimp_vec;
+ }
++
++ vectors[VEC_BUSERR] = buserr;
++ vectors[VEC_SYS] = system_call;
+ }
+
+ void __init trap_init (void)
+--
+1.7.4.4
+
Added: dists/sid/linux-2.6/debian/patches/bugfix/m68k/0003-m68k-Allow-all-kernel-traps-to-be-handled-via-except.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/0003-m68k-Allow-all-kernel-traps-to-be-handled-via-except.patch Mon Apr 25 01:17:00 2011 (r17252)
@@ -0,0 +1,53 @@
+From 94ff3996418310cc2109a70ff50a57e3532a661e Mon Sep 17 00:00:00 2001
+From: Andreas Schwab <schwab at linux-m68k.org>
+Date: Tue, 18 Nov 2008 21:25:17 +0100
+Subject: [PATCH 3/9] m68k: Allow all kernel traps to be handled via exception
+ fixups
+
+This will be needed by the ARAnyM Native Feature initialization code.
+Also document that the VEC_TRACE check is needed for 68020/30.
+
+Signed-off-by: Andreas Schwab <schwab at linux-m68k.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/kernel/traps.c | 10 +++++++---
+ 1 files changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c
+index cd802d4..4022bbc 100644
+--- a/arch/m68k/kernel/traps.c
++++ b/arch/m68k/kernel/traps.c
+@@ -58,6 +58,7 @@ asm(".text\n"
+ /*
+ * this must be called very early as the kernel might
+ * use some instruction that are emulated on the 060
++ * and so we're prepared for early probe attempts (e.g. nf_init).
+ */
+ void __init base_trap_init(void)
+ {
+@@ -78,6 +79,7 @@ void __init base_trap_init(void)
+ }
+
+ vectors[VEC_BUSERR] = buserr;
++ vectors[VEC_ILLEGAL] = trap;
+ vectors[VEC_SYS] = system_call;
+ }
+
+@@ -1055,9 +1057,11 @@ asmlinkage void trap_c(struct frame *fp)
+ siginfo_t info;
+
+ if (fp->ptregs.sr & PS_S) {
+- if ((fp->ptregs.vector >> 2) == VEC_TRACE) {
+- /* traced a trapping instruction */
+- } else
++ if (fp->ptregs.vector == VEC_TRACE << 2) {
++ /* traced a trapping instruction on a 68020/30,
++ * real exception will be executed afterwards.
++ */
++ } else if (!handle_kernel_fault(&fp->ptregs))
+ bad_super_trap(fp);
+ return;
+ }
+--
+1.7.4.4
+
Added: dists/sid/linux-2.6/debian/patches/bugfix/m68k/0004-m68k-atari-Initial-ARAnyM-support.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/0004-m68k-atari-Initial-ARAnyM-support.patch Mon Apr 25 01:17:00 2011 (r17252)
@@ -0,0 +1,242 @@
+From 62acf39a5ab025b65cce080a0bc21b547b32119b Mon Sep 17 00:00:00 2001
+From: Petr Stehlik <pstehlik at sophics.cz>
+Date: Tue, 18 Nov 2008 21:02:18 +0100
+Subject: [PATCH 4/9] m68k/atari: Initial ARAnyM support
+
+Add improved support for running under the ARAnyM emulator
+(Atari Running on Any Machine - http://aranym.org/).
+
+[michael, geert: Cleanups and updates]
+
+Signed-off-by: Petr Stehlik <pstehlik at sophics.cz>
+Signed-off-by: Michael Schmitz <schmitz at debian.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+---
+ arch/m68k/Kconfig | 7 ++
+ arch/m68k/Makefile | 1 +
+ arch/m68k/emu/Makefile | 5 ++
+ arch/m68k/emu/natfeat.c | 116 +++++++++++++++++++++++++++++++++++++++
+ arch/m68k/include/asm/natfeat.h | 22 +++++++
+ arch/m68k/kernel/setup.c | 5 ++
+ 6 files changed, 156 insertions(+), 0 deletions(-)
+ create mode 100644 arch/m68k/emu/Makefile
+ create mode 100644 arch/m68k/emu/natfeat.c
+ create mode 100644 arch/m68k/include/asm/natfeat.h
+
+diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
+index bc9271b..16a1e20 100644
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -242,6 +242,13 @@ config SUN3
+
+ If you don't want to compile a kernel exclusively for a Sun 3, say N.
+
++config NATFEAT
++ bool "ARAnyM emulator support"
++ depends on ATARI
++ help
++ This option enables support for ARAnyM native features, such as
++ access to a disk image as /dev/hda.
++
+ comment "Processor type"
+
+ config M68020
+diff --git a/arch/m68k/Makefile b/arch/m68k/Makefile
+index b06a7e3..b793163 100644
+--- a/arch/m68k/Makefile
++++ b/arch/m68k/Makefile
+@@ -76,6 +76,7 @@ core-$(CONFIG_MVME16x) += arch/m68k/mvme16x/
+ core-$(CONFIG_BVME6000) += arch/m68k/bvme6000/
+ core-$(CONFIG_SUN3X) += arch/m68k/sun3x/ arch/m68k/sun3/
+ core-$(CONFIG_SUN3) += arch/m68k/sun3/ arch/m68k/sun3/prom/
++core-$(CONFIG_NATFEAT) += arch/m68k/emu/
+ core-$(CONFIG_M68040) += arch/m68k/fpsp040/
+ core-$(CONFIG_M68060) += arch/m68k/ifpsp060/
+ core-$(CONFIG_M68KFPU_EMU) += arch/m68k/math-emu/
+diff --git a/arch/m68k/emu/Makefile b/arch/m68k/emu/Makefile
+new file mode 100644
+index 0000000..34cfa34
+--- /dev/null
++++ b/arch/m68k/emu/Makefile
+@@ -0,0 +1,5 @@
++#
++# Makefile for Linux arch/m68k/emu source directory
++#
++
++obj-y += natfeat.o
+diff --git a/arch/m68k/emu/natfeat.c b/arch/m68k/emu/natfeat.c
+new file mode 100644
+index 0000000..987d773
+--- /dev/null
++++ b/arch/m68k/emu/natfeat.c
+@@ -0,0 +1,116 @@
++/*
++ * natfeat.c - ARAnyM hardware support via Native Features (natfeats)
++ *
++ * Copyright (c) 2005 Petr Stehlik of ARAnyM dev team
++ *
++ * Reworked for Linux by Roman Zippel <zippel at linux-m68k.org>
++ *
++ * This software may be used and distributed according to the terms of
++ * the GNU General Public License (GPL), incorporated herein by reference.
++ */
++
++#include <linux/types.h>
++#include <linux/console.h>
++#include <linux/string.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/io.h>
++#include <asm/machdep.h>
++#include <asm/natfeat.h>
++
++asm("\n"
++" .global nf_get_id,nf_call\n"
++"nf_get_id:\n"
++" .short 0x7300\n"
++" rts\n"
++"nf_call:\n"
++" .short 0x7301\n"
++" rts\n"
++"1: moveq.l #0,%d0\n"
++" rts\n"
++" .section __ex_table,\"a\"\n"
++" .long nf_get_id,1b\n"
++" .long nf_call,1b\n"
++" .previous");
++EXPORT_SYMBOL_GPL(nf_get_id);
++EXPORT_SYMBOL_GPL(nf_call);
++
++static int stderr_id;
++
++static void nf_write(struct console *co, const char *str, unsigned int count)
++{
++ char buf[68];
++
++ buf[64] = 0;
++ while (count > 64) {
++ memcpy(buf, str, 64);
++ nf_call(stderr_id, buf);
++ str += 64;
++ count -= 64;
++ }
++ memcpy(buf, str, count);
++ buf[count] = 0;
++ nf_call(stderr_id, buf);
++}
++
++void nfprint(const char *fmt, ...)
++{
++ static char buf[256];
++ va_list ap;
++ int n;
++
++ va_start(ap, fmt);
++ n = vsnprintf(buf, 256, fmt, ap);
++ nf_call(nf_get_id("NF_STDERR"), buf);
++ va_end(ap);
++}
++
++static struct console nf_console_driver = {
++ .name = "debug",
++ .write = nf_write,
++ .flags = CON_PRINTBUFFER,
++ .index = -1,
++};
++
++static int __init nf_debug_setup(char *arg)
++{
++ if (strcmp(arg, "emu"))
++ return 0;
++
++ stderr_id = nf_get_id("NF_STDERR");
++ if (stderr_id)
++ register_console(&nf_console_driver);
++ return 0;
++}
++
++early_param("debug", nf_debug_setup);
++
++static void nf_poweroff(void)
++{
++ long id = nf_get_id("NF_SHUTDOWN");
++
++ if (id)
++ nf_call(id);
++}
++
++void nf_init(void)
++{
++ unsigned long id, version;
++ char buf[256];
++
++ id = nf_get_id("NF_VERSION");
++ if (!id)
++ return;
++ version = nf_call(id);
++
++ id = nf_get_id("NF_NAME");
++ if (!id)
++ return;
++ nf_call(id, buf, 256);
++ buf[255] = 0;
++
++ pr_info("NatFeats found (%s, %lu.%lu)\n", buf, version >> 16,
++ version & 0xffff);
++
++ mach_power_off = nf_poweroff;
++}
+diff --git a/arch/m68k/include/asm/natfeat.h b/arch/m68k/include/asm/natfeat.h
+new file mode 100644
+index 0000000..a3521b8
+--- /dev/null
++++ b/arch/m68k/include/asm/natfeat.h
+@@ -0,0 +1,22 @@
++/*
++ * ARAnyM hardware support via Native Features (natfeats)
++ *
++ * Copyright (c) 2005 Petr Stehlik of ARAnyM dev team
++ *
++ * This software may be used and distributed according to the terms of
++ * the GNU General Public License (GPL), incorporated herein by reference.
++ */
++
++#ifndef _NATFEAT_H
++#define _NATFEAT_H
++
++long nf_get_id(const char *feature_name);
++long nf_call(long id, ...);
++
++void nf_init(void);
++void nf_shutdown(void);
++
++void nfprint(const char *fmt, ...)
++ __attribute__ ((format (printf, 1, 2)));
++
++# endif /* _NATFEAT_H */
+diff --git a/arch/m68k/kernel/setup.c b/arch/m68k/kernel/setup.c
+index b3963ab..334d836 100644
+--- a/arch/m68k/kernel/setup.c
++++ b/arch/m68k/kernel/setup.c
+@@ -42,6 +42,7 @@
+ #ifdef CONFIG_SUN3X
+ #include <asm/dvma.h>
+ #endif
++#include <asm/natfeat.h>
+
+ #if !FPSTATESIZE || !NR_IRQS
+ #warning No CPU/platform type selected, your kernel will not work!
+@@ -324,6 +325,10 @@ void __init setup_arch(char **cmdline_p)
+ panic("No configuration setup");
+ }
+
++#ifdef CONFIG_NATFEAT
++ nf_init();
++#endif
++
+ paging_init();
+
+ #ifndef CONFIG_SUN3
+--
+1.7.4.4
+
Added: dists/sid/linux-2.6/debian/patches/bugfix/m68k/0005-m68k-atari-ARAnyM-Add-support-for-block-access.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/0005-m68k-atari-ARAnyM-Add-support-for-block-access.patch Mon Apr 25 01:17:00 2011 (r17252)
@@ -0,0 +1,250 @@
+From b17808612628b0504e4b7edcbf87683da4e6e83f Mon Sep 17 00:00:00 2001
+From: Roman Zippel <zippel at linux-m68k.org>
+Date: Tue, 18 Nov 2008 21:02:19 +0100
+Subject: [PATCH 5/9] m68k/atari: ARAnyM - Add support for block access
+
+[geert: Cleanups and updates]
+
+Signed-off-by: Roman Zippel <zippel at linux-m68k.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+Acked-by: Petr Stehlik <pstehlik at sophics.cz>
+---
+ arch/m68k/Kconfig | 8 ++
+ arch/m68k/emu/Makefile | 2 +
+ arch/m68k/emu/nfblock.c | 195 +++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 205 insertions(+), 0 deletions(-)
+ create mode 100644 arch/m68k/emu/nfblock.c
+
+diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
+index 16a1e20..c3047d7 100644
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -249,6 +249,14 @@ config NATFEAT
+ This option enables support for ARAnyM native features, such as
+ access to a disk image as /dev/hda.
+
++config NFBLOCK
++ tristate "NatFeat block device support"
++ depends on BLOCK && NATFEAT
++ help
++ Say Y to include support for the ARAnyM NatFeat block device
++ which allows direct access to the hard drives without using
++ the hardware emulation.
++
+ comment "Processor type"
+
+ config M68020
+diff --git a/arch/m68k/emu/Makefile b/arch/m68k/emu/Makefile
+index 34cfa34..fc4f77a 100644
+--- a/arch/m68k/emu/Makefile
++++ b/arch/m68k/emu/Makefile
+@@ -3,3 +3,5 @@
+ #
+
+ obj-y += natfeat.o
++
++obj-$(CONFIG_NFBLOCK) += nfblock.o
+diff --git a/arch/m68k/emu/nfblock.c b/arch/m68k/emu/nfblock.c
+new file mode 100644
+index 0000000..48e50f8
+--- /dev/null
++++ b/arch/m68k/emu/nfblock.c
+@@ -0,0 +1,195 @@
++/*
++ * ARAnyM block device driver
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive
++ * for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/moduleparam.h>
++#include <linux/init.h>
++
++#include <linux/kernel.h>
++#include <linux/errno.h>
++#include <linux/types.h>
++#include <linux/genhd.h>
++#include <linux/blkdev.h>
++#include <linux/hdreg.h>
++#include <linux/slab.h>
++
++#include <asm/natfeat.h>
++
++static long nfhd_id;
++
++enum {
++ /* emulation entry points */
++ NFHD_READ_WRITE = 10,
++ NFHD_GET_CAPACITY = 14,
++
++ /* skip ACSI devices */
++ NFHD_DEV_OFFSET = 8,
++};
++
++static inline s32 nfhd_read_write(u32 major, u32 minor, u32 rwflag, u32 recno,
++ u32 count, u32 buf)
++{
++ return nf_call(nfhd_id + NFHD_READ_WRITE, major, minor, rwflag, recno,
++ count, buf);
++}
++
++static inline s32 nfhd_get_capacity(u32 major, u32 minor, u32 *blocks,
++ u32 *blocksize)
++{
++ return nf_call(nfhd_id + NFHD_GET_CAPACITY, major, minor, blocks,
++ blocksize);
++}
++
++static LIST_HEAD(nfhd_list);
++
++static int major_num;
++module_param(major_num, int, 0);
++
++struct nfhd_device {
++ struct list_head list;
++ int id;
++ u32 blocks, bsize;
++ int bshift;
++ struct request_queue *queue;
++ struct gendisk *disk;
++};
++
++static int nfhd_make_request(struct request_queue *queue, struct bio *bio)
++{
++ struct nfhd_device *dev = queue->queuedata;
++ struct bio_vec *bvec;
++ int i, dir, len, shift;
++ sector_t sec = bio->bi_sector;
++
++ dir = bio_data_dir(bio);
++ shift = dev->bshift;
++ bio_for_each_segment(bvec, bio, i) {
++ len = bvec->bv_len;
++ len >>= 9;
++ nfhd_read_write(dev->id, 0, dir, sec >> shift, len >> shift,
++ bvec_to_phys(bvec));
++ sec += len;
++ }
++ bio_endio(bio, 0);
++ return 0;
++}
++
++static int nfhd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
++{
++ struct nfhd_device *dev = bdev->bd_disk->private_data;
++
++ geo->cylinders = dev->blocks >> (6 - dev->bshift);
++ geo->heads = 4;
++ geo->sectors = 16;
++
++ return 0;
++}
++
++static const struct block_device_operations nfhd_ops = {
++ .owner = THIS_MODULE,
++ .getgeo = nfhd_getgeo,
++};
++
++static int __init nfhd_init_one(int id, u32 blocks, u32 bsize)
++{
++ struct nfhd_device *dev;
++ int dev_id = id - NFHD_DEV_OFFSET;
++
++ pr_info("nfhd%u: found device with %u blocks (%u bytes)\n", dev_id,
++ blocks, bsize);
++
++ if (bsize < 512 || (bsize & (bsize - 1))) {
++ pr_warn("nfhd%u: invalid block size\n", dev_id);
++ return -EINVAL;
++ }
++
++ dev = kmalloc(sizeof(struct nfhd_device), GFP_KERNEL);
++ if (!dev)
++ goto out;
++
++ dev->id = id;
++ dev->blocks = blocks;
++ dev->bsize = bsize;
++ dev->bshift = ffs(bsize) - 10;
++
++ dev->queue = blk_alloc_queue(GFP_KERNEL);
++ if (dev->queue == NULL)
++ goto free_dev;
++
++ dev->queue->queuedata = dev;
++ blk_queue_make_request(dev->queue, nfhd_make_request);
++ blk_queue_logical_block_size(dev->queue, bsize);
++
++ dev->disk = alloc_disk(16);
++ if (!dev->disk)
++ goto free_queue;
++
++ dev->disk->major = major_num;
++ dev->disk->first_minor = dev_id * 16;
++ dev->disk->fops = &nfhd_ops;
++ dev->disk->private_data = dev;
++ sprintf(dev->disk->disk_name, "nfhd%u", dev_id);
++ set_capacity(dev->disk, (sector_t)blocks * (bsize / 512));
++ dev->disk->queue = dev->queue;
++
++ add_disk(dev->disk);
++
++ list_add_tail(&dev->list, &nfhd_list);
++
++ return 0;
++
++free_queue:
++ blk_cleanup_queue(dev->queue);
++free_dev:
++ kfree(dev);
++out:
++ return -ENOMEM;
++}
++
++static int __init nfhd_init(void)
++{
++ u32 blocks, bsize;
++ int i;
++
++ nfhd_id = nf_get_id("XHDI");
++ if (!nfhd_id)
++ return -ENODEV;
++
++ major_num = register_blkdev(major_num, "nfhd");
++ if (major_num <= 0) {
++ pr_warn("nfhd: unable to get major number\n");
++ return major_num;
++ }
++
++ for (i = NFHD_DEV_OFFSET; i < 24; i++) {
++ if (nfhd_get_capacity(i, 0, &blocks, &bsize))
++ continue;
++ nfhd_init_one(i, blocks, bsize);
++ }
++
++ return 0;
++}
++
++static void __exit nfhd_exit(void)
++{
++ struct nfhd_device *dev, *next;
++
++ list_for_each_entry_safe(dev, next, &nfhd_list, list) {
++ list_del(&dev->list);
++ del_gendisk(dev->disk);
++ put_disk(dev->disk);
++ blk_cleanup_queue(dev->queue);
++ kfree(dev);
++ }
++ unregister_blkdev(major_num, "nfhd");
++}
++
++module_init(nfhd_init);
++module_exit(nfhd_exit);
++
++MODULE_LICENSE("GPL");
+--
+1.7.4.4
+
Added: dists/sid/linux-2.6/debian/patches/bugfix/m68k/0006-m68k-atari-ARAnyM-Add-support-for-console-access.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/0006-m68k-atari-ARAnyM-Add-support-for-console-access.patch Mon Apr 25 01:17:00 2011 (r17252)
@@ -0,0 +1,273 @@
+From c154e95234fab43dd5dd03602bd19ac203200e89 Mon Sep 17 00:00:00 2001
+From: Roman Zippel <zippel at linux-m68k.org>
+Date: Tue, 18 Nov 2008 21:02:19 +0100
+Subject: [PATCH 6/9] m68k/atari: ARAnyM - Add support for console access
+
+[geert: Cleanups and updates]
+
+Signed-off-by: Roman Zippel <zippel at linux-m68k.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+Acked-by: Petr Stehlik <pstehlik at sophics.cz>
+---
+ arch/m68k/Kconfig | 8 +++
+ arch/m68k/emu/Makefile | 1 +
+ arch/m68k/emu/natfeat.c | 38 -----------
+ arch/m68k/emu/nfcon.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 171 insertions(+), 38 deletions(-)
+ create mode 100644 arch/m68k/emu/nfcon.c
+
+diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
+index c3047d7..9490731 100644
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -257,6 +257,14 @@ config NFBLOCK
+ which allows direct access to the hard drives without using
+ the hardware emulation.
+
++config NFCON
++ tristate "NatFeat console driver"
++ depends on NATFEAT
++ help
++ Say Y to include support for the ARAnyM NatFeat console driver
++ which allows the console output to be redirected to the stderr
++ output of ARAnyM.
++
+ comment "Processor type"
+
+ config M68020
+diff --git a/arch/m68k/emu/Makefile b/arch/m68k/emu/Makefile
+index fc4f77a..a83ef1e 100644
+--- a/arch/m68k/emu/Makefile
++++ b/arch/m68k/emu/Makefile
+@@ -5,3 +5,4 @@
+ obj-y += natfeat.o
+
+ obj-$(CONFIG_NFBLOCK) += nfblock.o
++obj-$(CONFIG_NFCON) += nfcon.o
+diff --git a/arch/m68k/emu/natfeat.c b/arch/m68k/emu/natfeat.c
+index 987d773..2291a7d 100644
+--- a/arch/m68k/emu/natfeat.c
++++ b/arch/m68k/emu/natfeat.c
+@@ -35,24 +35,6 @@ asm("\n"
+ EXPORT_SYMBOL_GPL(nf_get_id);
+ EXPORT_SYMBOL_GPL(nf_call);
+
+-static int stderr_id;
+-
+-static void nf_write(struct console *co, const char *str, unsigned int count)
+-{
+- char buf[68];
+-
+- buf[64] = 0;
+- while (count > 64) {
+- memcpy(buf, str, 64);
+- nf_call(stderr_id, buf);
+- str += 64;
+- count -= 64;
+- }
+- memcpy(buf, str, count);
+- buf[count] = 0;
+- nf_call(stderr_id, buf);
+-}
+-
+ void nfprint(const char *fmt, ...)
+ {
+ static char buf[256];
+@@ -65,26 +47,6 @@ void nfprint(const char *fmt, ...)
+ va_end(ap);
+ }
+
+-static struct console nf_console_driver = {
+- .name = "debug",
+- .write = nf_write,
+- .flags = CON_PRINTBUFFER,
+- .index = -1,
+-};
+-
+-static int __init nf_debug_setup(char *arg)
+-{
+- if (strcmp(arg, "emu"))
+- return 0;
+-
+- stderr_id = nf_get_id("NF_STDERR");
+- if (stderr_id)
+- register_console(&nf_console_driver);
+- return 0;
+-}
+-
+-early_param("debug", nf_debug_setup);
+-
+ static void nf_poweroff(void)
+ {
+ long id = nf_get_id("NF_SHUTDOWN");
+diff --git a/arch/m68k/emu/nfcon.c b/arch/m68k/emu/nfcon.c
+new file mode 100644
+index 0000000..ab20dc0
+--- /dev/null
++++ b/arch/m68k/emu/nfcon.c
+@@ -0,0 +1,162 @@
++/*
++ * ARAnyM console driver
++ *
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file COPYING in the main directory of this archive
++ * for more details.
++ */
++
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/console.h>
++#include <linux/tty.h>
++#include <linux/tty_driver.h>
++#include <linux/tty_flip.h>
++#include <linux/slab.h>
++#include <linux/err.h>
++#include <linux/uaccess.h>
++
++#include <asm/natfeat.h>
++
++static int stderr_id;
++static struct tty_driver *nfcon_tty_driver;
++
++static void nfputs(const char *str, unsigned int count)
++{
++ char buf[68];
++
++ buf[64] = 0;
++ while (count > 64) {
++ memcpy(buf, str, 64);
++ nf_call(stderr_id, buf);
++ str += 64;
++ count -= 64;
++ }
++ memcpy(buf, str, count);
++ buf[count] = 0;
++ nf_call(stderr_id, buf);
++}
++
++static void nfcon_write(struct console *con, const char *str,
++ unsigned int count)
++{
++ nfputs(str, count);
++}
++
++static struct tty_driver *nfcon_device(struct console *con, int *index)
++{
++ *index = 0;
++ return (con->flags & CON_ENABLED) ? nfcon_tty_driver : NULL;
++}
++
++static struct console nf_console = {
++ .name = "nfcon",
++ .write = nfcon_write,
++ .device = nfcon_device,
++ .flags = CON_PRINTBUFFER,
++ .index = -1,
++};
++
++
++static int nfcon_tty_open(struct tty_struct *tty, struct file *filp)
++{
++ return 0;
++}
++
++static void nfcon_tty_close(struct tty_struct *tty, struct file *filp)
++{
++}
++
++static int nfcon_tty_write(struct tty_struct *tty, const unsigned char *buf,
++ int count)
++{
++ nfputs(buf, count);
++ return count;
++}
++
++static int nfcon_tty_put_char(struct tty_struct *tty, unsigned char ch)
++{
++ char temp[2] = { ch, 0 };
++
++ nf_call(stderr_id, temp);
++ return 1;
++}
++
++static int nfcon_tty_write_room(struct tty_struct *tty)
++{
++ return 64;
++}
++
++static const struct tty_operations nfcon_tty_ops = {
++ .open = nfcon_tty_open,
++ .close = nfcon_tty_close,
++ .write = nfcon_tty_write,
++ .put_char = nfcon_tty_put_char,
++ .write_room = nfcon_tty_write_room,
++};
++
++#ifndef MODULE
++
++static int __init nf_debug_setup(char *arg)
++{
++ if (strcmp(arg, "nfcon"))
++ return 0;
++
++ stderr_id = nf_get_id("NF_STDERR");
++ if (stderr_id) {
++ nf_console.flags |= CON_ENABLED;
++ register_console(&nf_console);
++ }
++
++ return 0;
++}
++
++early_param("debug", nf_debug_setup);
++
++#endif /* !MODULE */
++
++static int __init nfcon_init(void)
++{
++ int res;
++
++ stderr_id = nf_get_id("NF_STDERR");
++ if (!stderr_id)
++ return -ENODEV;
++
++ nfcon_tty_driver = alloc_tty_driver(1);
++ if (!nfcon_tty_driver)
++ return -ENOMEM;
++
++ nfcon_tty_driver->owner = THIS_MODULE;
++ nfcon_tty_driver->driver_name = "nfcon";
++ nfcon_tty_driver->name = "nfcon";
++ nfcon_tty_driver->type = TTY_DRIVER_TYPE_SYSTEM;
++ nfcon_tty_driver->subtype = SYSTEM_TYPE_TTY;
++ nfcon_tty_driver->init_termios = tty_std_termios;
++ nfcon_tty_driver->flags = TTY_DRIVER_REAL_RAW;
++
++ tty_set_operations(nfcon_tty_driver, &nfcon_tty_ops);
++ res = tty_register_driver(nfcon_tty_driver);
++ if (res) {
++ pr_err("failed to register nfcon tty driver\n");
++ put_tty_driver(nfcon_tty_driver);
++ return res;
++ }
++
++ if (!(nf_console.flags & CON_ENABLED))
++ register_console(&nf_console);
++
++ return 0;
++}
++
++static void __exit nfcon_exit(void)
++{
++ unregister_console(&nf_console);
++ tty_unregister_driver(nfcon_tty_driver);
++ put_tty_driver(nfcon_tty_driver);
++}
++
++module_init(nfcon_init);
++module_exit(nfcon_exit);
++
++MODULE_LICENSE("GPL");
+--
+1.7.4.4
+
Added: dists/sid/linux-2.6/debian/patches/bugfix/m68k/0007-m68k-atari-ARAnyM-Add-support-for-network-access.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/0007-m68k-atari-ARAnyM-Add-support-for-network-access.patch Mon Apr 25 01:17:00 2011 (r17252)
@@ -0,0 +1,327 @@
+From cfb6fef8b8c8380d75b71f13b25084736172b7ed Mon Sep 17 00:00:00 2001
+From: Milan Jurik <milan.jurik at xylab.cz>
+Date: Tue, 18 Nov 2008 21:02:18 +0100
+Subject: [PATCH 7/9] m68k/atari: ARAnyM - Add support for network access
+
+[petr: Second author]
+[michael, geert: Cleanups and updates]
+
+Signed-off-by: Milan Jurik <milan.jurik at xylab.cz>
+Signed-off-by: Petr Stehlik <pstehlik at sophics.cz>
+Signed-off-by: Michael Schmitz <schmitz at debian.org>
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+Cc: netdev at vger.kernel.org
+---
+ arch/m68k/Kconfig | 8 ++
+ arch/m68k/emu/Makefile | 1 +
+ arch/m68k/emu/nfeth.c | 270 ++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 279 insertions(+), 0 deletions(-)
+ create mode 100644 arch/m68k/emu/nfeth.c
+
+diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
+index 9490731..2238c1d 100644
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -265,6 +265,14 @@ config NFCON
+ which allows the console output to be redirected to the stderr
+ output of ARAnyM.
+
++config NFETH
++ tristate "NatFeat Ethernet support"
++ depends on NET_ETHERNET && NATFEAT
++ help
++ Say Y to include support for the ARAnyM NatFeat network device
++ which will emulate a regular ethernet device while presenting an
++ ethertap device to the host system.
++
+ comment "Processor type"
+
+ config M68020
+diff --git a/arch/m68k/emu/Makefile b/arch/m68k/emu/Makefile
+index a83ef1e..7dc2010 100644
+--- a/arch/m68k/emu/Makefile
++++ b/arch/m68k/emu/Makefile
+@@ -6,3 +6,4 @@ obj-y += natfeat.o
+
+ obj-$(CONFIG_NFBLOCK) += nfblock.o
+ obj-$(CONFIG_NFCON) += nfcon.o
++obj-$(CONFIG_NFETH) += nfeth.o
+diff --git a/arch/m68k/emu/nfeth.c b/arch/m68k/emu/nfeth.c
+new file mode 100644
+index 0000000..8b6e201
+--- /dev/null
++++ b/arch/m68k/emu/nfeth.c
+@@ -0,0 +1,270 @@
++/*
++ * atari_nfeth.c - ARAnyM ethernet card driver for GNU/Linux
++ *
++ * Copyright (c) 2005 Milan Jurik, Petr Stehlik of ARAnyM dev team
++ *
++ * Based on ARAnyM driver for FreeMiNT written by Standa Opichal
++ *
++ * This software may be used and distributed according to the terms of
++ * the GNU General Public License (GPL), incorporated herein by reference.
++ */
++
++#define DRV_VERSION "0.3"
++#define DRV_RELDATE "10/12/2005"
++
++#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
++
++#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
++#include <linux/module.h>
++#include <asm/natfeat.h>
++#include <asm/virtconvert.h>
++
++enum {
++ GET_VERSION = 0,/* no parameters, return NFAPI_VERSION in d0 */
++ XIF_INTLEVEL, /* no parameters, return Interrupt Level in d0 */
++ XIF_IRQ, /* acknowledge interrupt from host */
++ XIF_START, /* (ethX), called on 'ifup', start receiver thread */
++ XIF_STOP, /* (ethX), called on 'ifdown', stop the thread */
++ XIF_READLENGTH, /* (ethX), return size of network data block to read */
++ XIF_READBLOCK, /* (ethX, buffer, size), read block of network data */
++ XIF_WRITEBLOCK, /* (ethX, buffer, size), write block of network data */
++ XIF_GET_MAC, /* (ethX, buffer, size), return MAC HW addr in buffer */
++ XIF_GET_IPHOST, /* (ethX, buffer, size), return IP address of host */
++ XIF_GET_IPATARI,/* (ethX, buffer, size), return IP address of atari */
++ XIF_GET_NETMASK /* (ethX, buffer, size), return IP netmask */
++};
++
++#define MAX_UNIT 8
++
++/* These identify the driver base version and may not be removed. */
++static const char version[] __devinitdata =
++ KERN_INFO KBUILD_MODNAME ".c:v" DRV_VERSION " " DRV_RELDATE
++ " S.Opichal, M.Jurik, P.Stehlik\n"
++ KERN_INFO " http://aranym.org/\n";
++
++MODULE_AUTHOR("Milan Jurik");
++MODULE_DESCRIPTION("Atari NFeth driver");
++MODULE_LICENSE("GPL");
++/*
++MODULE_PARM(nfeth_debug, "i");
++MODULE_PARM_DESC(nfeth_debug, "nfeth_debug level (1-2)");
++*/
++
++
++static long nfEtherID;
++static int nfEtherIRQ;
++
++struct nfeth_private {
++ int ethX;
++};
++
++static struct net_device *nfeth_dev[MAX_UNIT];
++
++static int nfeth_open(struct net_device *dev)
++{
++ struct nfeth_private *priv = netdev_priv(dev);
++ int res;
++
++ res = nf_call(nfEtherID + XIF_START, priv->ethX);
++ netdev_dbg(dev, "%s: %d\n", __func__, res);
++
++ /* Ready for data */
++ netif_start_queue(dev);
++
++ return 0;
++}
++
++static int nfeth_stop(struct net_device *dev)
++{
++ struct nfeth_private *priv = netdev_priv(dev);
++
++ /* No more data */
++ netif_stop_queue(dev);
++
++ nf_call(nfEtherID + XIF_STOP, priv->ethX);
++
++ return 0;
++}
++
++/*
++ * Read a packet out of the adapter and pass it to the upper layers
++ */
++static inline void recv_packet(struct net_device *dev)
++{
++ struct nfeth_private *priv = netdev_priv(dev);
++ unsigned short pktlen;
++ struct sk_buff *skb;
++
++ /* read packet length (excluding 32 bit crc) */
++ pktlen = nf_call(nfEtherID + XIF_READLENGTH, priv->ethX);
++
++ netdev_dbg(dev, "%s: %u\n", __func__, pktlen);
++
++ if (!pktlen) {
++ netdev_dbg(dev, "%s: pktlen == 0\n", __func__);
++ dev->stats.rx_errors++;
++ return;
++ }
++
++ skb = dev_alloc_skb(pktlen + 2);
++ if (!skb) {
++ netdev_dbg(dev, "%s: out of mem (buf_alloc failed)\n",
++ __func__);
++ dev->stats.rx_dropped++;
++ return;
++ }
++
++ skb->dev = dev;
++ skb_reserve(skb, 2); /* 16 Byte align */
++ skb_put(skb, pktlen); /* make room */
++ nf_call(nfEtherID + XIF_READBLOCK, priv->ethX, virt_to_phys(skb->data),
++ pktlen);
++
++ skb->protocol = eth_type_trans(skb, dev);
++ netif_rx(skb);
++ dev->last_rx = jiffies;
++ dev->stats.rx_packets++;
++ dev->stats.rx_bytes += pktlen;
++
++ /* and enqueue packet */
++ return;
++}
++
++static irqreturn_t nfeth_interrupt(int irq, void *dev_id)
++{
++ int i, m, mask;
++
++ mask = nf_call(nfEtherID + XIF_IRQ, 0);
++ for (i = 0, m = 1; i < MAX_UNIT; m <<= 1, i++) {
++ if (mask & m && nfeth_dev[i]) {
++ recv_packet(nfeth_dev[i]);
++ nf_call(nfEtherID + XIF_IRQ, m);
++ }
++ }
++ return IRQ_HANDLED;
++}
++
++static int nfeth_xmit(struct sk_buff *skb, struct net_device *dev)
++{
++ unsigned int len;
++ char *data, shortpkt[ETH_ZLEN];
++ struct nfeth_private *priv = netdev_priv(dev);
++
++ data = skb->data;
++ len = skb->len;
++ if (len < ETH_ZLEN) {
++ memset(shortpkt, 0, ETH_ZLEN);
++ memcpy(shortpkt, data, len);
++ data = shortpkt;
++ len = ETH_ZLEN;
++ }
++
++ netdev_dbg(dev, "%s: send %u bytes\n", __func__, len);
++ nf_call(nfEtherID + XIF_WRITEBLOCK, priv->ethX, virt_to_phys(data),
++ len);
++
++ dev->stats.tx_packets++;
++ dev->stats.tx_bytes += len;
++
++ dev_kfree_skb(skb);
++ return 0;
++}
++
++static void nfeth_tx_timeout(struct net_device *dev)
++{
++ dev->stats.tx_errors++;
++ netif_wake_queue(dev);
++}
++
++static const struct net_device_ops nfeth_netdev_ops = {
++ .ndo_open = nfeth_open,
++ .ndo_stop = nfeth_stop,
++ .ndo_start_xmit = nfeth_xmit,
++ .ndo_tx_timeout = nfeth_tx_timeout,
++ .ndo_validate_addr = eth_validate_addr,
++ .ndo_change_mtu = eth_change_mtu,
++ .ndo_set_mac_address = eth_mac_addr,
++};
++
++static struct net_device * __init nfeth_probe(int unit)
++{
++ struct net_device *dev;
++ struct nfeth_private *priv;
++ char mac[ETH_ALEN], host_ip[32], local_ip[32];
++ int err;
++
++ if (!nf_call(nfEtherID + XIF_GET_MAC, unit, mac, ETH_ALEN))
++ return NULL;
++
++ dev = alloc_etherdev(sizeof(struct nfeth_private));
++ if (!dev)
++ return NULL;
++
++ dev->irq = nfEtherIRQ;
++ dev->netdev_ops = &nfeth_netdev_ops;
++
++ dev->flags |= NETIF_F_NO_CSUM;
++ memcpy(dev->dev_addr, mac, ETH_ALEN);
++
++ priv = netdev_priv(dev);
++ priv->ethX = unit;
++
++ err = register_netdev(dev);
++ if (err) {
++ free_netdev(dev);
++ return NULL;
++ }
++
++ nf_call(nfEtherID + XIF_GET_IPHOST, unit,
++ host_ip, sizeof(host_ip));
++ nf_call(nfEtherID + XIF_GET_IPATARI, unit,
++ local_ip, sizeof(local_ip));
++
++ netdev_info(dev, KBUILD_MODNAME " addr:%s (%s) HWaddr:%pM\n", host_ip,
++ local_ip, mac);
++
++ return dev;
++}
++
++static int __init nfeth_init(void)
++{
++ long ver;
++ int error, i;
++
++ nfEtherID = nf_get_id("ETHERNET");
++ if (!nfEtherID)
++ return -ENODEV;
++
++ ver = nf_call(nfEtherID + GET_VERSION);
++ pr_info("API %lu\n", ver);
++
++ nfEtherIRQ = nf_call(nfEtherID + XIF_INTLEVEL);
++ error = request_irq(nfEtherIRQ, nfeth_interrupt, IRQF_SHARED,
++ "eth emu", nfeth_interrupt);
++ if (error) {
++ pr_err("request for irq %d failed %d", nfEtherIRQ, error);
++ return error;
++ }
++
++ for (i = 0; i < MAX_UNIT; i++)
++ nfeth_dev[i] = nfeth_probe(i);
++
++ return 0;
++}
++
++static void __exit nfeth_cleanup(void)
++{
++ int i;
++
++ for (i = 0; i < MAX_UNIT; i++) {
++ if (nfeth_dev[i]) {
++ unregister_netdev(nfeth_dev[0]);
++ free_netdev(nfeth_dev[0]);
++ }
++ }
++ free_irq(nfEtherIRQ, nfeth_interrupt);
++}
++
++module_init(nfeth_init);
++module_exit(nfeth_cleanup);
+--
+1.7.4.4
+
Added: dists/sid/linux-2.6/debian/patches/bugfix/m68k/0008-m68k-atari-Reserve-some-ST-RAM-early-on-for-device-b.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/0008-m68k-atari-Reserve-some-ST-RAM-early-on-for-device-b.patch Mon Apr 25 01:17:00 2011 (r17252)
@@ -0,0 +1,209 @@
+From 87f4d0a511a647dbb32d2e105a613584c5d8f4a4 Mon Sep 17 00:00:00 2001
+From: Michael Schmitz <schmitzmic at googlemail.com>
+Date: Mon, 1 Nov 2010 18:54:00 +0100
+Subject: [PATCH 8/9] m68k/atari: Reserve some ST-RAM early on for device
+ buffer use
+
+Signed-off-by: Michael Schmitz <schmitz at debian.org>
+[Andreas Schwab <schwab at linux-m68k.org>: Use memparse()]
+Signed-off-by: Geert Uytterhoeven <geert at linux-m68k.org>
+[Thorsten Glaser <tg at debian.org>: avoid trigraph]
+Signed-off-by: Thorsten Glaser <tg at debian.org>
+---
+ arch/m68k/atari/stram.c | 117 +++++++++++++++++++++++++++++++++++++++++++----
+ 1 files changed, 107 insertions(+), 10 deletions(-)
+
+diff --git a/arch/m68k/atari/stram.c b/arch/m68k/atari/stram.c
+index 6ec3b7f..bb6df5c 100644
+--- a/arch/m68k/atari/stram.c
++++ b/arch/m68k/atari/stram.c
+@@ -68,6 +68,23 @@
+ * no provision now for freeing ST-Ram buffers. It seems that isn't
+ * really needed.
+ *
++ * MSch 22/10/10: Because mem_init is now called before device init,
++ * devices that rely on ST-RAM may find all ST-RAM already allocated to
++ * other users by the time device init happens. In particular, a large
++ * initrd RAM disk may use up enough of ST-RAM to cause stram_alloc to
++ * resort to get_dma_pages allocation.
++ * In the current state of Atari memory management, all of RAM is marked
++ * DMA capable, so get_dma_pages may well return RAM that is not in actual
++ * fact DMA capable. Using this for frame buffer or SCSI DMA buffer causes
++ * subtle failure.
++ *
++ * The ST-RAM allocator has been changed to allocate memory from a pool of
++ * reserved ST-RAM of configurable size, set aside on ST-RAM init (i.e.
++ * before mem_init). As long as this pool is not exhausted, allocation of
++ * real ST-RAM can be guaranteed.
++ * Currently, pool ST-RAM freed is not returned to the pool free list so
++ * it will be lost. Code to move such freed ST-RAM from alloc_list to
++ * stram_free_list may be added if needed.
+ */
+
+ /* Start and end (virtual) of ST-RAM */
+@@ -91,11 +108,15 @@ typedef struct stram_block {
+ /* values for flags field */
+ #define BLOCK_FREE 0x01 /* free structure in the BLOCKs pool */
+ #define BLOCK_KMALLOCED 0x02 /* structure allocated by kmalloc() */
++#define BLOCK_POOL 0x04 /* block allocated from static pool */
+ #define BLOCK_GFP 0x08 /* block allocated with __get_dma_pages() */
+
+ /* list of allocated blocks */
+ static BLOCK *alloc_list;
+
++static BLOCK *stram_free_list;
++static unsigned long stram_pool, stram_pool_start, stram_pool_end;
++
+ /* We can't always use kmalloc() to allocate BLOCK structures, since
+ * stram_alloc() can be called rather early. So we need some pool of
+ * statically allocated structures. 20 of them is more than enough, so in most
+@@ -116,6 +137,19 @@ static int remove_region( BLOCK *block );
+ /* Public Interface */
+ /* ------------------------------------------------------------------------ */
+
++static int pool_size = 1024*1024;
++
++static int __init atari_stram_setup(char *arg)
++{
++ if (!MACH_IS_ATARI)
++ return 0;
++
++ pool_size = memparse(arg, NULL);
++ return 0;
++}
++
++early_param("stram_pool", atari_stram_setup);
++
+ /*
+ * This init function is called very early by atari/config.c
+ * It initializes some internal variables needed for stram_alloc()
+@@ -156,6 +190,11 @@ void __init atari_stram_reserve_pages(void *start_mem)
+ if (!kernel_in_stram)
+ reserve_bootmem(0, PAGE_SIZE, BOOTMEM_DEFAULT);
+
++ stram_pool = (unsigned long) alloc_bootmem_low(pool_size);
++ stram_pool_start = stram_pool;
++ stram_pool_end = stram_pool + pool_size - 1;
++ DPRINTK("atari_stram pool: size=%d bytes, start=%08lx, end=%08lx\n",
++ pool_size, stram_pool, stram_pool_end);
+ }
+
+ void atari_stram_mem_init_hook (void)
+@@ -163,6 +202,38 @@ void atari_stram_mem_init_hook (void)
+ mem_init_done = 1;
+ }
+
++/* find a region (by size) in the free list */
++static void *find_free_stram(long size)
++{
++ BLOCK *p, *q, *r;
++ unsigned long item;
++
++ q = NULL;
++ r = stram_free_list;
++ for (p = stram_free_list; p; p = p->next) {
++ if (p->size >= size) {
++ q = p;
++ break;
++ }
++ r = p;
++ }
++
++ /* remove from free list */
++ if (q) {
++ item = (unsigned long) q->start;
++ r->next = q->next;
++ return (void *) item;
++ }
++ /* nothing found on free list? take from pool */
++ if ((stram_pool_end - stram_pool) > size) {
++ item = stram_pool;
++ stram_pool += size;
++ return (void *) item;
++ }
++
++ return NULL;
++}
++
+
+ /*
+ * This is main public interface: somehow allocate a ST-RAM block
+@@ -184,16 +255,34 @@ void *atari_stram_alloc(long size, const char *owner)
+ BLOCK *block;
+ int flags;
+
+- DPRINTK("atari_stram_alloc(size=%08lx,owner=%s)\n", size, owner);
++ DPRINTK("atari_stram_alloc(size=%08lx,owner=%s) ... ", size, owner);
+
+ if (!mem_init_done)
++ /*
++ * This will trigger a section mismatch warning which is
++ * actually harmless:
++ * once mem_init has run (before free_initdata), we will not
++ * call this code path anymore
++ */
+ return alloc_bootmem_low(size);
+ else {
+- /* After mem_init(): can only resort to __get_dma_pages() */
+- addr = (void *)__get_dma_pages(GFP_KERNEL, get_order(size));
+- flags = BLOCK_GFP;
+- DPRINTK( "atari_stram_alloc: after mem_init, "
+- "get_pages=%p\n", addr );
++ /*
++ * After mem_init(): can only resort to allocating from
++ * reserved pool ...
++ */
++ addr = find_free_stram(size);
++ if (addr) {
++ flags = BLOCK_POOL;
++ DPRINTK("after mem_init, allocating from pool, "
++ "find_free_stram=%p\n", addr);
++ } else {
++ /* or resort to __get_dma_pages() !! */
++ addr = (void *)__get_dma_pages(GFP_KERNEL,
++ get_order(size));
++ flags = BLOCK_GFP;
++ DPRINTK("after mem_init, allocating dma pages, "
++ "get_dma_pages=%p\n", addr);
++ }
+ }
+
+ if (addr) {
+@@ -226,12 +315,18 @@ void atari_stram_free( void *addr )
+ DPRINTK( "atari_stram_free: found block (%p): size=%08lx, owner=%s, "
+ "flags=%02x\n", block, block->size, block->owner, block->flags );
+
+- if (!(block->flags & BLOCK_GFP))
++ if (!(block->flags & BLOCK_GFP || block->flags & BLOCK_POOL))
+ goto fail;
+
+ DPRINTK("atari_stram_free: is kmalloced, order_size=%d\n",
+ get_order(block->size));
+- free_pages((unsigned long)addr, get_order(block->size));
++
++ /*
++ * pages allocated from stram pool cannot be freed - only pages
++ * allocated by get_free_pages can
++ */
++ if ((block->flags & BLOCK_GFP))
++ free_pages((unsigned long)addr, get_order(block->size));
+ remove_region( block );
+ return;
+
+@@ -339,9 +434,11 @@ static int stram_proc_show(struct seq_file *m, void *v)
+ virt_to_phys(p->start+p->size-1),
+ p->owner);
+ if (p->flags & BLOCK_GFP)
+- PRINT_PROC( "page-alloced)\n" );
++ PRINT_PROC("page-alloced)\n");
++ else if (p->flags & BLOCK_POOL)
++ PRINT_PROC("pool-alloced)\n");
+ else
+- PRINT_PROC( "??)\n" );
++ PRINT_PROC("?)\n");
+ }
+
+ return 0;
+--
+1.7.4.4
+
Added: dists/sid/linux-2.6/debian/patches/bugfix/m68k/0009-m68k-mm-set-all-online-nodes-in-N_NORMAL_MEMORY.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/m68k/0009-m68k-mm-set-all-online-nodes-in-N_NORMAL_MEMORY.patch Mon Apr 25 01:17:00 2011 (r17252)
@@ -0,0 +1,64 @@
+From 678cf05cb8031c762644a393b7c943e7a9d2c288 Mon Sep 17 00:00:00 2001
+From: Michael Schmitz <schmitzmic at googlemail.com>
+Date: Sun, 24 Apr 2011 13:59:43 +1200
+Subject: [PATCH 9/9] m68k, mm: set all online nodes in N_NORMAL_MEMORY
+
+David Rientjes wrote:
+> For m68k, N_NORMAL_MEMORY represents all nodes that have present memory
+> since it does not support HIGHMEM. This patch sets the bit at the time
+> the node is brought online.
+>
+> If N_NORMAL_MEMORY is not accurate, slub may encounter errors since it
+> uses this nodemask to setup per-cache kmem_cache_node data structures.
+>
+> Signed-off-by: David Rientjes <rientjes at google.com>
+> ---
+> arch/m68k/mm/init_mm.c | 2 ++
+> 1 files changed, 2 insertions(+), 0 deletions(-)
+>
+> diff --git a/arch/m68k/mm/init_mm.c b/arch/m68k/mm/init_mm.c
+> --- a/arch/m68k/mm/init_mm.c
+> +++ b/arch/m68k/mm/init_mm.c
+> @@ -59,6 +59,8 @@ void __init m68k_setup_node(int node)
+> }
+> #endif
+> pg_data_map[node].bdata = bootmem_node_data + node;
+> + if (node_present_pages(node))
+> + node_set_state(node, N_NORMAL_MEMORY);
+> node_set_online(node);
+> }
+>
+>
+As Andreas pointed out, node_present_pages is set in free_area_init_node
+which only gets called at the very end of m68k mm paging_init.
+
+The correct patch would be something like this - the need for the
+conditional is perhaps debatable, seeing as we set the pages present
+just before node_set_state.
+
+Tested on my ARAnyM test setup so far. I'd like to wait for an
+independent kernel image built by Thorsten before I test on the actual
+hardware. Sorry but you'll have to restart your build Thorsten :-)
+
+Signed-off-by: Michael Schmitz <schmitz at debian.org>
+Tested-by: Thorsten Glaser <tg at debian.org>
+---
+ arch/m68k/mm/motorola.c | 2 ++
+ 1 files changed, 2 insertions(+), 0 deletions(-)
+
+diff --git a/arch/m68k/mm/motorola.c b/arch/m68k/mm/motorola.c
+index 02b7a03..8b3db1c 100644
+--- a/arch/m68k/mm/motorola.c
++++ b/arch/m68k/mm/motorola.c
+@@ -300,6 +300,8 @@ void __init paging_init(void)
+ zones_size[ZONE_DMA] = m68k_memory[i].size >> PAGE_SHIFT;
+ free_area_init_node(i, zones_size,
+ m68k_memory[i].addr >> PAGE_SHIFT, NULL);
++ if (node_present_pages(i))
++ node_set_state(i, N_NORMAL_MEMORY);
+ }
+ }
+
+--
+1.7.4.4
+
More information about the Kernel-svn-changes
mailing list