diff options
| author | Stelios Koroneos <skoroneos@digital-opsis.com> | 2007-05-06 16:47:53 +0000 |
|---|---|---|
| committer | Stelios Koroneos <skoroneos@digital-opsis.com> | 2007-05-06 16:47:53 +0000 |
| commit | 3fbd828c6fdcd947ec735c38ca9f700701d1354d (patch) | |
| tree | ccc57653f1214858e347485b5c2308cf67353cde | |
| parent | 7c8380efe7ac5b7d7aaf01f91599bb5e64542710 (diff) | |
packages/linux/linux-magicbox_2.6.19.2.bb: Add kernel 2.6.19.2 for Magicbox
The patch set comes from Openwrt project
46 files changed, 46962 insertions, 0 deletions
diff --git a/packages/linux/linux-magicbox-2.6.19.2/.mtn2git_empty b/packages/linux/linux-magicbox-2.6.19.2/.mtn2git_empty new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/packages/linux/linux-magicbox-2.6.19.2/.mtn2git_empty diff --git a/packages/linux/linux-magicbox-2.6.19.2/001-magicbox_support.patch b/packages/linux/linux-magicbox-2.6.19.2/001-magicbox_support.patch new file mode 100644 index 0000000000..7c609e5d02 --- /dev/null +++ b/packages/linux/linux-magicbox-2.6.19.2/001-magicbox_support.patch @@ -0,0 +1,372 @@ +diff -urN linux.old/arch/ppc/platforms/4xx/Kconfig linux.dev/arch/ppc/platforms/4xx/Kconfig +--- linux.old/arch/ppc/platforms/4xx/Kconfig 2006-11-29 22:57:37.000000000 +0100 ++++ linux.dev/arch/ppc/platforms/4xx/Kconfig 2006-12-14 08:49:18.000000000 +0100 +@@ -52,6 +52,12 @@ + help + This option enables support for the IBM PPC405GP evaluation board. + ++config MAGICBOX ++ bool "MagicBox" ++ select WANT_EARLY_SERIAL ++ help ++ This option enables support for the IBM PPC405EP evaluation board. ++ + config XILINX_ML300 + bool "Xilinx-ML300" + help +@@ -173,7 +179,7 @@ + + config IBM_OCP + bool +- depends on ASH || BAMBOO || BUBINGA || CPCI405 || EBONY || EP405 || LUAN || YUCCA || OCOTEA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT ++ depends on ASH || BAMBOO || BUBINGA || CPCI405 || EBONY || EP405 || LUAN || YUCCA || OCOTEA || REDWOOD_5 || REDWOOD_6 || SYCAMORE || WALNUT || MAGICBOX + default y + + config IBM_EMAC4 +@@ -183,7 +189,7 @@ + + config BIOS_FIXUP + bool +- depends on BUBINGA || EP405 || SYCAMORE || WALNUT || CPCI405 ++ depends on BUBINGA || EP405 || SYCAMORE || WALNUT || CPCI405 || MAGICBOX + default y + + # OAK doesn't exist but wanted to keep this around for any future 403GCX boards +@@ -194,7 +200,7 @@ + + config 405EP + bool +- depends on BUBINGA ++ depends on BUBINGA || MAGICBOX + default y + + config 405GP +diff -urN linux.old/arch/ppc/platforms/4xx/magicbox.c linux.dev/arch/ppc/platforms/4xx/magicbox.c +--- linux.old/arch/ppc/platforms/4xx/magicbox.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux.dev/arch/ppc/platforms/4xx/magicbox.c 2006-12-14 08:48:56.000000000 +0100 +@@ -0,0 +1,249 @@ ++/* ++ * Support for IBM PPC 405EP-based MagicBox board ++ * Copyright (C) 2006 Karol Lewandowski ++ * ++ * Heavily based on bubinga.c ++ * ++ * Author: SAW (IBM), derived from walnut.c. ++ * Maintained by MontaVista Software <source@mvista.com> ++ * ++ * 2003 (c) MontaVista Softare Inc. This file is licensed under the ++ * terms of the GNU General Public License version 2. This program is ++ * licensed "as is" without any warranty of any kind, whether express ++ * or implied. ++ */ ++ ++#include <linux/autoconf.h> ++#include <linux/init.h> ++#include <linux/smp.h> ++#include <linux/threads.h> ++#include <linux/param.h> ++#include <linux/string.h> ++#include <linux/blkdev.h> ++#include <linux/pci.h> ++#include <linux/tty.h> ++#include <linux/serial.h> ++#include <linux/serial_core.h> ++ ++#include <asm/system.h> ++#include <asm/pci-bridge.h> ++#include <asm/processor.h> ++#include <asm/machdep.h> ++#include <asm/page.h> ++#include <asm/time.h> ++#include <asm/io.h> ++#include <asm/kgdb.h> ++#include <asm/ocp.h> ++#include <asm/ibm_ocp_pci.h> ++ ++#include <platforms/4xx/ibm405ep.h> ++ ++#undef DEBUG ++ ++#ifdef DEBUG ++#define DBG(x...) printk(x) ++#else ++#define DBG(x...) ++#endif ++ ++extern bd_t __res; ++ ++/* Some IRQs unique to board ++ * Used by the generic 405 PCI setup functions in ppc4xx_pci.c ++ */ ++int __init ++ppc405_map_irq(struct pci_dev *dev, unsigned char idsel, unsigned char pin) ++{ ++ static char pci_irq_table[][4] = ++ /* ++ * PCI IDSEL/INTPIN->INTLINE ++ * A B C D ++ */ ++ { ++ {28, 28, 28, 28}, /* IDSEL 1 - PCI slot 1 */ ++ {29, 29, 29, 29}, /* IDSEL 2 - PCI slot 2 */ ++ {30, 30, 30, 30}, /* IDSEL 3 - PCI slot 3 */ ++ {31, 31, 31, 31}, /* IDSEL 4 - PCI slot 4 */ ++ }; ++ ++ const long min_idsel = 1, max_idsel = 4, irqs_per_slot = 4; ++ return PCI_IRQ_TABLE_LOOKUP; ++}; ++ ++ ++/* The serial clock for the chip is an internal clock determined by ++ * different clock speeds/dividers. ++ * Calculate the proper input baud rate and setup the serial driver. ++ */ ++static void __init ++magicbox_early_serial_map(void) ++{ ++ u32 uart_div; ++ int uart_clock; ++ struct uart_port port; ++ ++ /* Calculate the serial clock input frequency ++ * ++ * The base baud is the PLL OUTA (provided in the board info ++ * structure) divided by the external UART Divisor, divided ++ * by 16. ++ */ ++ uart_div = (mfdcr(DCRN_CPC0_UCR_BASE) & DCRN_CPC0_UCR_U0DIV); ++ uart_clock = __res.bi_procfreq / uart_div; ++ ++ /* Setup serial port access */ ++ memset(&port, 0, sizeof(port)); ++ port.membase = (void*)ACTING_UART0_IO_BASE; ++ port.irq = ACTING_UART0_INT; ++ port.uartclk = uart_clock; ++ port.regshift = 0; ++ port.iotype = SERIAL_IO_MEM; ++ port.flags = ASYNC_BOOT_AUTOCONF | ASYNC_SKIP_TEST; ++ port.line = 0; ++ ++ if (early_serial_setup(&port) != 0) { ++ printk("Early serial init of port 0 failed\n"); ++ } ++ ++ port.membase = (void*)ACTING_UART1_IO_BASE; ++ port.irq = ACTING_UART1_INT; ++ port.line = 1; ++ ++ if (early_serial_setup(&port) != 0) { ++ printk("Early serial init of port 1 failed\n"); ++ } ++} ++ ++void __init ++bios_fixup(struct pci_controller *hose, struct pcil0_regs *pcip) ++{ ++ unsigned int bar_response, bar; ++ /* ++ * Expected PCI mapping: ++ * ++ * PLB addr PCI memory addr ++ * --------------------- --------------------- ++ * 0000'0000 - 7fff'ffff <--- 0000'0000 - 7fff'ffff ++ * 8000'0000 - Bfff'ffff ---> 8000'0000 - Bfff'ffff ++ * ++ * PLB addr PCI io addr ++ * --------------------- --------------------- ++ * e800'0000 - e800'ffff ---> 0000'0000 - 0001'0000 ++ * ++ * The following code is simplified by assuming that the bootrom ++ * has been well behaved in following this mapping. ++ */ ++ ++#ifdef DEBUG ++ int i; ++ ++ printk("ioremap PCLIO_BASE = 0x%x\n", pcip); ++ printk("PCI bridge regs before fixup \n"); ++ for (i = 0; i <= 3; i++) { ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].ma))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].la))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pcila))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pciha))); ++ } ++ printk(" ptm1ms\t0x%x\n", in_le32(&(pcip->ptm1ms))); ++ printk(" ptm1la\t0x%x\n", in_le32(&(pcip->ptm1la))); ++ printk(" ptm2ms\t0x%x\n", in_le32(&(pcip->ptm2ms))); ++ printk(" ptm2la\t0x%x\n", in_le32(&(pcip->ptm2la))); ++ ++#endif ++ ++ /* added for IBM boot rom version 1.15 bios bar changes -AK */ ++ ++ /* Disable region first */ ++ out_le32((void *) &(pcip->pmm[0].ma), 0x00000000); ++ /* PLB starting addr, PCI: 0x80000000 */ ++ out_le32((void *) &(pcip->pmm[0].la), 0x80000000); ++ /* PCI start addr, 0x80000000 */ ++ out_le32((void *) &(pcip->pmm[0].pcila), PPC405_PCI_MEM_BASE); ++ /* 512MB range of PLB to PCI */ ++ out_le32((void *) &(pcip->pmm[0].pciha), 0x00000000); ++ /* Enable no pre-fetch, enable region */ ++ out_le32((void *) &(pcip->pmm[0].ma), ((0xffffffff - ++ (PPC405_PCI_UPPER_MEM - ++ PPC405_PCI_MEM_BASE)) | 0x01)); ++ ++ /* Disable region one */ ++ out_le32((void *) &(pcip->pmm[1].ma), 0x00000000); ++ out_le32((void *) &(pcip->pmm[1].la), 0x00000000); ++ out_le32((void *) &(pcip->pmm[1].pcila), 0x00000000); ++ out_le32((void *) &(pcip->pmm[1].pciha), 0x00000000); ++ out_le32((void *) &(pcip->pmm[1].ma), 0x00000000); ++ out_le32((void *) &(pcip->ptm1ms), 0x00000001); ++ ++ /* Disable region two */ ++ out_le32((void *) &(pcip->pmm[2].ma), 0x00000000); ++ out_le32((void *) &(pcip->pmm[2].la), 0x00000000); ++ out_le32((void *) &(pcip->pmm[2].pcila), 0x00000000); ++ out_le32((void *) &(pcip->pmm[2].pciha), 0x00000000); ++ out_le32((void *) &(pcip->pmm[2].ma), 0x00000000); ++ out_le32((void *) &(pcip->ptm2ms), 0x00000000); ++ out_le32((void *) &(pcip->ptm2la), 0x00000000); ++ ++ /* Zero config bars */ ++ for (bar = PCI_BASE_ADDRESS_1; bar <= PCI_BASE_ADDRESS_2; bar += 4) { ++ early_write_config_dword(hose, hose->first_busno, ++ PCI_FUNC(hose->first_busno), bar, ++ 0x00000000); ++ early_read_config_dword(hose, hose->first_busno, ++ PCI_FUNC(hose->first_busno), bar, ++ &bar_response); ++ DBG("BUS %d, device %d, Function %d bar 0x%8.8x is 0x%8.8x\n", ++ hose->first_busno, PCI_SLOT(hose->first_busno), ++ PCI_FUNC(hose->first_busno), bar, bar_response); ++ } ++ /* end work arround */ ++ ++#ifdef DEBUG ++ printk("PCI bridge regs after fixup \n"); ++ for (i = 0; i <= 3; i++) { ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].ma))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].la))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pcila))); ++ printk(" pmm%dma\t0x%x\n", i, in_le32(&(pcip->pmm[i].pciha))); ++ } ++ printk(" ptm1ms\t0x%x\n", in_le32(&(pcip->ptm1ms))); ++ printk(" ptm1la\t0x%x\n", in_le32(&(pcip->ptm1la))); ++ printk(" ptm2ms\t0x%x\n", in_le32(&(pcip->ptm2ms))); ++ printk(" ptm2la\t0x%x\n", in_le32(&(pcip->ptm2la))); ++ ++#endif /* DEBUG */ ++} ++ ++void __init ++magicbox_setup_arch(void) ++{ ++ ppc4xx_setup_arch(); ++ ++ ibm_ocp_set_emac(0, 1); ++ ++ magicbox_early_serial_map(); ++ ++ /* Identify the system */ ++ printk("MagicBox port (C) 2005 Karol Lewandowski <kl@jasmine.eu.org>\n"); ++} ++ ++void __init ++magicbox_map_io(void) ++{ ++ ppc4xx_map_io(); ++} ++ ++void __init ++platform_init(unsigned long r3, unsigned long r4, unsigned long r5, ++ unsigned long r6, unsigned long r7) ++{ ++ ppc4xx_init(r3, r4, r5, r6, r7); ++ ++ ppc_md.setup_arch = magicbox_setup_arch; ++ ppc_md.setup_io_mappings = magicbox_map_io; ++ ++#ifdef CONFIG_KGDB ++ ppc_md.early_serial_map = bubinga_early_serial_map; ++#endif ++ ++} +diff -urN linux.old/arch/ppc/platforms/4xx/magicbox.h linux.dev/arch/ppc/platforms/4xx/magicbox.h +--- linux.old/arch/ppc/platforms/4xx/magicbox.h 1970-01-01 01:00:00.000000000 +0100 ++++ linux.dev/arch/ppc/platforms/4xx/magicbox.h 2006-12-14 08:48:56.000000000 +0100 +@@ -0,0 +1,47 @@ ++/* ++ * Support for IBM PPC 405EP-based MagicBox board ++ * ++ * Heavily based on bubinga.h ++ * ++ * ++ * Author: SAW (IBM), derived from walnut.h. ++ * Maintained by MontaVista Software <source@mvista.com> ++ * ++ * 2003 (c) MontaVista Softare Inc. This file is licensed under the ++ * terms of the GNU General Public License version 2. This program is ++ * licensed "as is" without any warranty of any kind, whether express ++ * or implied. ++ */ ++ ++#ifdef __KERNEL__ ++#ifndef __MAGICBOX_H__ ++#define __MAGICBOX_H__ ++ ++#include <linux/autoconf.h> ++#include <platforms/4xx/ibm405ep.h> ++#include <asm/ppcboot.h> ++ ++/* Memory map for the "MagicBox" 405EP evaluation board -- generic 4xx. */ ++ ++/* The UART clock is based off an internal clock - ++ * define BASE_BAUD based on the internal clock and divider(s). ++ * Since BASE_BAUD must be a constant, we will initialize it ++ * using clock/divider values which OpenBIOS initializes ++ * for typical configurations at various CPU speeds. ++ * The base baud is calculated as (FWDA / EXT UART DIV / 16) ++ */ ++#define BASE_BAUD 0 ++ ++/* Flash */ ++#define PPC40x_FPGA_BASE 0xF0300000 ++#define PPC40x_FPGA_REG_OFFS 1 /* offset to flash map reg */ ++#define PPC40x_FLASH_ONBD_N(x) (x & 0x02) ++#define PPC40x_FLASH_SRAM_SEL(x) (x & 0x01) ++#define PPC40x_FLASH_LOW 0xFFF00000 ++#define PPC40x_FLASH_HIGH 0xFFF80000 ++#define PPC40x_FLASH_SIZE 0x80000 ++ ++#define PPC4xx_MACHINE_NAME "MagicBox" ++ ++#endif /* __MAGICBOX_H__ */ ++#endif /* __KERNEL__ */ +diff -urN linux.old/arch/ppc/platforms/4xx/Makefile linux.dev/arch/ppc/platforms/4xx/Makefile +--- linux.old/arch/ppc/platforms/4xx/Makefile 2006-11-29 22:57:37.000000000 +0100 ++++ linux.dev/arch/ppc/platforms/4xx/Makefile 2006-12-14 08:48:56.000000000 +0100 +@@ -13,6 +13,7 @@ + obj-$(CONFIG_REDWOOD_6) += redwood6.o + obj-$(CONFIG_SYCAMORE) += sycamore.o + obj-$(CONFIG_WALNUT) += walnut.o ++obj-$(CONFIG_MAGICBOX) += magicbox.o + obj-$(CONFIG_XILINX_ML300) += xilinx_ml300.o + obj-$(CONFIG_XILINX_ML403) += xilinx_ml403.o + +diff -urN linux.old/include/asm-ppc/ibm4xx.h linux.dev/include/asm-ppc/ibm4xx.h +--- linux.old/include/asm-ppc/ibm4xx.h 2006-11-29 22:57:37.000000000 +0100 ++++ linux.dev/include/asm-ppc/ibm4xx.h 2006-12-14 08:48:56.000000000 +0100 +@@ -18,6 +18,10 @@ + + #ifdef CONFIG_40x + ++#if defined(CONFIG_MAGICBOX) ++#include <platforms/4xx/magicbox.h> ++#endif ++ + #if defined(CONFIG_BUBINGA) + #include <platforms/4xx/bubinga.h> + #endif diff --git a/packages/linux/linux-magicbox-2.6.19.2/001-squashfs.patch b/packages/linux/linux-magicbox-2.6.19.2/001-squashfs.patch new file mode 100644 index 0000000000..6881cd0bb1 --- /dev/null +++ b/packages/linux/linux-magicbox-2.6.19.2/001-squashfs.patch @@ -0,0 +1,4170 @@ +diff -urN linux-2.6.19.old/fs/Kconfig linux-2.6.19.dev/fs/Kconfig +--- linux-2.6.19.old/fs/Kconfig 2006-12-14 03:13:16.000000000 +0100 ++++ linux-2.6.19.dev/fs/Kconfig 2006-12-14 03:13:16.000000000 +0100 +@@ -1457,6 +1457,71 @@ + + If unsure, say N. + ++config SQUASHFS ++ tristate "SquashFS 3.0 - Squashed file system support" ++ select ZLIB_INFLATE ++ help ++ Saying Y here includes support for SquashFS 3.0 (a Compressed Read-Only File ++ System). Squashfs is a highly compressed read-only filesystem for Linux. ++ It uses zlib compression to compress both files, inodes and directories. ++ Inodes in the system are very small and all blocks are packed to minimise ++ data overhead. Block sizes greater than 4K are supported up to a maximum of 64K. ++ SquashFS 3.0 supports 64 bit filesystems and files (larger than 4GB), full ++ uid/gid information, hard links and timestamps. ++ ++ Squashfs is intended for general read-only filesystem use, for archival ++ use (i.e. in cases where a .tar.gz file may be used), and in embedded ++ systems where low overhead is needed. Further information and filesystem tools ++ are available from http://squashfs.sourceforge.net. ++ ++ If you want to compile this as a module ( = code which can be ++ inserted in and removed from the running kernel whenever you want), ++ say M here and read <file:Documentation/modules.txt>. The module ++ will be called squashfs. Note that the root file system (the one ++ containing the directory /) cannot be compiled as a module. ++ ++ If unsure, say N. ++ ++config SQUASHFS_EMBEDDED ++ ++ bool "Additional options for memory-constrained systems" ++ depends on SQUASHFS ++ default n ++ help ++ Saying Y here allows you to specify cache sizes and how Squashfs ++ allocates memory. This is only intended for memory constrained ++ systems. ++ ++ If unsure, say N. ++ ++config SQUASHFS_FRAGMENT_CACHE_SIZE ++ int "Number of fragments cached" if SQUASHFS_EMBEDDED ++ depends on SQUASHFS ++ default "3" ++ help ++ By default SquashFS caches the last 3 fragments read from ++ the filesystem. Increasing this amount may mean SquashFS ++ has to re-read fragments less often from disk, at the expense ++ of extra system memory. Decreasing this amount will mean ++ SquashFS uses less memory at the expense of extra reads from disk. ++ ++ Note there must be at least one cached fragment. Anything ++ much more than three will probably not make much difference. ++ ++config SQUASHFS_VMALLOC ++ bool "Use Vmalloc rather than Kmalloc" if SQUASHFS_EMBEDDED ++ depends on SQUASHFS ++ default n ++ help ++ By default SquashFS uses kmalloc to obtain fragment cache memory. ++ Kmalloc memory is the standard kernel allocator, but it can fail ++ on memory constrained systems. Because of the way Vmalloc works, ++ Vmalloc can succeed when kmalloc fails. Specifying this option ++ will make SquashFS always use Vmalloc to allocate the ++ fragment cache memory. ++ ++ If unsure, say N. ++ + config VXFS_FS + tristate "FreeVxFS file system support (VERITAS VxFS(TM) compatible)" + depends on BLOCK +diff -urN linux-2.6.19.old/fs/Makefile linux-2.6.19.dev/fs/Makefile +--- linux-2.6.19.old/fs/Makefile 2006-12-14 03:13:16.000000000 +0100 ++++ linux-2.6.19.dev/fs/Makefile 2006-12-14 03:13:16.000000000 +0100 +@@ -67,6 +67,7 @@ + obj-$(CONFIG_JBD2) += jbd2/ + obj-$(CONFIG_EXT2_FS) += ext2/ + obj-$(CONFIG_CRAMFS) += cramfs/ ++obj-$(CONFIG_SQUASHFS) += squashfs/ + obj-$(CONFIG_RAMFS) += ramfs/ + obj-$(CONFIG_HUGETLBFS) += hugetlbfs/ + obj-$(CONFIG_CODA_FS) += coda/ +diff -urN linux-2.6.19.old/fs/squashfs/inode.c linux-2.6.19.dev/fs/squashfs/inode.c +--- linux-2.6.19.old/fs/squashfs/inode.c 1970-01-01 01:00:00.000000000 +0100 ++++ linux-2.6.19.dev/fs/squashfs/inode.c 2006-12-14 03:13:16.000000000 +0100 +@@ -0,0 +1,2124 @@ ++/* ++ * Squashfs - a compressed read only filesystem for Linux ++ * ++ * Copyright (c) 2002, 2003, 2004, 2005, 2006 ++ * Phillip Lougher <phillip@lougher.org.uk> ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License ++ * as published by the Free Software Foundation; either version 2, ++ * or (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ * ++ * inode.c ++ */ ++ ++#include <linux/types.h> ++#include <linux/squashfs_fs.h> ++#include <linux/module.h> ++#include <linux/errno.h> ++#include <linux/slab.h> ++#include <linux/fs.h> ++#include <linux/smp_lock.h> ++#include <linux/slab.h> ++#include <linux/squashfs_fs_sb.h> ++#include <linux/squashfs_fs_i.h> ++#include <linux/buffer_head.h> ++#include <linux/vfs.h> ++#include <linux/init.h> ++#include <linux/dcache.h> ++#include <linux/wait.h> ++#include <linux/zlib.h> ++#include <linux/blkdev.h> ++#include <linux/vmalloc.h> ++#include <asm/uaccess.h> ++#include <asm/semaphore.h> ++ ++#include "squashfs.h" ++ ++static void squashfs_put_super(struct super_block *); ++static int squashfs_statfs(struct dentry *, struct kstatfs *); ++static int squashfs_symlink_readpage(struct file *file, struct page *page); ++static int squashfs_readpage(struct file *file, struct page *page); ++static int squashfs_readpage4K(struct file *file, struct page *page); ++static int squashfs_readdir(struct file *, void *, filldir_t); ++static struct inode *squashfs_alloc_inode(struct super_block *sb); ++static void squashfs_destroy_inode(struct inode *inode); ++static int init_inodecache(void); ++static void destroy_inodecache(void); ++static struct dentry *squashfs_lookup(struct inode *, struct dentry *, ++ struct nameidata *); ++static struct inode *squashfs_iget(struct super_block *s, squashfs_inode_t inode); ++static long long read_blocklist(struct inode *inode, int index, ++ int readahead_blks, char *block_list, ++ unsigned short **block_p, unsigned int *bsize); ++static int squashfs_get_sb(struct file_system_type *, int, ++ const char *, void *, struct vfsmount *); ++ ++ ++static z_stream stream; ++ ++static struct file_system_type squashfs_fs_type = { ++ .owner = THIS_MODULE, ++ .name = "squashfs", ++ .get_sb = squashfs_get_sb, ++ .kill_sb = kill_block_super, ++ .fs_flags = FS_REQUIRES_DEV ++}; ++ ++static unsigned char squashfs_filetype_table[] = { ++ DT_UNKNOWN, DT_DIR, DT_REG, DT_LNK, DT_BLK, DT_CHR, DT_FIFO, DT_SOCK ++}; ++ ++static struct super_operations squashfs_ops = { ++ .alloc_inode = squashfs_alloc_inode, ++ .destroy_inode = squashfs_destroy_inode, ++ .statfs = squashfs_statfs, ++ .put_super = squashfs_put_super, ++}; ++ ++SQSH_EXTERN struct address_space_operations squashfs_symlink_aops = { ++ .readpage = squashfs_symlink_readpage ++}; ++ ++SQSH_EXTERN struct address_space_operations squashfs_aops = { ++ .readpage = squashfs_readpage ++}; ++ ++SQSH_EXTERN struct address_space_operations squashfs_aops_4K = { ++ .readpage = squashfs_readpage4K ++}; ++ ++static struct file_operations squashfs_dir_ops = { ++ .read = generic_read_dir, ++ .readdir = squashfs_readdir ++}; ++ ++SQSH_EXTERN struct inode_operations squashfs_dir_inode_ops = { ++ .lookup = squashfs_lookup ++}; ++ ++ ++static struct buffer_head *get_block_length(struct super_block *s, ++ int *cur_index, int *offset, int *c_byte) ++{ ++ struct squashfs_sb_info *msblk = s->s_fs_info; ++ unsigned short temp; ++ struct buffer_head *bh; ++ ++ if (!(bh = sb_bread(s, *cur_index))) ++ goto out; ++ ++ if (msblk->devblksize - *offset == 1) { ++ if (msblk->swap) ++ ((unsigned char *) &temp)[1] = *((unsigned char *) ++ (bh->b_data + *offset)); ++ else ++ ((unsigned char *) &temp)[0] = *((unsigned char *) ++ (bh->b_data + *offset)); ++ brelse(bh); ++ if (!(bh = sb_bread(s, ++(*cur_index)))) ++ goto out; ++ if (msblk->swap) ++ ((unsigned char *) &temp)[0] = *((unsigned char *) ++ bh->b_data); ++ else ++ ((unsigned char *) &temp)[1] = *((unsigned c |
