(Michael, Geert, please read below for action item.)
Finn Thain dixit: >Most of the relevant mac patches were merged into the mainline prior to >the 2.6.34 release and by 2.6.37 all of them were merged. Thanks for the information. Ben Hutchings dixit: >You don't need to unset ECONET or X25 in debian/config/m68k/config; they I’ve addressed that now. Here is another preview. Changes from the previous one: * forgot one changelog entry * used SLUB fix from thread on linux-mm: <4db3840f.3060...@gmail.com> Re: [patch] m68k, mm: set all online nodes in N_NORMAL_MEMORY * added a patch to reserve some ST-RAM early, which fixes usability of the atari framebuffer console on machines with a lot of FastRAM (the patch is accepted by the m68k subsystem maintainer; we’ll work on getting it into 2.6.40) * reduced diff of debian/config/** Except for the two patches listed above, all others are accepted and merged by Linus for 2.6.39 already. Michael Schmitz: I’ve changed one line in your ST-RAM patch to avoid a trigraph (changed "??)" to "?)"). Geert, can you please update the patch in your git? I’ve also added signoff or tested-by lines to both the ST-RAM and SLUB patches, in case that’s relevant to someone, based on my previous expe- rience with these two patches. I will, of course, mail back when I actually submit these to the Debian Kernel Team. +++ linux-2.6-2.6.38/debian/changelog + [ Thorsten Glaser ] + * [m68k] Disable staging drivers (taken from Debian 2.6.32) + * [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 diff -u linux-2.6-2.6.38/debian/config/m68k/config.atari linux-2.6-2.6.38/debian/config/m68k/config.atari --- linux-2.6-2.6.38/debian/config/m68k/config.atari +++ linux-2.6-2.6.38/debian/config/m68k/config.atari @@ -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 diff -u linux-2.6-2.6.38/debian/config/m68k/config linux-2.6-2.6.38/debian/config/m68k/config --- linux-2.6-2.6.38/debian/config/m68k/config +++ linux-2.6-2.6.38/debian/config/m68k/config @@ -130,7 +130,7 @@ ## ## file: drivers/staging/Kconfig ## -# CONFIG_STAGING is not set +CONFIG_STAGING=n ## ## file: drivers/telephony/Kconfig only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/series/4+m68k.3 +++ linux-2.6-2.6.38/debian/patches/series/4+m68k.3 @@ -0,0 +1,12 @@ +# merged by Linus for 2.6.39 ++ bugfix/m68k/0001-m68k-Add-helper-function-handle_kernel_fault.patch ++ bugfix/m68k/0002-m68k-Use-base_trap_init-to-initialize-vectors.patch ++ bugfix/m68k/0003-m68k-Allow-all-kernel-traps-to-be-handled-via-except.patch ++ bugfix/m68k/0004-m68k-atari-Initial-ARAnyM-support.patch ++ bugfix/m68k/0005-m68k-atari-ARAnyM-Add-support-for-block-access.patch ++ bugfix/m68k/0006-m68k-atari-ARAnyM-Add-support-for-console-access.patch ++ bugfix/m68k/0007-m68k-atari-ARAnyM-Add-support-for-network-access.patch +# from m68k subsystem maintainer's patch queue, probably in 2.6.40 ++ bugfix/m68k/0008-m68k-atari-Reserve-some-ST-RAM-early-on-for-device-b.patch +# from http://thread.gmane.org/gmane.linux.kernel.mm/61328/focus=2190 ++ bugfix/m68k/0009-m68k-mm-set-all-online-nodes-in-N_NORMAL_MEMORY.patch only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/bugfix/m68k/0009-m68k-mm-set-all-online-nodes-in-N_NORMAL_MEMORY.patch +++ linux-2.6-2.6.38/debian/patches/bugfix/m68k/0009-m68k-mm-set-all-online-nodes-in-N_NORMAL_MEMORY.patch @@ -0,0 +1,64 @@ +From 678cf05cb8031c762644a393b7c943e7a9d2c288 Mon Sep 17 00:00:00 2001 +From: Michael Schmitz <schmitz...@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 <rient...@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 <schm...@debian.org> +Tested-by: Thorsten Glaser <t...@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 + only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/bugfix/m68k/0005-m68k-atari-ARAnyM-Add-support-for-block-access.patch +++ linux-2.6-2.6.38/debian/patches/bugfix/m68k/0005-m68k-atari-ARAnyM-Add-support-for-block-access.patch @@ -0,0 +1,250 @@ +From b17808612628b0504e4b7edcbf87683da4e6e83f Mon Sep 17 00:00:00 2001 +From: Roman Zippel <zip...@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 <zip...@linux-m68k.org> +Signed-off-by: Geert Uytterhoeven <ge...@linux-m68k.org> +Acked-by: Petr Stehlik <psteh...@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 + only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/bugfix/m68k/0008-m68k-atari-Reserve-some-ST-RAM-early-on-for-device-b.patch +++ linux-2.6-2.6.38/debian/patches/bugfix/m68k/0008-m68k-atari-Reserve-some-ST-RAM-early-on-for-device-b.patch @@ -0,0 +1,209 @@ +From 87f4d0a511a647dbb32d2e105a613584c5d8f4a4 Mon Sep 17 00:00:00 2001 +From: Michael Schmitz <schmitz...@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 <schm...@debian.org> +[Andreas Schwab <sch...@linux-m68k.org>: Use memparse()] +Signed-off-by: Geert Uytterhoeven <ge...@linux-m68k.org> +[Thorsten Glaser <t...@debian.org>: avoid trigraph] +Signed-off-by: Thorsten Glaser <t...@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 + only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/bugfix/m68k/0006-m68k-atari-ARAnyM-Add-support-for-console-access.patch +++ linux-2.6-2.6.38/debian/patches/bugfix/m68k/0006-m68k-atari-ARAnyM-Add-support-for-console-access.patch @@ -0,0 +1,273 @@ +From c154e95234fab43dd5dd03602bd19ac203200e89 Mon Sep 17 00:00:00 2001 +From: Roman Zippel <zip...@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 <zip...@linux-m68k.org> +Signed-off-by: Geert Uytterhoeven <ge...@linux-m68k.org> +Acked-by: Petr Stehlik <psteh...@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 + only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/bugfix/m68k/0002-m68k-Use-base_trap_init-to-initialize-vectors.patch +++ linux-2.6-2.6.38/debian/patches/bugfix/m68k/0002-m68k-Use-base_trap_init-to-initialize-vectors.patch @@ -0,0 +1,51 @@ +From 2a36e907a8bb57c90a3addd94993f4e73b571ada Mon Sep 17 00:00:00 2001 +From: Roman Zippel <zip...@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 <zip...@linux-m68k.org> +Signed-off-by: Geert Uytterhoeven <ge...@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 + only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/bugfix/m68k/0004-m68k-atari-Initial-ARAnyM-support.patch +++ linux-2.6-2.6.38/debian/patches/bugfix/m68k/0004-m68k-atari-Initial-ARAnyM-support.patch @@ -0,0 +1,242 @@ +From 62acf39a5ab025b65cce080a0bc21b547b32119b Mon Sep 17 00:00:00 2001 +From: Petr Stehlik <psteh...@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 <psteh...@sophics.cz> +Signed-off-by: Michael Schmitz <schm...@debian.org> +Signed-off-by: Geert Uytterhoeven <ge...@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 <zip...@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 + only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/bugfix/m68k/0001-m68k-Add-helper-function-handle_kernel_fault.patch +++ linux-2.6-2.6.38/debian/patches/bugfix/m68k/0001-m68k-Add-helper-function-handle_kernel_fault.patch @@ -0,0 +1,116 @@ +From b8d10d8540e1d2eece5f2e8d629e0a8c3368965a Mon Sep 17 00:00:00 2001 +From: Roman Zippel <zip...@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 <zip...@linux-m68k.org> +Signed-off-by: Geert Uytterhoeven <ge...@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 + only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/bugfix/m68k/0007-m68k-atari-ARAnyM-Add-support-for-network-access.patch +++ linux-2.6-2.6.38/debian/patches/bugfix/m68k/0007-m68k-atari-ARAnyM-Add-support-for-network-access.patch @@ -0,0 +1,327 @@ +From cfb6fef8b8c8380d75b71f13b25084736172b7ed Mon Sep 17 00:00:00 2001 +From: Milan Jurik <milan.ju...@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.ju...@xylab.cz> +Signed-off-by: Petr Stehlik <psteh...@sophics.cz> +Signed-off-by: Michael Schmitz <schm...@debian.org> +Signed-off-by: Geert Uytterhoeven <ge...@linux-m68k.org> +Cc: net...@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 + only in patch2: unchanged: --- linux-2.6-2.6.38.orig/debian/patches/bugfix/m68k/0003-m68k-Allow-all-kernel-traps-to-be-handled-via-except.patch +++ linux-2.6-2.6.38/debian/patches/bugfix/m68k/0003-m68k-Allow-all-kernel-traps-to-be-handled-via-except.patch @@ -0,0 +1,53 @@ +From 94ff3996418310cc2109a70ff50a57e3532a661e Mon Sep 17 00:00:00 2001 +From: Andreas Schwab <sch...@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 <sch...@linux-m68k.org> +Signed-off-by: Geert Uytterhoeven <ge...@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 + -- To UNSUBSCRIBE, email to debian-kernel-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/pine.bsm.4.64l.1104242000490.8...@herc.mirbsd.org