mirror of https://gitee.com/openkylin/linux.git
Merge branch 'master'
This commit is contained in:
commit
d26046bb0a
|
@ -246,6 +246,7 @@ class/
|
|||
devices/
|
||||
firmware/
|
||||
net/
|
||||
fs/
|
||||
|
||||
devices/ contains a filesystem representation of the device tree. It maps
|
||||
directly to the internal kernel device tree, which is a hierarchy of
|
||||
|
@ -264,6 +265,10 @@ drivers/ contains a directory for each device driver that is loaded
|
|||
for devices on that particular bus (this assumes that drivers do not
|
||||
span multiple bus types).
|
||||
|
||||
fs/ contains a directory for some filesystems. Currently each
|
||||
filesystem wanting to export attributes must create its own hierarchy
|
||||
below fs/ (see ./fuse.txt for an example).
|
||||
|
||||
|
||||
More information can driver-model specific features can be found in
|
||||
Documentation/driver-model/.
|
||||
|
|
12
MAINTAINERS
12
MAINTAINERS
|
@ -421,6 +421,14 @@ L: linux-hams@vger.kernel.org
|
|||
W: http://www.baycom.org/~tom/ham/ham.html
|
||||
S: Maintained
|
||||
|
||||
BCM43XX WIRELESS DRIVER
|
||||
P: Michael Buesch
|
||||
M: mb@bu3sch.de
|
||||
P: Stefano Brivio
|
||||
M: st3@riseup.net
|
||||
W: http://bcm43xx.berlios.de/
|
||||
S: Maintained
|
||||
|
||||
BEFS FILE SYSTEM
|
||||
P: Sergey S. Kostyliov
|
||||
M: rathamahata@php4.ru
|
||||
|
@ -2065,8 +2073,12 @@ P: Matthew Wilcox
|
|||
M: matthew@wil.cx
|
||||
P: Grant Grundler
|
||||
M: grundler@parisc-linux.org
|
||||
P: Kyle McMartin
|
||||
M: kyle@parisc-linux.org
|
||||
L: parisc-linux@parisc-linux.org
|
||||
W: http://www.parisc-linux.org/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
|
||||
T: cvs cvs.parisc-linux.org:/var/cvs/linux-2.6
|
||||
S: Maintained
|
||||
|
||||
PCI ERROR RECOVERY
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 17
|
||||
EXTRAVERSION =-rc2
|
||||
EXTRAVERSION =-rc3
|
||||
NAME=Sliding Snow Leopard
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -43,8 +43,8 @@ strncpy:
|
|||
|
||||
.align 4
|
||||
$multiword:
|
||||
subq $24, 1, $2 # clear the final bits in the prev word
|
||||
or $2, $24, $2
|
||||
subq $27, 1, $2 # clear the final bits in the prev word
|
||||
or $2, $27, $2
|
||||
zapnot $1, $2, $1
|
||||
subq $18, 1, $18
|
||||
|
||||
|
@ -70,8 +70,8 @@ $multiword:
|
|||
bne $18, 0b
|
||||
|
||||
1: ldq_u $1, 0($16) # clear the leading bits in the final word
|
||||
subq $27, 1, $2
|
||||
or $2, $27, $2
|
||||
subq $24, 1, $2
|
||||
or $2, $24, $2
|
||||
|
||||
zap $1, $2, $1
|
||||
stq_u $1, 0($16)
|
||||
|
|
|
@ -66,7 +66,7 @@ tune-$(CONFIG_CPU_XSC3) :=$(call cc-option,-mtune=xscale,-mtune=strongarm110) -
|
|||
tune-$(CONFIG_CPU_V6) :=$(call cc-option,-mtune=arm1136j-s,-mtune=strongarm)
|
||||
|
||||
ifeq ($(CONFIG_AEABI),y)
|
||||
CFLAGS_ABI :=-mabi=aapcs -mno-thumb-interwork
|
||||
CFLAGS_ABI :=-mabi=aapcs-linux -mno-thumb-interwork
|
||||
else
|
||||
CFLAGS_ABI :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,)
|
||||
endif
|
||||
|
|
|
@ -29,7 +29,7 @@ ifneq ($(CONFIG_ARCH_EBSA110),y)
|
|||
obj-y += io.o
|
||||
endif
|
||||
|
||||
head-y := head.o
|
||||
head-y := head$(MMUEXT).o
|
||||
obj-$(CONFIG_DEBUG_LL) += debug.o
|
||||
|
||||
extra-y := $(head-y) init_task.o vmlinux.lds
|
||||
|
|
|
@ -20,10 +20,11 @@
|
|||
#include <asm/mach-types.h>
|
||||
#include <asm/procinfo.h>
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/constants.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#define PROCINFO_INITFUNC 12
|
||||
#define MACHINFO_TYPE 0
|
||||
|
||||
/*
|
||||
* Kernel startup entry point.
|
||||
|
@ -79,5 +80,6 @@ __after_proc_init:
|
|||
|
||||
mov pc, r13 @ clear the BSS and jump
|
||||
@ to start_kernel
|
||||
.ltorg
|
||||
|
||||
#include "head-common.S"
|
||||
|
|
|
@ -197,7 +197,7 @@ u32 vfp_double_normaliseround(int dd, struct vfp_double *vd, u32 fpscr, u32 exce
|
|||
dd, d, exceptions);
|
||||
vfp_put_double(dd, d);
|
||||
}
|
||||
return exceptions & ~VFP_NAN_FLAG;
|
||||
return exceptions;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -180,7 +180,7 @@ static u32 vfp_emulate_instruction(u32 inst, u32 fpscr, struct pt_regs *regs)
|
|||
* emulate it.
|
||||
*/
|
||||
}
|
||||
return exceptions;
|
||||
return exceptions & ~VFP_NAN_FLAG;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -203,7 +203,7 @@ u32 vfp_single_normaliseround(int sd, struct vfp_single *vs, u32 fpscr, u32 exce
|
|||
vfp_put_float(sd, d);
|
||||
}
|
||||
|
||||
return exceptions & ~VFP_NAN_FLAG;
|
||||
return exceptions;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -642,7 +642,7 @@ static void __cpuexit cache_remove_dev(struct sys_device * sys_dev)
|
|||
return;
|
||||
}
|
||||
|
||||
static int __cpuinit cacheinfo_cpu_callback(struct notifier_block *nfb,
|
||||
static int cacheinfo_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
|
|
|
@ -1610,5 +1610,6 @@ sys_call_table:
|
|||
data8 sys_get_robust_list
|
||||
data8 sys_sync_file_range // 1300
|
||||
data8 sys_tee
|
||||
data8 sys_vmsplice
|
||||
|
||||
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
|
||||
|
|
|
@ -959,7 +959,7 @@ remove_palinfo_proc_entries(unsigned int hcpu)
|
|||
}
|
||||
}
|
||||
|
||||
static int __devinit palinfo_cpu_callback(struct notifier_block *nfb,
|
||||
static int palinfo_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action,
|
||||
void *hcpu)
|
||||
{
|
||||
|
|
|
@ -572,7 +572,7 @@ static struct file_operations salinfo_data_fops = {
|
|||
};
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
static int __devinit
|
||||
static int
|
||||
salinfo_cpu_callback(struct notifier_block *nb, unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int i, cpu = (unsigned long)hcpu;
|
||||
|
|
|
@ -429,7 +429,7 @@ static int __cpuinit cache_remove_dev(struct sys_device * sys_dev)
|
|||
* When a cpu is hot-plugged, do a check and initiate
|
||||
* cache kobject if necessary
|
||||
*/
|
||||
static int __cpuinit cache_cpu_callback(struct notifier_block *nfb,
|
||||
static int cache_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
|
|
|
@ -356,73 +356,13 @@ asmlinkage int sys32_llseek(unsigned int fd, unsigned int offset_high,
|
|||
asmlinkage ssize_t sys32_pread(unsigned int fd, char __user * buf,
|
||||
size_t count, u32 unused, u64 a4, u64 a5)
|
||||
{
|
||||
ssize_t ret;
|
||||
struct file * file;
|
||||
ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);
|
||||
loff_t pos;
|
||||
|
||||
ret = -EBADF;
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto bad_file;
|
||||
if (!(file->f_mode & FMODE_READ))
|
||||
goto out;
|
||||
pos = merge_64(a4, a5);
|
||||
ret = rw_verify_area(READ, file, &pos, count);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = -EINVAL;
|
||||
if (!file->f_op || !(read = file->f_op->read))
|
||||
goto out;
|
||||
if (pos < 0)
|
||||
goto out;
|
||||
ret = -ESPIPE;
|
||||
if (!(file->f_mode & FMODE_PREAD))
|
||||
goto out;
|
||||
ret = read(file, buf, count, &pos);
|
||||
if (ret > 0)
|
||||
dnotify_parent(file->f_dentry, DN_ACCESS);
|
||||
out:
|
||||
fput(file);
|
||||
bad_file:
|
||||
return ret;
|
||||
return sys_pread64(fd, buf, count, merge_64(a4, a5));
|
||||
}
|
||||
|
||||
asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char __user * buf,
|
||||
size_t count, u32 unused, u64 a4, u64 a5)
|
||||
{
|
||||
ssize_t ret;
|
||||
struct file * file;
|
||||
ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *);
|
||||
loff_t pos;
|
||||
|
||||
ret = -EBADF;
|
||||
file = fget(fd);
|
||||
if (!file)
|
||||
goto bad_file;
|
||||
if (!(file->f_mode & FMODE_WRITE))
|
||||
goto out;
|
||||
pos = merge_64(a4, a5);
|
||||
ret = rw_verify_area(WRITE, file, &pos, count);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = -EINVAL;
|
||||
if (!file->f_op || !(write = file->f_op->write))
|
||||
goto out;
|
||||
if (pos < 0)
|
||||
goto out;
|
||||
|
||||
ret = -ESPIPE;
|
||||
if (!(file->f_mode & FMODE_PWRITE))
|
||||
goto out;
|
||||
|
||||
ret = write(file, buf, count, &pos);
|
||||
if (ret > 0)
|
||||
dnotify_parent(file->f_dentry, DN_MODIFY);
|
||||
out:
|
||||
fput(file);
|
||||
bad_file:
|
||||
return ret;
|
||||
return sys_pwrite64(fd, buf, count, merge_64(a4, a5));
|
||||
}
|
||||
|
||||
asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
|
||||
|
|
|
@ -138,6 +138,37 @@ config 64BIT
|
|||
enable this option otherwise. The 64bit kernel is significantly bigger
|
||||
and slower than the 32bit one.
|
||||
|
||||
choice
|
||||
prompt "Kernel page size"
|
||||
default PARISC_PAGE_SIZE_4KB if !64BIT
|
||||
default PARISC_PAGE_SIZE_4KB if 64BIT
|
||||
# default PARISC_PAGE_SIZE_16KB if 64BIT
|
||||
|
||||
config PARISC_PAGE_SIZE_4KB
|
||||
bool "4KB"
|
||||
help
|
||||
This lets you select the page size of the kernel. For best
|
||||
performance, a page size of 16KB is recommended. For best
|
||||
compatibility with 32bit applications, a page size of 4KB should be
|
||||
selected (the vast majority of 32bit binaries work perfectly fine
|
||||
with a larger page size).
|
||||
|
||||
4KB For best 32bit compatibility
|
||||
16KB For best performance
|
||||
64KB For best performance, might give more overhead.
|
||||
|
||||
If you don't know what to do, choose 4KB.
|
||||
|
||||
config PARISC_PAGE_SIZE_16KB
|
||||
bool "16KB (EXPERIMENTAL)"
|
||||
depends on PA8X00 && EXPERIMENTAL
|
||||
|
||||
config PARISC_PAGE_SIZE_64KB
|
||||
bool "64KB (EXPERIMENTAL)"
|
||||
depends on PA8X00 && EXPERIMENTAL
|
||||
|
||||
endchoice
|
||||
|
||||
config SMP
|
||||
bool "Symmetric multi-processing support"
|
||||
---help---
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16-pa6
|
||||
# Sun Mar 26 19:50:07 2006
|
||||
# Linux kernel version: 2.6.16-pa10
|
||||
# Sun Apr 2 15:26:38 2006
|
||||
#
|
||||
CONFIG_PARISC=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -25,7 +25,7 @@ CONFIG_LOCALVERSION=""
|
|||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
|
@ -35,7 +35,7 @@ CONFIG_INITRAMFS_SOURCE=""
|
|||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
|
@ -57,7 +57,13 @@ CONFIG_BASE_SMALL=0
|
|||
#
|
||||
# Loadable module support
|
||||
#
|
||||
# CONFIG_MODULES is not set
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
|
||||
#
|
||||
# Block layer
|
||||
|
@ -79,16 +85,19 @@ CONFIG_DEFAULT_IOSCHED="anticipatory"
|
|||
#
|
||||
# Processor type and features
|
||||
#
|
||||
CONFIG_PA7000=y
|
||||
# CONFIG_PA7100LC is not set
|
||||
# CONFIG_PA7000 is not set
|
||||
CONFIG_PA7100LC=y
|
||||
# CONFIG_PA7200 is not set
|
||||
# CONFIG_PA7300LC is not set
|
||||
# CONFIG_PA8X00 is not set
|
||||
CONFIG_PA11=y
|
||||
CONFIG_PARISC_PAGE_SIZE_4KB=y
|
||||
# CONFIG_PARISC_PAGE_SIZE_16KB is not set
|
||||
# CONFIG_PARISC_PAGE_SIZE_64KB is not set
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT_NONE is not set
|
||||
CONFIG_PREEMPT_VOLUNTARY=y
|
||||
# CONFIG_PREEMPT is not set
|
||||
# CONFIG_HZ_100 is not set
|
||||
CONFIG_HZ_250=y
|
||||
|
@ -108,7 +117,7 @@ CONFIG_SPLIT_PTLOCK_CPUS=4096
|
|||
# Bus options (PCI, PCMCIA, EISA, GSC, ISA)
|
||||
#
|
||||
CONFIG_GSC=y
|
||||
CONFIG_HPPB=y
|
||||
# CONFIG_HPPB is not set
|
||||
CONFIG_IOMMU_CCIO=y
|
||||
CONFIG_GSC_LASI=y
|
||||
CONFIG_GSC_WAX=y
|
||||
|
@ -126,7 +135,25 @@ CONFIG_IOMMU_SBA=y
|
|||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
CONFIG_PCCARD=y
|
||||
# CONFIG_PCMCIA_DEBUG is not set
|
||||
CONFIG_PCMCIA=y
|
||||
CONFIG_PCMCIA_LOAD_CIS=y
|
||||
CONFIG_PCMCIA_IOCTL=y
|
||||
CONFIG_CARDBUS=y
|
||||
|
||||
#
|
||||
# PC-card bridges
|
||||
#
|
||||
CONFIG_YENTA=y
|
||||
CONFIG_YENTA_O2=y
|
||||
CONFIG_YENTA_RICOH=y
|
||||
CONFIG_YENTA_TI=y
|
||||
CONFIG_YENTA_ENE_TUNE=y
|
||||
CONFIG_YENTA_TOSHIBA=y
|
||||
CONFIG_PD6729=y
|
||||
CONFIG_I82092=y
|
||||
CONFIG_PCCARD_NONSTATIC=y
|
||||
|
||||
#
|
||||
# PCI Hotplug Support
|
||||
|
@ -145,7 +172,7 @@ CONFIG_PDC_STABLE=y
|
|||
# Executable file formats
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_BINFMT_MISC=m
|
||||
|
||||
#
|
||||
# Networking
|
||||
|
@ -159,13 +186,15 @@ CONFIG_NET=y
|
|||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_MMAP=y
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_XFRM=y
|
||||
CONFIG_XFRM_USER=m
|
||||
CONFIG_NET_KEY=m
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
CONFIG_IP_PNP=y
|
||||
# CONFIG_IP_PNP_DHCP is not set
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
|
@ -173,19 +202,20 @@ CONFIG_IP_PNP_BOOTP=y
|
|||
# CONFIG_IP_MROUTE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
CONFIG_INET_AH=m
|
||||
CONFIG_INET_ESP=m
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_INET_DIAG is not set
|
||||
CONFIG_INET_TUNNEL=m
|
||||
CONFIG_INET_DIAG=m
|
||||
CONFIG_INET_TCP_DIAG=m
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_IPV6=y
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
# CONFIG_INET6_AH is not set
|
||||
# CONFIG_INET6_ESP is not set
|
||||
# CONFIG_INET6_IPCOMP is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
CONFIG_INET6_AH=y
|
||||
CONFIG_INET6_ESP=y
|
||||
CONFIG_INET6_IPCOMP=y
|
||||
CONFIG_INET6_TUNNEL=y
|
||||
# CONFIG_IPV6_TUNNEL is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
|
@ -207,7 +237,8 @@ CONFIG_IPV6=y
|
|||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
CONFIG_LLC=m
|
||||
CONFIG_LLC2=m
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
|
@ -237,9 +268,9 @@ CONFIG_IPV6=y
|
|||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
# CONFIG_STANDALONE is not set
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
|
||||
#
|
||||
|
@ -256,13 +287,14 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
|
|||
# Parallel port support
|
||||
#
|
||||
CONFIG_PARPORT=y
|
||||
CONFIG_PARPORT_PC=y
|
||||
CONFIG_PARPORT_PC=m
|
||||
# CONFIG_PARPORT_SERIAL is not set
|
||||
# CONFIG_PARPORT_PC_FIFO is not set
|
||||
# CONFIG_PARPORT_PC_SUPERIO is not set
|
||||
CONFIG_PARPORT_PC_PCMCIA=m
|
||||
CONFIG_PARPORT_NOT_PC=y
|
||||
CONFIG_PARPORT_GSC=y
|
||||
# CONFIG_PARPORT_1284 is not set
|
||||
CONFIG_PARPORT_1284=y
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
|
@ -284,7 +316,7 @@ CONFIG_BLK_DEV_CRYPTOLOOP=y
|
|||
# CONFIG_BLK_DEV_UB is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_RAM_SIZE=6144
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
@ -292,7 +324,60 @@ CONFIG_BLK_DEV_INITRD=y
|
|||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDE=y
|
||||
|
||||
#
|
||||
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||
#
|
||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||
CONFIG_BLK_DEV_IDEDISK=y
|
||||
CONFIG_IDEDISK_MULTI_MODE=y
|
||||
CONFIG_BLK_DEV_IDECS=y
|
||||
CONFIG_BLK_DEV_IDECD=y
|
||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||
# CONFIG_BLK_DEV_IDEFLOPPY is not set
|
||||
CONFIG_BLK_DEV_IDESCSI=y
|
||||
# CONFIG_IDE_TASK_IOCTL is not set
|
||||
|
||||
#
|
||||
# IDE chipset support/bugfixes
|
||||
#
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_IDEPCI=y
|
||||
CONFIG_IDEPCI_SHARE_IRQ=y
|
||||
# CONFIG_BLK_DEV_OFFBOARD is not set
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
# CONFIG_BLK_DEV_OPTI621 is not set
|
||||
CONFIG_BLK_DEV_IDEDMA_PCI=y
|
||||
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
|
||||
# CONFIG_IDEDMA_PCI_AUTO is not set
|
||||
# CONFIG_BLK_DEV_AEC62XX is not set
|
||||
# CONFIG_BLK_DEV_ALI15X3 is not set
|
||||
# CONFIG_BLK_DEV_AMD74XX is not set
|
||||
# CONFIG_BLK_DEV_CMD64X is not set
|
||||
# CONFIG_BLK_DEV_TRIFLEX is not set
|
||||
# CONFIG_BLK_DEV_CY82C693 is not set
|
||||
# CONFIG_BLK_DEV_CS5520 is not set
|
||||
# CONFIG_BLK_DEV_CS5530 is not set
|
||||
# CONFIG_BLK_DEV_HPT34X is not set
|
||||
# CONFIG_BLK_DEV_HPT366 is not set
|
||||
# CONFIG_BLK_DEV_SC1200 is not set
|
||||
# CONFIG_BLK_DEV_PIIX is not set
|
||||
# CONFIG_BLK_DEV_IT821X is not set
|
||||
CONFIG_BLK_DEV_NS87415=y
|
||||
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
|
||||
# CONFIG_BLK_DEV_SVWKS is not set
|
||||
# CONFIG_BLK_DEV_SIIMAGE is not set
|
||||
# CONFIG_BLK_DEV_SLC90E66 is not set
|
||||
# CONFIG_BLK_DEV_TRM290 is not set
|
||||
# CONFIG_BLK_DEV_VIA82CXXX is not set
|
||||
# CONFIG_IDE_ARM is not set
|
||||
CONFIG_BLK_DEV_IDEDMA=y
|
||||
# CONFIG_IDEDMA_IVB is not set
|
||||
# CONFIG_IDEDMA_AUTO is not set
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
|
@ -374,6 +459,15 @@ CONFIG_SCSI_NCR53C8XX_SYNC=20
|
|||
# CONFIG_SCSI_NSP32 is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCMCIA SCSI adapter support
|
||||
#
|
||||
# CONFIG_PCMCIA_AHA152X is not set
|
||||
# CONFIG_PCMCIA_FDOMAIN is not set
|
||||
# CONFIG_PCMCIA_NINJA_SCSI is not set
|
||||
# CONFIG_PCMCIA_QLOGIC is not set
|
||||
# CONFIG_PCMCIA_SYM53C500 is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
|
@ -382,12 +476,17 @@ CONFIG_BLK_DEV_MD=y
|
|||
CONFIG_MD_LINEAR=y
|
||||
CONFIG_MD_RAID0=y
|
||||
CONFIG_MD_RAID1=y
|
||||
# CONFIG_MD_RAID10 is not set
|
||||
CONFIG_MD_RAID10=y
|
||||
CONFIG_MD_RAID5=y
|
||||
# CONFIG_MD_RAID6 is not set
|
||||
CONFIG_MD_RAID6=y
|
||||
# CONFIG_MD_MULTIPATH is not set
|
||||
# CONFIG_MD_FAULTY is not set
|
||||
# CONFIG_BLK_DEV_DM is not set
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
# CONFIG_DM_CRYPT is not set
|
||||
# CONFIG_DM_SNAPSHOT is not set
|
||||
# CONFIG_DM_MIRROR is not set
|
||||
# CONFIG_DM_ZERO is not set
|
||||
# CONFIG_DM_MULTIPATH is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
|
@ -411,10 +510,10 @@ CONFIG_MD_RAID5=y
|
|||
# Network device support
|
||||
#
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_BONDING=m
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
CONFIG_TUN=m
|
||||
|
||||
#
|
||||
# ARCnet devices
|
||||
|
@ -430,7 +529,7 @@ CONFIG_NETDEVICES=y
|
|||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_MII is not set
|
||||
CONFIG_MII=m
|
||||
CONFIG_LASI_82596=y
|
||||
# CONFIG_HAPPYMEAL is not set
|
||||
# CONFIG_SUNGEM is not set
|
||||
|
@ -451,6 +550,8 @@ CONFIG_TULIP=y
|
|||
# CONFIG_WINBOND_840 is not set
|
||||
# CONFIG_DM9102 is not set
|
||||
# CONFIG_ULI526X is not set
|
||||
# CONFIG_PCMCIA_XIRCOM is not set
|
||||
# CONFIG_PCMCIA_XIRTULIP is not set
|
||||
# CONFIG_DEPCA is not set
|
||||
# CONFIG_HP100 is not set
|
||||
CONFIG_NET_PCI=y
|
||||
|
@ -518,13 +619,32 @@ CONFIG_NET_RADIO=y
|
|||
# Obsolete Wireless cards support (pre-802.11)
|
||||
#
|
||||
# CONFIG_STRIP is not set
|
||||
# CONFIG_PCMCIA_WAVELAN is not set
|
||||
# CONFIG_PCMCIA_NETWAVE is not set
|
||||
|
||||
#
|
||||
# Wireless 802.11 Frequency Hopping cards support
|
||||
#
|
||||
# CONFIG_PCMCIA_RAYCS is not set
|
||||
|
||||
#
|
||||
# Wireless 802.11b ISA/PCI cards support
|
||||
#
|
||||
# CONFIG_HERMES is not set
|
||||
CONFIG_HERMES=y
|
||||
# CONFIG_PLX_HERMES is not set
|
||||
# CONFIG_TMD_HERMES is not set
|
||||
# CONFIG_NORTEL_HERMES is not set
|
||||
# CONFIG_PCI_HERMES is not set
|
||||
# CONFIG_ATMEL is not set
|
||||
|
||||
#
|
||||
# Wireless 802.11b Pcmcia/Cardbus cards support
|
||||
#
|
||||
CONFIG_PCMCIA_HERMES=y
|
||||
CONFIG_PCMCIA_SPECTRUM=y
|
||||
# CONFIG_AIRO_CS is not set
|
||||
# CONFIG_PCMCIA_WL3501 is not set
|
||||
|
||||
#
|
||||
# Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support
|
||||
#
|
||||
|
@ -532,6 +652,19 @@ CONFIG_NET_RADIO=y
|
|||
# CONFIG_HOSTAP is not set
|
||||
CONFIG_NET_WIRELESS=y
|
||||
|
||||
#
|
||||
# PCMCIA network device support
|
||||
#
|
||||
CONFIG_NET_PCMCIA=y
|
||||
# CONFIG_PCMCIA_3C589 is not set
|
||||
# CONFIG_PCMCIA_3C574 is not set
|
||||
# CONFIG_PCMCIA_FMVJ18X is not set
|
||||
# CONFIG_PCMCIA_PCNET is not set
|
||||
# CONFIG_PCMCIA_NMCLAN is not set
|
||||
# CONFIG_PCMCIA_SMC91C92 is not set
|
||||
# CONFIG_PCMCIA_XIRC2PS is not set
|
||||
# CONFIG_PCMCIA_AXNET is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
|
@ -539,7 +672,15 @@ CONFIG_NET_WIRELESS=y
|
|||
# CONFIG_FDDI is not set
|
||||
# CONFIG_HIPPI is not set
|
||||
# CONFIG_PLIP is not set
|
||||
# CONFIG_PPP is not set
|
||||
CONFIG_PPP=m
|
||||
# CONFIG_PPP_MULTILINK is not set
|
||||
# CONFIG_PPP_FILTER is not set
|
||||
CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_SYNC_TTY=m
|
||||
CONFIG_PPP_DEFLATE=m
|
||||
CONFIG_PPP_BSDCOMP=m
|
||||
# CONFIG_PPP_MPPE is not set
|
||||
CONFIG_PPPOE=m
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_NET_FC is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
|
@ -571,14 +712,16 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
|||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
CONFIG_KEYBOARD_ATKBD=y
|
||||
CONFIG_KEYBOARD_ATKBD_HP_KEYCODES=y
|
||||
# CONFIG_KEYBOARD_ATKBD_RDI_KEYCODES is not set
|
||||
# CONFIG_KEYBOARD_SUNKBD is not set
|
||||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
|
@ -586,52 +729,25 @@ CONFIG_INPUT_KEYBOARD=y
|
|||
# CONFIG_KEYBOARD_HIL_OLD is not set
|
||||
CONFIG_KEYBOARD_HIL=y
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
# CONFIG_MOUSE_PS2 is not set
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
CONFIG_MOUSE_PS2=y
|
||||
CONFIG_MOUSE_SERIAL=y
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
CONFIG_MOUSE_HIL=y
|
||||
CONFIG_INPUT_JOYSTICK=y
|
||||
# CONFIG_JOYSTICK_ANALOG is not set
|
||||
# CONFIG_JOYSTICK_A3D is not set
|
||||
# CONFIG_JOYSTICK_ADI is not set
|
||||
# CONFIG_JOYSTICK_COBRA is not set
|
||||
# CONFIG_JOYSTICK_GF2K is not set
|
||||
# CONFIG_JOYSTICK_GRIP is not set
|
||||
# CONFIG_JOYSTICK_GRIP_MP is not set
|
||||
# CONFIG_JOYSTICK_GUILLEMOT is not set
|
||||
# CONFIG_JOYSTICK_INTERACT is not set
|
||||
# CONFIG_JOYSTICK_SIDEWINDER is not set
|
||||
# CONFIG_JOYSTICK_TMDC is not set
|
||||
# CONFIG_JOYSTICK_IFORCE is not set
|
||||
# CONFIG_JOYSTICK_WARRIOR is not set
|
||||
# CONFIG_JOYSTICK_MAGELLAN is not set
|
||||
# CONFIG_JOYSTICK_SPACEORB is not set
|
||||
# CONFIG_JOYSTICK_SPACEBALL is not set
|
||||
# CONFIG_JOYSTICK_STINGER is not set
|
||||
# CONFIG_JOYSTICK_TWIDJOY is not set
|
||||
# CONFIG_JOYSTICK_DB9 is not set
|
||||
# CONFIG_JOYSTICK_GAMECON is not set
|
||||
# CONFIG_JOYSTICK_TURBOGRAFX is not set
|
||||
# CONFIG_JOYSTICK_JOYDUMP is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
# CONFIG_TOUCHSCREEN_GUNZE is not set
|
||||
# CONFIG_TOUCHSCREEN_ELO is not set
|
||||
# CONFIG_TOUCHSCREEN_MTOUCH is not set
|
||||
# CONFIG_TOUCHSCREEN_MK712 is not set
|
||||
CONFIG_INPUT_MISC=y
|
||||
# CONFIG_INPUT_UINPUT is not set
|
||||
CONFIG_HP_SDC_RTC=y
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
# CONFIG_SERIO_SERPORT is not set
|
||||
CONFIG_SERIO_SERPORT=y
|
||||
# CONFIG_SERIO_PARKBD is not set
|
||||
CONFIG_SERIO_GSCPS2=y
|
||||
CONFIG_HP_SDC=y
|
||||
CONFIG_HIL_MLC=y
|
||||
# CONFIG_SERIO_PCIPS2 is not set
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
|
@ -648,7 +764,8 @@ CONFIG_HW_CONSOLE=y
|
|||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=13
|
||||
CONFIG_SERIAL_8250_CS=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=17
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||
|
@ -666,10 +783,10 @@ CONFIG_SERIAL_CORE_CONSOLE=y
|
|||
# CONFIG_SERIAL_JSM is not set
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
CONFIG_PRINTER=y
|
||||
CONFIG_LEGACY_PTY_COUNT=64
|
||||
CONFIG_PRINTER=m
|
||||
# CONFIG_LP_CONSOLE is not set
|
||||
# CONFIG_PPDEV is not set
|
||||
CONFIG_PPDEV=m
|
||||
# CONFIG_TIPAR is not set
|
||||
|
||||
#
|
||||
|
@ -682,7 +799,7 @@ CONFIG_PRINTER=y
|
|||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_GEN_RTC=y
|
||||
# CONFIG_GEN_RTC_X is not set
|
||||
CONFIG_GEN_RTC_X=y
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
|
@ -691,6 +808,13 @@ CONFIG_GEN_RTC=y
|
|||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
|
||||
#
|
||||
# PCMCIA character devices
|
||||
#
|
||||
# CONFIG_SYNCLINK_CS is not set
|
||||
# CONFIG_CARDMAN_4000 is not set
|
||||
# CONFIG_CARDMAN_4040 is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
|
@ -718,10 +842,8 @@ CONFIG_GEN_RTC=y
|
|||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
|
@ -749,8 +871,8 @@ CONFIG_FB_CFB_FILLRECT=y
|
|||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_MODE_HELPERS is not set
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
# CONFIG_FB_CIRRUS is not set
|
||||
# CONFIG_FB_PM2 is not set
|
||||
# CONFIG_FB_CYBER2000 is not set
|
||||
|
@ -778,8 +900,8 @@ CONFIG_FB_STI=y
|
|||
# Console display driver support
|
||||
#
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_DUMMY_CONSOLE_COLUMNS=160
|
||||
CONFIG_DUMMY_CONSOLE_ROWS=64
|
||||
CONFIG_DUMMY_CONSOLE_COLUMNS=128
|
||||
CONFIG_DUMMY_CONSOLE_ROWS=48
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
CONFIG_STI_CONSOLE=y
|
||||
|
@ -816,13 +938,14 @@ CONFIG_SOUND=y
|
|||
CONFIG_SND=y
|
||||
CONFIG_SND_TIMER=y
|
||||
CONFIG_SND_PCM=y
|
||||
CONFIG_SND_HWDEP=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
# CONFIG_SND_SEQ_DUMMY is not set
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||
CONFIG_SND_DYNAMIC_MINORS=y
|
||||
CONFIG_SND_SUPPORT_OLD_API=y
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
|
@ -830,6 +953,7 @@ CONFIG_SND_SUPPORT_OLD_API=y
|
|||
#
|
||||
# Generic devices
|
||||
#
|
||||
CONFIG_SND_OPL3_LIB=y
|
||||
CONFIG_SND_AC97_CODEC=y
|
||||
CONFIG_SND_AC97_BUS=y
|
||||
# CONFIG_SND_DUMMY is not set
|
||||
|
@ -842,7 +966,7 @@ CONFIG_SND_AC97_BUS=y
|
|||
# PCI devices
|
||||
#
|
||||
CONFIG_SND_AD1889=y
|
||||
# CONFIG_SND_AD1889_OPL3 is not set
|
||||
CONFIG_SND_AD1889_OPL3=y
|
||||
# CONFIG_SND_ALI5451 is not set
|
||||
# CONFIG_SND_ATIIXP is not set
|
||||
# CONFIG_SND_ATIIXP_MODEM is not set
|
||||
|
@ -889,6 +1013,10 @@ CONFIG_SND_AD1889=y
|
|||
#
|
||||
# CONFIG_SND_USB_AUDIO is not set
|
||||
|
||||
#
|
||||
# PCMCIA devices
|
||||
#
|
||||
|
||||
#
|
||||
# GSC devices
|
||||
#
|
||||
|
@ -905,12 +1033,12 @@ CONFIG_SND_HARMONY=y
|
|||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_DEBUG=y
|
||||
# CONFIG_USB_DEBUG is not set
|
||||
|
||||
#
|
||||
# Miscellaneous USB options
|
||||
#
|
||||
# CONFIG_USB_DEVICEFS is not set
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
# CONFIG_USB_BANDWIDTH is not set
|
||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||
# CONFIG_USB_OTG is not set
|
||||
|
@ -918,14 +1046,12 @@ CONFIG_USB_DEBUG=y
|
|||
#
|
||||
# USB Host Controller Drivers
|
||||
#
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
# CONFIG_USB_EHCI_SPLIT_ISO is not set
|
||||
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
|
||||
# CONFIG_USB_EHCI_HCD is not set
|
||||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
# CONFIG_USB_OHCI_BIG_ENDIAN is not set
|
||||
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||
# CONFIG_USB_UHCI_HCD is not set
|
||||
CONFIG_USB_UHCI_HCD=y
|
||||
# CONFIG_USB_SL811_HCD is not set
|
||||
|
||||
#
|
||||
|
@ -948,13 +1074,11 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
|||
#
|
||||
# USB Input Devices
|
||||
#
|
||||
# CONFIG_USB_HID is not set
|
||||
|
||||
#
|
||||
# USB HID Boot Protocol drivers
|
||||
#
|
||||
# CONFIG_USB_KBD is not set
|
||||
# CONFIG_USB_MOUSE is not set
|
||||
CONFIG_USB_HID=y
|
||||
CONFIG_USB_HIDINPUT=y
|
||||
# CONFIG_USB_HIDINPUT_POWERBOOK is not set
|
||||
# CONFIG_HID_FF is not set
|
||||
# CONFIG_USB_HIDDEV is not set
|
||||
# CONFIG_USB_AIPTEK is not set
|
||||
# CONFIG_USB_WACOM is not set
|
||||
# CONFIG_USB_ACECAD is not set
|
||||
|
@ -1020,8 +1144,8 @@ CONFIG_USB_MON=y
|
|||
# CONFIG_USB_PHIDGETKIT is not set
|
||||
# CONFIG_USB_PHIDGETSERVO is not set
|
||||
# CONFIG_USB_IDMOUSE is not set
|
||||
# CONFIG_USB_SISUSBVGA is not set
|
||||
# CONFIG_USB_LD is not set
|
||||
# CONFIG_USB_TEST is not set
|
||||
|
||||
#
|
||||
# USB DSL modem support
|
||||
|
@ -1058,7 +1182,7 @@ CONFIG_JBD=y
|
|||
# CONFIG_JBD_DEBUG is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
|
@ -1066,7 +1190,7 @@ CONFIG_JBD=y
|
|||
CONFIG_INOTIFY=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
CONFIG_AUTOFS_FS=y
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
|
@ -1081,8 +1205,11 @@ CONFIG_JOLIET=y
|
|||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=y
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
|
@ -1125,7 +1252,7 @@ CONFIG_NFS_V3=y
|
|||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
# CONFIG_NFSD_V3_ACL is not set
|
||||
# CONFIG_NFSD_V4 is not set
|
||||
CONFIG_NFSD_V4=y
|
||||
CONFIG_NFSD_TCP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
|
@ -1133,10 +1260,16 @@ CONFIG_LOCKD_V4=y
|
|||
CONFIG_EXPORTFS=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
CONFIG_SUNRPC_GSS=y
|
||||
CONFIG_RPCSEC_GSS_KRB5=y
|
||||
CONFIG_RPCSEC_GSS_SPKM3=m
|
||||
CONFIG_SMB_FS=m
|
||||
CONFIG_SMB_NLS_DEFAULT=y
|
||||
CONFIG_SMB_NLS_REMOTE="cp437"
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS is not set
|
||||
# CONFIG_CIFS_XATTR is not set
|
||||
# CONFIG_CIFS_EXPERIMENTAL is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
@ -1153,50 +1286,50 @@ CONFIG_MSDOS_PARTITION=y
|
|||
#
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
# CONFIG_NLS_CODEPAGE_437 is not set
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
# CONFIG_NLS_ASCII is not set
|
||||
# CONFIG_NLS_ISO8859_1 is not set
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
# CONFIG_NLS_ISO8859_5 is not set
|
||||
# CONFIG_NLS_ISO8859_6 is not set
|
||||
# CONFIG_NLS_ISO8859_7 is not set
|
||||
# CONFIG_NLS_ISO8859_9 is not set
|
||||
# CONFIG_NLS_ISO8859_13 is not set
|
||||
# CONFIG_NLS_ISO8859_14 is not set
|
||||
# CONFIG_NLS_ISO8859_15 is not set
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_737=m
|
||||
CONFIG_NLS_CODEPAGE_775=m
|
||||
CONFIG_NLS_CODEPAGE_850=m
|
||||
CONFIG_NLS_CODEPAGE_852=m
|
||||
CONFIG_NLS_CODEPAGE_855=m
|
||||
CONFIG_NLS_CODEPAGE_857=m
|
||||
CONFIG_NLS_CODEPAGE_860=m
|
||||
CONFIG_NLS_CODEPAGE_861=m
|
||||
CONFIG_NLS_CODEPAGE_862=m
|
||||
CONFIG_NLS_CODEPAGE_863=m
|
||||
CONFIG_NLS_CODEPAGE_864=m
|
||||
CONFIG_NLS_CODEPAGE_865=m
|
||||
CONFIG_NLS_CODEPAGE_866=m
|
||||
CONFIG_NLS_CODEPAGE_869=m
|
||||
CONFIG_NLS_CODEPAGE_936=m
|
||||
CONFIG_NLS_CODEPAGE_950=m
|
||||
CONFIG_NLS_CODEPAGE_932=m
|
||||
CONFIG_NLS_CODEPAGE_949=m
|
||||
CONFIG_NLS_CODEPAGE_874=m
|
||||
CONFIG_NLS_ISO8859_8=m
|
||||
CONFIG_NLS_CODEPAGE_1250=y
|
||||
CONFIG_NLS_CODEPAGE_1251=m
|
||||
CONFIG_NLS_ASCII=m
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_ISO8859_2=m
|
||||
CONFIG_NLS_ISO8859_3=m
|
||||
CONFIG_NLS_ISO8859_4=m
|
||||
CONFIG_NLS_ISO8859_5=m
|
||||
CONFIG_NLS_ISO8859_6=m
|
||||
CONFIG_NLS_ISO8859_7=m
|
||||
CONFIG_NLS_ISO8859_9=m
|
||||
CONFIG_NLS_ISO8859_13=m
|
||||
CONFIG_NLS_ISO8859_14=m
|
||||
CONFIG_NLS_ISO8859_15=m
|
||||
CONFIG_NLS_KOI8_R=m
|
||||
CONFIG_NLS_KOI8_U=m
|
||||
CONFIG_NLS_UTF8=y
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_OPROFILE=y
|
||||
CONFIG_OPROFILE=m
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
|
@ -1204,7 +1337,7 @@ CONFIG_OPROFILE=y
|
|||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_LOG_BUF_SHIFT=15
|
||||
CONFIG_LOG_BUF_SHIFT=16
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
|
@ -1217,42 +1350,43 @@ CONFIG_DEBUG_MUTEXES=y
|
|||
# CONFIG_DEBUG_VM is not set
|
||||
CONFIG_FORCED_INLINING=y
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
CONFIG_DEBUG_RODATA=y
|
||||
# CONFIG_DEBUG_RODATA is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
CONFIG_KEYS=y
|
||||
CONFIG_KEYS_DEBUG_PROC_KEYS=y
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
CONFIG_CRYPTO=y
|
||||
# CONFIG_CRYPTO_HMAC is not set
|
||||
# CONFIG_CRYPTO_NULL is not set
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
# CONFIG_CRYPTO_MD5 is not set
|
||||
# CONFIG_CRYPTO_SHA1 is not set
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
# CONFIG_CRYPTO_WP512 is not set
|
||||
# CONFIG_CRYPTO_TGR192 is not set
|
||||
# CONFIG_CRYPTO_DES is not set
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
# CONFIG_CRYPTO_TWOFISH is not set
|
||||
# CONFIG_CRYPTO_SERPENT is not set
|
||||
# CONFIG_CRYPTO_AES is not set
|
||||
# CONFIG_CRYPTO_CAST5 is not set
|
||||
# CONFIG_CRYPTO_CAST6 is not set
|
||||
# CONFIG_CRYPTO_TEA is not set
|
||||
# CONFIG_CRYPTO_ARC4 is not set
|
||||
# CONFIG_CRYPTO_KHAZAD is not set
|
||||
# CONFIG_CRYPTO_ANUBIS is not set
|
||||
# CONFIG_CRYPTO_DEFLATE is not set
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
# CONFIG_CRYPTO_CRC32C is not set
|
||||
# CONFIG_CRYPTO_TEST is not set
|
||||
CONFIG_CRYPTO_HMAC=y
|
||||
CONFIG_CRYPTO_NULL=m
|
||||
CONFIG_CRYPTO_MD4=m
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_CRYPTO_SHA256=m
|
||||
CONFIG_CRYPTO_SHA512=m
|
||||
CONFIG_CRYPTO_WP512=m
|
||||
CONFIG_CRYPTO_TGR192=m
|
||||
CONFIG_CRYPTO_DES=y
|
||||
CONFIG_CRYPTO_BLOWFISH=m
|
||||
CONFIG_CRYPTO_TWOFISH=m
|
||||
CONFIG_CRYPTO_SERPENT=m
|
||||
CONFIG_CRYPTO_AES=m
|
||||
CONFIG_CRYPTO_CAST5=m
|
||||
CONFIG_CRYPTO_CAST6=m
|
||||
CONFIG_CRYPTO_TEA=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
CONFIG_CRYPTO_KHAZAD=m
|
||||
CONFIG_CRYPTO_ANUBIS=m
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||
CONFIG_CRYPTO_CRC32C=m
|
||||
CONFIG_CRYPTO_TEST=m
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
|
@ -1261,7 +1395,9 @@ CONFIG_CRYPTO=y
|
|||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
CONFIG_CRC_CCITT=m
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_LIBCRC32C=m
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
|
|
|
@ -288,8 +288,11 @@ int main(void)
|
|||
DEFINE(ASM_PGD_ENTRY_SIZE, PGD_ENTRY_SIZE);
|
||||
DEFINE(ASM_PMD_ENTRY_SIZE, PMD_ENTRY_SIZE);
|
||||
DEFINE(ASM_PTE_ENTRY_SIZE, PTE_ENTRY_SIZE);
|
||||
DEFINE(ASM_PFN_PTE_SHIFT, PFN_PTE_SHIFT);
|
||||
DEFINE(ASM_PT_INITIAL, PT_INITIAL);
|
||||
DEFINE(ASM_PAGE_SIZE, PAGE_SIZE);
|
||||
DEFINE(ASM_PAGE_SIZE_DIV64, PAGE_SIZE/64);
|
||||
DEFINE(ASM_PAGE_SIZE_DIV128, PAGE_SIZE/128);
|
||||
BLANK();
|
||||
DEFINE(EXCDATA_IP, offsetof(struct exception_data, fault_ip));
|
||||
DEFINE(EXCDATA_SPACE, offsetof(struct exception_data, fault_space));
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 1999 Helge Deller (07-13-1999)
|
||||
* Copyright (C) 1999-2006 Helge Deller <deller@gmx.de> (07-13-1999)
|
||||
* Copyright (C) 1999 SuSE GmbH Nuernberg
|
||||
* Copyright (C) 2000 Philipp Rumpf (prumpf@tux.org)
|
||||
*
|
||||
|
@ -358,5 +358,5 @@ void parisc_setup_cache_timing(void)
|
|||
if (!parisc_cache_flush_threshold)
|
||||
parisc_cache_flush_threshold = FLUSH_THRESHOLD;
|
||||
|
||||
printk("Setting cache flush threshold to %x (%d CPUs online)\n", parisc_cache_flush_threshold, num_online_cpus());
|
||||
printk(KERN_INFO "Setting cache flush threshold to %x (%d CPUs online)\n", parisc_cache_flush_threshold, num_online_cpus());
|
||||
}
|
||||
|
|
|
@ -502,18 +502,20 @@
|
|||
* all ILP32 processes and all the kernel for machines with
|
||||
* under 4GB of memory) */
|
||||
.macro L3_ptep pgd,pte,index,va,fault
|
||||
#if PT_NLEVELS == 3 /* we might have a 2-Level scheme, e.g. with 16kb page size */
|
||||
extrd,u \va,63-ASM_PGDIR_SHIFT,ASM_BITS_PER_PGD,\index
|
||||
copy %r0,\pte
|
||||
extrd,u,*= \va,31,32,%r0
|
||||
extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
|
||||
ldw,s \index(\pgd),\pgd
|
||||
extrd,u,*= \va,31,32,%r0
|
||||
extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
|
||||
bb,>=,n \pgd,_PxD_PRESENT_BIT,\fault
|
||||
extrd,u,*= \va,31,32,%r0
|
||||
extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
|
||||
shld \pgd,PxD_VALUE_SHIFT,\index
|
||||
extrd,u,*= \va,31,32,%r0
|
||||
extrd,u,*= \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
|
||||
copy \index,\pgd
|
||||
extrd,u,*<> \va,31,32,%r0
|
||||
extrd,u,*<> \va,63-ASM_PGDIR_SHIFT,64-ASM_PGDIR_SHIFT,%r0
|
||||
ldo ASM_PGD_PMD_OFFSET(\pgd),\pgd
|
||||
#endif
|
||||
L2_ptep \pgd,\pte,\index,\va,\fault
|
||||
.endm
|
||||
|
||||
|
@ -563,10 +565,18 @@
|
|||
extrd,u,*= \pte,_PAGE_GATEWAY_BIT+32,1,%r0
|
||||
depd %r0,11,2,\prot /* If Gateway, Set PL2 to 0 */
|
||||
|
||||
/* Get rid of prot bits and convert to page addr for iitlbt and idtlbt */
|
||||
/* Enforce uncacheable pages.
|
||||
* This should ONLY be use for MMIO on PA 2.0 machines.
|
||||
* Memory/DMA is cache coherent on all PA2.0 machines we support
|
||||
* (that means T-class is NOT supported) and the memory controllers
|
||||
* on most of those machines only handles cache transactions.
|
||||
*/
|
||||
extrd,u,*= \pte,_PAGE_NO_CACHE_BIT+32,1,%r0
|
||||
depi 1,12,1,\prot
|
||||
|
||||
depd %r0,63,PAGE_SHIFT,\pte
|
||||
extrd,s \pte,(63-PAGE_SHIFT)+(63-58),64-PAGE_SHIFT,\pte
|
||||
/* Drop prot bits and convert to page addr for iitlbt and idtlbt */
|
||||
extrd,u \pte,(63-ASM_PFN_PTE_SHIFT)+(63-58),64-PAGE_SHIFT,\pte
|
||||
depdi _PAGE_SIZE_ENCODING_DEFAULT,63,63-58,\pte
|
||||
.endm
|
||||
|
||||
/* Identical macro to make_insert_tlb above, except it
|
||||
|
@ -584,9 +594,8 @@
|
|||
|
||||
/* Get rid of prot bits and convert to page addr for iitlba */
|
||||
|
||||
depi 0,31,PAGE_SHIFT,\pte
|
||||
depi _PAGE_SIZE_ENCODING_DEFAULT,31,ASM_PFN_PTE_SHIFT,\pte
|
||||
extru \pte,24,25,\pte
|
||||
|
||||
.endm
|
||||
|
||||
/* This is for ILP32 PA2.0 only. The TLB insertion needs
|
||||
|
@ -1201,10 +1210,9 @@ intr_save:
|
|||
*/
|
||||
|
||||
/* adjust isr/ior. */
|
||||
|
||||
extrd,u %r16,63,7,%r1 /* get high bits from isr for ior */
|
||||
depd %r1,31,7,%r17 /* deposit them into ior */
|
||||
depdi 0,63,7,%r16 /* clear them from isr */
|
||||
extrd,u %r16,63,SPACEID_SHIFT,%r1 /* get high bits from isr for ior */
|
||||
depd %r1,31,SPACEID_SHIFT,%r17 /* deposit them into ior */
|
||||
depdi 0,63,SPACEID_SHIFT,%r16 /* clear them from isr */
|
||||
#endif
|
||||
STREG %r16, PT_ISR(%r29)
|
||||
STREG %r17, PT_IOR(%r29)
|
||||
|
|
|
@ -76,16 +76,16 @@ $bss_loop:
|
|||
mtctl %r4,%cr24 /* Initialize kernel root pointer */
|
||||
mtctl %r4,%cr25 /* Initialize user root pointer */
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
#if PT_NLEVELS == 3
|
||||
/* Set pmd in pgd */
|
||||
load32 PA(pmd0),%r5
|
||||
shrd %r5,PxD_VALUE_SHIFT,%r3
|
||||
ldo (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
|
||||
ldo (PxD_FLAG_PRESENT+PxD_FLAG_VALID)(%r3),%r3
|
||||
stw %r3,ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4)
|
||||
ldo ASM_PMD_ENTRY*ASM_PMD_ENTRY_SIZE(%r5),%r4
|
||||
#else
|
||||
/* 2-level page table, so pmd == pgd */
|
||||
ldo ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4),%r4
|
||||
ldo ASM_PGD_ENTRY*ASM_PGD_ENTRY_SIZE(%r4),%r4
|
||||
#endif
|
||||
|
||||
/* Fill in pmd with enough pte directories */
|
||||
|
@ -99,7 +99,7 @@ $bss_loop:
|
|||
stw %r3,0(%r4)
|
||||
ldo (ASM_PAGE_SIZE >> PxD_VALUE_SHIFT)(%r3),%r3
|
||||
addib,> -1,%r1,1b
|
||||
#ifdef CONFIG_64BIT
|
||||
#if PT_NLEVELS == 3
|
||||
ldo ASM_PMD_ENTRY_SIZE(%r4),%r4
|
||||
#else
|
||||
ldo ASM_PGD_ENTRY_SIZE(%r4),%r4
|
||||
|
@ -107,13 +107,14 @@ $bss_loop:
|
|||
|
||||
|
||||
/* Now initialize the PTEs themselves */
|
||||
ldo _PAGE_KERNEL(%r0),%r3 /* Hardwired 0 phys addr start */
|
||||
ldo 0+_PAGE_KERNEL(%r0),%r3 /* Hardwired 0 phys addr start */
|
||||
ldi (1<<(KERNEL_INITIAL_ORDER-PAGE_SHIFT)),%r11 /* PFN count */
|
||||
load32 PA(pg0),%r1
|
||||
|
||||
$pgt_fill_loop:
|
||||
STREGM %r3,ASM_PTE_ENTRY_SIZE(%r1)
|
||||
ldo ASM_PAGE_SIZE(%r3),%r3
|
||||
bb,>= %r3,31-KERNEL_INITIAL_ORDER,$pgt_fill_loop
|
||||
ldo (1<<PFN_PTE_SHIFT)(%r3),%r3 /* add one PFN */
|
||||
addib,> -1,%r11,$pgt_fill_loop
|
||||
nop
|
||||
|
||||
/* Load the return address...er...crash 'n burn */
|
||||
|
|
|
@ -53,17 +53,17 @@ union thread_union init_thread_union
|
|||
__attribute__((aligned(128))) __attribute__((__section__(".data.init_task"))) =
|
||||
{ INIT_THREAD_INFO(init_task) };
|
||||
|
||||
#ifdef __LP64__
|
||||
#if PT_NLEVELS == 3
|
||||
/* NOTE: This layout exactly conforms to the hybrid L2/L3 page table layout
|
||||
* with the first pmd adjacent to the pgd and below it. gcc doesn't actually
|
||||
* guarantee that global objects will be laid out in memory in the same order
|
||||
* as the order of declaration, so put these in different sections and use
|
||||
* the linker script to order them. */
|
||||
pmd_t pmd0[PTRS_PER_PMD] __attribute__ ((aligned(PAGE_SIZE))) __attribute__ ((__section__ (".data.vm0.pmd"))) = { {0}, };
|
||||
|
||||
pmd_t pmd0[PTRS_PER_PMD] __attribute__ ((__section__ (".data.vm0.pmd"), aligned(PAGE_SIZE)));
|
||||
#endif
|
||||
pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((aligned(PAGE_SIZE))) __attribute__ ((__section__ (".data.vm0.pgd"))) = { {0}, };
|
||||
pte_t pg0[PT_INITIAL * PTRS_PER_PTE] __attribute__ ((aligned(PAGE_SIZE))) __attribute__ ((__section__ (".data.vm0.pte"))) = { {0}, };
|
||||
|
||||
pgd_t swapper_pg_dir[PTRS_PER_PGD] __attribute__ ((__section__ (".data.vm0.pgd"), aligned(PAGE_SIZE)));
|
||||
pte_t pg0[PT_INITIAL * PTRS_PER_PTE] __attribute__ ((__section__ (".data.vm0.pte"), aligned(PAGE_SIZE)));
|
||||
|
||||
/*
|
||||
* Initial task structure.
|
||||
|
|
|
@ -65,7 +65,7 @@ flush_tlb_all_local:
|
|||
*/
|
||||
|
||||
/* pcxt_ssm_bug - relied upon translation! PA 2.0 Arch. F-4 and F-5 */
|
||||
rsm PSW_SM_I, %r19 /* save I-bit state */
|
||||
rsm PSW_SM_I, %r19 /* save I-bit state */
|
||||
load32 PA(1f), %r1
|
||||
nop
|
||||
nop
|
||||
|
@ -84,8 +84,7 @@ flush_tlb_all_local:
|
|||
rfi
|
||||
nop
|
||||
|
||||
1: ldil L%PA(cache_info), %r1
|
||||
ldo R%PA(cache_info)(%r1), %r1
|
||||
1: load32 PA(cache_info), %r1
|
||||
|
||||
/* Flush Instruction Tlb */
|
||||
|
||||
|
@ -212,8 +211,7 @@ flush_instruction_cache_local:
|
|||
.entry
|
||||
|
||||
mtsp %r0, %sr1
|
||||
ldil L%cache_info, %r1
|
||||
ldo R%cache_info(%r1), %r1
|
||||
load32 cache_info, %r1
|
||||
|
||||
/* Flush Instruction Cache */
|
||||
|
||||
|
@ -254,8 +252,7 @@ flush_data_cache_local:
|
|||
.entry
|
||||
|
||||
mtsp %r0, %sr1
|
||||
ldil L%cache_info, %r1
|
||||
ldo R%cache_info(%r1), %r1
|
||||
load32 cache_info, %r1
|
||||
|
||||
/* Flush Data Cache */
|
||||
|
||||
|
@ -303,7 +300,8 @@ copy_user_page_asm:
|
|||
*/
|
||||
|
||||
ldd 0(%r25), %r19
|
||||
ldi 32, %r1 /* PAGE_SIZE/128 == 32 */
|
||||
ldi ASM_PAGE_SIZE_DIV128, %r1
|
||||
|
||||
ldw 64(%r25), %r0 /* prefetch 1 cacheline ahead */
|
||||
ldw 128(%r25), %r0 /* prefetch 2 */
|
||||
|
||||
|
@ -368,7 +366,7 @@ copy_user_page_asm:
|
|||
* use ldd/std on a 32 bit kernel.
|
||||
*/
|
||||
ldw 0(%r25), %r19
|
||||
ldi 64, %r1 /* PAGE_SIZE/64 == 64 */
|
||||
ldi ASM_PAGE_SIZE_DIV64, %r1
|
||||
|
||||
1:
|
||||
ldw 4(%r25), %r20
|
||||
|
@ -461,6 +459,7 @@ copy_user_page_asm:
|
|||
sub %r25, %r1, %r23 /* move physical addr into non shadowed reg */
|
||||
|
||||
ldil L%(TMPALIAS_MAP_START), %r28
|
||||
/* FIXME for different page sizes != 4k */
|
||||
#ifdef CONFIG_64BIT
|
||||
extrd,u %r26,56,32, %r26 /* convert phys addr to tlb insert format */
|
||||
extrd,u %r23,56,32, %r23 /* convert phys addr to tlb insert format */
|
||||
|
@ -551,6 +550,7 @@ __clear_user_page_asm:
|
|||
#ifdef CONFIG_64BIT
|
||||
#if (TMPALIAS_MAP_START >= 0x80000000)
|
||||
depdi 0, 31,32, %r28 /* clear any sign extension */
|
||||
/* FIXME: page size dependend */
|
||||
#endif
|
||||
extrd,u %r26, 56,32, %r26 /* convert phys addr to tlb insert format */
|
||||
depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */
|
||||
|
@ -566,10 +566,10 @@ __clear_user_page_asm:
|
|||
pdtlb 0(%r28)
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
ldi 32, %r1 /* PAGE_SIZE/128 == 32 */
|
||||
ldi ASM_PAGE_SIZE_DIV128, %r1
|
||||
|
||||
/* PREFETCH (Write) has not (yet) been proven to help here */
|
||||
/* #define PREFETCHW_OP ldd 256(%0), %r0 */
|
||||
/* #define PREFETCHW_OP ldd 256(%0), %r0 */
|
||||
|
||||
1: std %r0, 0(%r28)
|
||||
std %r0, 8(%r28)
|
||||
|
@ -591,8 +591,7 @@ __clear_user_page_asm:
|
|||
ldo 128(%r28), %r28
|
||||
|
||||
#else /* ! CONFIG_64BIT */
|
||||
|
||||
ldi 64, %r1 /* PAGE_SIZE/64 == 64 */
|
||||
ldi ASM_PAGE_SIZE_DIV64, %r1
|
||||
|
||||
1:
|
||||
stw %r0, 0(%r28)
|
||||
|
|
|
@ -231,6 +231,14 @@ asmlinkage long parisc_fadvise64_64(int fd,
|
|||
(loff_t)high_len << 32 | low_len, advice);
|
||||
}
|
||||
|
||||
asmlinkage long parisc_sync_file_range(int fd,
|
||||
u32 hi_off, u32 lo_off, u32 hi_nbytes, u32 lo_nbytes,
|
||||
unsigned int flags)
|
||||
{
|
||||
return sys_sync_file_range(fd, (loff_t)hi_off << 32 | lo_off,
|
||||
(loff_t)hi_nbytes << 32 | lo_nbytes, flags);
|
||||
}
|
||||
|
||||
asmlinkage unsigned long sys_alloc_hugepages(int key, unsigned long addr, unsigned long len, int prot, int flag)
|
||||
{
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
* pointers.
|
||||
*/
|
||||
|
||||
.align 4096
|
||||
.align ASM_PAGE_SIZE
|
||||
linux_gateway_page:
|
||||
|
||||
/* ADDRESS 0x00 to 0xb0 = 176 bytes / 4 bytes per insn = 44 insns */
|
||||
|
@ -632,7 +632,7 @@ cas_action:
|
|||
end_compare_and_swap:
|
||||
|
||||
/* Make sure nothing else is placed on this page */
|
||||
.align 4096
|
||||
.align ASM_PAGE_SIZE
|
||||
.export end_linux_gateway_page
|
||||
end_linux_gateway_page:
|
||||
|
||||
|
@ -652,7 +652,7 @@ end_linux_gateway_page:
|
|||
|
||||
.section .rodata,"a"
|
||||
|
||||
.align 4096
|
||||
.align ASM_PAGE_SIZE
|
||||
/* Light-weight-syscall table */
|
||||
/* Start of lws table. */
|
||||
.export lws_table
|
||||
|
@ -662,14 +662,14 @@ lws_table:
|
|||
LWS_ENTRY(compare_and_swap64) /* 1 - ELF64 Atomic compare and swap */
|
||||
/* End of lws table */
|
||||
|
||||
.align 4096
|
||||
.align ASM_PAGE_SIZE
|
||||
.export sys_call_table
|
||||
.Lsys_call_table:
|
||||
sys_call_table:
|
||||
#include "syscall_table.S"
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
.align 4096
|
||||
.align ASM_PAGE_SIZE
|
||||
.export sys_call_table64
|
||||
.Lsys_call_table64:
|
||||
sys_call_table64:
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
* Copyright (C) 2001 Helge Deller <deller at parisc-linux.org>
|
||||
* Copyright (C) 2000-2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org>
|
||||
* Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org>
|
||||
*
|
||||
* Copyright (C) 2005-2006 Kyle McMartin <kyle at parisc-linux.org>
|
||||
*
|
||||
* 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
|
||||
|
@ -393,5 +393,11 @@
|
|||
ENTRY_SAME(readlinkat) /* 285 */
|
||||
ENTRY_SAME(fchmodat)
|
||||
ENTRY_SAME(faccessat)
|
||||
ENTRY_SAME(unshare)
|
||||
ENTRY_COMP(set_robust_list)
|
||||
ENTRY_COMP(get_robust_list) /* 290 */
|
||||
ENTRY_SAME(splice)
|
||||
ENTRY_OURS(sync_file_range)
|
||||
ENTRY_SAME(tee)
|
||||
/* Nothing yet */
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
* Copyright (C) 2000 Michael Ang <mang with subcarrier.org>
|
||||
* Copyright (C) 2002 Randolph Chung <tausq with parisc-linux.org>
|
||||
* Copyright (C) 2003 James Bottomley <jejb with parisc-linux.org>
|
||||
* Copyright (C) 2006 Helge Deller <deller@gmx.de>
|
||||
*
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
@ -27,6 +28,7 @@
|
|||
/* needed for the processor specific cache alignment size */
|
||||
#include <asm/cache.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
/* ld script to make hppa Linux kernel */
|
||||
#ifndef CONFIG_64BIT
|
||||
|
@ -68,7 +70,7 @@ SECTIONS
|
|||
RODATA
|
||||
|
||||
/* writeable */
|
||||
. = ALIGN(4096); /* Make sure this is page aligned so
|
||||
. = ALIGN(ASM_PAGE_SIZE); /* Make sure this is page aligned so
|
||||
that we can properly leave these
|
||||
as writable */
|
||||
data_start = .;
|
||||
|
@ -81,23 +83,17 @@ SECTIONS
|
|||
__start___unwind = .; /* unwind info */
|
||||
.PARISC.unwind : { *(.PARISC.unwind) }
|
||||
__stop___unwind = .;
|
||||
|
||||
|
||||
/* rarely changed data like cpu maps */
|
||||
. = ALIGN(16);
|
||||
.data.read_mostly : { *(.data.read_mostly) }
|
||||
|
||||
. = ALIGN(L1_CACHE_BYTES);
|
||||
.data : { /* Data */
|
||||
*(.data)
|
||||
*(.data.vm0.pmd)
|
||||
*(.data.vm0.pgd)
|
||||
*(.data.vm0.pte)
|
||||
CONSTRUCTORS
|
||||
}
|
||||
|
||||
. = ALIGN(4096);
|
||||
/* nosave data is really only used for software suspend...it's here
|
||||
* just in case we ever implement it */
|
||||
__nosave_begin = .;
|
||||
.data_nosave : { *(.data.nosave) }
|
||||
. = ALIGN(4096);
|
||||
__nosave_end = .;
|
||||
|
||||
. = ALIGN(L1_CACHE_BYTES);
|
||||
.data.cacheline_aligned : { *(.data.cacheline_aligned) }
|
||||
|
||||
|
@ -105,12 +101,29 @@ SECTIONS
|
|||
. = ALIGN(16);
|
||||
.data.lock_aligned : { *(.data.lock_aligned) }
|
||||
|
||||
/* rarely changed data like cpu maps */
|
||||
. = ALIGN(16);
|
||||
.data.read_mostly : { *(.data.read_mostly) }
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
/* nosave data is really only used for software suspend...it's here
|
||||
* just in case we ever implement it */
|
||||
__nosave_begin = .;
|
||||
.data_nosave : { *(.data.nosave) }
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
__nosave_end = .;
|
||||
|
||||
_edata = .; /* End of data section */
|
||||
|
||||
__bss_start = .; /* BSS */
|
||||
/* page table entries need to be PAGE_SIZE aligned */
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
.data.vmpages : {
|
||||
*(.data.vm0.pmd)
|
||||
*(.data.vm0.pgd)
|
||||
*(.data.vm0.pte)
|
||||
}
|
||||
.bss : { *(.bss) *(COMMON) }
|
||||
__bss_stop = .;
|
||||
|
||||
|
||||
/* assembler code expects init_task to be 16k aligned */
|
||||
. = ALIGN(16384); /* init_task */
|
||||
.data.init_task : { *(.data.init_task) }
|
||||
|
||||
|
@ -126,6 +139,7 @@ SECTIONS
|
|||
.dlt : { *(.dlt) }
|
||||
#endif
|
||||
|
||||
/* reserve space for interrupt stack by aligning __init* to 16k */
|
||||
. = ALIGN(16384);
|
||||
__init_begin = .;
|
||||
.init.text : {
|
||||
|
@ -166,7 +180,7 @@ SECTIONS
|
|||
from .altinstructions and .eh_frame */
|
||||
.exit.text : { *(.exit.text) }
|
||||
.exit.data : { *(.exit.data) }
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
__initramfs_start = .;
|
||||
.init.ramfs : { *(.init.ramfs) }
|
||||
__initramfs_end = .;
|
||||
|
@ -174,14 +188,10 @@ SECTIONS
|
|||
__per_cpu_start = .;
|
||||
.data.percpu : { *(.data.percpu) }
|
||||
__per_cpu_end = .;
|
||||
. = ALIGN(4096);
|
||||
. = ALIGN(ASM_PAGE_SIZE);
|
||||
__init_end = .;
|
||||
/* freed after init ends here */
|
||||
|
||||
__bss_start = .; /* BSS */
|
||||
.bss : { *(.bss) *(COMMON) }
|
||||
__bss_stop = .;
|
||||
|
||||
_end = . ;
|
||||
|
||||
/* Sections to be discarded */
|
||||
|
|
|
@ -186,7 +186,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long code,
|
|||
break;
|
||||
case VM_FAULT_SIGBUS:
|
||||
/*
|
||||
* We hit a hared mapping outside of the file, or some
|
||||
* We hit a shared mapping outside of the file, or some
|
||||
* other thing happened to us that made us unable to
|
||||
* handle the page fault gracefully.
|
||||
*/
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
* changed by Philipp Rumpf
|
||||
* Copyright 1999 Philipp Rumpf (prumpf@tux.org)
|
||||
* Copyright 2004 Randolph Chung (tausq@debian.org)
|
||||
* Copyright 2006 Helge Deller (deller@gmx.de)
|
||||
*
|
||||
*/
|
||||
|
||||
|
@ -371,8 +372,8 @@ static void __init setup_bootmem(void)
|
|||
|
||||
void free_initmem(void)
|
||||
{
|
||||
unsigned long addr;
|
||||
|
||||
unsigned long addr, init_begin, init_end;
|
||||
|
||||
printk(KERN_INFO "Freeing unused kernel memory: ");
|
||||
|
||||
#ifdef CONFIG_DEBUG_KERNEL
|
||||
|
@ -395,8 +396,11 @@ void free_initmem(void)
|
|||
local_irq_enable();
|
||||
#endif
|
||||
|
||||
addr = (unsigned long)(&__init_begin);
|
||||
for (; addr < (unsigned long)(&__init_end); addr += PAGE_SIZE) {
|
||||
/* align __init_begin and __init_end to page size,
|
||||
ignoring linker script where we might have tried to save RAM */
|
||||
init_begin = PAGE_ALIGN((unsigned long)(&__init_begin));
|
||||
init_end = PAGE_ALIGN((unsigned long)(&__init_end));
|
||||
for (addr = init_begin; addr < init_end; addr += PAGE_SIZE) {
|
||||
ClearPageReserved(virt_to_page(addr));
|
||||
init_page_count(virt_to_page(addr));
|
||||
free_page(addr);
|
||||
|
@ -407,7 +411,7 @@ void free_initmem(void)
|
|||
/* set up a new led state on systems shipped LED State panel */
|
||||
pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE);
|
||||
|
||||
printk("%luk freed\n", (unsigned long)(&__init_end - &__init_begin) >> 10);
|
||||
printk("%luk freed\n", (init_end - init_begin) >> 10);
|
||||
}
|
||||
|
||||
|
||||
|
@ -639,11 +643,13 @@ static void __init map_pages(unsigned long start_vaddr, unsigned long start_padd
|
|||
* Map the fault vector writable so we can
|
||||
* write the HPMC checksum.
|
||||
*/
|
||||
#if defined(CONFIG_PARISC_PAGE_SIZE_4KB)
|
||||
if (address >= ro_start && address < ro_end
|
||||
&& address != fv_addr
|
||||
&& address != gw_addr)
|
||||
pte = __mk_pte(address, PAGE_KERNEL_RO);
|
||||
else
|
||||
#endif
|
||||
pte = __mk_pte(address, pgprot);
|
||||
|
||||
if (address >= end_paddr)
|
||||
|
@ -874,8 +880,7 @@ unsigned long alloc_sid(void)
|
|||
flush_tlb_all(); /* flush_tlb_all() calls recycle_sids() */
|
||||
spin_lock(&sid_lock);
|
||||
}
|
||||
if (free_space_ids == 0)
|
||||
BUG();
|
||||
BUG_ON(free_space_ids == 0);
|
||||
}
|
||||
|
||||
free_space_ids--;
|
||||
|
@ -899,8 +904,7 @@ void free_sid(unsigned long spaceid)
|
|||
|
||||
spin_lock(&sid_lock);
|
||||
|
||||
if (*dirty_space_offset & (1L << index))
|
||||
BUG(); /* attempt to free space id twice */
|
||||
BUG_ON(*dirty_space_offset & (1L << index)); /* attempt to free space id twice */
|
||||
|
||||
*dirty_space_offset |= (1L << index);
|
||||
dirty_space_ids++;
|
||||
|
@ -975,7 +979,7 @@ static void recycle_sids(void)
|
|||
|
||||
static unsigned long recycle_ndirty;
|
||||
static unsigned long recycle_dirty_array[SID_ARRAY_SIZE];
|
||||
static unsigned int recycle_inuse = 0;
|
||||
static unsigned int recycle_inuse;
|
||||
|
||||
void flush_tlb_all(void)
|
||||
{
|
||||
|
@ -984,9 +988,7 @@ void flush_tlb_all(void)
|
|||
do_recycle = 0;
|
||||
spin_lock(&sid_lock);
|
||||
if (dirty_space_ids > RECYCLE_THRESHOLD) {
|
||||
if (recycle_inuse) {
|
||||
BUG(); /* FIXME: Use a semaphore/wait queue here */
|
||||
}
|
||||
BUG_ON(recycle_inuse); /* FIXME: Use a semaphore/wait queue here */
|
||||
get_dirty_sids(&recycle_ndirty,recycle_dirty_array);
|
||||
recycle_inuse++;
|
||||
do_recycle++;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* arch/parisc/mm/ioremap.c
|
||||
*
|
||||
* (C) Copyright 1995 1996 Linus Torvalds
|
||||
* (C) Copyright 2001 Helge Deller <deller@gmx.de>
|
||||
* (C) Copyright 2001-2006 Helge Deller <deller@gmx.de>
|
||||
* (C) Copyright 2005 Kyle McMartin <kyle@parisc-linux.org>
|
||||
*/
|
||||
|
||||
|
@ -138,6 +138,7 @@ void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned l
|
|||
if ((phys_addr >= 0x00080000 && end < 0x000fffff) ||
|
||||
(phys_addr >= 0x00500000 && end < 0x03bfffff)) {
|
||||
phys_addr |= F_EXTEND(0xfc000000);
|
||||
flags |= _PAGE_NO_CACHE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16-rc2
|
||||
# Fri Feb 10 17:33:08 2006
|
||||
# Linux kernel version: 2.6.17-rc1
|
||||
# Wed Apr 19 13:24:37 2006
|
||||
#
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_64BIT=y
|
||||
|
@ -9,6 +9,7 @@ CONFIG_PPC_MERGE=y
|
|||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
|
@ -29,6 +30,7 @@ CONFIG_POWER4=y
|
|||
CONFIG_PPC_FPU=y
|
||||
CONFIG_ALTIVEC=y
|
||||
CONFIG_PPC_STD_MMU=y
|
||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=4
|
||||
|
||||
|
@ -53,6 +55,7 @@ CONFIG_SYSCTL=y
|
|||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
|
@ -67,10 +70,6 @@ CONFIG_BASE_FULL=y
|
|||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
@ -82,7 +81,6 @@ CONFIG_BASE_SMALL=0
|
|||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_KMOD=y
|
||||
|
@ -91,6 +89,7 @@ CONFIG_STOP_MACHINE=y
|
|||
#
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
|
@ -185,7 +184,6 @@ CONFIG_GENERIC_ISA_DMA=y
|
|||
# CONFIG_PPC_INDIRECT_PCI is not set
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
|
@ -227,6 +225,7 @@ CONFIG_SYN_COOKIES=y
|
|||
CONFIG_INET_AH=m
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_INET_IPCOMP=m
|
||||
CONFIG_INET_XFRM_TUNNEL=m
|
||||
CONFIG_INET_TUNNEL=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
|
@ -238,6 +237,8 @@ CONFIG_TCP_CONG_BIC=y
|
|||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
|
@ -261,6 +262,7 @@ CONFIG_IP_NF_IRC=m
|
|||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
# CONFIG_IP_NF_H323 is not set
|
||||
CONFIG_IP_NF_QUEUE=m
|
||||
|
||||
#
|
||||
|
@ -513,6 +515,7 @@ CONFIG_MD_RAID0=y
|
|||
CONFIG_MD_RAID1=y
|
||||
CONFIG_MD_RAID10=m
|
||||
CONFIG_MD_RAID5=y
|
||||
# CONFIG_MD_RAID5_RESHAPE is not set
|
||||
CONFIG_MD_RAID6=m
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
CONFIG_MD_FAULTY=m
|
||||
|
@ -761,7 +764,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
CONFIG_GEN_RTC=y
|
||||
# CONFIG_GEN_RTC_X is not set
|
||||
# CONFIG_DTLK is not set
|
||||
|
@ -772,6 +774,7 @@ CONFIG_GEN_RTC=y
|
|||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
CONFIG_AGP=m
|
||||
# CONFIG_AGP_VIA is not set
|
||||
CONFIG_AGP_UNINORTH=m
|
||||
# CONFIG_DRM is not set
|
||||
CONFIG_RAW_DRIVER=y
|
||||
|
@ -813,7 +816,6 @@ CONFIG_I2C_POWERMAC=y
|
|||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_SCx200_ACB is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
|
@ -832,9 +834,7 @@ CONFIG_I2C_POWERMAC=y
|
|||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_RTC_X1205_I2C is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -861,10 +861,6 @@ CONFIG_I2C_POWERMAC=y
|
|||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -874,6 +870,7 @@ CONFIG_I2C_POWERMAC=y
|
|||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
# CONFIG_USB_DABUSB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
|
@ -883,6 +880,7 @@ CONFIG_FB_CFB_FILLRECT=y
|
|||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_MACMODES=y
|
||||
CONFIG_FB_FIRMWARE_EDID=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
# CONFIG_FB_CIRRUS is not set
|
||||
|
@ -901,7 +899,6 @@ CONFIG_FB_NVIDIA=y
|
|||
CONFIG_FB_NVIDIA_I2C=y
|
||||
# CONFIG_FB_RIVA is not set
|
||||
# CONFIG_FB_MATROX is not set
|
||||
# CONFIG_FB_RADEON_OLD is not set
|
||||
CONFIG_FB_RADEON=y
|
||||
CONFIG_FB_RADEON_I2C=y
|
||||
# CONFIG_FB_RADEON_DEBUG is not set
|
||||
|
@ -958,9 +955,11 @@ CONFIG_SND_SEQUENCER=m
|
|||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||
CONFIG_SND_SUPPORT_OLD_API=y
|
||||
CONFIG_SND_VERBOSE_PROCFS=y
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
|
||||
|
@ -977,6 +976,7 @@ CONFIG_SND_SUPPORT_OLD_API=y
|
|||
# PCI devices
|
||||
#
|
||||
# CONFIG_SND_AD1889 is not set
|
||||
# CONFIG_SND_ALS300 is not set
|
||||
# CONFIG_SND_ALS4000 is not set
|
||||
# CONFIG_SND_ALI5451 is not set
|
||||
# CONFIG_SND_ATIIXP is not set
|
||||
|
@ -1009,6 +1009,7 @@ CONFIG_SND_SUPPORT_OLD_API=y
|
|||
# CONFIG_SND_MIXART is not set
|
||||
# CONFIG_SND_NM256 is not set
|
||||
# CONFIG_SND_PCXHR is not set
|
||||
# CONFIG_SND_RIPTIDE is not set
|
||||
# CONFIG_SND_RME32 is not set
|
||||
# CONFIG_SND_RME96 is not set
|
||||
# CONFIG_SND_RME9652 is not set
|
||||
|
@ -1041,6 +1042,7 @@ CONFIG_SND_USB_AUDIO=m
|
|||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB_ARCH_HAS_EHCI=y
|
||||
CONFIG_USB=y
|
||||
# CONFIG_USB_DEBUG is not set
|
||||
|
||||
|
@ -1068,7 +1070,6 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
|||
#
|
||||
# USB Device Class drivers
|
||||
#
|
||||
# CONFIG_OBSOLETE_OSS_USB_DRIVER is not set
|
||||
CONFIG_USB_ACM=m
|
||||
CONFIG_USB_PRINTER=y
|
||||
|
||||
|
@ -1125,15 +1126,6 @@ CONFIG_USB_HIDDEV=y
|
|||
# CONFIG_USB_MDC800 is not set
|
||||
# CONFIG_USB_MICROTEK is not set
|
||||
|
||||
#
|
||||
# USB Multimedia devices
|
||||
#
|
||||
# CONFIG_USB_DABUSB is not set
|
||||
|
||||
#
|
||||
# Video4Linux support is needed for USB Multimedia device support
|
||||
#
|
||||
|
||||
#
|
||||
# USB Network Adapters
|
||||
#
|
||||
|
@ -1194,6 +1186,7 @@ CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
|
|||
CONFIG_USB_SERIAL_KLSI=m
|
||||
CONFIG_USB_SERIAL_KOBIL_SCT=m
|
||||
CONFIG_USB_SERIAL_MCT_U232=m
|
||||
# CONFIG_USB_SERIAL_NAVMAN is not set
|
||||
CONFIG_USB_SERIAL_PL2303=m
|
||||
# CONFIG_USB_SERIAL_HP4X is not set
|
||||
CONFIG_USB_SERIAL_SAFE=m
|
||||
|
@ -1236,18 +1229,24 @@ CONFIG_USB_EZUSB=y
|
|||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
# CONFIG_INFINIBAND is not set
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
|
||||
#
|
||||
|
||||
#
|
||||
# EDAC - error detection and reporting (RAS)
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
|
@ -1319,7 +1318,6 @@ CONFIG_TMPFS=y
|
|||
CONFIG_HUGETLBFS=y
|
||||
CONFIG_HUGETLB_PAGE=y
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16-rc6
|
||||
# Wed Mar 15 16:19:52 2006
|
||||
# Linux kernel version: 2.6.17-rc1
|
||||
# Wed Apr 19 11:46:44 2006
|
||||
#
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_64BIT=y
|
||||
|
@ -9,6 +9,7 @@ CONFIG_PPC_MERGE=y
|
|||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
|
@ -30,6 +31,7 @@ CONFIG_POWER4=y
|
|||
CONFIG_PPC_FPU=y
|
||||
# CONFIG_ALTIVEC is not set
|
||||
CONFIG_PPC_STD_MMU=y
|
||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=32
|
||||
|
||||
|
@ -55,6 +57,7 @@ CONFIG_AUDITSYSCALL=y
|
|||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_CPUSETS is not set
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
|
@ -69,10 +72,6 @@ CONFIG_BASE_FULL=y
|
|||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
@ -84,7 +83,6 @@ CONFIG_BASE_SMALL=0
|
|||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_KMOD=y
|
||||
|
@ -93,6 +91,7 @@ CONFIG_STOP_MACHINE=y
|
|||
#
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
|
@ -165,7 +164,6 @@ CONFIG_GENERIC_ISA_DMA=y
|
|||
# CONFIG_PPC_INDIRECT_PCI is not set
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
|
@ -207,6 +205,7 @@ CONFIG_SYN_COOKIES=y
|
|||
CONFIG_INET_AH=m
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_INET_IPCOMP=m
|
||||
CONFIG_INET_XFRM_TUNNEL=m
|
||||
CONFIG_INET_TUNNEL=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
|
@ -218,6 +217,8 @@ CONFIG_TCP_CONG_BIC=y
|
|||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
|
@ -236,11 +237,14 @@ CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
|
|||
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
|
||||
# CONFIG_NETFILTER_XT_MATCH_DCCP is not set
|
||||
# CONFIG_NETFILTER_XT_MATCH_ESP is not set
|
||||
CONFIG_NETFILTER_XT_MATCH_HELPER=m
|
||||
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
|
||||
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_MAC=m
|
||||
CONFIG_NETFILTER_XT_MATCH_MARK=m
|
||||
# CONFIG_NETFILTER_XT_MATCH_POLICY is not set
|
||||
# CONFIG_NETFILTER_XT_MATCH_MULTIPORT is not set
|
||||
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
|
||||
CONFIG_NETFILTER_XT_MATCH_REALM=m
|
||||
CONFIG_NETFILTER_XT_MATCH_SCTP=m
|
||||
|
@ -262,20 +266,19 @@ CONFIG_IP_NF_IRC=m
|
|||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
# CONFIG_IP_NF_H323 is not set
|
||||
CONFIG_IP_NF_QUEUE=m
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_MATCH_IPRANGE=m
|
||||
CONFIG_IP_NF_MATCH_MULTIPORT=m
|
||||
CONFIG_IP_NF_MATCH_TOS=m
|
||||
CONFIG_IP_NF_MATCH_RECENT=m
|
||||
CONFIG_IP_NF_MATCH_ECN=m
|
||||
CONFIG_IP_NF_MATCH_DSCP=m
|
||||
CONFIG_IP_NF_MATCH_AH_ESP=m
|
||||
# CONFIG_IP_NF_MATCH_AH is not set
|
||||
CONFIG_IP_NF_MATCH_TTL=m
|
||||
CONFIG_IP_NF_MATCH_OWNER=m
|
||||
CONFIG_IP_NF_MATCH_ADDRTYPE=m
|
||||
CONFIG_IP_NF_MATCH_HASHLIMIT=m
|
||||
CONFIG_IP_NF_MATCH_POLICY=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_TARGET_LOG=m
|
||||
|
@ -479,6 +482,7 @@ CONFIG_MD_RAID0=y
|
|||
CONFIG_MD_RAID1=y
|
||||
CONFIG_MD_RAID10=m
|
||||
CONFIG_MD_RAID5=y
|
||||
# CONFIG_MD_RAID5_RESHAPE is not set
|
||||
CONFIG_MD_RAID6=m
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
CONFIG_MD_FAULTY=m
|
||||
|
@ -702,7 +706,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
CONFIG_GEN_RTC=y
|
||||
# CONFIG_GEN_RTC_X is not set
|
||||
# CONFIG_DTLK is not set
|
||||
|
@ -750,10 +753,6 @@ CONFIG_MAX_RAW_DEVS=256
|
|||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -779,6 +778,7 @@ CONFIG_MAX_RAW_DEVS=256
|
|||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB_ARCH_HAS_EHCI=y
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
|
@ -795,6 +795,11 @@ CONFIG_USB_ARCH_HAS_OHCI=y
|
|||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
|
@ -804,6 +809,11 @@ CONFIG_USB_ARCH_HAS_OHCI=y
|
|||
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
|
||||
#
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
|
@ -878,7 +888,6 @@ CONFIG_TMPFS=y
|
|||
# CONFIG_HUGETLBFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.16-rc2
|
||||
# Fri Feb 10 17:33:32 2006
|
||||
# Linux kernel version: 2.6.17-rc1
|
||||
# Wed Apr 19 11:48:00 2006
|
||||
#
|
||||
CONFIG_PPC64=y
|
||||
CONFIG_64BIT=y
|
||||
|
@ -9,6 +9,7 @@ CONFIG_PPC_MERGE=y
|
|||
CONFIG_MMU=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_PPC=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
|
@ -30,6 +31,7 @@ CONFIG_POWER4=y
|
|||
CONFIG_PPC_FPU=y
|
||||
CONFIG_ALTIVEC=y
|
||||
CONFIG_PPC_STD_MMU=y
|
||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=128
|
||||
|
||||
|
@ -55,6 +57,7 @@ CONFIG_AUDITSYSCALL=y
|
|||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_CPUSETS=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
|
@ -69,10 +72,6 @@ CONFIG_BASE_FULL=y
|
|||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
@ -84,7 +83,6 @@ CONFIG_BASE_SMALL=0
|
|||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
CONFIG_KMOD=y
|
||||
|
@ -93,6 +91,7 @@ CONFIG_STOP_MACHINE=y
|
|||
#
|
||||
# Block layer
|
||||
#
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
|
@ -188,7 +187,6 @@ CONFIG_PPC_I8259=y
|
|||
# CONFIG_PPC_INDIRECT_PCI is not set
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PCI_DOMAINS=y
|
||||
CONFIG_PCI_LEGACY_PROC=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
|
@ -235,6 +233,7 @@ CONFIG_SYN_COOKIES=y
|
|||
CONFIG_INET_AH=m
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_INET_IPCOMP=m
|
||||
CONFIG_INET_XFRM_TUNNEL=m
|
||||
CONFIG_INET_TUNNEL=y
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
|
@ -246,6 +245,8 @@ CONFIG_TCP_CONG_BIC=y
|
|||
#
|
||||
# CONFIG_IP_VS is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_NETFILTER_DEBUG is not set
|
||||
|
||||
|
@ -272,6 +273,7 @@ CONFIG_IP_NF_IRC=m
|
|||
CONFIG_IP_NF_TFTP=m
|
||||
CONFIG_IP_NF_AMANDA=m
|
||||
# CONFIG_IP_NF_PPTP is not set
|
||||
# CONFIG_IP_NF_H323 is not set
|
||||
CONFIG_IP_NF_QUEUE=m
|
||||
|
||||
#
|
||||
|
@ -519,6 +521,7 @@ CONFIG_MD_RAID0=y
|
|||
CONFIG_MD_RAID1=y
|
||||
CONFIG_MD_RAID10=m
|
||||
CONFIG_MD_RAID5=y
|
||||
# CONFIG_MD_RAID5_RESHAPE is not set
|
||||
CONFIG_MD_RAID6=m
|
||||
CONFIG_MD_MULTIPATH=m
|
||||
CONFIG_MD_FAULTY=m
|
||||
|
@ -750,6 +753,7 @@ CONFIG_HW_CONSOLE=y
|
|||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_PCI=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=4
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
|
||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||
|
@ -767,7 +771,9 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
# CONFIG_PRINTER is not set
|
||||
# CONFIG_PPDEV is not set
|
||||
# CONFIG_TIPAR is not set
|
||||
CONFIG_HVC_DRIVER=y
|
||||
CONFIG_HVC_CONSOLE=y
|
||||
# CONFIG_HVC_RTAS is not set
|
||||
CONFIG_HVCS=m
|
||||
|
||||
#
|
||||
|
@ -779,7 +785,6 @@ CONFIG_HVCS=m
|
|||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_RTC is not set
|
||||
CONFIG_GEN_RTC=y
|
||||
# CONFIG_GEN_RTC_X is not set
|
||||
# CONFIG_DTLK is not set
|
||||
|
@ -830,7 +835,6 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_PROSAVAGE is not set
|
||||
# CONFIG_I2C_SAVAGE4 is not set
|
||||
# CONFIG_SCx200_ACB is not set
|
||||
# CONFIG_I2C_SIS5595 is not set
|
||||
# CONFIG_I2C_SIS630 is not set
|
||||
# CONFIG_I2C_SIS96X is not set
|
||||
|
@ -849,9 +853,7 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_RTC8564 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
# CONFIG_RTC_X1205_I2C is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
|
@ -878,10 +880,6 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia Capabilities Port drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -891,6 +889,7 @@ CONFIG_I2C_ALGOBIT=y
|
|||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
# CONFIG_USB_DABUSB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
|
@ -900,6 +899,7 @@ CONFIG_FB_CFB_FILLRECT=y
|
|||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_MACMODES=y
|
||||
CONFIG_FB_FIRMWARE_EDID=y
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
# CONFIG_FB_CIRRUS is not set
|
||||
|
@ -919,7 +919,6 @@ CONFIG_FB_MATROX_MYSTIQUE=y
|
|||
CONFIG_FB_MATROX_G=y
|
||||
# CONFIG_FB_MATROX_I2C is not set
|
||||
CONFIG_FB_MATROX_MULTIHEAD=y
|
||||
# CONFIG_FB_RADEON_OLD is not set
|
||||
CONFIG_FB_RADEON=y
|
||||
CONFIG_FB_RADEON_I2C=y
|
||||
# CONFIG_FB_RADEON_DEBUG is not set
|
||||
|
@ -968,6 +967,7 @@ CONFIG_LCD_DEVICE=y
|
|||
#
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
CONFIG_USB_ARCH_HAS_EHCI=y
|
||||
CONFIG_USB=y
|
||||
# CONFIG_USB_DEBUG is not set
|
||||
|
||||
|
@ -1047,15 +1047,6 @@ CONFIG_USB_HIDDEV=y
|
|||
# CONFIG_USB_MDC800 is not set
|
||||
# CONFIG_USB_MICROTEK is not set
|
||||
|
||||
#
|
||||
# USB Multimedia devices
|
||||
#
|
||||
# CONFIG_USB_DABUSB is not set
|
||||
|
||||
#
|
||||
# Video4Linux support is needed for USB Multimedia device support
|
||||
#
|
||||
|
||||
#
|
||||
# USB Network Adapters
|
||||
#
|
||||
|
@ -1108,6 +1099,11 @@ CONFIG_USB_MON=y
|
|||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
|
@ -1121,12 +1117,13 @@ CONFIG_INFINIBAND_IPOIB=m
|
|||
# CONFIG_INFINIBAND_SRP is not set
|
||||
|
||||
#
|
||||
# SN Devices
|
||||
# EDAC - error detection and reporting (RAS) (EXPERIMENTAL)
|
||||
#
|
||||
|
||||
#
|
||||
# EDAC - error detection and reporting (RAS)
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
|
@ -1202,7 +1199,6 @@ CONFIG_TMPFS=y
|
|||
CONFIG_HUGETLBFS=y
|
||||
CONFIG_HUGETLB_PAGE=y
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -61,6 +61,7 @@ __setup("iommu=", setup_iommu);
|
|||
static unsigned long iommu_range_alloc(struct iommu_table *tbl,
|
||||
unsigned long npages,
|
||||
unsigned long *handle,
|
||||
unsigned long mask,
|
||||
unsigned int align_order)
|
||||
{
|
||||
unsigned long n, end, i, start;
|
||||
|
@ -97,9 +98,21 @@ static unsigned long iommu_range_alloc(struct iommu_table *tbl,
|
|||
*/
|
||||
if (start >= limit)
|
||||
start = largealloc ? tbl->it_largehint : tbl->it_hint;
|
||||
|
||||
|
||||
again:
|
||||
|
||||
if (limit + tbl->it_offset > mask) {
|
||||
limit = mask - tbl->it_offset + 1;
|
||||
/* If we're constrained on address range, first try
|
||||
* at the masked hint to avoid O(n) search complexity,
|
||||
* but on second pass, start at 0.
|
||||
*/
|
||||
if ((start & mask) >= limit || pass > 0)
|
||||
start = 0;
|
||||
else
|
||||
start &= mask;
|
||||
}
|
||||
|
||||
n = find_next_zero_bit(tbl->it_map, limit, start);
|
||||
|
||||
/* Align allocation */
|
||||
|
@ -150,14 +163,14 @@ static unsigned long iommu_range_alloc(struct iommu_table *tbl,
|
|||
|
||||
static dma_addr_t iommu_alloc(struct iommu_table *tbl, void *page,
|
||||
unsigned int npages, enum dma_data_direction direction,
|
||||
unsigned int align_order)
|
||||
unsigned long mask, unsigned int align_order)
|
||||
{
|
||||
unsigned long entry, flags;
|
||||
dma_addr_t ret = DMA_ERROR_CODE;
|
||||
|
||||
|
||||
spin_lock_irqsave(&(tbl->it_lock), flags);
|
||||
|
||||
entry = iommu_range_alloc(tbl, npages, NULL, align_order);
|
||||
entry = iommu_range_alloc(tbl, npages, NULL, mask, align_order);
|
||||
|
||||
if (unlikely(entry == DMA_ERROR_CODE)) {
|
||||
spin_unlock_irqrestore(&(tbl->it_lock), flags);
|
||||
|
@ -236,7 +249,7 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
|
|||
|
||||
int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
|
||||
struct scatterlist *sglist, int nelems,
|
||||
enum dma_data_direction direction)
|
||||
unsigned long mask, enum dma_data_direction direction)
|
||||
{
|
||||
dma_addr_t dma_next = 0, dma_addr;
|
||||
unsigned long flags;
|
||||
|
@ -274,7 +287,7 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
|
|||
vaddr = (unsigned long)page_address(s->page) + s->offset;
|
||||
npages = PAGE_ALIGN(vaddr + slen) - (vaddr & PAGE_MASK);
|
||||
npages >>= PAGE_SHIFT;
|
||||
entry = iommu_range_alloc(tbl, npages, &handle, 0);
|
||||
entry = iommu_range_alloc(tbl, npages, &handle, mask >> PAGE_SHIFT, 0);
|
||||
|
||||
DBG(" - vaddr: %lx, size: %lx\n", vaddr, slen);
|
||||
|
||||
|
@ -479,7 +492,8 @@ void iommu_free_table(struct device_node *dn)
|
|||
* byte within the page as vaddr.
|
||||
*/
|
||||
dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
|
||||
size_t size, enum dma_data_direction direction)
|
||||
size_t size, unsigned long mask,
|
||||
enum dma_data_direction direction)
|
||||
{
|
||||
dma_addr_t dma_handle = DMA_ERROR_CODE;
|
||||
unsigned long uaddr;
|
||||
|
@ -492,7 +506,8 @@ dma_addr_t iommu_map_single(struct iommu_table *tbl, void *vaddr,
|
|||
npages >>= PAGE_SHIFT;
|
||||
|
||||
if (tbl) {
|
||||
dma_handle = iommu_alloc(tbl, vaddr, npages, direction, 0);
|
||||
dma_handle = iommu_alloc(tbl, vaddr, npages, direction,
|
||||
mask >> PAGE_SHIFT, 0);
|
||||
if (dma_handle == DMA_ERROR_CODE) {
|
||||
if (printk_ratelimit()) {
|
||||
printk(KERN_INFO "iommu_alloc failed, "
|
||||
|
@ -521,7 +536,7 @@ void iommu_unmap_single(struct iommu_table *tbl, dma_addr_t dma_handle,
|
|||
* to the dma address (mapping) of the first page.
|
||||
*/
|
||||
void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size,
|
||||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
dma_addr_t *dma_handle, unsigned long mask, gfp_t flag)
|
||||
{
|
||||
void *ret = NULL;
|
||||
dma_addr_t mapping;
|
||||
|
@ -551,7 +566,8 @@ void *iommu_alloc_coherent(struct iommu_table *tbl, size_t size,
|
|||
memset(ret, 0, size);
|
||||
|
||||
/* Set up tces to cover the allocated range */
|
||||
mapping = iommu_alloc(tbl, ret, npages, DMA_BIDIRECTIONAL, order);
|
||||
mapping = iommu_alloc(tbl, ret, npages, DMA_BIDIRECTIONAL,
|
||||
mask >> PAGE_SHIFT, order);
|
||||
if (mapping == DMA_ERROR_CODE) {
|
||||
free_pages((unsigned long)ret, order);
|
||||
ret = NULL;
|
||||
|
|
|
@ -59,6 +59,25 @@ static inline struct iommu_table *devnode_table(struct device *dev)
|
|||
}
|
||||
|
||||
|
||||
static inline unsigned long device_to_mask(struct device *hwdev)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
|
||||
if (!hwdev) {
|
||||
pdev = ppc64_isabridge_dev;
|
||||
if (!pdev) /* This is the best guess we can do */
|
||||
return 0xfffffffful;
|
||||
} else
|
||||
pdev = to_pci_dev(hwdev);
|
||||
|
||||
if (pdev->dma_mask)
|
||||
return pdev->dma_mask;
|
||||
|
||||
/* Assume devices without mask can take 32 bit addresses */
|
||||
return 0xfffffffful;
|
||||
}
|
||||
|
||||
|
||||
/* Allocates a contiguous real buffer and creates mappings over it.
|
||||
* Returns the virtual address of the buffer and sets dma_handle
|
||||
* to the dma address (mapping) of the first page.
|
||||
|
@ -67,7 +86,7 @@ static void *pci_iommu_alloc_coherent(struct device *hwdev, size_t size,
|
|||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
return iommu_alloc_coherent(devnode_table(hwdev), size, dma_handle,
|
||||
flag);
|
||||
device_to_mask(hwdev), flag);
|
||||
}
|
||||
|
||||
static void pci_iommu_free_coherent(struct device *hwdev, size_t size,
|
||||
|
@ -85,7 +104,8 @@ static void pci_iommu_free_coherent(struct device *hwdev, size_t size,
|
|||
static dma_addr_t pci_iommu_map_single(struct device *hwdev, void *vaddr,
|
||||
size_t size, enum dma_data_direction direction)
|
||||
{
|
||||
return iommu_map_single(devnode_table(hwdev), vaddr, size, direction);
|
||||
return iommu_map_single(devnode_table(hwdev), vaddr, size,
|
||||
device_to_mask(hwdev), direction);
|
||||
}
|
||||
|
||||
|
||||
|
@ -100,7 +120,7 @@ static int pci_iommu_map_sg(struct device *pdev, struct scatterlist *sglist,
|
|||
int nelems, enum dma_data_direction direction)
|
||||
{
|
||||
return iommu_map_sg(pdev, devnode_table(pdev), sglist,
|
||||
nelems, direction);
|
||||
nelems, device_to_mask(pdev), direction);
|
||||
}
|
||||
|
||||
static void pci_iommu_unmap_sg(struct device *pdev, struct scatterlist *sglist,
|
||||
|
@ -112,7 +132,19 @@ static void pci_iommu_unmap_sg(struct device *pdev, struct scatterlist *sglist,
|
|||
/* We support DMA to/from any memory page via the iommu */
|
||||
static int pci_iommu_dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
return 1;
|
||||
struct iommu_table *tbl = devnode_table(dev);
|
||||
|
||||
if (!tbl || tbl->it_offset > mask) {
|
||||
printk(KERN_INFO "Warning: IOMMU table offset too big for device mask\n");
|
||||
if (tbl)
|
||||
printk(KERN_INFO "mask: 0x%08lx, table offset: 0x%08lx\n",
|
||||
mask, tbl->it_offset);
|
||||
else
|
||||
printk(KERN_INFO "mask: 0x%08lx, table unavailable\n",
|
||||
mask);
|
||||
return 0;
|
||||
} else
|
||||
return 1;
|
||||
}
|
||||
|
||||
void pci_iommu_init(void)
|
||||
|
|
|
@ -81,6 +81,7 @@ EXPORT_SYMBOL(strcat);
|
|||
EXPORT_SYMBOL(strlen);
|
||||
EXPORT_SYMBOL(strcmp);
|
||||
EXPORT_SYMBOL(strcasecmp);
|
||||
EXPORT_SYMBOL(strncasecmp);
|
||||
|
||||
EXPORT_SYMBOL(csum_partial);
|
||||
EXPORT_SYMBOL(csum_partial_copy_generic);
|
||||
|
|
|
@ -62,7 +62,7 @@ static int __initdata dt_root_addr_cells;
|
|||
static int __initdata dt_root_size_cells;
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
static int __initdata iommu_is_off;
|
||||
int __initdata iommu_is_off;
|
||||
int __initdata iommu_force_on;
|
||||
unsigned long tce_alloc_start, tce_alloc_end;
|
||||
#endif
|
||||
|
|
|
@ -279,7 +279,7 @@ static void unregister_cpu_online(unsigned int cpu)
|
|||
}
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
static int __devinit sysfs_cpu_notify(struct notifier_block *self,
|
||||
static int sysfs_cpu_notify(struct notifier_block *self,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned int)(long)hcpu;
|
||||
|
@ -297,7 +297,7 @@ static int __devinit sysfs_cpu_notify(struct notifier_block *self,
|
|||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __devinitdata sysfs_cpu_nb = {
|
||||
static struct notifier_block sysfs_cpu_nb = {
|
||||
.notifier_call = sysfs_cpu_notify,
|
||||
};
|
||||
|
||||
|
|
|
@ -324,3 +324,9 @@ COMPAT_SYS(ppoll)
|
|||
SYSCALL(unshare)
|
||||
SYSCALL(splice)
|
||||
SYSCALL(tee)
|
||||
SYSCALL(vmsplice)
|
||||
|
||||
/*
|
||||
* please add new calls to arch/powerpc/platforms/cell/spu_callbacks.c
|
||||
* as well when appropriate.
|
||||
*/
|
||||
|
|
|
@ -202,7 +202,7 @@ static dma_addr_t vio_map_single(struct device *dev, void *vaddr,
|
|||
size_t size, enum dma_data_direction direction)
|
||||
{
|
||||
return iommu_map_single(to_vio_dev(dev)->iommu_table, vaddr, size,
|
||||
direction);
|
||||
~0ul, direction);
|
||||
}
|
||||
|
||||
static void vio_unmap_single(struct device *dev, dma_addr_t dma_handle,
|
||||
|
@ -216,7 +216,7 @@ static int vio_map_sg(struct device *dev, struct scatterlist *sglist,
|
|||
int nelems, enum dma_data_direction direction)
|
||||
{
|
||||
return iommu_map_sg(dev, to_vio_dev(dev)->iommu_table, sglist,
|
||||
nelems, direction);
|
||||
nelems, ~0ul, direction);
|
||||
}
|
||||
|
||||
static void vio_unmap_sg(struct device *dev, struct scatterlist *sglist,
|
||||
|
@ -229,7 +229,7 @@ static void *vio_alloc_coherent(struct device *dev, size_t size,
|
|||
dma_addr_t *dma_handle, gfp_t flag)
|
||||
{
|
||||
return iommu_alloc_coherent(to_vio_dev(dev)->iommu_table, size,
|
||||
dma_handle, flag);
|
||||
dma_handle, ~0ul, flag);
|
||||
}
|
||||
|
||||
static void vio_free_coherent(struct device *dev, size_t size,
|
||||
|
|
|
@ -317,17 +317,17 @@ void *spu_syscall_table[] = {
|
|||
[__NR_ppoll] sys_ni_syscall, /* sys_ppoll */
|
||||
[__NR_unshare] sys_unshare,
|
||||
[__NR_splice] sys_splice,
|
||||
[__NR_tee] sys_tee,
|
||||
[__NR_vmsplice] sys_vmsplice,
|
||||
};
|
||||
|
||||
long spu_sys_callback(struct spu_syscall_block *s)
|
||||
{
|
||||
long (*syscall)(u64 a1, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6);
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(spu_syscall_table) != __NR_syscalls);
|
||||
|
||||
syscall = spu_syscall_table[s->nr_ret];
|
||||
|
||||
if (s->nr_ret >= __NR_syscalls) {
|
||||
if (s->nr_ret >= ARRAY_SIZE(spu_syscall_table)) {
|
||||
pr_debug("%s: invalid syscall #%ld", __FUNCTION__, s->nr_ret);
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
|
|
@ -231,6 +231,14 @@ static u8 kw_i2c_wait_interrupt(struct pmac_i2c_host_kw *host)
|
|||
return isr;
|
||||
}
|
||||
|
||||
static void kw_i2c_do_stop(struct pmac_i2c_host_kw *host, int result)
|
||||
{
|
||||
kw_write_reg(reg_control, KW_I2C_CTL_STOP);
|
||||
host->state = state_stop;
|
||||
host->result = result;
|
||||
}
|
||||
|
||||
|
||||
static void kw_i2c_handle_interrupt(struct pmac_i2c_host_kw *host, u8 isr)
|
||||
{
|
||||
u8 ack;
|
||||
|
@ -246,42 +254,36 @@ static void kw_i2c_handle_interrupt(struct pmac_i2c_host_kw *host, u8 isr)
|
|||
}
|
||||
|
||||
if (isr == 0) {
|
||||
printk(KERN_WARNING "low_i2c: Timeout in i2c transfer"
|
||||
" on keywest !\n");
|
||||
if (host->state != state_stop) {
|
||||
DBG_LOW("KW: Timeout !\n");
|
||||
host->result = -EIO;
|
||||
goto stop;
|
||||
}
|
||||
if (host->state == state_stop) {
|
||||
ack = kw_read_reg(reg_status);
|
||||
if (ack & KW_I2C_STAT_BUSY)
|
||||
kw_write_reg(reg_status, 0);
|
||||
host->state = state_idle;
|
||||
kw_write_reg(reg_ier, 0x00);
|
||||
if (!host->polled)
|
||||
complete(&host->complete);
|
||||
kw_i2c_do_stop(host, -EIO);
|
||||
return;
|
||||
}
|
||||
ack = kw_read_reg(reg_status);
|
||||
if (ack & KW_I2C_STAT_BUSY)
|
||||
kw_write_reg(reg_status, 0);
|
||||
host->state = state_idle;
|
||||
kw_write_reg(reg_ier, 0x00);
|
||||
if (!host->polled)
|
||||
complete(&host->complete);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isr & KW_I2C_IRQ_ADDR) {
|
||||
ack = kw_read_reg(reg_status);
|
||||
if (host->state != state_addr) {
|
||||
kw_write_reg(reg_isr, KW_I2C_IRQ_ADDR);
|
||||
WRONG_STATE("KW_I2C_IRQ_ADDR");
|
||||
host->result = -EIO;
|
||||
goto stop;
|
||||
kw_i2c_do_stop(host, -EIO);
|
||||
}
|
||||
if ((ack & KW_I2C_STAT_LAST_AAK) == 0) {
|
||||
host->result = -ENODEV;
|
||||
DBG_LOW("KW: NAK on address\n");
|
||||
host->result = -ENXIO;
|
||||
host->state = state_stop;
|
||||
return;
|
||||
DBG_LOW("KW: NAK on address\n");
|
||||
} else {
|
||||
if (host->len == 0) {
|
||||
kw_write_reg(reg_isr, KW_I2C_IRQ_ADDR);
|
||||
goto stop;
|
||||
}
|
||||
if (host->rw) {
|
||||
if (host->len == 0)
|
||||
kw_i2c_do_stop(host, 0);
|
||||
else if (host->rw) {
|
||||
host->state = state_read;
|
||||
if (host->len > 1)
|
||||
kw_write_reg(reg_control,
|
||||
|
@ -308,25 +310,19 @@ static void kw_i2c_handle_interrupt(struct pmac_i2c_host_kw *host, u8 isr)
|
|||
ack = kw_read_reg(reg_status);
|
||||
if ((ack & KW_I2C_STAT_LAST_AAK) == 0) {
|
||||
DBG_LOW("KW: nack on data write\n");
|
||||
host->result = -EIO;
|
||||
goto stop;
|
||||
host->result = -EFBIG;
|
||||
host->state = state_stop;
|
||||
} else if (host->len) {
|
||||
kw_write_reg(reg_data, *(host->data++));
|
||||
host->len--;
|
||||
} else {
|
||||
kw_write_reg(reg_control, KW_I2C_CTL_STOP);
|
||||
host->state = state_stop;
|
||||
host->result = 0;
|
||||
}
|
||||
kw_write_reg(reg_isr, KW_I2C_IRQ_DATA);
|
||||
} else
|
||||
kw_i2c_do_stop(host, 0);
|
||||
} else {
|
||||
kw_write_reg(reg_isr, KW_I2C_IRQ_DATA);
|
||||
WRONG_STATE("KW_I2C_IRQ_DATA");
|
||||
if (host->state != state_stop) {
|
||||
host->result = -EIO;
|
||||
goto stop;
|
||||
}
|
||||
if (host->state != state_stop)
|
||||
kw_i2c_do_stop(host, -EIO);
|
||||
}
|
||||
kw_write_reg(reg_isr, KW_I2C_IRQ_DATA);
|
||||
}
|
||||
|
||||
if (isr & KW_I2C_IRQ_STOP) {
|
||||
|
@ -340,14 +336,10 @@ static void kw_i2c_handle_interrupt(struct pmac_i2c_host_kw *host, u8 isr)
|
|||
complete(&host->complete);
|
||||
}
|
||||
|
||||
/* Below should only happen in manual mode which we don't use ... */
|
||||
if (isr & KW_I2C_IRQ_START)
|
||||
kw_write_reg(reg_isr, KW_I2C_IRQ_START);
|
||||
|
||||
return;
|
||||
stop:
|
||||
kw_write_reg(reg_control, KW_I2C_CTL_STOP);
|
||||
host->state = state_stop;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Interrupt handler */
|
||||
|
@ -544,11 +536,11 @@ static struct pmac_i2c_host_kw *__init kw_i2c_host_init(struct device_node *np)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* Make sure IRA is disabled */
|
||||
/* Make sure IRQ is disabled */
|
||||
kw_write_reg(reg_ier, 0);
|
||||
|
||||
/* Request chip interrupt */
|
||||
if (request_irq(host->irq, kw_i2c_irq, SA_SHIRQ, "keywest i2c", host))
|
||||
if (request_irq(host->irq, kw_i2c_irq, 0, "keywest i2c", host))
|
||||
host->irq = NO_IRQ;
|
||||
|
||||
printk(KERN_INFO "KeyWest i2c @0x%08x irq %d %s\n",
|
||||
|
|
|
@ -49,6 +49,7 @@
|
|||
|
||||
#include "dart.h"
|
||||
|
||||
extern int iommu_is_off;
|
||||
extern int iommu_force_on;
|
||||
|
||||
/* Physical base address and size of the DART table */
|
||||
|
@ -329,10 +330,17 @@ void iommu_init_early_dart(void)
|
|||
|
||||
void __init alloc_dart_table(void)
|
||||
{
|
||||
/* Only reserve DART space if machine has more than 2GB of RAM
|
||||
/* Only reserve DART space if machine has more than 1GB of RAM
|
||||
* or if requested with iommu=on on cmdline.
|
||||
*
|
||||
* 1GB of RAM is picked as limit because some default devices
|
||||
* (i.e. Airport Extreme) have 30 bit address range limits.
|
||||
*/
|
||||
if (lmb_end_of_DRAM() <= 0x80000000ull && !iommu_force_on)
|
||||
|
||||
if (iommu_is_off)
|
||||
return;
|
||||
|
||||
if (!iommu_force_on && lmb_end_of_DRAM() <= 0x40000000ull)
|
||||
return;
|
||||
|
||||
/* 512 pages (2MB) is max DART tablesize. */
|
||||
|
|
|
@ -134,6 +134,7 @@ main(void)
|
|||
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
||||
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
||||
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
||||
DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, flags));
|
||||
DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
|
||||
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
|
||||
|
||||
|
|
|
@ -128,29 +128,26 @@ transfer_to_handler:
|
|||
stw r12,4(r11)
|
||||
#endif
|
||||
b 3f
|
||||
|
||||
2: /* if from kernel, check interrupted DOZE/NAP mode and
|
||||
* check for stack overflow
|
||||
*/
|
||||
lwz r9,THREAD_INFO-THREAD(r12)
|
||||
cmplw r1,r9 /* if r1 <= current->thread_info */
|
||||
ble- stack_ovf /* then the kernel stack overflowed */
|
||||
5:
|
||||
#ifdef CONFIG_6xx
|
||||
mfspr r11,SPRN_HID0
|
||||
mtcr r11
|
||||
BEGIN_FTR_SECTION
|
||||
bt- 8,4f /* Check DOZE */
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_CAN_DOZE)
|
||||
BEGIN_FTR_SECTION
|
||||
bt- 9,4f /* Check NAP */
|
||||
END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
|
||||
tophys(r9,r9) /* check local flags */
|
||||
lwz r12,TI_LOCAL_FLAGS(r9)
|
||||
mtcrf 0x01,r12
|
||||
bt- 31-TLF_NAPPING,4f
|
||||
#endif /* CONFIG_6xx */
|
||||
.globl transfer_to_handler_cont
|
||||
transfer_to_handler_cont:
|
||||
lwz r11,THREAD_INFO-THREAD(r12)
|
||||
cmplw r1,r11 /* if r1 <= current->thread_info */
|
||||
ble- stack_ovf /* then the kernel stack overflowed */
|
||||
3:
|
||||
mflr r9
|
||||
lwz r11,0(r9) /* virtual address of handler */
|
||||
lwz r9,4(r9) /* where to go when done */
|
||||
FIX_SRR1(r10,r12)
|
||||
mtspr SPRN_SRR0,r11
|
||||
mtspr SPRN_SRR1,r10
|
||||
mtlr r9
|
||||
|
@ -158,7 +155,9 @@ transfer_to_handler_cont:
|
|||
RFI /* jump to handler, enable MMU */
|
||||
|
||||
#ifdef CONFIG_6xx
|
||||
4: b power_save_6xx_restore
|
||||
4: rlwinm r12,r12,0,~_TLF_NAPPING
|
||||
stw r12,TI_LOCAL_FLAGS(r9)
|
||||
b power_save_6xx_restore
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -167,10 +166,10 @@ transfer_to_handler_cont:
|
|||
*/
|
||||
stack_ovf:
|
||||
/* sometimes we use a statically-allocated stack, which is OK. */
|
||||
lis r11,_end@h
|
||||
ori r11,r11,_end@l
|
||||
cmplw r1,r11
|
||||
ble 3b /* r1 <= &_end is OK */
|
||||
lis r12,_end@h
|
||||
ori r12,r12,_end@l
|
||||
cmplw r1,r12
|
||||
ble 5b /* r1 <= &_end is OK */
|
||||
SAVE_NVGPRS(r11)
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
lis r1,init_thread_union@ha
|
||||
|
|
|
@ -94,6 +94,7 @@ EXPORT_SYMBOL(strcat);
|
|||
EXPORT_SYMBOL(strlen);
|
||||
EXPORT_SYMBOL(strcmp);
|
||||
EXPORT_SYMBOL(strcasecmp);
|
||||
EXPORT_SYMBOL(strncasecmp);
|
||||
EXPORT_SYMBOL(__div64_32);
|
||||
|
||||
EXPORT_SYMBOL(csum_partial);
|
||||
|
|
|
@ -652,7 +652,7 @@ appldata_cpu_notify(struct notifier_block *self,
|
|||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __devinitdata appldata_nb = {
|
||||
static struct notifier_block appldata_nb = {
|
||||
.notifier_call = appldata_cpu_notify,
|
||||
};
|
||||
|
||||
|
|
|
@ -27,5 +27,5 @@ $(obj)/vsyscall-sysenter.so $(obj)/vsyscall-syscall.so: \
|
|||
$(obj)/vsyscall-%.so: $(src)/vsyscall.lds $(obj)/vsyscall-%.o FORCE
|
||||
$(call if_changed,syscall)
|
||||
|
||||
AFLAGS_vsyscall-sysenter.o = -m32
|
||||
AFLAGS_vsyscall-syscall.o = -m32
|
||||
AFLAGS_vsyscall-sysenter.o = -m32 -Wa,-32
|
||||
AFLAGS_vsyscall-syscall.o = -m32 -Wa,-32
|
||||
|
|
|
@ -629,7 +629,7 @@ static __cpuinit void mce_remove_device(unsigned int cpu)
|
|||
#endif
|
||||
|
||||
/* Get notified when a cpu comes on/off. Be hotplug friendly. */
|
||||
static __cpuinit int
|
||||
static int
|
||||
mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
|
|
|
@ -482,7 +482,7 @@ static void threshold_remove_device(unsigned int cpu)
|
|||
#endif
|
||||
|
||||
/* get notified when a cpu comes on/off */
|
||||
static __cpuinit int threshold_cpu_callback(struct notifier_block *nfb,
|
||||
static int threshold_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
/* cpu was unsigned int to begin with */
|
||||
|
|
|
@ -112,10 +112,6 @@ static unsigned long alloc_iommu(int size)
|
|||
static void free_iommu(unsigned long offset, int size)
|
||||
{
|
||||
unsigned long flags;
|
||||
if (size == 1) {
|
||||
clear_bit(offset, iommu_gart_bitmap);
|
||||
return;
|
||||
}
|
||||
spin_lock_irqsave(&iommu_bitmap_lock, flags);
|
||||
__clear_bit_string(iommu_gart_bitmap, offset, size);
|
||||
spin_unlock_irqrestore(&iommu_bitmap_lock, flags);
|
||||
|
|
|
@ -188,11 +188,13 @@ void __init setup_node_zones(int nodeid)
|
|||
memory. */
|
||||
memmapsize = sizeof(struct page) * (end_pfn-start_pfn);
|
||||
limit = end_pfn << PAGE_SHIFT;
|
||||
#ifdef CONFIG_FLAT_NODE_MEM_MAP
|
||||
NODE_DATA(nodeid)->node_mem_map =
|
||||
__alloc_bootmem_core(NODE_DATA(nodeid)->bdata,
|
||||
memmapsize, SMP_CACHE_BYTES,
|
||||
round_down(limit - memmapsize, PAGE_SIZE),
|
||||
limit);
|
||||
#endif
|
||||
|
||||
size_zones(zones, holes, start_pfn, end_pfn);
|
||||
free_area_init_node(nodeid, NODE_DATA(nodeid), zones,
|
||||
|
|
|
@ -3385,7 +3385,7 @@ static int blk_cpu_notify(struct notifier_block *self, unsigned long action,
|
|||
}
|
||||
|
||||
|
||||
static struct notifier_block __devinitdata blk_cpu_notifier = {
|
||||
static struct notifier_block blk_cpu_notifier = {
|
||||
.notifier_call = blk_cpu_notify,
|
||||
};
|
||||
|
||||
|
|
|
@ -107,7 +107,7 @@ static int __cpuinit topology_remove_dev(struct sys_device * sys_dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __cpuinit topology_cpu_callback(struct notifier_block *nfb,
|
||||
static int topology_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
|
|
|
@ -889,7 +889,6 @@ extern int drm_lock_free(drm_device_t * dev,
|
|||
/* Buffer management support (drm_bufs.h) */
|
||||
extern int drm_addbufs_agp(drm_device_t * dev, drm_buf_desc_t * request);
|
||||
extern int drm_addbufs_pci(drm_device_t * dev, drm_buf_desc_t * request);
|
||||
extern int drm_addbufs_fb(drm_device_t *dev, drm_buf_desc_t *request);
|
||||
extern int drm_addmap(drm_device_t * dev, unsigned int offset,
|
||||
unsigned int size, drm_map_type_t type,
|
||||
drm_map_flags_t flags, drm_local_map_t ** map_ptr);
|
||||
|
|
|
@ -503,8 +503,6 @@ int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start)
|
|||
return agp_bind_memory(handle, start);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(drm_agp_bind_memory);
|
||||
|
||||
/** Calls agp_unbind_memory() */
|
||||
int drm_agp_unbind_memory(DRM_AGP_MEM * handle)
|
||||
{
|
||||
|
|
|
@ -386,7 +386,6 @@ int drm_rmmap_locked(drm_device_t *dev, drm_local_map_t *map)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_rmmap_locked);
|
||||
|
||||
int drm_rmmap(drm_device_t *dev, drm_local_map_t *map)
|
||||
{
|
||||
|
@ -398,7 +397,6 @@ int drm_rmmap(drm_device_t *dev, drm_local_map_t *map)
|
|||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_rmmap);
|
||||
|
||||
/* The rmmap ioctl appears to be unnecessary. All mappings are torn down on
|
||||
* the last close of the device, and this is necessary for cleanup when things
|
||||
|
@ -1053,7 +1051,7 @@ static int drm_addbufs_sg(drm_device_t * dev, drm_buf_desc_t * request)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request)
|
||||
static int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request)
|
||||
{
|
||||
drm_device_dma_t *dma = dev->dma;
|
||||
drm_buf_entry_t *entry;
|
||||
|
@ -1212,7 +1210,6 @@ int drm_addbufs_fb(drm_device_t * dev, drm_buf_desc_t * request)
|
|||
atomic_dec(&dev->buf_alloc);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_addbufs_fb);
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
@ -229,8 +229,6 @@ int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
|
|||
return ret;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(drm_get_dev);
|
||||
|
||||
/**
|
||||
* Put a device minor number.
|
||||
*
|
||||
|
|
|
@ -723,7 +723,7 @@ static int r300_scratch(drm_radeon_private_t *dev_priv,
|
|||
|
||||
dev_priv->scratch_ages[header.scratch.reg]++;
|
||||
|
||||
ref_age_base = *(u32 **)cmdbuf->buf;
|
||||
ref_age_base = (u32 *)(unsigned long)*((uint64_t *)cmdbuf->buf);
|
||||
|
||||
cmdbuf->buf += sizeof(u64);
|
||||
cmdbuf->bufsz -= sizeof(u64);
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/crash_dump.h>
|
||||
#include <linux/backing-dev.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/pipe_fs_i.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -578,6 +579,18 @@ static ssize_t write_null(struct file * file, const char __user * buf,
|
|||
return count;
|
||||
}
|
||||
|
||||
static int pipe_to_null(struct pipe_inode_info *info, struct pipe_buffer *buf,
|
||||
struct splice_desc *sd)
|
||||
{
|
||||
return sd->len;
|
||||
}
|
||||
|
||||
static ssize_t splice_write_null(struct pipe_inode_info *pipe,struct file *out,
|
||||
loff_t *ppos, size_t len, unsigned int flags)
|
||||
{
|
||||
return splice_from_pipe(pipe, out, ppos, len, flags, pipe_to_null);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
/*
|
||||
* For fun, we are using the MMU for this.
|
||||
|
@ -785,6 +798,7 @@ static struct file_operations null_fops = {
|
|||
.llseek = null_lseek,
|
||||
.read = read_null,
|
||||
.write = write_null,
|
||||
.splice_write = splice_write_null,
|
||||
};
|
||||
|
||||
#if defined(CONFIG_ISA) || !defined(__mc68000__)
|
||||
|
|
|
@ -390,7 +390,8 @@ scdrv_init(void)
|
|||
format_module_id(devnamep, geo_module(geoid),
|
||||
MODULE_FORMAT_BRIEF);
|
||||
devnamep = devname + strlen(devname);
|
||||
sprintf(devnamep, "#%d", geo_slab(geoid));
|
||||
sprintf(devnamep, "^%d#%d", geo_slot(geoid),
|
||||
geo_slab(geoid));
|
||||
|
||||
/* allocate sysctl device data */
|
||||
scd = kzalloc(sizeof (struct sysctl_data_s),
|
||||
|
|
|
@ -20,9 +20,18 @@ config TCG_TPM
|
|||
Note: For more TPM drivers enable CONFIG_PNP, CONFIG_ACPI
|
||||
and CONFIG_PNPACPI.
|
||||
|
||||
config TCG_TIS
|
||||
tristate "TPM Interface Specification 1.2 Interface"
|
||||
depends on TCG_TPM
|
||||
---help---
|
||||
If you have a TPM security chip that is compliant with the
|
||||
TCG TIS 1.2 TPM specification say Yes and it will be accessible
|
||||
from within Linux. To compile this driver as a module, choose
|
||||
M here; the module will be called tpm_tis.
|
||||
|
||||
config TCG_NSC
|
||||
tristate "National Semiconductor TPM Interface"
|
||||
depends on TCG_TPM
|
||||
depends on TCG_TPM && PNPACPI
|
||||
---help---
|
||||
If you have a TPM security chip from National Semicondutor
|
||||
say Yes and it will be accessible from within Linux. To
|
||||
|
|
|
@ -5,6 +5,7 @@ obj-$(CONFIG_TCG_TPM) += tpm.o
|
|||
ifdef CONFIG_ACPI
|
||||
obj-$(CONFIG_TCG_TPM) += tpm_bios.o
|
||||
endif
|
||||
obj-$(CONFIG_TCG_TIS) += tpm_tis.o
|
||||
obj-$(CONFIG_TCG_NSC) += tpm_nsc.o
|
||||
obj-$(CONFIG_TCG_ATMEL) += tpm_atmel.o
|
||||
obj-$(CONFIG_TCG_INFINEON) += tpm_infineon.o
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -42,18 +42,30 @@ extern ssize_t tpm_show_pcrs(struct device *, struct device_attribute *attr,
|
|||
char *);
|
||||
extern ssize_t tpm_show_caps(struct device *, struct device_attribute *attr,
|
||||
char *);
|
||||
extern ssize_t tpm_show_caps_1_2(struct device *, struct device_attribute *attr,
|
||||
char *);
|
||||
extern ssize_t tpm_store_cancel(struct device *, struct device_attribute *attr,
|
||||
const char *, size_t);
|
||||
extern ssize_t tpm_show_enabled(struct device *, struct device_attribute *attr,
|
||||
char *);
|
||||
extern ssize_t tpm_show_active(struct device *, struct device_attribute *attr,
|
||||
char *);
|
||||
extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr,
|
||||
char *);
|
||||
extern ssize_t tpm_show_temp_deactivated(struct device *,
|
||||
struct device_attribute *attr, char *);
|
||||
|
||||
struct tpm_chip;
|
||||
|
||||
struct tpm_vendor_specific {
|
||||
u8 req_complete_mask;
|
||||
u8 req_complete_val;
|
||||
u8 req_canceled;
|
||||
const u8 req_complete_mask;
|
||||
const u8 req_complete_val;
|
||||
const u8 req_canceled;
|
||||
void __iomem *iobase; /* ioremapped address */
|
||||
unsigned long base; /* TPM base address */
|
||||
|
||||
int irq;
|
||||
|
||||
int region_size;
|
||||
int have_region;
|
||||
|
||||
|
@ -63,6 +75,13 @@ struct tpm_vendor_specific {
|
|||
u8 (*status) (struct tpm_chip *);
|
||||
struct miscdevice miscdev;
|
||||
struct attribute_group *attr_group;
|
||||
struct list_head list;
|
||||
int locality;
|
||||
unsigned long timeout_a, timeout_b, timeout_c, timeout_d; /* jiffies */
|
||||
unsigned long duration[3]; /* jiffies */
|
||||
|
||||
wait_queue_head_t read_queue;
|
||||
wait_queue_head_t int_queue;
|
||||
};
|
||||
|
||||
struct tpm_chip {
|
||||
|
@ -81,13 +100,15 @@ struct tpm_chip {
|
|||
struct work_struct work;
|
||||
struct semaphore tpm_mutex; /* tpm is processing */
|
||||
|
||||
struct tpm_vendor_specific *vendor;
|
||||
struct tpm_vendor_specific vendor;
|
||||
|
||||
struct dentry **bios_dir;
|
||||
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
#define to_tpm_chip(n) container_of(n, struct tpm_chip, vendor)
|
||||
|
||||
static inline int tpm_read_index(int base, int index)
|
||||
{
|
||||
outb(index, base);
|
||||
|
@ -100,8 +121,12 @@ static inline void tpm_write_index(int base, int index, int value)
|
|||
outb(value & 0xFF, base+1);
|
||||
}
|
||||
|
||||
extern int tpm_register_hardware(struct device *,
|
||||
struct tpm_vendor_specific *);
|
||||
extern void tpm_get_timeouts(struct tpm_chip *);
|
||||
extern void tpm_gen_interrupt(struct tpm_chip *);
|
||||
extern void tpm_continue_selftest(struct tpm_chip *);
|
||||
extern unsigned long tpm_calc_ordinal_duration(struct tpm_chip *, u32);
|
||||
extern struct tpm_chip* tpm_register_hardware(struct device *,
|
||||
const struct tpm_vendor_specific *);
|
||||
extern int tpm_open(struct inode *, struct file *);
|
||||
extern int tpm_release(struct inode *, struct file *);
|
||||
extern ssize_t tpm_write(struct file *, const char __user *, size_t,
|
||||
|
|
|
@ -47,12 +47,12 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
return -EIO;
|
||||
|
||||
for (i = 0; i < 6; i++) {
|
||||
status = ioread8(chip->vendor->iobase + 1);
|
||||
status = ioread8(chip->vendor.iobase + 1);
|
||||
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
|
||||
dev_err(chip->dev, "error reading header\n");
|
||||
return -EIO;
|
||||
}
|
||||
*buf++ = ioread8(chip->vendor->iobase);
|
||||
*buf++ = ioread8(chip->vendor.iobase);
|
||||
}
|
||||
|
||||
/* size of the data received */
|
||||
|
@ -63,7 +63,7 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
dev_err(chip->dev,
|
||||
"Recv size(%d) less than available space\n", size);
|
||||
for (; i < size; i++) { /* clear the waiting data anyway */
|
||||
status = ioread8(chip->vendor->iobase + 1);
|
||||
status = ioread8(chip->vendor.iobase + 1);
|
||||
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
|
||||
dev_err(chip->dev, "error reading data\n");
|
||||
return -EIO;
|
||||
|
@ -74,16 +74,16 @@ static int tpm_atml_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
|
||||
/* read all the data available */
|
||||
for (; i < size; i++) {
|
||||
status = ioread8(chip->vendor->iobase + 1);
|
||||
status = ioread8(chip->vendor.iobase + 1);
|
||||
if ((status & ATML_STATUS_DATA_AVAIL) == 0) {
|
||||
dev_err(chip->dev, "error reading data\n");
|
||||
return -EIO;
|
||||
}
|
||||
*buf++ = ioread8(chip->vendor->iobase);
|
||||
*buf++ = ioread8(chip->vendor.iobase);
|
||||
}
|
||||
|
||||
/* make sure data available is gone */
|
||||
status = ioread8(chip->vendor->iobase + 1);
|
||||
status = ioread8(chip->vendor.iobase + 1);
|
||||
|
||||
if (status & ATML_STATUS_DATA_AVAIL) {
|
||||
dev_err(chip->dev, "data available is stuck\n");
|
||||
|
@ -100,7 +100,7 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
dev_dbg(chip->dev, "tpm_atml_send:\n");
|
||||
for (i = 0; i < count; i++) {
|
||||
dev_dbg(chip->dev, "%d 0x%x(%d)\n", i, buf[i], buf[i]);
|
||||
iowrite8(buf[i], chip->vendor->iobase);
|
||||
iowrite8(buf[i], chip->vendor.iobase);
|
||||
}
|
||||
|
||||
return count;
|
||||
|
@ -108,12 +108,12 @@ static int tpm_atml_send(struct tpm_chip *chip, u8 *buf, size_t count)
|
|||
|
||||
static void tpm_atml_cancel(struct tpm_chip *chip)
|
||||
{
|
||||
iowrite8(ATML_STATUS_ABORT, chip->vendor->iobase + 1);
|
||||
iowrite8(ATML_STATUS_ABORT, chip->vendor.iobase + 1);
|
||||
}
|
||||
|
||||
static u8 tpm_atml_status(struct tpm_chip *chip)
|
||||
{
|
||||
return ioread8(chip->vendor->iobase + 1);
|
||||
return ioread8(chip->vendor.iobase + 1);
|
||||
}
|
||||
|
||||
static struct file_operations atmel_ops = {
|
||||
|
@ -140,7 +140,7 @@ static struct attribute* atmel_attrs[] = {
|
|||
|
||||
static struct attribute_group atmel_attr_grp = { .attrs = atmel_attrs };
|
||||
|
||||
static struct tpm_vendor_specific tpm_atmel = {
|
||||
static const struct tpm_vendor_specific tpm_atmel = {
|
||||
.recv = tpm_atml_recv,
|
||||
.send = tpm_atml_send,
|
||||
.cancel = tpm_atml_cancel,
|
||||
|
@ -159,10 +159,10 @@ static void atml_plat_remove(void)
|
|||
struct tpm_chip *chip = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
if (chip) {
|
||||
if (chip->vendor->have_region)
|
||||
atmel_release_region(chip->vendor->base,
|
||||
chip->vendor->region_size);
|
||||
atmel_put_base_addr(chip->vendor);
|
||||
if (chip->vendor.have_region)
|
||||
atmel_release_region(chip->vendor.base,
|
||||
chip->vendor.region_size);
|
||||
atmel_put_base_addr(chip->vendor.iobase);
|
||||
tpm_remove_hardware(chip->dev);
|
||||
platform_device_unregister(pdev);
|
||||
}
|
||||
|
@ -179,18 +179,22 @@ static struct device_driver atml_drv = {
|
|||
static int __init init_atmel(void)
|
||||
{
|
||||
int rc = 0;
|
||||
void __iomem *iobase = NULL;
|
||||
int have_region, region_size;
|
||||
unsigned long base;
|
||||
struct tpm_chip *chip;
|
||||
|
||||
driver_register(&atml_drv);
|
||||
|
||||
if ((tpm_atmel.iobase = atmel_get_base_addr(&tpm_atmel)) == NULL) {
|
||||
if ((iobase = atmel_get_base_addr(&base, ®ion_size)) == NULL) {
|
||||
rc = -ENODEV;
|
||||
goto err_unreg_drv;
|
||||
}
|
||||
|
||||
tpm_atmel.have_region =
|
||||
have_region =
|
||||
(atmel_request_region
|
||||
(tpm_atmel.base, tpm_atmel.region_size,
|
||||
"tpm_atmel0") == NULL) ? 0 : 1;
|
||||
(tpm_atmel.base, region_size, "tpm_atmel0") == NULL) ? 0 : 1;
|
||||
|
||||
|
||||
if (IS_ERR
|
||||
(pdev =
|
||||
|
@ -199,17 +203,25 @@ static int __init init_atmel(void)
|
|||
goto err_rel_reg;
|
||||
}
|
||||
|
||||
if ((rc = tpm_register_hardware(&pdev->dev, &tpm_atmel)) < 0)
|
||||
if (!(chip = tpm_register_hardware(&pdev->dev, &tpm_atmel))) {
|
||||
rc = -ENODEV;
|
||||
goto err_unreg_dev;
|
||||
}
|
||||
|
||||
chip->vendor.iobase = iobase;
|
||||
chip->vendor.base = base;
|
||||
chip->vendor.have_region = have_region;
|
||||
chip->vendor.region_size = region_size;
|
||||
|
||||
return 0;
|
||||
|
||||
err_unreg_dev:
|
||||
platform_device_unregister(pdev);
|
||||
err_rel_reg:
|
||||
atmel_put_base_addr(&tpm_atmel);
|
||||
if (tpm_atmel.have_region)
|
||||
atmel_release_region(tpm_atmel.base,
|
||||
tpm_atmel.region_size);
|
||||
atmel_put_base_addr(iobase);
|
||||
if (have_region)
|
||||
atmel_release_region(base,
|
||||
region_size);
|
||||
err_unreg_drv:
|
||||
driver_unregister(&atml_drv);
|
||||
return rc;
|
||||
|
|
|
@ -28,13 +28,12 @@
|
|||
#define atmel_request_region request_mem_region
|
||||
#define atmel_release_region release_mem_region
|
||||
|
||||
static inline void atmel_put_base_addr(struct tpm_vendor_specific
|
||||
*vendor)
|
||||
static inline void atmel_put_base_addr(void __iomem *iobase)
|
||||
{
|
||||
iounmap(vendor->iobase);
|
||||
iounmap(iobase);
|
||||
}
|
||||
|
||||
static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific *vendor)
|
||||
static void __iomem * atmel_get_base_addr(unsigned long *base, int *region_size)
|
||||
{
|
||||
struct device_node *dn;
|
||||
unsigned long address, size;
|
||||
|
@ -71,9 +70,9 @@ static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific *vendor)
|
|||
else
|
||||
size = reg[naddrc];
|
||||
|
||||
vendor->base = address;
|
||||
vendor->region_size = size;
|
||||
return ioremap(vendor->base, vendor->region_size);
|
||||
*base = address;
|
||||
*region_size = size;
|
||||
return ioremap(*base, *region_size);
|
||||
}
|
||||
#else
|
||||
#define atmel_getb(chip, offset) inb(chip->vendor->base + offset)
|
||||
|
@ -106,14 +105,12 @@ static int atmel_verify_tpm11(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void atmel_put_base_addr(struct tpm_vendor_specific
|
||||
*vendor)
|
||||
static inline void atmel_put_base_addr(void __iomem *iobase)
|
||||
{
|
||||
}
|
||||
|
||||
/* Determine where to talk to device */
|
||||
static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific
|
||||
*vendor)
|
||||
static void __iomem * atmel_get_base_addr(unsigned long *base, int *region_size)
|
||||
{
|
||||
int lo, hi;
|
||||
|
||||
|
@ -123,9 +120,9 @@ static void __iomem * atmel_get_base_addr(struct tpm_vendor_specific
|
|||
lo = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_LO);
|
||||
hi = tpm_read_index(TPM_ADDR, TPM_ATMEL_BASE_ADDR_HI);
|
||||
|
||||
vendor->base = (hi << 8) | lo;
|
||||
vendor->region_size = 2;
|
||||
*base = (hi << 8) | lo;
|
||||
*region_size = 2;
|
||||
|
||||
return ioport_map(vendor->base, vendor->region_size);
|
||||
return ioport_map(*base, *region_size);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -29,6 +29,11 @@
|
|||
#define MAX_TEXT_EVENT 1000 /* Max event string length */
|
||||
#define ACPI_TCPA_SIG "TCPA" /* 0x41504354 /'TCPA' */
|
||||
|
||||
enum bios_platform_class {
|
||||
BIOS_CLIENT = 0x00,
|
||||
BIOS_SERVER = 0x01,
|
||||
};
|
||||
|
||||
struct tpm_bios_log {
|
||||
void *bios_event_log;
|
||||
void *bios_event_log_end;
|
||||
|
@ -36,9 +41,18 @@ struct tpm_bios_log {
|
|||
|
||||
struct acpi_tcpa {
|
||||
struct acpi_table_header hdr;
|
||||
u16 reserved;
|
||||
u32 log_max_len __attribute__ ((packed));
|
||||
u32 log_start_addr __attribute__ ((packed));
|
||||
u16 platform_class;
|
||||
union {
|
||||
struct client_hdr {
|
||||
u32 log_max_len __attribute__ ((packed));
|
||||
u64 log_start_addr __attribute__ ((packed));
|
||||
} client;
|
||||
struct server_hdr {
|
||||
u16 reserved;
|
||||
u64 log_max_len __attribute__ ((packed));
|
||||
u64 log_start_addr __attribute__ ((packed));
|
||||
} server;
|
||||
};
|
||||
};
|
||||
|
||||
struct tcpa_event {
|
||||
|
@ -120,6 +134,7 @@ static const char* tcpa_pc_event_id_strings[] = {
|
|||
"S-CRTM Version",
|
||||
"S-CRTM Contents",
|
||||
"S-CRTM POST Contents",
|
||||
"POST Contents",
|
||||
};
|
||||
|
||||
/* returns pointer to start of pos. entry of tcg log */
|
||||
|
@ -306,6 +321,7 @@ static int tpm_binary_bios_measurements_show(struct seq_file *m, void *v)
|
|||
/* 5th: delimiter */
|
||||
seq_putc(m, '\0');
|
||||
|
||||
kfree(eventname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -353,6 +369,7 @@ static int tpm_ascii_bios_measurements_show(struct seq_file *m, void *v)
|
|||
/* 4th: eventname <= max + \'0' delimiter */
|
||||
seq_printf(m, " %s\n", eventname);
|
||||
|
||||
kfree(eventname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -376,6 +393,7 @@ static int read_log(struct tpm_bios_log *log)
|
|||
struct acpi_tcpa *buff;
|
||||
acpi_status status;
|
||||
struct acpi_table_header *virt;
|
||||
u64 len, start;
|
||||
|
||||
if (log->bios_event_log != NULL) {
|
||||
printk(KERN_ERR
|
||||
|
@ -396,27 +414,37 @@ static int read_log(struct tpm_bios_log *log)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
if (buff->log_max_len == 0) {
|
||||
switch(buff->platform_class) {
|
||||
case BIOS_SERVER:
|
||||
len = buff->server.log_max_len;
|
||||
start = buff->server.log_start_addr;
|
||||
break;
|
||||
case BIOS_CLIENT:
|
||||
default:
|
||||
len = buff->client.log_max_len;
|
||||
start = buff->client.log_start_addr;
|
||||
break;
|
||||
}
|
||||
if (!len) {
|
||||
printk(KERN_ERR "%s: ERROR - TCPA log area empty\n", __func__);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* malloc EventLog space */
|
||||
log->bios_event_log = kmalloc(buff->log_max_len, GFP_KERNEL);
|
||||
log->bios_event_log = kmalloc(len, GFP_KERNEL);
|
||||
if (!log->bios_event_log) {
|
||||
printk
|
||||
("%s: ERROR - Not enough Memory for BIOS measurements\n",
|
||||
__func__);
|
||||
printk("%s: ERROR - Not enough Memory for BIOS measurements\n",
|
||||
__func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
log->bios_event_log_end = log->bios_event_log + buff->log_max_len;
|
||||
log->bios_event_log_end = log->bios_event_log + len;
|
||||
|
||||
acpi_os_map_memory(buff->log_start_addr, buff->log_max_len, (void *) &virt);
|
||||
acpi_os_map_memory(start, len, (void *) &virt);
|
||||
|
||||
memcpy(log->bios_event_log, virt, buff->log_max_len);
|
||||
memcpy(log->bios_event_log, virt, len);
|
||||
|
||||
acpi_os_unmap_memory(virt, buff->log_max_len);
|
||||
acpi_os_unmap_memory(virt, len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
* License.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/pnp.h>
|
||||
#include "tpm.h"
|
||||
|
||||
|
@ -104,7 +105,7 @@ static int empty_fifo(struct tpm_chip *chip, int clear_wrfifo)
|
|||
|
||||
if (clear_wrfifo) {
|
||||
for (i = 0; i < 4096; i++) {
|
||||
status = inb(chip->vendor->base + WRFIFO);
|
||||
status = inb(chip->vendor.base + WRFIFO);
|
||||
if (status == 0xff) {
|
||||
if (check == 5)
|
||||
break;
|
||||
|
@ -124,8 +125,8 @@ static int empty_fifo(struct tpm_chip *chip, int clear_wrfifo)
|
|||
*/
|
||||
i = 0;
|
||||
do {
|
||||
status = inb(chip->vendor->base + RDFIFO);
|
||||
status = inb(chip->vendor->base + STAT);
|
||||
status = inb(chip->vendor.base + RDFIFO);
|
||||
status = inb(chip->vendor.base + STAT);
|
||||
i++;
|
||||
if (i == TPM_MAX_TRIES)
|
||||
return -EIO;
|
||||
|
@ -138,7 +139,7 @@ static int wait(struct tpm_chip *chip, int wait_for_bit)
|
|||
int status;
|
||||
int i;
|
||||
for (i = 0; i < TPM_MAX_TRIES; i++) {
|
||||
status = inb(chip->vendor->base + STAT);
|
||||
status = inb(chip->vendor.base + STAT);
|
||||
/* check the status-register if wait_for_bit is set */
|
||||
if (status & 1 << wait_for_bit)
|
||||
break;
|
||||
|
@ -157,7 +158,7 @@ static int wait(struct tpm_chip *chip, int wait_for_bit)
|
|||
static void wait_and_send(struct tpm_chip *chip, u8 sendbyte)
|
||||
{
|
||||
wait(chip, STAT_XFE);
|
||||
outb(sendbyte, chip->vendor->base + WRFIFO);
|
||||
outb(sendbyte, chip->vendor.base + WRFIFO);
|
||||
}
|
||||
|
||||
/* Note: WTX means Waiting-Time-Extension. Whenever the TPM needs more
|
||||
|
@ -204,7 +205,7 @@ static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
ret = wait(chip, STAT_RDA);
|
||||
if (ret)
|
||||
return -EIO;
|
||||
buf[i] = inb(chip->vendor->base + RDFIFO);
|
||||
buf[i] = inb(chip->vendor.base + RDFIFO);
|
||||
}
|
||||
|
||||
if (buf[0] != TPM_VL_VER) {
|
||||
|
@ -219,7 +220,7 @@ static int tpm_inf_recv(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
|
||||
for (i = 0; i < size; i++) {
|
||||
wait(chip, STAT_RDA);
|
||||
buf[i] = inb(chip->vendor->base + RDFIFO);
|
||||
buf[i] = inb(chip->vendor.base + RDFIFO);
|
||||
}
|
||||
|
||||
if ((size == 0x6D00) && (buf[1] == 0x80)) {
|
||||
|
@ -268,7 +269,7 @@ static int tpm_inf_send(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
u8 count_high, count_low, count_4, count_3, count_2, count_1;
|
||||
|
||||
/* Disabling Reset, LP and IRQC */
|
||||
outb(RESET_LP_IRQC_DISABLE, chip->vendor->base + CMD);
|
||||
outb(RESET_LP_IRQC_DISABLE, chip->vendor.base + CMD);
|
||||
|
||||
ret = empty_fifo(chip, 1);
|
||||
if (ret) {
|
||||
|
@ -319,7 +320,7 @@ static void tpm_inf_cancel(struct tpm_chip *chip)
|
|||
|
||||
static u8 tpm_inf_status(struct tpm_chip *chip)
|
||||
{
|
||||
return inb(chip->vendor->base + STAT);
|
||||
return inb(chip->vendor.base + STAT);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
|
||||
|
@ -346,7 +347,7 @@ static struct file_operations inf_ops = {
|
|||
.release = tpm_release,
|
||||
};
|
||||
|
||||
static struct tpm_vendor_specific tpm_inf = {
|
||||
static const struct tpm_vendor_specific tpm_inf = {
|
||||
.recv = tpm_inf_recv,
|
||||
.send = tpm_inf_send,
|
||||
.cancel = tpm_inf_cancel,
|
||||
|
@ -375,6 +376,7 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
|
|||
int version[2];
|
||||
int productid[2];
|
||||
char chipname[20];
|
||||
struct tpm_chip *chip;
|
||||
|
||||
/* read IO-ports through PnP */
|
||||
if (pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) &&
|
||||
|
@ -395,14 +397,13 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
|
|||
goto err_last;
|
||||
}
|
||||
/* publish my base address and request region */
|
||||
tpm_inf.base = TPM_INF_BASE;
|
||||
if (request_region
|
||||
(tpm_inf.base, TPM_INF_PORT_LEN, "tpm_infineon0") == NULL) {
|
||||
(TPM_INF_BASE, TPM_INF_PORT_LEN, "tpm_infineon0") == NULL) {
|
||||
rc = -EINVAL;
|
||||
goto err_last;
|
||||
}
|
||||
if (request_region(TPM_INF_ADDR, TPM_INF_ADDR_LEN,
|
||||
"tpm_infineon0") == NULL) {
|
||||
if (request_region
|
||||
(TPM_INF_ADDR, TPM_INF_ADDR_LEN, "tpm_infineon0") == NULL) {
|
||||
rc = -EINVAL;
|
||||
goto err_last;
|
||||
}
|
||||
|
@ -442,9 +443,9 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
|
|||
|
||||
/* configure TPM with IO-ports */
|
||||
outb(IOLIMH, TPM_INF_ADDR);
|
||||
outb(((tpm_inf.base >> 8) & 0xff), TPM_INF_DATA);
|
||||
outb(((TPM_INF_BASE >> 8) & 0xff), TPM_INF_DATA);
|
||||
outb(IOLIML, TPM_INF_ADDR);
|
||||
outb((tpm_inf.base & 0xff), TPM_INF_DATA);
|
||||
outb((TPM_INF_BASE & 0xff), TPM_INF_DATA);
|
||||
|
||||
/* control if IO-ports are set correctly */
|
||||
outb(IOLIMH, TPM_INF_ADDR);
|
||||
|
@ -452,10 +453,10 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
|
|||
outb(IOLIML, TPM_INF_ADDR);
|
||||
iol = inb(TPM_INF_DATA);
|
||||
|
||||
if ((ioh << 8 | iol) != tpm_inf.base) {
|
||||
if ((ioh << 8 | iol) != TPM_INF_BASE) {
|
||||
dev_err(&dev->dev,
|
||||
"Could not set IO-ports to 0x%lx\n",
|
||||
tpm_inf.base);
|
||||
"Could not set IO-ports to 0x%x\n",
|
||||
TPM_INF_BASE);
|
||||
rc = -EIO;
|
||||
goto err_release_region;
|
||||
}
|
||||
|
@ -466,15 +467,15 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
|
|||
outb(DISABLE_REGISTER_PAIR, TPM_INF_ADDR);
|
||||
|
||||
/* disable RESET, LP and IRQC */
|
||||
outb(RESET_LP_IRQC_DISABLE, tpm_inf.base + CMD);
|
||||
outb(RESET_LP_IRQC_DISABLE, TPM_INF_BASE + CMD);
|
||||
|
||||
/* Finally, we're done, print some infos */
|
||||
dev_info(&dev->dev, "TPM found: "
|
||||
"config base 0x%x, "
|
||||
"io base 0x%x, "
|
||||
"chip version %02x%02x, "
|
||||
"vendor id %x%x (Infineon), "
|
||||
"product id %02x%02x"
|
||||
"chip version 0x%02x%02x, "
|
||||
"vendor id 0x%x%x (Infineon), "
|
||||
"product id 0x%02x%02x"
|
||||
"%s\n",
|
||||
TPM_INF_ADDR,
|
||||
TPM_INF_BASE,
|
||||
|
@ -482,11 +483,10 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
|
|||
vendorid[0], vendorid[1],
|
||||
productid[0], productid[1], chipname);
|
||||
|
||||
rc = tpm_register_hardware(&dev->dev, &tpm_inf);
|
||||
if (rc < 0) {
|
||||
rc = -ENODEV;
|
||||
if (!(chip = tpm_register_hardware(&dev->dev, &tpm_inf))) {
|
||||
goto err_release_region;
|
||||
}
|
||||
chip->vendor.base = TPM_INF_BASE;
|
||||
return 0;
|
||||
} else {
|
||||
rc = -ENODEV;
|
||||
|
@ -494,7 +494,7 @@ static int __devinit tpm_inf_pnp_probe(struct pnp_dev *dev,
|
|||
}
|
||||
|
||||
err_release_region:
|
||||
release_region(tpm_inf.base, TPM_INF_PORT_LEN);
|
||||
release_region(TPM_INF_BASE, TPM_INF_PORT_LEN);
|
||||
release_region(TPM_INF_ADDR, TPM_INF_ADDR_LEN);
|
||||
|
||||
err_last:
|
||||
|
@ -506,7 +506,8 @@ static __devexit void tpm_inf_pnp_remove(struct pnp_dev *dev)
|
|||
struct tpm_chip *chip = pnp_get_drvdata(dev);
|
||||
|
||||
if (chip) {
|
||||
release_region(chip->vendor->base, TPM_INF_PORT_LEN);
|
||||
release_region(TPM_INF_BASE, TPM_INF_PORT_LEN);
|
||||
release_region(TPM_INF_ADDR, TPM_INF_ADDR_LEN);
|
||||
tpm_remove_hardware(chip->dev);
|
||||
}
|
||||
}
|
||||
|
@ -520,7 +521,7 @@ static struct pnp_driver tpm_inf_pnp = {
|
|||
},
|
||||
.id_table = tpm_pnp_tbl,
|
||||
.probe = tpm_inf_pnp_probe,
|
||||
.remove = tpm_inf_pnp_remove,
|
||||
.remove = __devexit_p(tpm_inf_pnp_remove),
|
||||
};
|
||||
|
||||
static int __init init_inf(void)
|
||||
|
@ -538,5 +539,5 @@ module_exit(cleanup_inf);
|
|||
|
||||
MODULE_AUTHOR("Marcel Selhorst <selhorst@crypto.rub.de>");
|
||||
MODULE_DESCRIPTION("Driver for Infineon TPM SLD 9630 TT 1.1 / SLB 9635 TT 1.2");
|
||||
MODULE_VERSION("1.7");
|
||||
MODULE_VERSION("1.8");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -71,7 +71,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, u8 val, u8 * data)
|
|||
unsigned long stop;
|
||||
|
||||
/* status immediately available check */
|
||||
*data = inb(chip->vendor->base + NSC_STATUS);
|
||||
*data = inb(chip->vendor.base + NSC_STATUS);
|
||||
if ((*data & mask) == val)
|
||||
return 0;
|
||||
|
||||
|
@ -79,7 +79,7 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, u8 val, u8 * data)
|
|||
stop = jiffies + 10 * HZ;
|
||||
do {
|
||||
msleep(TPM_TIMEOUT);
|
||||
*data = inb(chip->vendor->base + 1);
|
||||
*data = inb(chip->vendor.base + 1);
|
||||
if ((*data & mask) == val)
|
||||
return 0;
|
||||
}
|
||||
|
@ -94,9 +94,9 @@ static int nsc_wait_for_ready(struct tpm_chip *chip)
|
|||
unsigned long stop;
|
||||
|
||||
/* status immediately available check */
|
||||
status = inb(chip->vendor->base + NSC_STATUS);
|
||||
status = inb(chip->vendor.base + NSC_STATUS);
|
||||
if (status & NSC_STATUS_OBF)
|
||||
status = inb(chip->vendor->base + NSC_DATA);
|
||||
status = inb(chip->vendor.base + NSC_DATA);
|
||||
if (status & NSC_STATUS_RDY)
|
||||
return 0;
|
||||
|
||||
|
@ -104,9 +104,9 @@ static int nsc_wait_for_ready(struct tpm_chip *chip)
|
|||
stop = jiffies + 100;
|
||||
do {
|
||||
msleep(TPM_TIMEOUT);
|
||||
status = inb(chip->vendor->base + NSC_STATUS);
|
||||
status = inb(chip->vendor.base + NSC_STATUS);
|
||||
if (status & NSC_STATUS_OBF)
|
||||
status = inb(chip->vendor->base + NSC_DATA);
|
||||
status = inb(chip->vendor.base + NSC_DATA);
|
||||
if (status & NSC_STATUS_RDY)
|
||||
return 0;
|
||||
}
|
||||
|
@ -132,7 +132,7 @@ static int tpm_nsc_recv(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
return -EIO;
|
||||
}
|
||||
if ((data =
|
||||
inb(chip->vendor->base + NSC_DATA)) != NSC_COMMAND_NORMAL) {
|
||||
inb(chip->vendor.base + NSC_DATA)) != NSC_COMMAND_NORMAL) {
|
||||
dev_err(chip->dev, "not in normal mode (0x%x)\n",
|
||||
data);
|
||||
return -EIO;
|
||||
|
@ -148,7 +148,7 @@ static int tpm_nsc_recv(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
}
|
||||
if (data & NSC_STATUS_F0)
|
||||
break;
|
||||
*p = inb(chip->vendor->base + NSC_DATA);
|
||||
*p = inb(chip->vendor.base + NSC_DATA);
|
||||
}
|
||||
|
||||
if ((data & NSC_STATUS_F0) == 0 &&
|
||||
|
@ -156,7 +156,7 @@ static int tpm_nsc_recv(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
dev_err(chip->dev, "F0 not set\n");
|
||||
return -EIO;
|
||||
}
|
||||
if ((data = inb(chip->vendor->base + NSC_DATA)) != NSC_COMMAND_EOC) {
|
||||
if ((data = inb(chip->vendor.base + NSC_DATA)) != NSC_COMMAND_EOC) {
|
||||
dev_err(chip->dev,
|
||||
"expected end of command(0x%x)\n", data);
|
||||
return -EIO;
|
||||
|
@ -182,7 +182,7 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
* fix it. Not sure why this is needed, we followed the flow
|
||||
* chart in the manual to the letter.
|
||||
*/
|
||||
outb(NSC_COMMAND_CANCEL, chip->vendor->base + NSC_COMMAND);
|
||||
outb(NSC_COMMAND_CANCEL, chip->vendor.base + NSC_COMMAND);
|
||||
|
||||
if (nsc_wait_for_ready(chip) != 0)
|
||||
return -EIO;
|
||||
|
@ -192,7 +192,7 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
outb(NSC_COMMAND_NORMAL, chip->vendor->base + NSC_COMMAND);
|
||||
outb(NSC_COMMAND_NORMAL, chip->vendor.base + NSC_COMMAND);
|
||||
if (wait_for_stat(chip, NSC_STATUS_IBR, NSC_STATUS_IBR, &data) < 0) {
|
||||
dev_err(chip->dev, "IBR timeout\n");
|
||||
return -EIO;
|
||||
|
@ -204,26 +204,26 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
|
|||
"IBF timeout (while writing data)\n");
|
||||
return -EIO;
|
||||
}
|
||||
outb(buf[i], chip->vendor->base + NSC_DATA);
|
||||
outb(buf[i], chip->vendor.base + NSC_DATA);
|
||||
}
|
||||
|
||||
if (wait_for_stat(chip, NSC_STATUS_IBF, 0, &data) < 0) {
|
||||
dev_err(chip->dev, "IBF timeout\n");
|
||||
return -EIO;
|
||||
}
|
||||
outb(NSC_COMMAND_EOC, chip->vendor->base + NSC_COMMAND);
|
||||
outb(NSC_COMMAND_EOC, chip->vendor.base + NSC_COMMAND);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static void tpm_nsc_cancel(struct tpm_chip *chip)
|
||||
{
|
||||
outb(NSC_COMMAND_CANCEL, chip->vendor->base + NSC_COMMAND);
|
||||
outb(NSC_COMMAND_CANCEL, chip->vendor.base + NSC_COMMAND);
|
||||
}
|
||||
|
||||
static u8 tpm_nsc_status(struct tpm_chip *chip)
|
||||
{
|
||||
return inb(chip->vendor->base + NSC_STATUS);
|
||||
return inb(chip->vendor.base + NSC_STATUS);
|
||||
}
|
||||
|
||||
static struct file_operations nsc_ops = {
|
||||
|
@ -250,7 +250,7 @@ static struct attribute * nsc_attrs[] = {
|
|||
|
||||
static struct attribute_group nsc_attr_grp = { .attrs = nsc_attrs };
|
||||
|
||||
static struct tpm_vendor_specific tpm_nsc = {
|
||||
static const struct tpm_vendor_specific tpm_nsc = {
|
||||
.recv = tpm_nsc_recv,
|
||||
.send = tpm_nsc_send,
|
||||
.cancel = tpm_nsc_cancel,
|
||||
|
@ -268,7 +268,7 @@ static void __devexit tpm_nsc_remove(struct device *dev)
|
|||
{
|
||||
struct tpm_chip *chip = dev_get_drvdata(dev);
|
||||
if ( chip ) {
|
||||
release_region(chip->vendor->base, 2);
|
||||
release_region(chip->vendor.base, 2);
|
||||
tpm_remove_hardware(chip->dev);
|
||||
}
|
||||
}
|
||||
|
@ -286,7 +286,8 @@ static int __init init_nsc(void)
|
|||
int rc = 0;
|
||||
int lo, hi;
|
||||
int nscAddrBase = TPM_ADDR;
|
||||
|
||||
struct tpm_chip *chip;
|
||||
unsigned long base;
|
||||
|
||||
/* verify that it is a National part (SID) */
|
||||
if (tpm_read_index(TPM_ADDR, NSC_SID_INDEX) != 0xEF) {
|
||||
|
@ -300,7 +301,7 @@ static int __init init_nsc(void)
|
|||
|
||||
hi = tpm_read_index(nscAddrBase, TPM_NSC_BASE0_HI);
|
||||
lo = tpm_read_index(nscAddrBase, TPM_NSC_BASE0_LO);
|
||||
tpm_nsc.base = (hi<<8) | lo;
|
||||
base = (hi<<8) | lo;
|
||||
|
||||
/* enable the DPM module */
|
||||
tpm_write_index(nscAddrBase, NSC_LDC_INDEX, 0x01);
|
||||
|
@ -320,13 +321,15 @@ static int __init init_nsc(void)
|
|||
if ((rc = platform_device_register(pdev)) < 0)
|
||||
goto err_free_dev;
|
||||
|
||||
if (request_region(tpm_nsc.base, 2, "tpm_nsc0") == NULL ) {
|
||||
if (request_region(base, 2, "tpm_nsc0") == NULL ) {
|
||||
rc = -EBUSY;
|
||||
goto err_unreg_dev;
|
||||
}
|
||||
|
||||
if ((rc = tpm_register_hardware(&pdev->dev, &tpm_nsc)) < 0)
|
||||
if (!(chip = tpm_register_hardware(&pdev->dev, &tpm_nsc))) {
|
||||
rc = -ENODEV;
|
||||
goto err_rel_reg;
|
||||
}
|
||||
|
||||
dev_dbg(&pdev->dev, "NSC TPM detected\n");
|
||||
dev_dbg(&pdev->dev,
|
||||
|
@ -361,10 +364,12 @@ static int __init init_nsc(void)
|
|||
"NSC TPM revision %d\n",
|
||||
tpm_read_index(nscAddrBase, 0x27) & 0x1F);
|
||||
|
||||
chip->vendor.base = base;
|
||||
|
||||
return 0;
|
||||
|
||||
err_rel_reg:
|
||||
release_region(tpm_nsc.base, 2);
|
||||
release_region(base, 2);
|
||||
err_unreg_dev:
|
||||
platform_device_unregister(pdev);
|
||||
err_free_dev:
|
||||
|
|
|
@ -0,0 +1,669 @@
|
|||
/*
|
||||
* Copyright (C) 2005, 2006 IBM Corporation
|
||||
*
|
||||
* Authors:
|
||||
* Leendert van Doorn <leendert@watson.ibm.com>
|
||||
* Kylene Hall <kjhall@us.ibm.com>
|
||||
*
|
||||
* Device driver for TCG/TCPA TPM (trusted platform module).
|
||||
* Specifications at www.trustedcomputinggroup.org
|
||||
*
|
||||
* This device driver implements the TPM interface as defined in
|
||||
* the TCG TPM Interface Spec version 1.2, revision 1.0.
|
||||
*
|
||||
* 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, version 2 of the
|
||||
* License.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/pnp.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/wait.h>
|
||||
#include "tpm.h"
|
||||
|
||||
#define TPM_HEADER_SIZE 10
|
||||
|
||||
enum tis_access {
|
||||
TPM_ACCESS_VALID = 0x80,
|
||||
TPM_ACCESS_ACTIVE_LOCALITY = 0x20,
|
||||
TPM_ACCESS_REQUEST_PENDING = 0x04,
|
||||
TPM_ACCESS_REQUEST_USE = 0x02,
|
||||
};
|
||||
|
||||
enum tis_status {
|
||||
TPM_STS_VALID = 0x80,
|
||||
TPM_STS_COMMAND_READY = 0x40,
|
||||
TPM_STS_GO = 0x20,
|
||||
TPM_STS_DATA_AVAIL = 0x10,
|
||||
TPM_STS_DATA_EXPECT = 0x08,
|
||||
};
|
||||
|
||||
enum tis_int_flags {
|
||||
TPM_GLOBAL_INT_ENABLE = 0x80000000,
|
||||
TPM_INTF_BURST_COUNT_STATIC = 0x100,
|
||||
TPM_INTF_CMD_READY_INT = 0x080,
|
||||
TPM_INTF_INT_EDGE_FALLING = 0x040,
|
||||
TPM_INTF_INT_EDGE_RISING = 0x020,
|
||||
TPM_INTF_INT_LEVEL_LOW = 0x010,
|
||||
TPM_INTF_INT_LEVEL_HIGH = 0x008,
|
||||
TPM_INTF_LOCALITY_CHANGE_INT = 0x004,
|
||||
TPM_INTF_STS_VALID_INT = 0x002,
|
||||
TPM_INTF_DATA_AVAIL_INT = 0x001,
|
||||
};
|
||||
|
||||
enum tis_defaults {
|
||||
TIS_MEM_BASE = 0xFED4000,
|
||||
TIS_MEM_LEN = 0x5000,
|
||||
TIS_SHORT_TIMEOUT = 750, /* ms */
|
||||
TIS_LONG_TIMEOUT = 2000, /* 2 sec */
|
||||
};
|
||||
|
||||
#define TPM_ACCESS(l) (0x0000 | ((l) << 12))
|
||||
#define TPM_INT_ENABLE(l) (0x0008 | ((l) << 12))
|
||||
#define TPM_INT_VECTOR(l) (0x000C | ((l) << 12))
|
||||
#define TPM_INT_STATUS(l) (0x0010 | ((l) << 12))
|
||||
#define TPM_INTF_CAPS(l) (0x0014 | ((l) << 12))
|
||||
#define TPM_STS(l) (0x0018 | ((l) << 12))
|
||||
#define TPM_DATA_FIFO(l) (0x0024 | ((l) << 12))
|
||||
|
||||
#define TPM_DID_VID(l) (0x0F00 | ((l) << 12))
|
||||
#define TPM_RID(l) (0x0F04 | ((l) << 12))
|
||||
|
||||
static LIST_HEAD(tis_chips);
|
||||
static DEFINE_SPINLOCK(tis_lock);
|
||||
|
||||
static int check_locality(struct tpm_chip *chip, int l)
|
||||
{
|
||||
if ((ioread8(chip->vendor.iobase + TPM_ACCESS(l)) &
|
||||
(TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) ==
|
||||
(TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID))
|
||||
return chip->vendor.locality = l;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void release_locality(struct tpm_chip *chip, int l, int force)
|
||||
{
|
||||
if (force || (ioread8(chip->vendor.iobase + TPM_ACCESS(l)) &
|
||||
(TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID)) ==
|
||||
(TPM_ACCESS_REQUEST_PENDING | TPM_ACCESS_VALID))
|
||||
iowrite8(TPM_ACCESS_ACTIVE_LOCALITY,
|
||||
chip->vendor.iobase + TPM_ACCESS(l));
|
||||
}
|
||||
|
||||
static int request_locality(struct tpm_chip *chip, int l)
|
||||
{
|
||||
unsigned long stop;
|
||||
long rc;
|
||||
|
||||
if (check_locality(chip, l) >= 0)
|
||||
return l;
|
||||
|
||||
iowrite8(TPM_ACCESS_REQUEST_USE,
|
||||
chip->vendor.iobase + TPM_ACCESS(l));
|
||||
|
||||
if (chip->vendor.irq) {
|
||||
rc = wait_event_interruptible_timeout(chip->vendor.int_queue,
|
||||
(check_locality
|
||||
(chip, l) >= 0),
|
||||
chip->vendor.timeout_a);
|
||||
if (rc > 0)
|
||||
return l;
|
||||
|
||||
} else {
|
||||
/* wait for burstcount */
|
||||
stop = jiffies + chip->vendor.timeout_a;
|
||||
do {
|
||||
if (check_locality(chip, l) >= 0)
|
||||
return l;
|
||||
msleep(TPM_TIMEOUT);
|
||||
}
|
||||
while (time_before(jiffies, stop));
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static u8 tpm_tis_status(struct tpm_chip *chip)
|
||||
{
|
||||
return ioread8(chip->vendor.iobase +
|
||||
TPM_STS(chip->vendor.locality));
|
||||
}
|
||||
|
||||
static void tpm_tis_ready(struct tpm_chip *chip)
|
||||
{
|
||||
/* this causes the current command to be aborted */
|
||||
iowrite8(TPM_STS_COMMAND_READY,
|
||||
chip->vendor.iobase + TPM_STS(chip->vendor.locality));
|
||||
}
|
||||
|
||||
static int get_burstcount(struct tpm_chip *chip)
|
||||
{
|
||||
unsigned long stop;
|
||||
int burstcnt;
|
||||
|
||||
/* wait for burstcount */
|
||||
/* which timeout value, spec has 2 answers (c & d) */
|
||||
stop = jiffies + chip->vendor.timeout_d;
|
||||
do {
|
||||
burstcnt = ioread8(chip->vendor.iobase +
|
||||
TPM_STS(chip->vendor.locality) + 1);
|
||||
burstcnt += ioread8(chip->vendor.iobase +
|
||||
TPM_STS(chip->vendor.locality) +
|
||||
2) << 8;
|
||||
if (burstcnt)
|
||||
return burstcnt;
|
||||
msleep(TPM_TIMEOUT);
|
||||
} while (time_before(jiffies, stop));
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static int wait_for_stat(struct tpm_chip *chip, u8 mask, unsigned long timeout,
|
||||
wait_queue_head_t *queue)
|
||||
{
|
||||
unsigned long stop;
|
||||
long rc;
|
||||
u8 status;
|
||||
|
||||
/* check current status */
|
||||
status = tpm_tis_status(chip);
|
||||
if ((status & mask) == mask)
|
||||
return 0;
|
||||
|
||||
if (chip->vendor.irq) {
|
||||
rc = wait_event_interruptible_timeout(*queue,
|
||||
((tpm_tis_status
|
||||
(chip) & mask) ==
|
||||
mask), timeout);
|
||||
if (rc > 0)
|
||||
return 0;
|
||||
} else {
|
||||
stop = jiffies + timeout;
|
||||
do {
|
||||
msleep(TPM_TIMEOUT);
|
||||
status = tpm_tis_status(chip);
|
||||
if ((status & mask) == mask)
|
||||
return 0;
|
||||
} while (time_before(jiffies, stop));
|
||||
}
|
||||
return -ETIME;
|
||||
}
|
||||
|
||||
static int recv_data(struct tpm_chip *chip, u8 *buf, size_t count)
|
||||
{
|
||||
int size = 0, burstcnt;
|
||||
while (size < count &&
|
||||
wait_for_stat(chip,
|
||||
TPM_STS_DATA_AVAIL | TPM_STS_VALID,
|
||||
chip->vendor.timeout_c,
|
||||
&chip->vendor.read_queue)
|
||||
== 0) {
|
||||
burstcnt = get_burstcount(chip);
|
||||
for (; burstcnt > 0 && size < count; burstcnt--)
|
||||
buf[size++] = ioread8(chip->vendor.iobase +
|
||||
TPM_DATA_FIFO(chip->vendor.
|
||||
locality));
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
static int tpm_tis_recv(struct tpm_chip *chip, u8 *buf, size_t count)
|
||||
{
|
||||
int size = 0;
|
||||
int expected, status;
|
||||
|
||||
if (count < TPM_HEADER_SIZE) {
|
||||
size = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* read first 10 bytes, including tag, paramsize, and result */
|
||||
if ((size =
|
||||
recv_data(chip, buf, TPM_HEADER_SIZE)) < TPM_HEADER_SIZE) {
|
||||
dev_err(chip->dev, "Unable to read header\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
expected = be32_to_cpu(*(__be32 *) (buf + 2));
|
||||
if (expected > count) {
|
||||
size = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if ((size +=
|
||||
recv_data(chip, &buf[TPM_HEADER_SIZE],
|
||||
expected - TPM_HEADER_SIZE)) < expected) {
|
||||
dev_err(chip->dev, "Unable to read remainder of result\n");
|
||||
size = -ETIME;
|
||||
goto out;
|
||||
}
|
||||
|
||||
wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
|
||||
&chip->vendor.int_queue);
|
||||
status = tpm_tis_status(chip);
|
||||
if (status & TPM_STS_DATA_AVAIL) { /* retry? */
|
||||
dev_err(chip->dev, "Error left over data\n");
|
||||
size = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
tpm_tis_ready(chip);
|
||||
release_locality(chip, chip->vendor.locality, 0);
|
||||
return size;
|
||||
}
|
||||
|
||||
/*
|
||||
* If interrupts are used (signaled by an irq set in the vendor structure)
|
||||
* tpm.c can skip polling for the data to be available as the interrupt is
|
||||
* waited for here
|
||||
*/
|
||||
static int tpm_tis_send(struct tpm_chip *chip, u8 *buf, size_t len)
|
||||
{
|
||||
int rc, status, burstcnt;
|
||||
size_t count = 0;
|
||||
u32 ordinal;
|
||||
|
||||
if (request_locality(chip, 0) < 0)
|
||||
return -EBUSY;
|
||||
|
||||
status = tpm_tis_status(chip);
|
||||
if ((status & TPM_STS_COMMAND_READY) == 0) {
|
||||
tpm_tis_ready(chip);
|
||||
if (wait_for_stat
|
||||
(chip, TPM_STS_COMMAND_READY, chip->vendor.timeout_b,
|
||||
&chip->vendor.int_queue) < 0) {
|
||||
rc = -ETIME;
|
||||
goto out_err;
|
||||
}
|
||||
}
|
||||
|
||||
while (count < len - 1) {
|
||||
burstcnt = get_burstcount(chip);
|
||||
for (; burstcnt > 0 && count < len - 1; burstcnt--) {
|
||||
iowrite8(buf[count], chip->vendor.iobase +
|
||||
TPM_DATA_FIFO(chip->vendor.locality));
|
||||
count++;
|
||||
}
|
||||
|
||||
wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
|
||||
&chip->vendor.int_queue);
|
||||
status = tpm_tis_status(chip);
|
||||
if ((status & TPM_STS_DATA_EXPECT) == 0) {
|
||||
rc = -EIO;
|
||||
goto out_err;
|
||||
}
|
||||
}
|
||||
|
||||
/* write last byte */
|
||||
iowrite8(buf[count],
|
||||
chip->vendor.iobase +
|
||||
TPM_DATA_FIFO(chip->vendor.locality));
|
||||
wait_for_stat(chip, TPM_STS_VALID, chip->vendor.timeout_c,
|
||||
&chip->vendor.int_queue);
|
||||
status = tpm_tis_status(chip);
|
||||
if ((status & TPM_STS_DATA_EXPECT) != 0) {
|
||||
rc = -EIO;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/* go and do it */
|
||||
iowrite8(TPM_STS_GO,
|
||||
chip->vendor.iobase + TPM_STS(chip->vendor.locality));
|
||||
|
||||
if (chip->vendor.irq) {
|
||||
ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));
|
||||
if (wait_for_stat
|
||||
(chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID,
|
||||
tpm_calc_ordinal_duration(chip, ordinal),
|
||||
&chip->vendor.read_queue) < 0) {
|
||||
rc = -ETIME;
|
||||
goto out_err;
|
||||
}
|
||||
}
|
||||
return len;
|
||||
out_err:
|
||||
tpm_tis_ready(chip);
|
||||
release_locality(chip, chip->vendor.locality, 0);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static struct file_operations tis_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.llseek = no_llseek,
|
||||
.open = tpm_open,
|
||||
.read = tpm_read,
|
||||
.write = tpm_write,
|
||||
.release = tpm_release,
|
||||
};
|
||||
|
||||
static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
|
||||
static DEVICE_ATTR(pcrs, S_IRUGO, tpm_show_pcrs, NULL);
|
||||
static DEVICE_ATTR(enabled, S_IRUGO, tpm_show_enabled, NULL);
|
||||
static DEVICE_ATTR(active, S_IRUGO, tpm_show_active, NULL);
|
||||
static DEVICE_ATTR(owned, S_IRUGO, tpm_show_owned, NULL);
|
||||
static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated,
|
||||
NULL);
|
||||
static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL);
|
||||
static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel);
|
||||
|
||||
static struct attribute *tis_attrs[] = {
|
||||
&dev_attr_pubek.attr,
|
||||
&dev_attr_pcrs.attr,
|
||||
&dev_attr_enabled.attr,
|
||||
&dev_attr_active.attr,
|
||||
&dev_attr_owned.attr,
|
||||
&dev_attr_temp_deactivated.attr,
|
||||
&dev_attr_caps.attr,
|
||||
&dev_attr_cancel.attr, NULL,
|
||||
};
|
||||
|
||||
static struct attribute_group tis_attr_grp = {
|
||||
.attrs = tis_attrs
|
||||
};
|
||||
|
||||
static struct tpm_vendor_specific tpm_tis = {
|
||||
.status = tpm_tis_status,
|
||||
.recv = tpm_tis_recv,
|
||||
.send = tpm_tis_send,
|
||||
.cancel = tpm_tis_ready,
|
||||
.req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
|
||||
.req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
|
||||
.req_canceled = TPM_STS_COMMAND_READY,
|
||||
.attr_group = &tis_attr_grp,
|
||||
.miscdev = {
|
||||
.fops = &tis_ops,},
|
||||
};
|
||||
|
||||
static irqreturn_t tis_int_probe(int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
struct tpm_chip *chip = (struct tpm_chip *) dev_id;
|
||||
u32 interrupt;
|
||||
|
||||
interrupt = ioread32(chip->vendor.iobase +
|
||||
TPM_INT_STATUS(chip->vendor.locality));
|
||||
|
||||
if (interrupt == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
chip->vendor.irq = irq;
|
||||
|
||||
/* Clear interrupts handled with TPM_EOI */
|
||||
iowrite32(interrupt,
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_STATUS(chip->vendor.locality));
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static irqreturn_t tis_int_handler(int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
struct tpm_chip *chip = (struct tpm_chip *) dev_id;
|
||||
u32 interrupt;
|
||||
int i;
|
||||
|
||||
interrupt = ioread32(chip->vendor.iobase +
|
||||
TPM_INT_STATUS(chip->vendor.locality));
|
||||
|
||||
if (interrupt == 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
if (interrupt & TPM_INTF_DATA_AVAIL_INT)
|
||||
wake_up_interruptible(&chip->vendor.read_queue);
|
||||
if (interrupt & TPM_INTF_LOCALITY_CHANGE_INT)
|
||||
for (i = 0; i < 5; i++)
|
||||
if (check_locality(chip, i) >= 0)
|
||||
break;
|
||||
if (interrupt &
|
||||
(TPM_INTF_LOCALITY_CHANGE_INT | TPM_INTF_STS_VALID_INT |
|
||||
TPM_INTF_CMD_READY_INT))
|
||||
wake_up_interruptible(&chip->vendor.int_queue);
|
||||
|
||||
/* Clear interrupts handled with TPM_EOI */
|
||||
iowrite32(interrupt,
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_STATUS(chip->vendor.locality));
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int interrupts = 1;
|
||||
module_param(interrupts, bool, 0444);
|
||||
MODULE_PARM_DESC(interrupts, "Enable interrupts");
|
||||
|
||||
static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev,
|
||||
const struct pnp_device_id *pnp_id)
|
||||
{
|
||||
u32 vendor, intfcaps, intmask;
|
||||
int rc, i;
|
||||
unsigned long start, len;
|
||||
struct tpm_chip *chip;
|
||||
|
||||
start = pnp_mem_start(pnp_dev, 0);
|
||||
len = pnp_mem_len(pnp_dev, 0);
|
||||
|
||||
if (!start)
|
||||
start = TIS_MEM_BASE;
|
||||
if (!len)
|
||||
len = TIS_MEM_LEN;
|
||||
|
||||
if (!(chip = tpm_register_hardware(&pnp_dev->dev, &tpm_tis)))
|
||||
return -ENODEV;
|
||||
|
||||
chip->vendor.iobase = ioremap(start, len);
|
||||
if (!chip->vendor.iobase) {
|
||||
rc = -EIO;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0));
|
||||
if ((vendor & 0xFFFF) == 0xFFFF) {
|
||||
rc = -ENODEV;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/* Default timeouts */
|
||||
chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
|
||||
chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT);
|
||||
chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
|
||||
chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
|
||||
|
||||
dev_info(&pnp_dev->dev,
|
||||
"1.2 TPM (device-id 0x%X, rev-id %d)\n",
|
||||
vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0)));
|
||||
|
||||
/* Figure out the capabilities */
|
||||
intfcaps =
|
||||
ioread32(chip->vendor.iobase +
|
||||
TPM_INTF_CAPS(chip->vendor.locality));
|
||||
dev_dbg(&pnp_dev->dev, "TPM interface capabilities (0x%x):\n",
|
||||
intfcaps);
|
||||
if (intfcaps & TPM_INTF_BURST_COUNT_STATIC)
|
||||
dev_dbg(&pnp_dev->dev, "\tBurst Count Static\n");
|
||||
if (intfcaps & TPM_INTF_CMD_READY_INT)
|
||||
dev_dbg(&pnp_dev->dev, "\tCommand Ready Int Support\n");
|
||||
if (intfcaps & TPM_INTF_INT_EDGE_FALLING)
|
||||
dev_dbg(&pnp_dev->dev, "\tInterrupt Edge Falling\n");
|
||||
if (intfcaps & TPM_INTF_INT_EDGE_RISING)
|
||||
dev_dbg(&pnp_dev->dev, "\tInterrupt Edge Rising\n");
|
||||
if (intfcaps & TPM_INTF_INT_LEVEL_LOW)
|
||||
dev_dbg(&pnp_dev->dev, "\tInterrupt Level Low\n");
|
||||
if (intfcaps & TPM_INTF_INT_LEVEL_HIGH)
|
||||
dev_dbg(&pnp_dev->dev, "\tInterrupt Level High\n");
|
||||
if (intfcaps & TPM_INTF_LOCALITY_CHANGE_INT)
|
||||
dev_dbg(&pnp_dev->dev, "\tLocality Change Int Support\n");
|
||||
if (intfcaps & TPM_INTF_STS_VALID_INT)
|
||||
dev_dbg(&pnp_dev->dev, "\tSts Valid Int Support\n");
|
||||
if (intfcaps & TPM_INTF_DATA_AVAIL_INT)
|
||||
dev_dbg(&pnp_dev->dev, "\tData Avail Int Support\n");
|
||||
|
||||
if (request_locality(chip, 0) != 0) {
|
||||
rc = -ENODEV;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/* INTERRUPT Setup */
|
||||
init_waitqueue_head(&chip->vendor.read_queue);
|
||||
init_waitqueue_head(&chip->vendor.int_queue);
|
||||
|
||||
intmask =
|
||||
ioread32(chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.locality));
|
||||
|
||||
intmask |= TPM_INTF_CMD_READY_INT
|
||||
| TPM_INTF_LOCALITY_CHANGE_INT | TPM_INTF_DATA_AVAIL_INT
|
||||
| TPM_INTF_STS_VALID_INT;
|
||||
|
||||
iowrite32(intmask,
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.locality));
|
||||
if (interrupts) {
|
||||
chip->vendor.irq =
|
||||
ioread8(chip->vendor.iobase +
|
||||
TPM_INT_VECTOR(chip->vendor.locality));
|
||||
|
||||
for (i = 3; i < 16 && chip->vendor.irq == 0; i++) {
|
||||
iowrite8(i, chip->vendor.iobase +
|
||||
TPM_INT_VECTOR(chip->vendor.locality));
|
||||
if (request_irq
|
||||
(i, tis_int_probe, SA_SHIRQ,
|
||||
chip->vendor.miscdev.name, chip) != 0) {
|
||||
dev_info(chip->dev,
|
||||
"Unable to request irq: %d for probe\n",
|
||||
i);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Clear all existing */
|
||||
iowrite32(ioread32
|
||||
(chip->vendor.iobase +
|
||||
TPM_INT_STATUS(chip->vendor.locality)),
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_STATUS(chip->vendor.locality));
|
||||
|
||||
/* Turn on */
|
||||
iowrite32(intmask | TPM_GLOBAL_INT_ENABLE,
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.locality));
|
||||
|
||||
/* Generate Interrupts */
|
||||
tpm_gen_interrupt(chip);
|
||||
|
||||
/* Turn off */
|
||||
iowrite32(intmask,
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.locality));
|
||||
free_irq(i, chip);
|
||||
}
|
||||
}
|
||||
if (chip->vendor.irq) {
|
||||
iowrite8(chip->vendor.irq,
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_VECTOR(chip->vendor.locality));
|
||||
if (request_irq
|
||||
(chip->vendor.irq, tis_int_handler, SA_SHIRQ,
|
||||
chip->vendor.miscdev.name, chip) != 0) {
|
||||
dev_info(chip->dev,
|
||||
"Unable to request irq: %d for use\n",
|
||||
chip->vendor.irq);
|
||||
chip->vendor.irq = 0;
|
||||
} else {
|
||||
/* Clear all existing */
|
||||
iowrite32(ioread32
|
||||
(chip->vendor.iobase +
|
||||
TPM_INT_STATUS(chip->vendor.locality)),
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_STATUS(chip->vendor.locality));
|
||||
|
||||
/* Turn on */
|
||||
iowrite32(intmask | TPM_GLOBAL_INT_ENABLE,
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.locality));
|
||||
}
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&chip->vendor.list);
|
||||
spin_lock(&tis_lock);
|
||||
list_add(&chip->vendor.list, &tis_chips);
|
||||
spin_unlock(&tis_lock);
|
||||
|
||||
tpm_get_timeouts(chip);
|
||||
tpm_continue_selftest(chip);
|
||||
|
||||
return 0;
|
||||
out_err:
|
||||
if (chip->vendor.iobase)
|
||||
iounmap(chip->vendor.iobase);
|
||||
tpm_remove_hardware(chip->dev);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int tpm_tis_pnp_suspend(struct pnp_dev *dev, pm_message_t msg)
|
||||
{
|
||||
return tpm_pm_suspend(&dev->dev, msg);
|
||||
}
|
||||
|
||||
static int tpm_tis_pnp_resume(struct pnp_dev *dev)
|
||||
{
|
||||
return tpm_pm_resume(&dev->dev);
|
||||
}
|
||||
|
||||
static struct pnp_device_id tpm_pnp_tbl[] __devinitdata = {
|
||||
{"PNP0C31", 0}, /* TPM */
|
||||
{"ATM1200", 0}, /* Atmel */
|
||||
{"IFX0102", 0}, /* Infineon */
|
||||
{"BCM0101", 0}, /* Broadcom */
|
||||
{"NSC1200", 0}, /* National */
|
||||
/* Add new here */
|
||||
{"", 0}, /* User Specified */
|
||||
{"", 0} /* Terminator */
|
||||
};
|
||||
|
||||
static struct pnp_driver tis_pnp_driver = {
|
||||
.name = "tpm_tis",
|
||||
.id_table = tpm_pnp_tbl,
|
||||
.probe = tpm_tis_pnp_init,
|
||||
.suspend = tpm_tis_pnp_suspend,
|
||||
.resume = tpm_tis_pnp_resume,
|
||||
};
|
||||
|
||||
#define TIS_HID_USR_IDX sizeof(tpm_pnp_tbl)/sizeof(struct pnp_device_id) -2
|
||||
module_param_string(hid, tpm_pnp_tbl[TIS_HID_USR_IDX].id,
|
||||
sizeof(tpm_pnp_tbl[TIS_HID_USR_IDX].id), 0444);
|
||||
MODULE_PARM_DESC(hid, "Set additional specific HID for this driver to probe");
|
||||
|
||||
static int __init init_tis(void)
|
||||
{
|
||||
return pnp_register_driver(&tis_pnp_driver);
|
||||
}
|
||||
|
||||
static void __exit cleanup_tis(void)
|
||||
{
|
||||
struct tpm_vendor_specific *i, *j;
|
||||
struct tpm_chip *chip;
|
||||
spin_lock(&tis_lock);
|
||||
list_for_each_entry_safe(i, j, &tis_chips, list) {
|
||||
chip = to_tpm_chip(i);
|
||||
iowrite32(~TPM_GLOBAL_INT_ENABLE &
|
||||
ioread32(chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.
|
||||
locality)),
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.locality));
|
||||
release_locality(chip, chip->vendor.locality, 1);
|
||||
if (chip->vendor.irq)
|
||||
free_irq(chip->vendor.irq, chip);
|
||||
iounmap(i->iobase);
|
||||
list_del(&i->list);
|
||||
tpm_remove_hardware(chip->dev);
|
||||
}
|
||||
spin_unlock(&tis_lock);
|
||||
pnp_unregister_driver(&tis_pnp_driver);
|
||||
}
|
||||
|
||||
module_init(init_tis);
|
||||
module_exit(cleanup_tis);
|
||||
MODULE_AUTHOR("Leendert van Doorn (leendert@watson.ibm.com)");
|
||||
MODULE_DESCRIPTION("TPM Driver");
|
||||
MODULE_VERSION("2.0");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -1497,7 +1497,7 @@ int cpufreq_update_policy(unsigned int cpu)
|
|||
}
|
||||
EXPORT_SYMBOL(cpufreq_update_policy);
|
||||
|
||||
static int __cpuinit cpufreq_cpu_callback(struct notifier_block *nfb,
|
||||
static int cpufreq_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
|
|
|
@ -350,11 +350,11 @@ static int hil_kbd_connect(struct serio *serio, struct serio_driver *drv)
|
|||
return 0;
|
||||
bail2:
|
||||
serio_close(serio);
|
||||
serio_set_drvdata(serio, NULL);
|
||||
bail1:
|
||||
input_free_device(kbd->dev);
|
||||
bail0:
|
||||
kfree(kbd);
|
||||
serio_set_drvdata(serio, NULL);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -781,8 +781,7 @@ error: if (cs)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(gigaset_initcs);
|
||||
|
||||
/* ReInitialize the b-channel structure */
|
||||
/* e.g. called on hangup, disconnect */
|
||||
/* ReInitialize the b-channel structure on hangup */
|
||||
void gigaset_bcs_reinit(struct bc_state *bcs)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
|
|
@ -373,6 +373,9 @@ struct reply_t gigaset_tab_cid_m10x[] = /* for M10x */
|
|||
|
||||
{EV_TIMEOUT, 750,750, -1, 0, 0, {ACT_CONNTIMEOUT}},
|
||||
|
||||
/* B channel closed (general case) */
|
||||
{EV_BC_CLOSED, -1, -1, -1, -1,-1, {ACT_NOTIFY_BC_DOWN}}, //FIXME
|
||||
|
||||
/* misc. */
|
||||
{EV_PROTO_L2, -1, -1, -1, -1,-1, {ACT_PROTO_L2}}, //FIXME
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ extern int gigaset_debuglevel; /* "needs" cast to (enum debuglevel) */
|
|||
* e.g. 'insmod usb_gigaset.o debug=0x2c' will set DEBUG_OPEN, DEBUG_CMD and
|
||||
* DEBUG_INTR.
|
||||
*/
|
||||
enum debuglevel { /* up to 24 bits (atomic_t) */
|
||||
enum debuglevel {
|
||||
DEBUG_REG = 0x0002, /* serial port I/O register operations */
|
||||
DEBUG_OPEN = 0x0004, /* open/close serial port */
|
||||
DEBUG_INTR = 0x0008, /* interrupt processing */
|
||||
|
@ -141,7 +141,7 @@ enum debuglevel { /* up to 24 bits (atomic_t) */
|
|||
printk(KERN_DEBUG KBUILD_MODNAME ": " format "\n", \
|
||||
## arg); \
|
||||
} while (0)
|
||||
#define DEBUG_DEFAULT (DEBUG_INIT | DEBUG_TRANSCMD | DEBUG_CMD | DEBUG_USBREQ)
|
||||
#define DEBUG_DEFAULT (DEBUG_TRANSCMD | DEBUG_CMD | DEBUG_USBREQ)
|
||||
|
||||
#else
|
||||
|
||||
|
@ -627,8 +627,7 @@ struct gigaset_ops {
|
|||
/* Called by gigaset_freecs() for freeing bcs->hw.xxx */
|
||||
int (*freebcshw)(struct bc_state *bcs);
|
||||
|
||||
/* Called by gigaset_stop() or gigaset_bchannel_down() for resetting
|
||||
bcs->hw.xxx */
|
||||
/* Called by gigaset_bchannel_down() for resetting bcs->hw.xxx */
|
||||
void (*reinitbcshw)(struct bc_state *bcs);
|
||||
|
||||
/* Called by gigaset_initcs() for setting up cs->hw.xxx */
|
||||
|
|
|
@ -73,7 +73,7 @@ static int writebuf_from_LL(int driverID, int channel, int ack,
|
|||
len, skblen, (unsigned) skb->head[0], (unsigned) skb->head[1]);
|
||||
|
||||
/* pass to device-specific module */
|
||||
return cs->ops->send_skb(bcs, skb); //FIXME cs->ops->send_skb() must handle !cs->connected correctly
|
||||
return cs->ops->send_skb(bcs, skb);
|
||||
}
|
||||
|
||||
void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *skb)
|
||||
|
|
|
@ -992,14 +992,18 @@ int gigaset_isoc_send_skb(struct bc_state *bcs, struct sk_buff *skb)
|
|||
int len = skb->len;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bcs->cs->lock, flags);
|
||||
if (!bcs->cs->connected) {
|
||||
spin_unlock_irqrestore(&bcs->cs->lock, flags);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
skb_queue_tail(&bcs->squeue, skb);
|
||||
gig_dbg(DEBUG_ISO, "%s: skb queued, qlen=%d",
|
||||
__func__, skb_queue_len(&bcs->squeue));
|
||||
|
||||
/* tasklet submits URB if necessary */
|
||||
spin_lock_irqsave(&bcs->cs->lock, flags);
|
||||
if (bcs->cs->connected)
|
||||
tasklet_schedule(&bcs->hw.bas->sent_tasklet);
|
||||
tasklet_schedule(&bcs->hw.bas->sent_tasklet);
|
||||
spin_unlock_irqrestore(&bcs->cs->lock, flags);
|
||||
|
||||
return len; /* ok so far */
|
||||
|
|
|
@ -627,8 +627,8 @@ thermostat_init(void)
|
|||
if(therm_type == ADT7460)
|
||||
device_create_file(&of_dev->dev, &dev_attr_sensor2_fan_speed);
|
||||
|
||||
#ifndef CONFIG_I2C_KEYWEST
|
||||
request_module("i2c-keywest");
|
||||
#ifndef CONFIG_I2C_POWERMAC
|
||||
request_module("i2c-powermac");
|
||||
#endif
|
||||
|
||||
return i2c_add_driver(&thermostat_driver);
|
||||
|
|
|
@ -65,11 +65,6 @@ struct pxamci_host {
|
|||
unsigned int dma_dir;
|
||||
};
|
||||
|
||||
static inline unsigned int ns_to_clocks(unsigned int ns)
|
||||
{
|
||||
return (ns * (CLOCKRATE / 1000000) + 999) / 1000;
|
||||
}
|
||||
|
||||
static void pxamci_stop_clock(struct pxamci_host *host)
|
||||
{
|
||||
if (readl(host->base + MMC_STAT) & STAT_CLK_EN) {
|
||||
|
@ -113,6 +108,7 @@ static void pxamci_disable_irq(struct pxamci_host *host, unsigned int mask)
|
|||
static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
|
||||
{
|
||||
unsigned int nob = data->blocks;
|
||||
unsigned long long clks;
|
||||
unsigned int timeout;
|
||||
u32 dcmd;
|
||||
int i;
|
||||
|
@ -125,7 +121,9 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
|
|||
writel(nob, host->base + MMC_NOB);
|
||||
writel(1 << data->blksz_bits, host->base + MMC_BLKLEN);
|
||||
|
||||
timeout = ns_to_clocks(data->timeout_ns) + data->timeout_clks;
|
||||
clks = (unsigned long long)data->timeout_ns * CLOCKRATE;
|
||||
do_div(clks, 1000000000UL);
|
||||
timeout = (unsigned int)clks + (data->timeout_clks << host->clkrt);
|
||||
writel((timeout + 255) / 256, host->base + MMC_RDTO);
|
||||
|
||||
if (data->flags & MMC_DATA_READ) {
|
||||
|
|
|
@ -3768,6 +3768,7 @@ e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
|
|||
ps_page->ps_page[j] = NULL;
|
||||
skb->len += length;
|
||||
skb->data_len += length;
|
||||
skb->truesize += length;
|
||||
}
|
||||
|
||||
copydone:
|
||||
|
|
|
@ -105,6 +105,7 @@
|
|||
* 0.50: 20 Jan 2006: Add 8021pq tagging support.
|
||||
* 0.51: 20 Jan 2006: Add 64bit consistent memory allocation for rings.
|
||||
* 0.52: 20 Jan 2006: Add MSI/MSIX support.
|
||||
* 0.53: 19 Mar 2006: Fix init from low power mode and add hw reset.
|
||||
*
|
||||
* Known bugs:
|
||||
* We suspect that on some hardware no TX done interrupts are generated.
|
||||
|
@ -116,7 +117,7 @@
|
|||
* DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few
|
||||
* superfluous timer interrupts from the nic.
|
||||
*/
|
||||
#define FORCEDETH_VERSION "0.52"
|
||||
#define FORCEDETH_VERSION "0.53"
|
||||
#define DRV_NAME "forcedeth"
|
||||
|
||||
#include <linux/module.h>
|
||||
|
@ -160,6 +161,7 @@
|
|||
#define DEV_HAS_VLAN 0x0020 /* device supports vlan tagging and striping */
|
||||
#define DEV_HAS_MSI 0x0040 /* device supports MSI */
|
||||
#define DEV_HAS_MSI_X 0x0080 /* device supports MSI-X */
|
||||
#define DEV_HAS_POWER_CNTRL 0x0100 /* device supports power savings */
|
||||
|
||||
enum {
|
||||
NvRegIrqStatus = 0x000,
|
||||
|
@ -203,6 +205,8 @@ enum {
|
|||
#define NVREG_MISC1_HD 0x02
|
||||
#define NVREG_MISC1_FORCE 0x3b0f3c
|
||||
|
||||
NvRegMacReset = 0x3c,
|
||||
#define NVREG_MAC_RESET_ASSERT 0x0F3
|
||||
NvRegTransmitterControl = 0x084,
|
||||
#define NVREG_XMITCTL_START 0x01
|
||||
NvRegTransmitterStatus = 0x088,
|
||||
|
@ -326,6 +330,10 @@ enum {
|
|||
NvRegMSIXMap0 = 0x3e0,
|
||||
NvRegMSIXMap1 = 0x3e4,
|
||||
NvRegMSIXIrqStatus = 0x3f0,
|
||||
|
||||
NvRegPowerState2 = 0x600,
|
||||
#define NVREG_POWERSTATE2_POWERUP_MASK 0x0F11
|
||||
#define NVREG_POWERSTATE2_POWERUP_REV_A3 0x0001
|
||||
};
|
||||
|
||||
/* Big endian: should work, but is untested */
|
||||
|
@ -414,7 +422,8 @@ typedef union _ring_type {
|
|||
#define NV_RX3_VLAN_TAG_MASK (0x0000FFFF)
|
||||
|
||||
/* Miscelaneous hardware related defines: */
|
||||
#define NV_PCI_REGSZ 0x270
|
||||
#define NV_PCI_REGSZ_VER1 0x270
|
||||
#define NV_PCI_REGSZ_VER2 0x604
|
||||
|
||||
/* various timeout delays: all in usec */
|
||||
#define NV_TXRX_RESET_DELAY 4
|
||||
|
@ -431,6 +440,7 @@ typedef union _ring_type {
|
|||
#define NV_MIIBUSY_DELAY 50
|
||||
#define NV_MIIPHY_DELAY 10
|
||||
#define NV_MIIPHY_DELAYMAX 10000
|
||||
#define NV_MAC_RESET_DELAY 64
|
||||
|
||||
#define NV_WAKEUPPATTERNS 5
|
||||
#define NV_WAKEUPMASKENTRIES 4
|
||||
|
@ -552,6 +562,8 @@ struct fe_priv {
|
|||
u32 desc_ver;
|
||||
u32 txrxctl_bits;
|
||||
u32 vlanctl_bits;
|
||||
u32 driver_data;
|
||||
u32 register_size;
|
||||
|
||||
void __iomem *base;
|
||||
|
||||
|
@ -919,6 +931,24 @@ static void nv_txrx_reset(struct net_device *dev)
|
|||
pci_push(base);
|
||||
}
|
||||
|
||||
static void nv_mac_reset(struct net_device *dev)
|
||||
{
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
u8 __iomem *base = get_hwbase(dev);
|
||||
|
||||
dprintk(KERN_DEBUG "%s: nv_mac_reset\n", dev->name);
|
||||
writel(NVREG_TXRXCTL_BIT2 | NVREG_TXRXCTL_RESET | np->txrxctl_bits, base + NvRegTxRxControl);
|
||||
pci_push(base);
|
||||
writel(NVREG_MAC_RESET_ASSERT, base + NvRegMacReset);
|
||||
pci_push(base);
|
||||
udelay(NV_MAC_RESET_DELAY);
|
||||
writel(0, base + NvRegMacReset);
|
||||
pci_push(base);
|
||||
udelay(NV_MAC_RESET_DELAY);
|
||||
writel(NVREG_TXRXCTL_BIT2 | np->txrxctl_bits, base + NvRegTxRxControl);
|
||||
pci_push(base);
|
||||
}
|
||||
|
||||
/*
|
||||
* nv_get_stats: dev->get_stats function
|
||||
* Get latest stats value from the nic.
|
||||
|
@ -1331,7 +1361,7 @@ static void nv_tx_timeout(struct net_device *dev)
|
|||
dev->name, (unsigned long)np->ring_addr,
|
||||
np->next_tx, np->nic_tx);
|
||||
printk(KERN_INFO "%s: Dumping tx registers\n", dev->name);
|
||||
for (i=0;i<0x400;i+= 32) {
|
||||
for (i=0;i<=np->register_size;i+= 32) {
|
||||
printk(KERN_INFO "%3x: %08x %08x %08x %08x %08x %08x %08x %08x\n",
|
||||
i,
|
||||
readl(base + i + 0), readl(base + i + 4),
|
||||
|
@ -2488,11 +2518,11 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
|
|||
}
|
||||
|
||||
#define FORCEDETH_REGS_VER 1
|
||||
#define FORCEDETH_REGS_SIZE 0x400 /* 256 32-bit registers */
|
||||
|
||||
static int nv_get_regs_len(struct net_device *dev)
|
||||
{
|
||||
return FORCEDETH_REGS_SIZE;
|
||||
struct fe_priv *np = netdev_priv(dev);
|
||||
return np->register_size;
|
||||
}
|
||||
|
||||
static void nv_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *buf)
|
||||
|
@ -2504,7 +2534,7 @@ static void nv_get_regs(struct net_device *dev, struct ethtool_regs *regs, void
|
|||
|
||||
regs->version = FORCEDETH_REGS_VER;
|
||||
spin_lock_irq(&np->lock);
|
||||
for (i=0;i<FORCEDETH_REGS_SIZE/sizeof(u32);i++)
|
||||
for (i = 0;i <= np->register_size/sizeof(u32); i++)
|
||||
rbuf[i] = readl(base + i*sizeof(u32));
|
||||
spin_unlock_irq(&np->lock);
|
||||
}
|
||||
|
@ -2608,6 +2638,8 @@ static int nv_open(struct net_device *dev)
|
|||
dprintk(KERN_DEBUG "nv_open: begin\n");
|
||||
|
||||
/* 1) erase previous misconfiguration */
|
||||
if (np->driver_data & DEV_HAS_POWER_CNTRL)
|
||||
nv_mac_reset(dev);
|
||||
/* 4.1-1: stop adapter: ignored, 4.3 seems to be overkill */
|
||||
writel(NVREG_MCASTADDRA_FORCE, base + NvRegMulticastAddrA);
|
||||
writel(0, base + NvRegMulticastAddrB);
|
||||
|
@ -2878,6 +2910,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
|||
unsigned long addr;
|
||||
u8 __iomem *base;
|
||||
int err, i;
|
||||
u32 powerstate;
|
||||
|
||||
dev = alloc_etherdev(sizeof(struct fe_priv));
|
||||
err = -ENOMEM;
|
||||
|
@ -2910,6 +2943,11 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
|||
if (err < 0)
|
||||
goto out_disable;
|
||||
|
||||
if (id->driver_data & (DEV_HAS_VLAN|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL))
|
||||
np->register_size = NV_PCI_REGSZ_VER2;
|
||||
else
|
||||
np->register_size = NV_PCI_REGSZ_VER1;
|
||||
|
||||
err = -EINVAL;
|
||||
addr = 0;
|
||||
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||
|
@ -2918,7 +2956,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
|||
pci_resource_len(pci_dev, i),
|
||||
pci_resource_flags(pci_dev, i));
|
||||
if (pci_resource_flags(pci_dev, i) & IORESOURCE_MEM &&
|
||||
pci_resource_len(pci_dev, i) >= NV_PCI_REGSZ) {
|
||||
pci_resource_len(pci_dev, i) >= np->register_size) {
|
||||
addr = pci_resource_start(pci_dev, i);
|
||||
break;
|
||||
}
|
||||
|
@ -2929,6 +2967,9 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
|||
goto out_relreg;
|
||||
}
|
||||
|
||||
/* copy of driver data */
|
||||
np->driver_data = id->driver_data;
|
||||
|
||||
/* handle different descriptor versions */
|
||||
if (id->driver_data & DEV_HAS_HIGH_DMA) {
|
||||
/* packet format 3: supports 40-bit addressing */
|
||||
|
@ -2986,7 +3027,7 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
|||
}
|
||||
|
||||
err = -ENOMEM;
|
||||
np->base = ioremap(addr, NV_PCI_REGSZ);
|
||||
np->base = ioremap(addr, np->register_size);
|
||||
if (!np->base)
|
||||
goto out_relreg;
|
||||
dev->base_addr = (unsigned long)np->base;
|
||||
|
@ -3062,6 +3103,20 @@ static int __devinit nv_probe(struct pci_dev *pci_dev, const struct pci_device_i
|
|||
writel(0, base + NvRegWakeUpFlags);
|
||||
np->wolenabled = 0;
|
||||
|
||||
if (id->driver_data & DEV_HAS_POWER_CNTRL) {
|
||||
u8 revision_id;
|
||||
pci_read_config_byte(pci_dev, PCI_REVISION_ID, &revision_id);
|
||||
|
||||
/* take phy and nic out of low power mode */
|
||||
powerstate = readl(base + NvRegPowerState2);
|
||||
powerstate &= ~NVREG_POWERSTATE2_POWERUP_MASK;
|
||||
if ((id->device == PCI_DEVICE_ID_NVIDIA_NVENET_12 ||
|
||||
id->device == PCI_DEVICE_ID_NVIDIA_NVENET_13) &&
|
||||
revision_id >= 0xA3)
|
||||
powerstate |= NVREG_POWERSTATE2_POWERUP_REV_A3;
|
||||
writel(powerstate, base + NvRegPowerState2);
|
||||
}
|
||||
|
||||
if (np->desc_ver == DESC_VER_1) {
|
||||
np->tx_flags = NV_TX_VALID;
|
||||
} else {
|
||||
|
@ -3223,19 +3278,19 @@ static struct pci_device_id pci_tbl[] = {
|
|||
},
|
||||
{ /* MCP51 Ethernet Controller */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_12),
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA,
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL,
|
||||
},
|
||||
{ /* MCP51 Ethernet Controller */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_13),
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA,
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_HIGH_DMA|DEV_HAS_POWER_CNTRL,
|
||||
},
|
||||
{ /* MCP55 Ethernet Controller */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_14),
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X,
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL,
|
||||
},
|
||||
{ /* MCP55 Ethernet Controller */
|
||||
PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_15),
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X,
|
||||
.driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_LARGEDESC|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_VLAN|DEV_HAS_MSI|DEV_HAS_MSI_X|DEV_HAS_POWER_CNTRL,
|
||||
},
|
||||
{0,},
|
||||
};
|
||||
|
|
|
@ -210,7 +210,8 @@ static int gfar_probe(struct platform_device *pdev)
|
|||
goto regs_fail;
|
||||
}
|
||||
|
||||
spin_lock_init(&priv->lock);
|
||||
spin_lock_init(&priv->txlock);
|
||||
spin_lock_init(&priv->rxlock);
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
|
@ -515,11 +516,13 @@ void stop_gfar(struct net_device *dev)
|
|||
phy_stop(priv->phydev);
|
||||
|
||||
/* Lock it down */
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->txlock, flags);
|
||||
spin_lock(&priv->rxlock);
|
||||
|
||||
gfar_halt(dev);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock(&priv->rxlock);
|
||||
spin_unlock_irqrestore(&priv->txlock, flags);
|
||||
|
||||
/* Free the IRQs */
|
||||
if (priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_MULTI_INTR) {
|
||||
|
@ -605,14 +608,15 @@ void gfar_start(struct net_device *dev)
|
|||
tempval |= DMACTRL_INIT_SETTINGS;
|
||||
gfar_write(&priv->regs->dmactrl, tempval);
|
||||
|
||||
/* Clear THLT, so that the DMA starts polling now */
|
||||
gfar_write(®s->tstat, TSTAT_CLEAR_THALT);
|
||||
|
||||
/* Make sure we aren't stopped */
|
||||
tempval = gfar_read(&priv->regs->dmactrl);
|
||||
tempval &= ~(DMACTRL_GRS | DMACTRL_GTS);
|
||||
gfar_write(&priv->regs->dmactrl, tempval);
|
||||
|
||||
/* Clear THLT/RHLT, so that the DMA starts polling now */
|
||||
gfar_write(®s->tstat, TSTAT_CLEAR_THALT);
|
||||
gfar_write(®s->rstat, RSTAT_CLEAR_RHALT);
|
||||
|
||||
/* Unmask the interrupts we look for */
|
||||
gfar_write(®s->imask, IMASK_DEFAULT);
|
||||
}
|
||||
|
@ -928,12 +932,13 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct txfcb *fcb = NULL;
|
||||
struct txbd8 *txbdp;
|
||||
u16 status;
|
||||
unsigned long flags;
|
||||
|
||||
/* Update transmit stats */
|
||||
priv->stats.tx_bytes += skb->len;
|
||||
|
||||
/* Lock priv now */
|
||||
spin_lock_irq(&priv->lock);
|
||||
spin_lock_irqsave(&priv->txlock, flags);
|
||||
|
||||
/* Point at the first free tx descriptor */
|
||||
txbdp = priv->cur_tx;
|
||||
|
@ -1004,7 +1009,7 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
gfar_write(&priv->regs->tstat, TSTAT_CLEAR_THALT);
|
||||
|
||||
/* Unlock priv */
|
||||
spin_unlock_irq(&priv->lock);
|
||||
spin_unlock_irqrestore(&priv->txlock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1049,7 +1054,7 @@ static void gfar_vlan_rx_register(struct net_device *dev,
|
|||
unsigned long flags;
|
||||
u32 tempval;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->rxlock, flags);
|
||||
|
||||
priv->vlgrp = grp;
|
||||
|
||||
|
@ -1076,7 +1081,7 @@ static void gfar_vlan_rx_register(struct net_device *dev,
|
|||
gfar_write(&priv->regs->rctrl, tempval);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->rxlock, flags);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1085,12 +1090,12 @@ static void gfar_vlan_rx_kill_vid(struct net_device *dev, uint16_t vid)
|
|||
struct gfar_private *priv = netdev_priv(dev);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->rxlock, flags);
|
||||
|
||||
if (priv->vlgrp)
|
||||
priv->vlgrp->vlan_devices[vid] = NULL;
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->rxlock, flags);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1179,7 +1184,7 @@ static irqreturn_t gfar_transmit(int irq, void *dev_id, struct pt_regs *regs)
|
|||
gfar_write(&priv->regs->ievent, IEVENT_TX_MASK);
|
||||
|
||||
/* Lock priv */
|
||||
spin_lock(&priv->lock);
|
||||
spin_lock(&priv->txlock);
|
||||
bdp = priv->dirty_tx;
|
||||
while ((bdp->status & TXBD_READY) == 0) {
|
||||
/* If dirty_tx and cur_tx are the same, then either the */
|
||||
|
@ -1224,7 +1229,7 @@ static irqreturn_t gfar_transmit(int irq, void *dev_id, struct pt_regs *regs)
|
|||
else
|
||||
gfar_write(&priv->regs->txic, 0);
|
||||
|
||||
spin_unlock(&priv->lock);
|
||||
spin_unlock(&priv->txlock);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
@ -1305,9 +1310,10 @@ irqreturn_t gfar_receive(int irq, void *dev_id, struct pt_regs *regs)
|
|||
{
|
||||
struct net_device *dev = (struct net_device *) dev_id;
|
||||
struct gfar_private *priv = netdev_priv(dev);
|
||||
|
||||
#ifdef CONFIG_GFAR_NAPI
|
||||
u32 tempval;
|
||||
#else
|
||||
unsigned long flags;
|
||||
#endif
|
||||
|
||||
/* Clear IEVENT, so rx interrupt isn't called again
|
||||
|
@ -1330,7 +1336,7 @@ irqreturn_t gfar_receive(int irq, void *dev_id, struct pt_regs *regs)
|
|||
}
|
||||
#else
|
||||
|
||||
spin_lock(&priv->lock);
|
||||
spin_lock_irqsave(&priv->rxlock, flags);
|
||||
gfar_clean_rx_ring(dev, priv->rx_ring_size);
|
||||
|
||||
/* If we are coalescing interrupts, update the timer */
|
||||
|
@ -1341,7 +1347,7 @@ irqreturn_t gfar_receive(int irq, void *dev_id, struct pt_regs *regs)
|
|||
else
|
||||
gfar_write(&priv->regs->rxic, 0);
|
||||
|
||||
spin_unlock(&priv->lock);
|
||||
spin_unlock_irqrestore(&priv->rxlock, flags);
|
||||
#endif
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
@ -1490,13 +1496,6 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
|
|||
/* Update the current rxbd pointer to be the next one */
|
||||
priv->cur_rx = bdp;
|
||||
|
||||
/* If no packets have arrived since the
|
||||
* last one we processed, clear the IEVENT RX and
|
||||
* BSY bits so that another interrupt won't be
|
||||
* generated when we set IMASK */
|
||||
if (bdp->status & RXBD_EMPTY)
|
||||
gfar_write(&priv->regs->ievent, IEVENT_RX_MASK);
|
||||
|
||||
return howmany;
|
||||
}
|
||||
|
||||
|
@ -1516,7 +1515,7 @@ static int gfar_poll(struct net_device *dev, int *budget)
|
|||
rx_work_limit -= howmany;
|
||||
*budget -= howmany;
|
||||
|
||||
if (rx_work_limit >= 0) {
|
||||
if (rx_work_limit > 0) {
|
||||
netif_rx_complete(dev);
|
||||
|
||||
/* Clear the halt bit in RSTAT */
|
||||
|
@ -1533,7 +1532,8 @@ static int gfar_poll(struct net_device *dev, int *budget)
|
|||
gfar_write(&priv->regs->rxic, 0);
|
||||
}
|
||||
|
||||
return (rx_work_limit < 0) ? 1 : 0;
|
||||
/* Return 1 if there's more work to do */
|
||||
return (rx_work_limit > 0) ? 0 : 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -1629,7 +1629,7 @@ static void adjust_link(struct net_device *dev)
|
|||
struct phy_device *phydev = priv->phydev;
|
||||
int new_state = 0;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->txlock, flags);
|
||||
if (phydev->link) {
|
||||
u32 tempval = gfar_read(®s->maccfg2);
|
||||
u32 ecntrl = gfar_read(®s->ecntrl);
|
||||
|
@ -1694,7 +1694,7 @@ static void adjust_link(struct net_device *dev)
|
|||
if (new_state && netif_msg_link(priv))
|
||||
phy_print_status(phydev);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->txlock, flags);
|
||||
}
|
||||
|
||||
/* Update the hash table based on the current list of multicast
|
||||
|
|
|
@ -656,43 +656,62 @@ struct gfar {
|
|||
* the buffer descriptor determines the actual condition.
|
||||
*/
|
||||
struct gfar_private {
|
||||
/* pointers to arrays of skbuffs for tx and rx */
|
||||
/* Fields controlled by TX lock */
|
||||
spinlock_t txlock;
|
||||
|
||||
/* Pointer to the array of skbuffs */
|
||||
struct sk_buff ** tx_skbuff;
|
||||
struct sk_buff ** rx_skbuff;
|
||||
|
||||
/* indices pointing to the next free sbk in skb arrays */
|
||||
/* next free skb in the array */
|
||||
u16 skb_curtx;
|
||||
u16 skb_currx;
|
||||
|
||||
/* index of the first skb which hasn't been transmitted
|
||||
* yet. */
|
||||
/* First skb in line to be transmitted */
|
||||
u16 skb_dirtytx;
|
||||
|
||||
/* Configuration info for the coalescing features */
|
||||
unsigned char txcoalescing;
|
||||
unsigned short txcount;
|
||||
unsigned short txtime;
|
||||
|
||||
/* Buffer descriptor pointers */
|
||||
struct txbd8 *tx_bd_base; /* First tx buffer descriptor */
|
||||
struct txbd8 *cur_tx; /* Next free ring entry */
|
||||
struct txbd8 *dirty_tx; /* First buffer in line
|
||||
to be transmitted */
|
||||
unsigned int tx_ring_size;
|
||||
|
||||
/* RX Locked fields */
|
||||
spinlock_t rxlock;
|
||||
|
||||
/* skb array and index */
|
||||
struct sk_buff ** rx_skbuff;
|
||||
u16 skb_currx;
|
||||
|
||||
/* RX Coalescing values */
|
||||
unsigned char rxcoalescing;
|
||||
unsigned short rxcount;
|
||||
unsigned short rxtime;
|
||||
|
||||
/* GFAR addresses */
|
||||
struct rxbd8 *rx_bd_base; /* Base addresses of Rx and Tx Buffers */
|
||||
struct txbd8 *tx_bd_base;
|
||||
struct rxbd8 *rx_bd_base; /* First Rx buffers */
|
||||
struct rxbd8 *cur_rx; /* Next free rx ring entry */
|
||||
struct txbd8 *cur_tx; /* Next free ring entry */
|
||||
struct txbd8 *dirty_tx; /* The Ring entry to be freed. */
|
||||
struct gfar __iomem *regs; /* Pointer to the GFAR memory mapped Registers */
|
||||
u32 __iomem *hash_regs[16];
|
||||
int hash_width;
|
||||
struct net_device_stats stats; /* linux network statistics */
|
||||
struct gfar_extra_stats extra_stats;
|
||||
spinlock_t lock;
|
||||
|
||||
/* RX parameters */
|
||||
unsigned int rx_ring_size;
|
||||
unsigned int rx_buffer_size;
|
||||
unsigned int rx_stash_size;
|
||||
unsigned int rx_stash_index;
|
||||
unsigned int tx_ring_size;
|
||||
unsigned int rx_ring_size;
|
||||
|
||||
struct vlan_group *vlgrp;
|
||||
|
||||
/* Unprotected fields */
|
||||
/* Pointer to the GFAR memory mapped Registers */
|
||||
struct gfar __iomem *regs;
|
||||
|
||||
/* Hash registers and their width */
|
||||
u32 __iomem *hash_regs[16];
|
||||
int hash_width;
|
||||
|
||||
/* global parameters */
|
||||
unsigned int fifo_threshold;
|
||||
unsigned int fifo_starve;
|
||||
unsigned int fifo_starve_off;
|
||||
|
@ -702,13 +721,15 @@ struct gfar_private {
|
|||
extended_hash:1,
|
||||
bd_stash_en:1;
|
||||
unsigned short padding;
|
||||
struct vlan_group *vlgrp;
|
||||
/* Info structure initialized by board setup code */
|
||||
|
||||
unsigned int interruptTransmit;
|
||||
unsigned int interruptReceive;
|
||||
unsigned int interruptError;
|
||||
|
||||
/* info structure initialized by platform code */
|
||||
struct gianfar_platform_data *einfo;
|
||||
|
||||
/* PHY stuff */
|
||||
struct phy_device *phydev;
|
||||
struct mii_bus *mii_bus;
|
||||
int oldspeed;
|
||||
|
@ -716,6 +737,10 @@ struct gfar_private {
|
|||
int oldlink;
|
||||
|
||||
uint32_t msg_enable;
|
||||
|
||||
/* Network Statistics */
|
||||
struct net_device_stats stats;
|
||||
struct gfar_extra_stats extra_stats;
|
||||
};
|
||||
|
||||
static inline u32 gfar_read(volatile unsigned __iomem *addr)
|
||||
|
|
|
@ -455,10 +455,14 @@ static int gfar_sringparam(struct net_device *dev, struct ethtool_ringparam *rva
|
|||
|
||||
/* Halt TX and RX, and process the frames which
|
||||
* have already been received */
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->txlock, flags);
|
||||
spin_lock(&priv->rxlock);
|
||||
|
||||
gfar_halt(dev);
|
||||
gfar_clean_rx_ring(dev, priv->rx_ring_size);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
spin_unlock(&priv->rxlock);
|
||||
spin_unlock_irqrestore(&priv->txlock, flags);
|
||||
|
||||
/* Now we take down the rings to rebuild them */
|
||||
stop_gfar(dev);
|
||||
|
@ -488,10 +492,14 @@ static int gfar_set_rx_csum(struct net_device *dev, uint32_t data)
|
|||
|
||||
/* Halt TX and RX, and process the frames which
|
||||
* have already been received */
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->txlock, flags);
|
||||
spin_lock(&priv->rxlock);
|
||||
|
||||
gfar_halt(dev);
|
||||
gfar_clean_rx_ring(dev, priv->rx_ring_size);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
|
||||
spin_unlock(&priv->rxlock);
|
||||
spin_unlock_irqrestore(&priv->txlock, flags);
|
||||
|
||||
/* Now we take down the rings to rebuild them */
|
||||
stop_gfar(dev);
|
||||
|
@ -523,7 +531,7 @@ static int gfar_set_tx_csum(struct net_device *dev, uint32_t data)
|
|||
if (!(priv->einfo->device_flags & FSL_GIANFAR_DEV_HAS_CSUM))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->txlock, flags);
|
||||
gfar_halt(dev);
|
||||
|
||||
if (data)
|
||||
|
@ -532,7 +540,7 @@ static int gfar_set_tx_csum(struct net_device *dev, uint32_t data)
|
|||
dev->features &= ~NETIF_F_IP_CSUM;
|
||||
|
||||
gfar_start(dev);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->txlock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ static ssize_t gfar_set_bd_stash(struct class_device *cdev,
|
|||
else
|
||||
return count;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->rxlock, flags);
|
||||
|
||||
/* Set the new stashing value */
|
||||
priv->bd_stash_en = new_setting;
|
||||
|
@ -96,7 +96,7 @@ static ssize_t gfar_set_bd_stash(struct class_device *cdev,
|
|||
|
||||
gfar_write(&priv->regs->attr, temp);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->rxlock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -118,7 +118,7 @@ static ssize_t gfar_set_rx_stash_size(struct class_device *cdev,
|
|||
u32 temp;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->rxlock, flags);
|
||||
if (length > priv->rx_buffer_size)
|
||||
return count;
|
||||
|
||||
|
@ -142,7 +142,7 @@ static ssize_t gfar_set_rx_stash_size(struct class_device *cdev,
|
|||
|
||||
gfar_write(&priv->regs->attr, temp);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->rxlock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -166,7 +166,7 @@ static ssize_t gfar_set_rx_stash_index(struct class_device *cdev,
|
|||
u32 temp;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->rxlock, flags);
|
||||
if (index > priv->rx_stash_size)
|
||||
return count;
|
||||
|
||||
|
@ -180,7 +180,7 @@ static ssize_t gfar_set_rx_stash_index(struct class_device *cdev,
|
|||
temp |= ATTRELI_EI(index);
|
||||
gfar_write(&priv->regs->attreli, flags);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->rxlock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -205,7 +205,7 @@ static ssize_t gfar_set_fifo_threshold(struct class_device *cdev,
|
|||
if (length > GFAR_MAX_FIFO_THRESHOLD)
|
||||
return count;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->txlock, flags);
|
||||
|
||||
priv->fifo_threshold = length;
|
||||
|
||||
|
@ -214,7 +214,7 @@ static ssize_t gfar_set_fifo_threshold(struct class_device *cdev,
|
|||
temp |= length;
|
||||
gfar_write(&priv->regs->fifo_tx_thr, temp);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->txlock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -240,7 +240,7 @@ static ssize_t gfar_set_fifo_starve(struct class_device *cdev,
|
|||
if (num > GFAR_MAX_FIFO_STARVE)
|
||||
return count;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->txlock, flags);
|
||||
|
||||
priv->fifo_starve = num;
|
||||
|
||||
|
@ -249,7 +249,7 @@ static ssize_t gfar_set_fifo_starve(struct class_device *cdev,
|
|||
temp |= num;
|
||||
gfar_write(&priv->regs->fifo_tx_starve, temp);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->txlock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ static ssize_t gfar_set_fifo_starve_off(struct class_device *cdev,
|
|||
if (num > GFAR_MAX_FIFO_STARVE_OFF)
|
||||
return count;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
spin_lock_irqsave(&priv->txlock, flags);
|
||||
|
||||
priv->fifo_starve_off = num;
|
||||
|
||||
|
@ -283,7 +283,7 @@ static ssize_t gfar_set_fifo_starve_off(struct class_device *cdev,
|
|||
temp |= num;
|
||||
gfar_write(&priv->regs->fifo_tx_starve_shutoff, temp);
|
||||
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
spin_unlock_irqrestore(&priv->txlock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
|
|
@ -1639,6 +1639,7 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
|||
PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722),
|
||||
PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2),
|
||||
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd),
|
||||
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d),
|
||||
PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d),
|
||||
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa),
|
||||
PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9),
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
#include "sky2.h"
|
||||
|
||||
#define DRV_NAME "sky2"
|
||||
#define DRV_VERSION "1.1"
|
||||
#define DRV_VERSION "1.2"
|
||||
#define PFX DRV_NAME " "
|
||||
|
||||
/*
|
||||
|
@ -925,8 +925,7 @@ static inline struct sk_buff *sky2_alloc_skb(unsigned int size, gfp_t gfp_mask)
|
|||
skb = alloc_skb(size + RX_SKB_ALIGN, gfp_mask);
|
||||
if (likely(skb)) {
|
||||
unsigned long p = (unsigned long) skb->data;
|
||||
skb_reserve(skb,
|
||||
((p + RX_SKB_ALIGN - 1) & ~(RX_SKB_ALIGN - 1)) - p);
|
||||
skb_reserve(skb, ALIGN(p, RX_SKB_ALIGN) - p);
|
||||
}
|
||||
|
||||
return skb;
|
||||
|
@ -1686,13 +1685,12 @@ static void sky2_tx_timeout(struct net_device *dev)
|
|||
}
|
||||
|
||||
|
||||
#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
|
||||
/* Want receive buffer size to be multiple of 64 bits
|
||||
* and incl room for vlan and truncation
|
||||
*/
|
||||
static inline unsigned sky2_buf_size(int mtu)
|
||||
{
|
||||
return roundup(mtu + ETH_HLEN + VLAN_HLEN, 8) + 8;
|
||||
return ALIGN(mtu + ETH_HLEN + VLAN_HLEN, 8) + 8;
|
||||
}
|
||||
|
||||
static int sky2_change_mtu(struct net_device *dev, int new_mtu)
|
||||
|
@ -2086,6 +2084,20 @@ static void sky2_descriptor_error(struct sky2_hw *hw, unsigned port,
|
|||
}
|
||||
}
|
||||
|
||||
/* If idle then force a fake soft NAPI poll once a second
|
||||
* to work around cases where sharing an edge triggered interrupt.
|
||||
*/
|
||||
static void sky2_idle(unsigned long arg)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *) arg;
|
||||
|
||||
local_irq_disable();
|
||||
if (__netif_rx_schedule_prep(dev))
|
||||
__netif_rx_schedule(dev);
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
|
||||
static int sky2_poll(struct net_device *dev0, int *budget)
|
||||
{
|
||||
struct sky2_hw *hw = ((struct sky2_port *) netdev_priv(dev0))->hw;
|
||||
|
@ -2093,6 +2105,7 @@ static int sky2_poll(struct net_device *dev0, int *budget)
|
|||
int work_done = 0;
|
||||
u32 status = sky2_read32(hw, B0_Y2_SP_EISR);
|
||||
|
||||
restart_poll:
|
||||
if (unlikely(status & ~Y2_IS_STAT_BMU)) {
|
||||
if (status & Y2_IS_HW_ERR)
|
||||
sky2_hw_intr(hw);
|
||||
|
@ -2123,7 +2136,7 @@ static int sky2_poll(struct net_device *dev0, int *budget)
|
|||
}
|
||||
|
||||
if (status & Y2_IS_STAT_BMU) {
|
||||
work_done = sky2_status_intr(hw, work_limit);
|
||||
work_done += sky2_status_intr(hw, work_limit - work_done);
|
||||
*budget -= work_done;
|
||||
dev0->quota -= work_done;
|
||||
|
||||
|
@ -2133,9 +2146,24 @@ static int sky2_poll(struct net_device *dev0, int *budget)
|
|||
sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ);
|
||||
}
|
||||
|
||||
netif_rx_complete(dev0);
|
||||
mod_timer(&hw->idle_timer, jiffies + HZ);
|
||||
|
||||
local_irq_disable();
|
||||
__netif_rx_complete(dev0);
|
||||
|
||||
status = sky2_read32(hw, B0_Y2_SP_LISR);
|
||||
|
||||
if (unlikely(status)) {
|
||||
/* More work pending, try and keep going */
|
||||
if (__netif_rx_schedule_prep(dev0)) {
|
||||
__netif_rx_reschedule(dev0, work_done);
|
||||
status = sky2_read32(hw, B0_Y2_SP_EISR);
|
||||
local_irq_enable();
|
||||
goto restart_poll;
|
||||
}
|
||||
}
|
||||
|
||||
local_irq_enable();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2153,8 +2181,6 @@ static irqreturn_t sky2_intr(int irq, void *dev_id, struct pt_regs *regs)
|
|||
prefetch(&hw->st_le[hw->st_idx]);
|
||||
if (likely(__netif_rx_schedule_prep(dev0)))
|
||||
__netif_rx_schedule(dev0);
|
||||
else
|
||||
printk(KERN_DEBUG PFX "irq race detected\n");
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
@ -2193,7 +2219,7 @@ static inline u32 sky2_clk2us(const struct sky2_hw *hw, u32 clk)
|
|||
}
|
||||
|
||||
|
||||
static int sky2_reset(struct sky2_hw *hw)
|
||||
static int __devinit sky2_reset(struct sky2_hw *hw)
|
||||
{
|
||||
u16 status;
|
||||
u8 t8, pmd_type;
|
||||
|
@ -3276,6 +3302,8 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
|
|||
|
||||
sky2_write32(hw, B0_IMSK, Y2_IS_BASE);
|
||||
|
||||
setup_timer(&hw->idle_timer, sky2_idle, (unsigned long) dev);
|
||||
|
||||
pci_set_drvdata(pdev, hw);
|
||||
|
||||
return 0;
|
||||
|
@ -3311,13 +3339,15 @@ static void __devexit sky2_remove(struct pci_dev *pdev)
|
|||
if (!hw)
|
||||
return;
|
||||
|
||||
del_timer_sync(&hw->idle_timer);
|
||||
|
||||
sky2_write32(hw, B0_IMSK, 0);
|
||||
dev0 = hw->dev[0];
|
||||
dev1 = hw->dev[1];
|
||||
if (dev1)
|
||||
unregister_netdev(dev1);
|
||||
unregister_netdev(dev0);
|
||||
|
||||
sky2_write32(hw, B0_IMSK, 0);
|
||||
sky2_set_power_state(hw, PCI_D3hot);
|
||||
sky2_write16(hw, B0_Y2LED, LED_STAT_OFF);
|
||||
sky2_write8(hw, B0_CTST, CS_RST_SET);
|
||||
|
|
|
@ -1880,6 +1880,8 @@ struct sky2_hw {
|
|||
struct sky2_status_le *st_le;
|
||||
u32 st_idx;
|
||||
dma_addr_t st_dma;
|
||||
|
||||
struct timer_list idle_timer;
|
||||
int msi_detected;
|
||||
wait_queue_head_t msi_wait;
|
||||
};
|
||||
|
|
|
@ -213,6 +213,14 @@ static inline
|
|||
void bcm43xx_dma_rx(struct bcm43xx_dmaring *ring)
|
||||
{
|
||||
}
|
||||
static inline
|
||||
void bcm43xx_dma_tx_suspend(struct bcm43xx_dmaring *ring)
|
||||
{
|
||||
}
|
||||
static inline
|
||||
void bcm43xx_dma_tx_resume(struct bcm43xx_dmaring *ring)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BCM43XX_DMA */
|
||||
#endif /* BCM43xx_DMA_H_ */
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "bcm43xx_pio.h"
|
||||
#include "bcm43xx_main.h"
|
||||
#include "bcm43xx_xmit.h"
|
||||
#include "bcm43xx_power.h"
|
||||
|
||||
#include <linux/delay.h>
|
||||
|
||||
|
@ -44,10 +45,10 @@ static void tx_octet(struct bcm43xx_pioqueue *queue,
|
|||
bcm43xx_pio_write(queue, BCM43xx_PIO_TXDATA,
|
||||
octet);
|
||||
bcm43xx_pio_write(queue, BCM43xx_PIO_TXCTL,
|
||||
BCM43xx_PIO_TXCTL_WRITEHI);
|
||||
BCM43xx_PIO_TXCTL_WRITELO);
|
||||
} else {
|
||||
bcm43xx_pio_write(queue, BCM43xx_PIO_TXCTL,
|
||||
BCM43xx_PIO_TXCTL_WRITEHI);
|
||||
BCM43xx_PIO_TXCTL_WRITELO);
|
||||
bcm43xx_pio_write(queue, BCM43xx_PIO_TXDATA,
|
||||
octet);
|
||||
}
|
||||
|
@ -103,7 +104,7 @@ static void tx_complete(struct bcm43xx_pioqueue *queue,
|
|||
bcm43xx_pio_write(queue, BCM43xx_PIO_TXDATA,
|
||||
skb->data[skb->len - 1]);
|
||||
bcm43xx_pio_write(queue, BCM43xx_PIO_TXCTL,
|
||||
BCM43xx_PIO_TXCTL_WRITEHI |
|
||||
BCM43xx_PIO_TXCTL_WRITELO |
|
||||
BCM43xx_PIO_TXCTL_COMPLETE);
|
||||
} else {
|
||||
bcm43xx_pio_write(queue, BCM43xx_PIO_TXCTL,
|
||||
|
@ -112,9 +113,10 @@ static void tx_complete(struct bcm43xx_pioqueue *queue,
|
|||
}
|
||||
|
||||
static u16 generate_cookie(struct bcm43xx_pioqueue *queue,
|
||||
int packetindex)
|
||||
struct bcm43xx_pio_txpacket *packet)
|
||||
{
|
||||
u16 cookie = 0x0000;
|
||||
int packetindex;
|
||||
|
||||
/* We use the upper 4 bits for the PIO
|
||||
* controller ID and the lower 12 bits
|
||||
|
@ -135,6 +137,7 @@ static u16 generate_cookie(struct bcm43xx_pioqueue *queue,
|
|||
default:
|
||||
assert(0);
|
||||
}
|
||||
packetindex = pio_txpacket_getindex(packet);
|
||||
assert(((u16)packetindex & 0xF000) == 0x0000);
|
||||
cookie |= (u16)packetindex;
|
||||
|
||||
|
@ -184,7 +187,7 @@ static void pio_tx_write_fragment(struct bcm43xx_pioqueue *queue,
|
|||
bcm43xx_generate_txhdr(queue->bcm,
|
||||
&txhdr, skb->data, skb->len,
|
||||
(packet->xmitted_frags == 0),
|
||||
generate_cookie(queue, pio_txpacket_getindex(packet)));
|
||||
generate_cookie(queue, packet));
|
||||
|
||||
tx_start(queue);
|
||||
octets = skb->len + sizeof(txhdr);
|
||||
|
@ -241,7 +244,7 @@ static int pio_tx_packet(struct bcm43xx_pio_txpacket *packet)
|
|||
queue->tx_devq_packets++;
|
||||
queue->tx_devq_used += octets;
|
||||
|
||||
assert(packet->xmitted_frags <= packet->txb->nr_frags);
|
||||
assert(packet->xmitted_frags < packet->txb->nr_frags);
|
||||
packet->xmitted_frags++;
|
||||
packet->xmitted_octets += octets;
|
||||
}
|
||||
|
@ -257,8 +260,14 @@ static void tx_tasklet(unsigned long d)
|
|||
unsigned long flags;
|
||||
struct bcm43xx_pio_txpacket *packet, *tmp_packet;
|
||||
int err;
|
||||
u16 txctl;
|
||||
|
||||
bcm43xx_lock_mmio(bcm, flags);
|
||||
|
||||
txctl = bcm43xx_pio_read(queue, BCM43xx_PIO_TXCTL);
|
||||
if (txctl & BCM43xx_PIO_TXCTL_SUSPEND)
|
||||
goto out_unlock;
|
||||
|
||||
list_for_each_entry_safe(packet, tmp_packet, &queue->txqueue, list) {
|
||||
assert(packet->xmitted_frags < packet->txb->nr_frags);
|
||||
if (packet->xmitted_frags == 0) {
|
||||
|
@ -288,6 +297,7 @@ static void tx_tasklet(unsigned long d)
|
|||
next_packet:
|
||||
continue;
|
||||
}
|
||||
out_unlock:
|
||||
bcm43xx_unlock_mmio(bcm, flags);
|
||||
}
|
||||
|
||||
|
@ -330,12 +340,19 @@ struct bcm43xx_pioqueue * bcm43xx_setup_pioqueue(struct bcm43xx_private *bcm,
|
|||
(unsigned long)queue);
|
||||
|
||||
value = bcm43xx_read32(bcm, BCM43xx_MMIO_STATUS_BITFIELD);
|
||||
value |= BCM43xx_SBF_XFER_REG_BYTESWAP;
|
||||
value &= ~BCM43xx_SBF_XFER_REG_BYTESWAP;
|
||||
bcm43xx_write32(bcm, BCM43xx_MMIO_STATUS_BITFIELD, value);
|
||||
|
||||
qsize = bcm43xx_read16(bcm, queue->mmio_base + BCM43xx_PIO_TXQBUFSIZE);
|
||||
if (qsize == 0) {
|
||||
printk(KERN_ERR PFX "ERROR: This card does not support PIO "
|
||||
"operation mode. Please use DMA mode "
|
||||
"(module parameter pio=0).\n");
|
||||
goto err_freequeue;
|
||||
}
|
||||
if (qsize <= BCM43xx_PIO_TXQADJUST) {
|
||||
printk(KERN_ERR PFX "PIO tx device-queue too small (%u)\n", qsize);
|
||||
printk(KERN_ERR PFX "PIO tx device-queue too small (%u)\n",
|
||||
qsize);
|
||||
goto err_freequeue;
|
||||
}
|
||||
qsize -= BCM43xx_PIO_TXQADJUST;
|
||||
|
@ -444,15 +461,10 @@ int bcm43xx_pio_tx(struct bcm43xx_private *bcm,
|
|||
{
|
||||
struct bcm43xx_pioqueue *queue = bcm43xx_current_pio(bcm)->queue1;
|
||||
struct bcm43xx_pio_txpacket *packet;
|
||||
u16 tmp;
|
||||
|
||||
assert(!queue->tx_suspended);
|
||||
assert(!list_empty(&queue->txfree));
|
||||
|
||||
tmp = bcm43xx_pio_read(queue, BCM43xx_PIO_TXCTL);
|
||||
if (tmp & BCM43xx_PIO_TXCTL_SUSPEND)
|
||||
return -EBUSY;
|
||||
|
||||
packet = list_entry(queue->txfree.next, struct bcm43xx_pio_txpacket, list);
|
||||
packet->txb = txb;
|
||||
packet->xmitted_frags = 0;
|
||||
|
@ -462,7 +474,7 @@ int bcm43xx_pio_tx(struct bcm43xx_private *bcm,
|
|||
assert(queue->nr_txfree < BCM43xx_PIO_MAXTXPACKETS);
|
||||
|
||||
/* Suspend TX, if we are out of packets in the "free" queue. */
|
||||
if (unlikely(list_empty(&queue->txfree))) {
|
||||
if (list_empty(&queue->txfree)) {
|
||||
netif_stop_queue(queue->bcm->net_dev);
|
||||
queue->tx_suspended = 1;
|
||||
}
|
||||
|
@ -480,15 +492,15 @@ void bcm43xx_pio_handle_xmitstatus(struct bcm43xx_private *bcm,
|
|||
|
||||
queue = parse_cookie(bcm, status->cookie, &packet);
|
||||
assert(queue);
|
||||
//TODO
|
||||
if (!queue)
|
||||
return;
|
||||
|
||||
free_txpacket(packet, 1);
|
||||
if (unlikely(queue->tx_suspended)) {
|
||||
if (queue->tx_suspended) {
|
||||
queue->tx_suspended = 0;
|
||||
netif_wake_queue(queue->bcm->net_dev);
|
||||
}
|
||||
/* If there are packets on the txqueue, poke the tasklet. */
|
||||
/* If there are packets on the txqueue, poke the tasklet
|
||||
* to transmit them.
|
||||
*/
|
||||
if (!list_empty(&queue->txqueue))
|
||||
tasklet_schedule(&queue->txtask);
|
||||
}
|
||||
|
@ -519,12 +531,9 @@ void bcm43xx_pio_rx(struct bcm43xx_pioqueue *queue)
|
|||
int i, preamble_readwords;
|
||||
struct sk_buff *skb;
|
||||
|
||||
return;
|
||||
tmp = bcm43xx_pio_read(queue, BCM43xx_PIO_RXCTL);
|
||||
if (!(tmp & BCM43xx_PIO_RXCTL_DATAAVAILABLE)) {
|
||||
dprintkl(KERN_ERR PFX "PIO RX: No data available\n");//TODO: remove this printk.
|
||||
if (!(tmp & BCM43xx_PIO_RXCTL_DATAAVAILABLE))
|
||||
return;
|
||||
}
|
||||
bcm43xx_pio_write(queue, BCM43xx_PIO_RXCTL,
|
||||
BCM43xx_PIO_RXCTL_DATAAVAILABLE);
|
||||
|
||||
|
@ -538,8 +547,7 @@ return;
|
|||
return;
|
||||
data_ready:
|
||||
|
||||
//FIXME: endianess in this function.
|
||||
len = le16_to_cpu(bcm43xx_pio_read(queue, BCM43xx_PIO_RXDATA));
|
||||
len = bcm43xx_pio_read(queue, BCM43xx_PIO_RXDATA);
|
||||
if (unlikely(len > 0x700)) {
|
||||
pio_rx_error(queue, 0, "len > 0x700");
|
||||
return;
|
||||
|
@ -555,7 +563,7 @@ return;
|
|||
preamble_readwords = 18 / sizeof(u16);
|
||||
for (i = 0; i < preamble_readwords; i++) {
|
||||
tmp = bcm43xx_pio_read(queue, BCM43xx_PIO_RXDATA);
|
||||
preamble[i + 1] = cpu_to_be16(tmp);//FIXME?
|
||||
preamble[i + 1] = cpu_to_le16(tmp);
|
||||
}
|
||||
rxhdr = (struct bcm43xx_rxhdr *)preamble;
|
||||
rxflags2 = le16_to_cpu(rxhdr->flags2);
|
||||
|
@ -591,16 +599,40 @@ return;
|
|||
}
|
||||
skb_put(skb, len);
|
||||
for (i = 0; i < len - 1; i += 2) {
|
||||
tmp = cpu_to_be16(bcm43xx_pio_read(queue, BCM43xx_PIO_RXDATA));
|
||||
*((u16 *)(skb->data + i)) = tmp;
|
||||
tmp = bcm43xx_pio_read(queue, BCM43xx_PIO_RXDATA);
|
||||
*((u16 *)(skb->data + i)) = cpu_to_le16(tmp);
|
||||
}
|
||||
if (len % 2) {
|
||||
tmp = bcm43xx_pio_read(queue, BCM43xx_PIO_RXDATA);
|
||||
skb->data[len - 1] = (tmp & 0x00FF);
|
||||
/* The specs say the following is required, but
|
||||
* it is wrong and corrupts the PLCP. If we don't do
|
||||
* this, the PLCP seems to be correct. So ifdef it out for now.
|
||||
*/
|
||||
#if 0
|
||||
if (rxflags2 & BCM43xx_RXHDR_FLAGS2_TYPE2FRAME)
|
||||
skb->data[0x20] = (tmp & 0xFF00) >> 8;
|
||||
skb->data[2] = (tmp & 0xFF00) >> 8;
|
||||
else
|
||||
skb->data[0x1E] = (tmp & 0xFF00) >> 8;
|
||||
skb->data[0] = (tmp & 0xFF00) >> 8;
|
||||
#endif
|
||||
}
|
||||
skb_trim(skb, len - IEEE80211_FCS_LEN);
|
||||
bcm43xx_rx(queue->bcm, skb, rxhdr);
|
||||
}
|
||||
|
||||
void bcm43xx_pio_tx_suspend(struct bcm43xx_pioqueue *queue)
|
||||
{
|
||||
bcm43xx_power_saving_ctl_bits(queue->bcm, -1, 1);
|
||||
bcm43xx_pio_write(queue, BCM43xx_PIO_TXCTL,
|
||||
bcm43xx_pio_read(queue, BCM43xx_PIO_TXCTL)
|
||||
| BCM43xx_PIO_TXCTL_SUSPEND);
|
||||
}
|
||||
|
||||
void bcm43xx_pio_tx_resume(struct bcm43xx_pioqueue *queue)
|
||||
{
|
||||
bcm43xx_pio_write(queue, BCM43xx_PIO_TXCTL,
|
||||
bcm43xx_pio_read(queue, BCM43xx_PIO_TXCTL)
|
||||
& ~BCM43xx_PIO_TXCTL_SUSPEND);
|
||||
bcm43xx_power_saving_ctl_bits(queue->bcm, -1, -1);
|
||||
tasklet_schedule(&queue->txtask);
|
||||
}
|
||||
|
|
|
@ -14,8 +14,8 @@
|
|||
#define BCM43xx_PIO_RXCTL 0x08
|
||||
#define BCM43xx_PIO_RXDATA 0x0A
|
||||
|
||||
#define BCM43xx_PIO_TXCTL_WRITEHI (1 << 0)
|
||||
#define BCM43xx_PIO_TXCTL_WRITELO (1 << 1)
|
||||
#define BCM43xx_PIO_TXCTL_WRITELO (1 << 0)
|
||||
#define BCM43xx_PIO_TXCTL_WRITEHI (1 << 1)
|
||||
#define BCM43xx_PIO_TXCTL_COMPLETE (1 << 2)
|
||||
#define BCM43xx_PIO_TXCTL_INIT (1 << 3)
|
||||
#define BCM43xx_PIO_TXCTL_SUSPEND (1 << 7)
|
||||
|
@ -95,6 +95,7 @@ void bcm43xx_pio_write(struct bcm43xx_pioqueue *queue,
|
|||
u16 offset, u16 value)
|
||||
{
|
||||
bcm43xx_write16(queue->bcm, queue->mmio_base + offset, value);
|
||||
mmiowb();
|
||||
}
|
||||
|
||||
|
||||
|
@ -107,6 +108,9 @@ void bcm43xx_pio_handle_xmitstatus(struct bcm43xx_private *bcm,
|
|||
struct bcm43xx_xmitstatus *status);
|
||||
void bcm43xx_pio_rx(struct bcm43xx_pioqueue *queue);
|
||||
|
||||
void bcm43xx_pio_tx_suspend(struct bcm43xx_pioqueue *queue);
|
||||
void bcm43xx_pio_tx_resume(struct bcm43xx_pioqueue *queue);
|
||||
|
||||
#else /* CONFIG_BCM43XX_PIO */
|
||||
|
||||
static inline
|
||||
|
@ -133,6 +137,14 @@ static inline
|
|||
void bcm43xx_pio_rx(struct bcm43xx_pioqueue *queue)
|
||||
{
|
||||
}
|
||||
static inline
|
||||
void bcm43xx_pio_tx_suspend(struct bcm43xx_pioqueue *queue)
|
||||
{
|
||||
}
|
||||
static inline
|
||||
void bcm43xx_pio_tx_resume(struct bcm43xx_pioqueue *queue)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BCM43XX_PIO */
|
||||
#endif /* BCM43xx_PIO_H_ */
|
||||
|
|
|
@ -1860,7 +1860,7 @@ static char * __prism2_translate_scan(local_info_t *local,
|
|||
memset(&iwe, 0, sizeof(iwe));
|
||||
iwe.cmd = SIOCGIWFREQ;
|
||||
if (scan) {
|
||||
chan = scan->chid;
|
||||
chan = le16_to_cpu(scan->chid);
|
||||
} else if (bss) {
|
||||
chan = bss->chan;
|
||||
} else {
|
||||
|
@ -1868,7 +1868,7 @@ static char * __prism2_translate_scan(local_info_t *local,
|
|||
}
|
||||
|
||||
if (chan > 0) {
|
||||
iwe.u.freq.m = freq_list[le16_to_cpu(chan - 1)] * 100000;
|
||||
iwe.u.freq.m = freq_list[chan - 1] * 100000;
|
||||
iwe.u.freq.e = 1;
|
||||
current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
|
||||
IW_EV_FREQ_LEN);
|
||||
|
|
|
@ -535,7 +535,7 @@ pdcs_auto_read(struct subsystem *entry, char *buf, int knob)
|
|||
{
|
||||
char *out = buf;
|
||||
struct pdcspath_entry *pathentry;
|
||||
|
||||
|
||||
if (!entry || !buf)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -178,6 +178,11 @@ extern struct proc_dir_entry * proc_mckinley_root;
|
|||
#define ROPE6_CTL 0x230
|
||||
#define ROPE7_CTL 0x238
|
||||
|
||||
#define IOC_ROPE0_CFG 0x500 /* pluto only */
|
||||
#define IOC_ROPE_AO 0x10 /* Allow "Relaxed Ordering" */
|
||||
|
||||
|
||||
|
||||
#define HF_ENABLE 0x40
|
||||
|
||||
|
||||
|
@ -1759,19 +1764,33 @@ printk("sba_hw_init(): mem_boot 0x%x 0x%x 0x%x 0x%x\n", PAGE0->mem_boot.hpa,
|
|||
|
||||
sba_dev->num_ioc = num_ioc;
|
||||
for (i = 0; i < num_ioc; i++) {
|
||||
/*
|
||||
** Make sure the box crashes if we get any errors on a rope.
|
||||
*/
|
||||
WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE0_CTL);
|
||||
WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE1_CTL);
|
||||
WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE2_CTL);
|
||||
WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE3_CTL);
|
||||
WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE4_CTL);
|
||||
WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE5_CTL);
|
||||
WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE6_CTL);
|
||||
WRITE_REG(HF_ENABLE, sba_dev->ioc[i].ioc_hpa + ROPE7_CTL);
|
||||
unsigned long ioc_hpa = sba_dev->ioc[i].ioc_hpa;
|
||||
unsigned int j;
|
||||
|
||||
/* flush out the writes */
|
||||
for (j=0; j < sizeof(u64) * ROPES_PER_IOC; j+=sizeof(u64)) {
|
||||
|
||||
/*
|
||||
* Clear ROPE(N)_CONFIG AO bit.
|
||||
* Disables "NT Ordering" (~= !"Relaxed Ordering")
|
||||
* Overrides bit 1 in DMA Hint Sets.
|
||||
* Improves netperf UDP_STREAM by ~10% for bcm5701.
|
||||
*/
|
||||
if (IS_PLUTO(sba_dev->iodc)) {
|
||||
unsigned long rope_cfg, cfg_val;
|
||||
|
||||
rope_cfg = ioc_hpa + IOC_ROPE0_CFG + j;
|
||||
cfg_val = READ_REG(rope_cfg);
|
||||
cfg_val &= ~IOC_ROPE_AO;
|
||||
WRITE_REG(cfg_val, rope_cfg);
|
||||
}
|
||||
|
||||
/*
|
||||
** Make sure the box crashes on rope errors.
|
||||
*/
|
||||
WRITE_REG(HF_ENABLE, ioc_hpa + ROPE0_CTL + j);
|
||||
}
|
||||
|
||||
/* flush out the last writes */
|
||||
READ_REG(sba_dev->ioc[i].ioc_hpa + ROPE7_CTL);
|
||||
|
||||
DBG_INIT(" ioc[%d] ROPE_CFG 0x%Lx ROPE_DBG 0x%Lx\n",
|
||||
|
|
|
@ -155,7 +155,7 @@ superio_init(struct pci_dev *pcidev)
|
|||
struct pci_dev *pdev = sio->lio_pdev;
|
||||
u16 word;
|
||||
|
||||
if (sio->suckyio_irq_enabled)
|
||||
if (sio->suckyio_irq_enabled)
|
||||
return;
|
||||
|
||||
BUG_ON(!pdev);
|
||||
|
@ -194,7 +194,7 @@ superio_init(struct pci_dev *pcidev)
|
|||
request_region (sio->acpi_base, 0x1f, "acpi");
|
||||
|
||||
/* Enable the legacy I/O function */
|
||||
pci_read_config_word (pdev, PCI_COMMAND, &word);
|
||||
pci_read_config_word (pdev, PCI_COMMAND, &word);
|
||||
word |= PCI_COMMAND_SERR | PCI_COMMAND_PARITY | PCI_COMMAND_IO;
|
||||
pci_write_config_word (pdev, PCI_COMMAND, word);
|
||||
|
||||
|
|
|
@ -250,7 +250,7 @@ config M32R_CFC_NUM
|
|||
|
||||
config PCMCIA_VRC4171
|
||||
tristate "NEC VRC4171 Card Controllers support"
|
||||
depends on VRC4171 && PCMCIA
|
||||
depends on CPU_VR41XX && ISA && PCMCIA
|
||||
|
||||
config PCMCIA_VRC4173
|
||||
tristate "NEC VRC4173 CARDU support"
|
||||
|
|
|
@ -236,11 +236,11 @@ static void pcmcia_check_driver(struct pcmcia_driver *p_drv)
|
|||
/**
|
||||
* pcmcia_load_firmware - load CIS from userspace if device-provided is broken
|
||||
* @dev - the pcmcia device which needs a CIS override
|
||||
* @filename - requested filename in /lib/firmware/cis/
|
||||
* @filename - requested filename in /lib/firmware/
|
||||
*
|
||||
* This uses the in-kernel firmware loading mechanism to use a "fake CIS" if
|
||||
* the one provided by the card is broken. The firmware files reside in
|
||||
* /lib/firmware/cis/ in userspace.
|
||||
* /lib/firmware/ in userspace.
|
||||
*/
|
||||
static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
|
||||
{
|
||||
|
@ -298,9 +298,6 @@ static inline int pcmcia_load_firmware(struct pcmcia_device *dev, char * filenam
|
|||
*
|
||||
* Registers a PCMCIA driver with the PCMCIA bus core.
|
||||
*/
|
||||
static int pcmcia_device_probe(struct device *dev);
|
||||
static int pcmcia_device_remove(struct device * dev);
|
||||
|
||||
int pcmcia_register_driver(struct pcmcia_driver *driver)
|
||||
{
|
||||
if (!driver)
|
||||
|
@ -400,7 +397,7 @@ static int pcmcia_device_probe(struct device * dev)
|
|||
* call which will then check whether there are two
|
||||
* pseudo devices, and if not, add the second one.
|
||||
*/
|
||||
did = (struct pcmcia_device_id *) p_dev->dev.driver_data;
|
||||
did = p_dev->dev.driver_data;
|
||||
if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
|
||||
(p_dev->socket->device_count == 1) && (p_dev->device_no == 0))
|
||||
pcmcia_add_pseudo_device(p_dev->socket);
|
||||
|
@ -448,7 +445,6 @@ static void pcmcia_card_remove(struct pcmcia_socket *s, struct pcmcia_device *le
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
static int pcmcia_device_remove(struct device * dev)
|
||||
{
|
||||
struct pcmcia_device *p_dev;
|
||||
|
@ -463,7 +459,7 @@ static int pcmcia_device_remove(struct device * dev)
|
|||
* pseudo multi-function card, we need to unbind
|
||||
* all devices
|
||||
*/
|
||||
did = (struct pcmcia_device_id *) p_dev->dev.driver_data;
|
||||
did = p_dev->dev.driver_data;
|
||||
if (did && (did->match_flags & PCMCIA_DEV_ID_MATCH_DEVICE_NO) &&
|
||||
(p_dev->socket->device_count != 0) &&
|
||||
(p_dev->device_no == 0))
|
||||
|
@ -476,6 +472,8 @@ static int pcmcia_device_remove(struct device * dev)
|
|||
if (p_drv->remove)
|
||||
p_drv->remove(p_dev);
|
||||
|
||||
p_dev->dev_node = NULL;
|
||||
|
||||
/* check for proper unloading */
|
||||
if (p_dev->_irq || p_dev->_io || p_dev->_locked)
|
||||
printk(KERN_INFO "pcmcia: driver %s did not release config properly\n",
|
||||
|
@ -628,7 +626,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
|
|||
}
|
||||
|
||||
/* Add to the list in pcmcia_bus_socket */
|
||||
list_add_tail(&p_dev->socket_device_list, &s->devices_list);
|
||||
list_add(&p_dev->socket_device_list, &s->devices_list);
|
||||
|
||||
spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue