merge linus into test branch
commit
9774f33841
|
@ -303,10 +303,10 @@ desc->status |= running;
|
||||||
do {
|
do {
|
||||||
if (desc->status & masked)
|
if (desc->status & masked)
|
||||||
desc->chip->enable();
|
desc->chip->enable();
|
||||||
desc-status &= ~pending;
|
desc->status &= ~pending;
|
||||||
handle_IRQ_event(desc->action);
|
handle_IRQ_event(desc->action);
|
||||||
} while (status & pending);
|
} while (status & pending);
|
||||||
desc-status &= ~running;
|
desc->status &= ~running;
|
||||||
desc->chip->end();
|
desc->chip->end();
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</para>
|
</para>
|
||||||
|
|
|
@ -1277,6 +1277,12 @@ L: linux-nvidia@lists.surfsouth.com
|
||||||
W: http://drama.obuda.kando.hu/~fero/cgi-bin/hgafb.shtml
|
W: http://drama.obuda.kando.hu/~fero/cgi-bin/hgafb.shtml
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
HID CORE LAYER
|
||||||
|
P: Jiri Kosina
|
||||||
|
M: jkosina@suse.cz
|
||||||
|
L: linux-input@atrey.karlin.mff.cuni.cz
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
HIGH-SPEED SCC DRIVER FOR AX.25
|
HIGH-SPEED SCC DRIVER FOR AX.25
|
||||||
P: Klaus Kudielka
|
P: Klaus Kudielka
|
||||||
M: klaus.kudielka@ieee.org
|
M: klaus.kudielka@ieee.org
|
||||||
|
|
5
Makefile
5
Makefile
|
@ -496,11 +496,6 @@ else
|
||||||
CFLAGS += -fomit-frame-pointer
|
CFLAGS += -fomit-frame-pointer
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_UNWIND_INFO
|
|
||||||
CFLAGS += -fasynchronous-unwind-tables
|
|
||||||
LDFLAGS_vmlinux += --eh-frame-hdr
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifdef CONFIG_DEBUG_INFO
|
ifdef CONFIG_DEBUG_INFO
|
||||||
CFLAGS += -g
|
CFLAGS += -g
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1493,8 +1493,6 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
||||||
# CONFIG_DEBUG_VM is not set
|
# CONFIG_DEBUG_VM is not set
|
||||||
# CONFIG_DEBUG_LIST is not set
|
# CONFIG_DEBUG_LIST is not set
|
||||||
# CONFIG_FRAME_POINTER is not set
|
# CONFIG_FRAME_POINTER is not set
|
||||||
CONFIG_UNWIND_INFO=y
|
|
||||||
CONFIG_STACK_UNWIND=y
|
|
||||||
# CONFIG_FORCED_INLINING is not set
|
# CONFIG_FORCED_INLINING is not set
|
||||||
# CONFIG_HEADERS_CHECK is not set
|
# CONFIG_HEADERS_CHECK is not set
|
||||||
# CONFIG_RCU_TORTURE_TEST is not set
|
# CONFIG_RCU_TORTURE_TEST is not set
|
||||||
|
|
|
@ -126,27 +126,6 @@ static unsigned extract_freq(u32 val, struct acpi_cpufreq_data *data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wrport(u16 port, u8 bit_width, u32 value)
|
|
||||||
{
|
|
||||||
if (bit_width <= 8)
|
|
||||||
outb(value, port);
|
|
||||||
else if (bit_width <= 16)
|
|
||||||
outw(value, port);
|
|
||||||
else if (bit_width <= 32)
|
|
||||||
outl(value, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void rdport(u16 port, u8 bit_width, u32 * ret)
|
|
||||||
{
|
|
||||||
*ret = 0;
|
|
||||||
if (bit_width <= 8)
|
|
||||||
*ret = inb(port);
|
|
||||||
else if (bit_width <= 16)
|
|
||||||
*ret = inw(port);
|
|
||||||
else if (bit_width <= 32)
|
|
||||||
*ret = inl(port);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct msr_addr {
|
struct msr_addr {
|
||||||
u32 reg;
|
u32 reg;
|
||||||
};
|
};
|
||||||
|
@ -177,7 +156,9 @@ static void do_drv_read(struct drv_cmd *cmd)
|
||||||
rdmsr(cmd->addr.msr.reg, cmd->val, h);
|
rdmsr(cmd->addr.msr.reg, cmd->val, h);
|
||||||
break;
|
break;
|
||||||
case SYSTEM_IO_CAPABLE:
|
case SYSTEM_IO_CAPABLE:
|
||||||
rdport(cmd->addr.io.port, cmd->addr.io.bit_width, &cmd->val);
|
acpi_os_read_port((acpi_io_address)cmd->addr.io.port,
|
||||||
|
&cmd->val,
|
||||||
|
(u32)cmd->addr.io.bit_width);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -193,7 +174,9 @@ static void do_drv_write(struct drv_cmd *cmd)
|
||||||
wrmsr(cmd->addr.msr.reg, cmd->val, h);
|
wrmsr(cmd->addr.msr.reg, cmd->val, h);
|
||||||
break;
|
break;
|
||||||
case SYSTEM_IO_CAPABLE:
|
case SYSTEM_IO_CAPABLE:
|
||||||
wrport(cmd->addr.io.port, cmd->addr.io.bit_width, cmd->val);
|
acpi_os_write_port((acpi_io_address)cmd->addr.io.port,
|
||||||
|
cmd->val,
|
||||||
|
(u32)cmd->addr.io.bit_width);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -699,14 +682,14 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
||||||
if (result)
|
if (result)
|
||||||
goto err_freqfree;
|
goto err_freqfree;
|
||||||
|
|
||||||
switch (data->cpu_feature) {
|
switch (perf->control_register.space_id) {
|
||||||
case ACPI_ADR_SPACE_SYSTEM_IO:
|
case ACPI_ADR_SPACE_SYSTEM_IO:
|
||||||
/* Current speed is unknown and not detectable by IO port */
|
/* Current speed is unknown and not detectable by IO port */
|
||||||
policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
|
policy->cur = acpi_cpufreq_guess_freq(data, policy->cpu);
|
||||||
break;
|
break;
|
||||||
case ACPI_ADR_SPACE_FIXED_HARDWARE:
|
case ACPI_ADR_SPACE_FIXED_HARDWARE:
|
||||||
acpi_cpufreq_driver.get = get_cur_freq_on_cpu;
|
acpi_cpufreq_driver.get = get_cur_freq_on_cpu;
|
||||||
get_cur_freq_on_cpu(cpu);
|
policy->cur = get_cur_freq_on_cpu(cpu);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -787,8 +787,10 @@ static int __init longhaul_init(void)
|
||||||
switch (c->x86_model) {
|
switch (c->x86_model) {
|
||||||
case 6 ... 9:
|
case 6 ... 9:
|
||||||
return cpufreq_register_driver(&longhaul_driver);
|
return cpufreq_register_driver(&longhaul_driver);
|
||||||
|
case 10:
|
||||||
|
printk(KERN_ERR PFX "Use acpi-cpufreq driver for VIA C7\n");
|
||||||
default:
|
default:
|
||||||
printk (KERN_INFO PFX "Unknown VIA CPU. Contact davej@codemonkey.org.uk\n");
|
;;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
|
@ -979,38 +979,6 @@ ENTRY(spurious_interrupt_bug)
|
||||||
jmp error_code
|
jmp error_code
|
||||||
CFI_ENDPROC
|
CFI_ENDPROC
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
ENTRY(arch_unwind_init_running)
|
|
||||||
CFI_STARTPROC
|
|
||||||
movl 4(%esp), %edx
|
|
||||||
movl (%esp), %ecx
|
|
||||||
leal 4(%esp), %eax
|
|
||||||
movl %ebx, PT_EBX(%edx)
|
|
||||||
xorl %ebx, %ebx
|
|
||||||
movl %ebx, PT_ECX(%edx)
|
|
||||||
movl %ebx, PT_EDX(%edx)
|
|
||||||
movl %esi, PT_ESI(%edx)
|
|
||||||
movl %edi, PT_EDI(%edx)
|
|
||||||
movl %ebp, PT_EBP(%edx)
|
|
||||||
movl %ebx, PT_EAX(%edx)
|
|
||||||
movl $__USER_DS, PT_DS(%edx)
|
|
||||||
movl $__USER_DS, PT_ES(%edx)
|
|
||||||
movl $0, PT_GS(%edx)
|
|
||||||
movl %ebx, PT_ORIG_EAX(%edx)
|
|
||||||
movl %ecx, PT_EIP(%edx)
|
|
||||||
movl 12(%esp), %ecx
|
|
||||||
movl $__KERNEL_CS, PT_CS(%edx)
|
|
||||||
movl %ebx, PT_EFLAGS(%edx)
|
|
||||||
movl %eax, PT_OLDESP(%edx)
|
|
||||||
movl 8(%esp), %eax
|
|
||||||
movl %ecx, 8(%esp)
|
|
||||||
movl PT_EBX(%edx), %ebx
|
|
||||||
movl $__KERNEL_DS, PT_OLDSS(%edx)
|
|
||||||
jmpl *%eax
|
|
||||||
CFI_ENDPROC
|
|
||||||
ENDPROC(arch_unwind_init_running)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ENTRY(kernel_thread_helper)
|
ENTRY(kernel_thread_helper)
|
||||||
pushl $0 # fake return address for unwinder
|
pushl $0 # fake return address for unwinder
|
||||||
CFI_STARTPROC
|
CFI_STARTPROC
|
||||||
|
|
|
@ -94,11 +94,6 @@ asmlinkage void spurious_interrupt_bug(void);
|
||||||
asmlinkage void machine_check(void);
|
asmlinkage void machine_check(void);
|
||||||
|
|
||||||
int kstack_depth_to_print = 24;
|
int kstack_depth_to_print = 24;
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
static int call_trace = 1;
|
|
||||||
#else
|
|
||||||
#define call_trace (-1)
|
|
||||||
#endif
|
|
||||||
ATOMIC_NOTIFIER_HEAD(i386die_chain);
|
ATOMIC_NOTIFIER_HEAD(i386die_chain);
|
||||||
|
|
||||||
int register_die_notifier(struct notifier_block *nb)
|
int register_die_notifier(struct notifier_block *nb)
|
||||||
|
@ -152,33 +147,6 @@ static inline unsigned long print_context_stack(struct thread_info *tinfo,
|
||||||
return ebp;
|
return ebp;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ops_and_data {
|
|
||||||
struct stacktrace_ops *ops;
|
|
||||||
void *data;
|
|
||||||
};
|
|
||||||
|
|
||||||
static asmlinkage int
|
|
||||||
dump_trace_unwind(struct unwind_frame_info *info, void *data)
|
|
||||||
{
|
|
||||||
struct ops_and_data *oad = (struct ops_and_data *)data;
|
|
||||||
int n = 0;
|
|
||||||
unsigned long sp = UNW_SP(info);
|
|
||||||
|
|
||||||
if (arch_unw_user_mode(info))
|
|
||||||
return -1;
|
|
||||||
while (unwind(info) == 0 && UNW_PC(info)) {
|
|
||||||
n++;
|
|
||||||
oad->ops->address(oad->data, UNW_PC(info));
|
|
||||||
if (arch_unw_user_mode(info))
|
|
||||||
break;
|
|
||||||
if ((sp & ~(PAGE_SIZE - 1)) == (UNW_SP(info) & ~(PAGE_SIZE - 1))
|
|
||||||
&& sp > UNW_SP(info))
|
|
||||||
break;
|
|
||||||
sp = UNW_SP(info);
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MSG(msg) ops->warning(data, msg)
|
#define MSG(msg) ops->warning(data, msg)
|
||||||
|
|
||||||
void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
||||||
|
@ -190,41 +158,6 @@ void dump_trace(struct task_struct *task, struct pt_regs *regs,
|
||||||
if (!task)
|
if (!task)
|
||||||
task = current;
|
task = current;
|
||||||
|
|
||||||
if (call_trace >= 0) {
|
|
||||||
int unw_ret = 0;
|
|
||||||
struct unwind_frame_info info;
|
|
||||||
struct ops_and_data oad = { .ops = ops, .data = data };
|
|
||||||
|
|
||||||
if (regs) {
|
|
||||||
if (unwind_init_frame_info(&info, task, regs) == 0)
|
|
||||||
unw_ret = dump_trace_unwind(&info, &oad);
|
|
||||||
} else if (task == current)
|
|
||||||
unw_ret = unwind_init_running(&info, dump_trace_unwind,
|
|
||||||
&oad);
|
|
||||||
else {
|
|
||||||
if (unwind_init_blocked(&info, task) == 0)
|
|
||||||
unw_ret = dump_trace_unwind(&info, &oad);
|
|
||||||
}
|
|
||||||
if (unw_ret > 0) {
|
|
||||||
if (call_trace == 1 && !arch_unw_user_mode(&info)) {
|
|
||||||
ops->warning_symbol(data,
|
|
||||||
"DWARF2 unwinder stuck at %s",
|
|
||||||
UNW_PC(&info));
|
|
||||||
if (UNW_SP(&info) >= PAGE_OFFSET) {
|
|
||||||
MSG("Leftover inexact backtrace:");
|
|
||||||
stack = (void *)UNW_SP(&info);
|
|
||||||
if (!stack)
|
|
||||||
return;
|
|
||||||
ebp = UNW_FP(&info);
|
|
||||||
} else
|
|
||||||
MSG("Full inexact backtrace again:");
|
|
||||||
} else if (call_trace >= 1)
|
|
||||||
return;
|
|
||||||
else
|
|
||||||
MSG("Full inexact backtrace again:");
|
|
||||||
} else
|
|
||||||
MSG("Inexact backtrace:");
|
|
||||||
}
|
|
||||||
if (!stack) {
|
if (!stack) {
|
||||||
unsigned long dummy;
|
unsigned long dummy;
|
||||||
stack = &dummy;
|
stack = &dummy;
|
||||||
|
@ -1258,19 +1191,3 @@ static int __init kstack_setup(char *s)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
__setup("kstack=", kstack_setup);
|
__setup("kstack=", kstack_setup);
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
static int __init call_trace_setup(char *s)
|
|
||||||
{
|
|
||||||
if (strcmp(s, "old") == 0)
|
|
||||||
call_trace = -1;
|
|
||||||
else if (strcmp(s, "both") == 0)
|
|
||||||
call_trace = 0;
|
|
||||||
else if (strcmp(s, "newfallback") == 0)
|
|
||||||
call_trace = 1;
|
|
||||||
else if (strcmp(s, "new") == 2)
|
|
||||||
call_trace = 2;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
__setup("call_trace=", call_trace_setup);
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.19-rc2
|
# Linux kernel version: 2.6.20-rc1
|
||||||
# Wed Oct 18 17:11:10 2006
|
# Fri Dec 15 16:52:28 2006
|
||||||
#
|
#
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
CONFIG_LOCKDEP_SUPPORT=y
|
CONFIG_LOCKDEP_SUPPORT=y
|
||||||
CONFIG_STACKTRACE_SUPPORT=y
|
CONFIG_STACKTRACE_SUPPORT=y
|
||||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||||
|
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||||
|
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||||
CONFIG_GENERIC_HWEIGHT=y
|
CONFIG_GENERIC_HWEIGHT=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
|
||||||
CONFIG_GENERIC_TIME=y
|
CONFIG_GENERIC_TIME=y
|
||||||
CONFIG_S390=y
|
CONFIG_S390=y
|
||||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||||
|
@ -37,12 +38,13 @@ CONFIG_AUDIT=y
|
||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
CONFIG_IKCONFIG_PROC=y
|
CONFIG_IKCONFIG_PROC=y
|
||||||
# CONFIG_CPUSETS is not set
|
# CONFIG_CPUSETS is not set
|
||||||
|
CONFIG_SYSFS_DEPRECATED=y
|
||||||
# CONFIG_RELAY is not set
|
# CONFIG_RELAY is not set
|
||||||
CONFIG_INITRAMFS_SOURCE=""
|
CONFIG_INITRAMFS_SOURCE=""
|
||||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||||
CONFIG_SYSCTL=y
|
CONFIG_SYSCTL=y
|
||||||
# CONFIG_EMBEDDED is not set
|
# CONFIG_EMBEDDED is not set
|
||||||
# CONFIG_SYSCTL_SYSCALL is not set
|
CONFIG_SYSCTL_SYSCALL=y
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# CONFIG_KALLSYMS_ALL is not set
|
# CONFIG_KALLSYMS_ALL is not set
|
||||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||||
|
@ -119,6 +121,7 @@ CONFIG_PACK_STACK=y
|
||||||
CONFIG_CHECK_STACK=y
|
CONFIG_CHECK_STACK=y
|
||||||
CONFIG_STACK_GUARD=256
|
CONFIG_STACK_GUARD=256
|
||||||
# CONFIG_WARN_STACK is not set
|
# CONFIG_WARN_STACK is not set
|
||||||
|
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||||
CONFIG_SELECT_MEMORY_MODEL=y
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
CONFIG_FLATMEM_MANUAL=y
|
CONFIG_FLATMEM_MANUAL=y
|
||||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||||
|
@ -128,6 +131,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
# CONFIG_SPARSEMEM_STATIC is not set
|
# CONFIG_SPARSEMEM_STATIC is not set
|
||||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||||
CONFIG_RESOURCES_64BIT=y
|
CONFIG_RESOURCES_64BIT=y
|
||||||
|
CONFIG_HOLES_IN_ZONE=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# I/O subsystem configuration
|
# I/O subsystem configuration
|
||||||
|
@ -196,6 +200,7 @@ CONFIG_INET_TCP_DIAG=y
|
||||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||||
CONFIG_TCP_CONG_CUBIC=y
|
CONFIG_TCP_CONG_CUBIC=y
|
||||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||||
|
# CONFIG_TCP_MD5SIG is not set
|
||||||
CONFIG_IPV6=y
|
CONFIG_IPV6=y
|
||||||
# CONFIG_IPV6_PRIVACY is not set
|
# CONFIG_IPV6_PRIVACY is not set
|
||||||
# CONFIG_IPV6_ROUTER_PREF is not set
|
# CONFIG_IPV6_ROUTER_PREF is not set
|
||||||
|
@ -211,7 +216,6 @@ CONFIG_INET6_XFRM_MODE_BEET=y
|
||||||
# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
|
# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
|
||||||
CONFIG_IPV6_SIT=y
|
CONFIG_IPV6_SIT=y
|
||||||
# CONFIG_IPV6_TUNNEL is not set
|
# CONFIG_IPV6_TUNNEL is not set
|
||||||
# CONFIG_IPV6_SUBTREES is not set
|
|
||||||
# CONFIG_IPV6_MULTIPLE_TABLES is not set
|
# CONFIG_IPV6_MULTIPLE_TABLES is not set
|
||||||
# CONFIG_NETWORK_SECMARK is not set
|
# CONFIG_NETWORK_SECMARK is not set
|
||||||
# CONFIG_NETFILTER is not set
|
# CONFIG_NETFILTER is not set
|
||||||
|
@ -246,6 +250,7 @@ CONFIG_IPV6_SIT=y
|
||||||
# QoS and/or fair queueing
|
# QoS and/or fair queueing
|
||||||
#
|
#
|
||||||
CONFIG_NET_SCHED=y
|
CONFIG_NET_SCHED=y
|
||||||
|
CONFIG_NET_SCH_FIFO=y
|
||||||
CONFIG_NET_SCH_CLK_JIFFIES=y
|
CONFIG_NET_SCH_CLK_JIFFIES=y
|
||||||
# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
|
# CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set
|
||||||
# CONFIG_NET_SCH_CLK_CPU is not set
|
# CONFIG_NET_SCH_CLK_CPU is not set
|
||||||
|
@ -277,6 +282,7 @@ CONFIG_NET_CLS_ROUTE=y
|
||||||
CONFIG_NET_CLS_FW=m
|
CONFIG_NET_CLS_FW=m
|
||||||
CONFIG_NET_CLS_U32=m
|
CONFIG_NET_CLS_U32=m
|
||||||
# CONFIG_CLS_U32_PERF is not set
|
# CONFIG_CLS_U32_PERF is not set
|
||||||
|
CONFIG_CLS_U32_MARK=y
|
||||||
CONFIG_NET_CLS_RSVP=m
|
CONFIG_NET_CLS_RSVP=m
|
||||||
CONFIG_NET_CLS_RSVP6=m
|
CONFIG_NET_CLS_RSVP6=m
|
||||||
# CONFIG_NET_EMATCH is not set
|
# CONFIG_NET_EMATCH is not set
|
||||||
|
@ -315,6 +321,7 @@ CONFIG_SYS_HYPERVISOR=y
|
||||||
#
|
#
|
||||||
# CONFIG_RAID_ATTRS is not set
|
# CONFIG_RAID_ATTRS is not set
|
||||||
CONFIG_SCSI=y
|
CONFIG_SCSI=y
|
||||||
|
# CONFIG_SCSI_TGT is not set
|
||||||
CONFIG_SCSI_NETLINK=y
|
CONFIG_SCSI_NETLINK=y
|
||||||
CONFIG_SCSI_PROC_FS=y
|
CONFIG_SCSI_PROC_FS=y
|
||||||
|
|
||||||
|
@ -335,6 +342,7 @@ CONFIG_CHR_DEV_SG=y
|
||||||
CONFIG_SCSI_MULTI_LUN=y
|
CONFIG_SCSI_MULTI_LUN=y
|
||||||
CONFIG_SCSI_CONSTANTS=y
|
CONFIG_SCSI_CONSTANTS=y
|
||||||
CONFIG_SCSI_LOGGING=y
|
CONFIG_SCSI_LOGGING=y
|
||||||
|
CONFIG_SCSI_SCAN_ASYNC=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# SCSI Transports
|
# SCSI Transports
|
||||||
|
@ -546,6 +554,7 @@ CONFIG_DNOTIFY=y
|
||||||
# CONFIG_AUTOFS_FS is not set
|
# CONFIG_AUTOFS_FS is not set
|
||||||
# CONFIG_AUTOFS4_FS is not set
|
# CONFIG_AUTOFS4_FS is not set
|
||||||
# CONFIG_FUSE_FS is not set
|
# CONFIG_FUSE_FS is not set
|
||||||
|
CONFIG_GENERIC_ACL=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# CD-ROM/DVD Filesystems
|
# CD-ROM/DVD Filesystems
|
||||||
|
@ -571,7 +580,7 @@ CONFIG_TMPFS=y
|
||||||
CONFIG_TMPFS_POSIX_ACL=y
|
CONFIG_TMPFS_POSIX_ACL=y
|
||||||
# CONFIG_HUGETLB_PAGE is not set
|
# CONFIG_HUGETLB_PAGE is not set
|
||||||
CONFIG_RAMFS=y
|
CONFIG_RAMFS=y
|
||||||
# CONFIG_CONFIGFS_FS is not set
|
CONFIG_CONFIGFS_FS=m
|
||||||
|
|
||||||
#
|
#
|
||||||
# Miscellaneous filesystems
|
# Miscellaneous filesystems
|
||||||
|
@ -616,7 +625,6 @@ CONFIG_SUNRPC=y
|
||||||
# CONFIG_CODA_FS is not set
|
# CONFIG_CODA_FS is not set
|
||||||
# CONFIG_AFS_FS is not set
|
# CONFIG_AFS_FS is not set
|
||||||
# CONFIG_9P_FS is not set
|
# CONFIG_9P_FS is not set
|
||||||
CONFIG_GENERIC_ACL=y
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Partition Types
|
# Partition Types
|
||||||
|
@ -645,6 +653,14 @@ CONFIG_MSDOS_PARTITION=y
|
||||||
#
|
#
|
||||||
# CONFIG_NLS is not set
|
# CONFIG_NLS is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Distributed Lock Manager
|
||||||
|
#
|
||||||
|
CONFIG_DLM=m
|
||||||
|
CONFIG_DLM_TCP=y
|
||||||
|
# CONFIG_DLM_SCTP is not set
|
||||||
|
# CONFIG_DLM_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Instrumentation Support
|
# Instrumentation Support
|
||||||
#
|
#
|
||||||
|
@ -663,6 +679,8 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||||
CONFIG_ENABLE_MUST_CHECK=y
|
CONFIG_ENABLE_MUST_CHECK=y
|
||||||
CONFIG_MAGIC_SYSRQ=y
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
# CONFIG_UNUSED_SYMBOLS is not set
|
# CONFIG_UNUSED_SYMBOLS is not set
|
||||||
|
CONFIG_DEBUG_FS=y
|
||||||
|
CONFIG_HEADERS_CHECK=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_LOG_BUF_SHIFT=17
|
CONFIG_LOG_BUF_SHIFT=17
|
||||||
# CONFIG_SCHEDSTATS is not set
|
# CONFIG_SCHEDSTATS is not set
|
||||||
|
@ -679,13 +697,11 @@ CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||||
# CONFIG_DEBUG_KOBJECT is not set
|
# CONFIG_DEBUG_KOBJECT is not set
|
||||||
# CONFIG_DEBUG_INFO is not set
|
# CONFIG_DEBUG_INFO is not set
|
||||||
CONFIG_DEBUG_FS=y
|
|
||||||
# CONFIG_DEBUG_VM is not set
|
# CONFIG_DEBUG_VM is not set
|
||||||
# CONFIG_DEBUG_LIST is not set
|
# CONFIG_DEBUG_LIST is not set
|
||||||
# CONFIG_FRAME_POINTER is not set
|
# CONFIG_FRAME_POINTER is not set
|
||||||
# CONFIG_UNWIND_INFO is not set
|
# CONFIG_UNWIND_INFO is not set
|
||||||
CONFIG_FORCED_INLINING=y
|
CONFIG_FORCED_INLINING=y
|
||||||
CONFIG_HEADERS_CHECK=y
|
|
||||||
# CONFIG_RCU_TORTURE_TEST is not set
|
# CONFIG_RCU_TORTURE_TEST is not set
|
||||||
# CONFIG_LKDTM is not set
|
# CONFIG_LKDTM is not set
|
||||||
|
|
||||||
|
@ -699,10 +715,11 @@ CONFIG_HEADERS_CHECK=y
|
||||||
# Cryptographic options
|
# Cryptographic options
|
||||||
#
|
#
|
||||||
CONFIG_CRYPTO=y
|
CONFIG_CRYPTO=y
|
||||||
CONFIG_CRYPTO_ALGAPI=m
|
CONFIG_CRYPTO_ALGAPI=y
|
||||||
CONFIG_CRYPTO_BLKCIPHER=m
|
CONFIG_CRYPTO_BLKCIPHER=y
|
||||||
CONFIG_CRYPTO_MANAGER=m
|
CONFIG_CRYPTO_MANAGER=y
|
||||||
# CONFIG_CRYPTO_HMAC is not set
|
# CONFIG_CRYPTO_HMAC is not set
|
||||||
|
# CONFIG_CRYPTO_XCBC is not set
|
||||||
# CONFIG_CRYPTO_NULL is not set
|
# CONFIG_CRYPTO_NULL is not set
|
||||||
# CONFIG_CRYPTO_MD4 is not set
|
# CONFIG_CRYPTO_MD4 is not set
|
||||||
# CONFIG_CRYPTO_MD5 is not set
|
# CONFIG_CRYPTO_MD5 is not set
|
||||||
|
@ -713,8 +730,10 @@ CONFIG_CRYPTO_MANAGER=m
|
||||||
# CONFIG_CRYPTO_SHA512 is not set
|
# CONFIG_CRYPTO_SHA512 is not set
|
||||||
# CONFIG_CRYPTO_WP512 is not set
|
# CONFIG_CRYPTO_WP512 is not set
|
||||||
# CONFIG_CRYPTO_TGR192 is not set
|
# CONFIG_CRYPTO_TGR192 is not set
|
||||||
|
# CONFIG_CRYPTO_GF128MUL is not set
|
||||||
CONFIG_CRYPTO_ECB=m
|
CONFIG_CRYPTO_ECB=m
|
||||||
CONFIG_CRYPTO_CBC=m
|
CONFIG_CRYPTO_CBC=y
|
||||||
|
# CONFIG_CRYPTO_LRW is not set
|
||||||
# CONFIG_CRYPTO_DES is not set
|
# CONFIG_CRYPTO_DES is not set
|
||||||
# CONFIG_CRYPTO_DES_S390 is not set
|
# CONFIG_CRYPTO_DES_S390 is not set
|
||||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||||
|
@ -740,8 +759,10 @@ CONFIG_CRYPTO_CBC=m
|
||||||
#
|
#
|
||||||
# Library routines
|
# Library routines
|
||||||
#
|
#
|
||||||
|
CONFIG_BITREVERSE=m
|
||||||
# CONFIG_CRC_CCITT is not set
|
# CONFIG_CRC_CCITT is not set
|
||||||
# CONFIG_CRC16 is not set
|
# CONFIG_CRC16 is not set
|
||||||
CONFIG_CRC32=m
|
CONFIG_CRC32=m
|
||||||
# CONFIG_LIBCRC32C is not set
|
# CONFIG_LIBCRC32C is not set
|
||||||
CONFIG_PLIST=y
|
CONFIG_PLIST=y
|
||||||
|
CONFIG_IOMAP_COPY=y
|
||||||
|
|
|
@ -379,7 +379,7 @@ static void *diag204_alloc_vbuf(int pages)
|
||||||
static void *diag204_alloc_rbuf(void)
|
static void *diag204_alloc_rbuf(void)
|
||||||
{
|
{
|
||||||
diag204_buf = (void*)__get_free_pages(GFP_KERNEL,0);
|
diag204_buf = (void*)__get_free_pages(GFP_KERNEL,0);
|
||||||
if (diag204_buf)
|
if (!diag204_buf)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
diag204_buf_pages = 1;
|
diag204_buf_pages = 1;
|
||||||
return diag204_buf;
|
return diag204_buf;
|
||||||
|
@ -521,7 +521,7 @@ __init int hypfs_diag_init(void)
|
||||||
}
|
}
|
||||||
rc = diag224_get_name_table();
|
rc = diag224_get_name_table();
|
||||||
if (rc) {
|
if (rc) {
|
||||||
diag224_delete_name_table();
|
diag204_free_buffer();
|
||||||
printk(KERN_ERR "hypfs: could not get name table.\n");
|
printk(KERN_ERR "hypfs: could not get name table.\n");
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
|
|
|
@ -609,42 +609,12 @@ static ssize_t on_panic_store(struct subsystem *subsys, const char *buf,
|
||||||
static struct subsys_attribute on_panic_attr =
|
static struct subsys_attribute on_panic_attr =
|
||||||
__ATTR(on_panic, 0644, on_panic_show, on_panic_store);
|
__ATTR(on_panic, 0644, on_panic_show, on_panic_store);
|
||||||
|
|
||||||
static void print_fcp_block(struct ipl_parameter_block *fcp_block)
|
|
||||||
{
|
|
||||||
printk(KERN_EMERG "wwpn: %016llx\n",
|
|
||||||
(unsigned long long)fcp_block->ipl_info.fcp.wwpn);
|
|
||||||
printk(KERN_EMERG "lun: %016llx\n",
|
|
||||||
(unsigned long long)fcp_block->ipl_info.fcp.lun);
|
|
||||||
printk(KERN_EMERG "bootprog: %lld\n",
|
|
||||||
(unsigned long long)fcp_block->ipl_info.fcp.bootprog);
|
|
||||||
printk(KERN_EMERG "br_lba: %lld\n",
|
|
||||||
(unsigned long long)fcp_block->ipl_info.fcp.br_lba);
|
|
||||||
printk(KERN_EMERG "device: %llx\n",
|
|
||||||
(unsigned long long)fcp_block->ipl_info.fcp.devno);
|
|
||||||
printk(KERN_EMERG "opt: %x\n", fcp_block->ipl_info.fcp.opt);
|
|
||||||
}
|
|
||||||
|
|
||||||
void do_reipl(void)
|
void do_reipl(void)
|
||||||
{
|
{
|
||||||
struct ccw_dev_id devid;
|
struct ccw_dev_id devid;
|
||||||
static char buf[100];
|
static char buf[100];
|
||||||
char loadparm[LOADPARM_LEN + 1];
|
char loadparm[LOADPARM_LEN + 1];
|
||||||
|
|
||||||
switch (reipl_type) {
|
|
||||||
case IPL_TYPE_CCW:
|
|
||||||
reipl_get_ascii_loadparm(loadparm);
|
|
||||||
printk(KERN_EMERG "reboot on ccw device: 0.0.%04x\n",
|
|
||||||
reipl_block_ccw->ipl_info.ccw.devno);
|
|
||||||
printk(KERN_EMERG "loadparm = '%s'\n", loadparm);
|
|
||||||
break;
|
|
||||||
case IPL_TYPE_FCP:
|
|
||||||
printk(KERN_EMERG "reboot on fcp device:\n");
|
|
||||||
print_fcp_block(reipl_block_fcp);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (reipl_method) {
|
switch (reipl_method) {
|
||||||
case IPL_METHOD_CCW_CIO:
|
case IPL_METHOD_CCW_CIO:
|
||||||
devid.devno = reipl_block_ccw->ipl_info.ccw.devno;
|
devid.devno = reipl_block_ccw->ipl_info.ccw.devno;
|
||||||
|
@ -654,6 +624,7 @@ void do_reipl(void)
|
||||||
reipl_ccw_dev(&devid);
|
reipl_ccw_dev(&devid);
|
||||||
break;
|
break;
|
||||||
case IPL_METHOD_CCW_VM:
|
case IPL_METHOD_CCW_VM:
|
||||||
|
reipl_get_ascii_loadparm(loadparm);
|
||||||
if (strlen(loadparm) == 0)
|
if (strlen(loadparm) == 0)
|
||||||
sprintf(buf, "IPL %X",
|
sprintf(buf, "IPL %X",
|
||||||
reipl_block_ccw->ipl_info.ccw.devno);
|
reipl_block_ccw->ipl_info.ccw.devno);
|
||||||
|
@ -683,7 +654,6 @@ void do_reipl(void)
|
||||||
diag308(DIAG308_IPL, NULL);
|
diag308(DIAG308_IPL, NULL);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
printk(KERN_EMERG "reboot failed!\n");
|
|
||||||
signal_processor(smp_processor_id(), sigp_stop_and_store_status);
|
signal_processor(smp_processor_id(), sigp_stop_and_store_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -692,19 +662,6 @@ static void do_dump(void)
|
||||||
struct ccw_dev_id devid;
|
struct ccw_dev_id devid;
|
||||||
static char buf[100];
|
static char buf[100];
|
||||||
|
|
||||||
switch (dump_type) {
|
|
||||||
case IPL_TYPE_CCW:
|
|
||||||
printk(KERN_EMERG "Automatic dump on ccw device: 0.0.%04x\n",
|
|
||||||
dump_block_ccw->ipl_info.ccw.devno);
|
|
||||||
break;
|
|
||||||
case IPL_TYPE_FCP:
|
|
||||||
printk(KERN_EMERG "Automatic dump on fcp device:\n");
|
|
||||||
print_fcp_block(dump_block_fcp);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (dump_method) {
|
switch (dump_method) {
|
||||||
case IPL_METHOD_CCW_CIO:
|
case IPL_METHOD_CCW_CIO:
|
||||||
smp_send_stop();
|
smp_send_stop();
|
||||||
|
@ -1037,15 +994,21 @@ static void do_reset_calls(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void reset_mcck_handler(void);
|
extern void reset_mcck_handler(void);
|
||||||
|
extern void reset_pgm_handler(void);
|
||||||
|
extern __u32 dump_prefix_page;
|
||||||
|
|
||||||
void s390_reset_system(void)
|
void s390_reset_system(void)
|
||||||
{
|
{
|
||||||
struct _lowcore *lc;
|
struct _lowcore *lc;
|
||||||
|
|
||||||
/* Stack for interrupt/machine check handler */
|
|
||||||
lc = (struct _lowcore *)(unsigned long) store_prefix();
|
lc = (struct _lowcore *)(unsigned long) store_prefix();
|
||||||
|
|
||||||
|
/* Stack for interrupt/machine check handler */
|
||||||
lc->panic_stack = S390_lowcore.panic_stack;
|
lc->panic_stack = S390_lowcore.panic_stack;
|
||||||
|
|
||||||
|
/* Save prefix page address for dump case */
|
||||||
|
dump_prefix_page = (unsigned long) lc;
|
||||||
|
|
||||||
/* Disable prefixing */
|
/* Disable prefixing */
|
||||||
set_prefix(0);
|
set_prefix(0);
|
||||||
|
|
||||||
|
@ -1056,5 +1019,11 @@ void s390_reset_system(void)
|
||||||
S390_lowcore.mcck_new_psw.mask = PSW_KERNEL_BITS & ~PSW_MASK_MCHECK;
|
S390_lowcore.mcck_new_psw.mask = PSW_KERNEL_BITS & ~PSW_MASK_MCHECK;
|
||||||
S390_lowcore.mcck_new_psw.addr =
|
S390_lowcore.mcck_new_psw.addr =
|
||||||
PSW_ADDR_AMODE | (unsigned long) &reset_mcck_handler;
|
PSW_ADDR_AMODE | (unsigned long) &reset_mcck_handler;
|
||||||
|
|
||||||
|
/* Set new program check handler */
|
||||||
|
S390_lowcore.program_new_psw.mask = PSW_KERNEL_BITS & ~PSW_MASK_MCHECK;
|
||||||
|
S390_lowcore.program_new_psw.addr =
|
||||||
|
PSW_ADDR_AMODE | (unsigned long) &reset_pgm_handler;
|
||||||
|
|
||||||
do_reset_calls();
|
do_reset_calls();
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ do_reipl_asm: basr %r13,0
|
||||||
stm %r0,%r15,__LC_GPREGS_SAVE_AREA
|
stm %r0,%r15,__LC_GPREGS_SAVE_AREA
|
||||||
stctl %c0,%c15,__LC_CREGS_SAVE_AREA
|
stctl %c0,%c15,__LC_CREGS_SAVE_AREA
|
||||||
stam %a0,%a15,__LC_AREGS_SAVE_AREA
|
stam %a0,%a15,__LC_AREGS_SAVE_AREA
|
||||||
stpx __LC_PREFIX_SAVE_AREA
|
mvc __LC_PREFIX_SAVE_AREA(4),dump_prefix_page-.Lpg0(%r13)
|
||||||
stckc .Lclkcmp-.Lpg0(%r13)
|
stckc .Lclkcmp-.Lpg0(%r13)
|
||||||
mvc __LC_CLOCK_COMP_SAVE_AREA(8),.Lclkcmp-.Lpg0(%r13)
|
mvc __LC_CLOCK_COMP_SAVE_AREA(8),.Lclkcmp-.Lpg0(%r13)
|
||||||
stpt __LC_CPU_TIMER_SAVE_AREA
|
stpt __LC_CPU_TIMER_SAVE_AREA
|
||||||
|
@ -79,3 +79,7 @@ do_reipl_asm: basr %r13,0
|
||||||
.long 0x00000000,0x00000000
|
.long 0x00000000,0x00000000
|
||||||
.long 0x00000000,0x00000000
|
.long 0x00000000,0x00000000
|
||||||
.long 0x00000000,0x00000000
|
.long 0x00000000,0x00000000
|
||||||
|
.globl dump_prefix_page
|
||||||
|
dump_prefix_page:
|
||||||
|
.long 0x00000000
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ do_reipl_asm: basr %r13,0
|
||||||
stg %r0,__LC_GPREGS_SAVE_AREA-0x1000+8(%r1)
|
stg %r0,__LC_GPREGS_SAVE_AREA-0x1000+8(%r1)
|
||||||
stctg %c0,%c15,__LC_CREGS_SAVE_AREA-0x1000(%r1)
|
stctg %c0,%c15,__LC_CREGS_SAVE_AREA-0x1000(%r1)
|
||||||
stam %a0,%a15,__LC_AREGS_SAVE_AREA-0x1000(%r1)
|
stam %a0,%a15,__LC_AREGS_SAVE_AREA-0x1000(%r1)
|
||||||
stpx __LC_PREFIX_SAVE_AREA-0x1000(%r1)
|
mvc __LC_PREFIX_SAVE_AREA-0x1000(4,%r1),dump_prefix_page-.Lpg0(%r13)
|
||||||
stfpc __LC_FP_CREG_SAVE_AREA-0x1000(%r1)
|
stfpc __LC_FP_CREG_SAVE_AREA-0x1000(%r1)
|
||||||
stckc .Lclkcmp-.Lpg0(%r13)
|
stckc .Lclkcmp-.Lpg0(%r13)
|
||||||
mvc __LC_CLOCK_COMP_SAVE_AREA-0x1000(8,%r1),.Lclkcmp-.Lpg0(%r13)
|
mvc __LC_CLOCK_COMP_SAVE_AREA-0x1000(8,%r1),.Lclkcmp-.Lpg0(%r13)
|
||||||
|
@ -103,3 +103,6 @@ do_reipl_asm: basr %r13,0
|
||||||
.long 0x00000000,0x00000000
|
.long 0x00000000,0x00000000
|
||||||
.long 0x00000000,0x00000000
|
.long 0x00000000,0x00000000
|
||||||
.long 0x00000000,0x00000000
|
.long 0x00000000,0x00000000
|
||||||
|
.globl dump_prefix_page
|
||||||
|
dump_prefix_page:
|
||||||
|
.long 0x00000000
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) IBM Corp. 2006
|
* Copyright (C) IBM Corp. 2006
|
||||||
* Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
|
* Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
|
||||||
|
* Michael Holzheu <holzheu@de.ibm.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
@ -27,6 +28,26 @@ reset_mcck_handler:
|
||||||
s390_reset_mcck_handler:
|
s390_reset_mcck_handler:
|
||||||
.quad 0
|
.quad 0
|
||||||
|
|
||||||
|
.globl reset_pgm_handler
|
||||||
|
reset_pgm_handler:
|
||||||
|
stmg %r0,%r15,__LC_SAVE_AREA
|
||||||
|
basr %r13,0
|
||||||
|
0: lg %r15,__LC_PANIC_STACK # load panic stack
|
||||||
|
aghi %r15,-STACK_FRAME_OVERHEAD
|
||||||
|
lg %r1,s390_reset_pgm_handler-0b(%r13)
|
||||||
|
ltgr %r1,%r1
|
||||||
|
jz 1f
|
||||||
|
basr %r14,%r1
|
||||||
|
lmg %r0,%r15,__LC_SAVE_AREA
|
||||||
|
lpswe __LC_PGM_OLD_PSW
|
||||||
|
1: lpswe disabled_wait_psw-0b(%r13)
|
||||||
|
.globl s390_reset_pgm_handler
|
||||||
|
s390_reset_pgm_handler:
|
||||||
|
.quad 0
|
||||||
|
.align 8
|
||||||
|
disabled_wait_psw:
|
||||||
|
.quad 0x0002000180000000,0x0000000000000000 + reset_pgm_handler
|
||||||
|
|
||||||
#else /* CONFIG_64BIT */
|
#else /* CONFIG_64BIT */
|
||||||
|
|
||||||
.globl reset_mcck_handler
|
.globl reset_mcck_handler
|
||||||
|
@ -45,4 +66,25 @@ reset_mcck_handler:
|
||||||
s390_reset_mcck_handler:
|
s390_reset_mcck_handler:
|
||||||
.long 0
|
.long 0
|
||||||
|
|
||||||
|
.globl reset_pgm_handler
|
||||||
|
reset_pgm_handler:
|
||||||
|
stm %r0,%r15,__LC_SAVE_AREA
|
||||||
|
basr %r13,0
|
||||||
|
0: l %r15,__LC_PANIC_STACK # load panic stack
|
||||||
|
ahi %r15,-STACK_FRAME_OVERHEAD
|
||||||
|
l %r1,s390_reset_pgm_handler-0b(%r13)
|
||||||
|
ltr %r1,%r1
|
||||||
|
jz 1f
|
||||||
|
basr %r14,%r1
|
||||||
|
lm %r0,%r15,__LC_SAVE_AREA
|
||||||
|
lpsw __LC_PGM_OLD_PSW
|
||||||
|
|
||||||
|
1: lpsw disabled_wait_psw-0b(%r13)
|
||||||
|
.globl s390_reset_pgm_handler
|
||||||
|
s390_reset_pgm_handler:
|
||||||
|
.long 0
|
||||||
|
disabled_wait_psw:
|
||||||
|
.align 8
|
||||||
|
.long 0x000a0000,0x00000000 + reset_pgm_handler
|
||||||
|
|
||||||
#endif /* CONFIG_64BIT */
|
#endif /* CONFIG_64BIT */
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -83,9 +83,6 @@ extern int __divdi3(int, int);
|
||||||
/* Private functions with odd calling conventions. */
|
/* Private functions with odd calling conventions. */
|
||||||
extern void ___atomic24_add(void);
|
extern void ___atomic24_add(void);
|
||||||
extern void ___atomic24_sub(void);
|
extern void ___atomic24_sub(void);
|
||||||
extern void ___set_bit(void);
|
|
||||||
extern void ___clear_bit(void);
|
|
||||||
extern void ___change_bit(void);
|
|
||||||
extern void ___rw_read_enter(void);
|
extern void ___rw_read_enter(void);
|
||||||
extern void ___rw_read_try(void);
|
extern void ___rw_read_try(void);
|
||||||
extern void ___rw_read_exit(void);
|
extern void ___rw_read_exit(void);
|
||||||
|
@ -125,11 +122,6 @@ EXPORT_SYMBOL(pfn_base);
|
||||||
EXPORT_SYMBOL(___atomic24_add);
|
EXPORT_SYMBOL(___atomic24_add);
|
||||||
EXPORT_SYMBOL(___atomic24_sub);
|
EXPORT_SYMBOL(___atomic24_sub);
|
||||||
|
|
||||||
/* Bit operations. */
|
|
||||||
EXPORT_SYMBOL(___set_bit);
|
|
||||||
EXPORT_SYMBOL(___clear_bit);
|
|
||||||
EXPORT_SYMBOL(___change_bit);
|
|
||||||
|
|
||||||
/* Per-CPU information table */
|
/* Per-CPU information table */
|
||||||
EXPORT_PER_CPU_SYMBOL(__cpu_data);
|
EXPORT_PER_CPU_SYMBOL(__cpu_data);
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,6 @@ unsigned long profile_pc(struct pt_regs *regs)
|
||||||
extern char __copy_user_begin[], __copy_user_end[];
|
extern char __copy_user_begin[], __copy_user_end[];
|
||||||
extern char __atomic_begin[], __atomic_end[];
|
extern char __atomic_begin[], __atomic_end[];
|
||||||
extern char __bzero_begin[], __bzero_end[];
|
extern char __bzero_begin[], __bzero_end[];
|
||||||
extern char __bitops_begin[], __bitops_end[];
|
|
||||||
|
|
||||||
unsigned long pc = regs->pc;
|
unsigned long pc = regs->pc;
|
||||||
|
|
||||||
|
@ -88,9 +87,7 @@ unsigned long profile_pc(struct pt_regs *regs)
|
||||||
(pc >= (unsigned long) __atomic_begin &&
|
(pc >= (unsigned long) __atomic_begin &&
|
||||||
pc < (unsigned long) __atomic_end) ||
|
pc < (unsigned long) __atomic_end) ||
|
||||||
(pc >= (unsigned long) __bzero_begin &&
|
(pc >= (unsigned long) __bzero_begin &&
|
||||||
pc < (unsigned long) __bzero_end) ||
|
pc < (unsigned long) __bzero_end))
|
||||||
(pc >= (unsigned long) __bitops_begin &&
|
|
||||||
pc < (unsigned long) __bitops_end))
|
|
||||||
pc = regs->u_regs[UREG_RETPC];
|
pc = regs->u_regs[UREG_RETPC];
|
||||||
return pc;
|
return pc;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ EXTRA_AFLAGS := -ansi -DST_DIV0=0x02
|
||||||
lib-y := mul.o rem.o sdiv.o udiv.o umul.o urem.o ashrdi3.o memcpy.o memset.o \
|
lib-y := mul.o rem.o sdiv.o udiv.o umul.o urem.o ashrdi3.o memcpy.o memset.o \
|
||||||
strlen.o checksum.o blockops.o memscan.o memcmp.o strncmp.o \
|
strlen.o checksum.o blockops.o memscan.o memcmp.o strncmp.o \
|
||||||
strncpy_from_user.o divdi3.o udivdi3.o strlen_user.o \
|
strncpy_from_user.o divdi3.o udivdi3.o strlen_user.o \
|
||||||
copy_user.o locks.o atomic.o atomic32.o bitops.o \
|
copy_user.o locks.o atomic.o \
|
||||||
lshrdi3.o ashldi3.o rwsem.o muldi3.o bitext.o
|
lshrdi3.o ashldi3.o rwsem.o muldi3.o bitext.o
|
||||||
|
|
||||||
obj-y += iomap.o
|
obj-y += iomap.o atomic32.o
|
||||||
|
|
|
@ -76,3 +76,42 @@ void atomic_set(atomic_t *v, int i)
|
||||||
spin_unlock_irqrestore(ATOMIC_HASH(v), flags);
|
spin_unlock_irqrestore(ATOMIC_HASH(v), flags);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(atomic_set);
|
EXPORT_SYMBOL(atomic_set);
|
||||||
|
|
||||||
|
unsigned long ___set_bit(unsigned long *addr, unsigned long mask)
|
||||||
|
{
|
||||||
|
unsigned long old, flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(ATOMIC_HASH(addr), flags);
|
||||||
|
old = *addr;
|
||||||
|
*addr = old | mask;
|
||||||
|
spin_unlock_irqrestore(ATOMIC_HASH(addr), flags);
|
||||||
|
|
||||||
|
return old & mask;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(___set_bit);
|
||||||
|
|
||||||
|
unsigned long ___clear_bit(unsigned long *addr, unsigned long mask)
|
||||||
|
{
|
||||||
|
unsigned long old, flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(ATOMIC_HASH(addr), flags);
|
||||||
|
old = *addr;
|
||||||
|
*addr = old & ~mask;
|
||||||
|
spin_unlock_irqrestore(ATOMIC_HASH(addr), flags);
|
||||||
|
|
||||||
|
return old & mask;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(___clear_bit);
|
||||||
|
|
||||||
|
unsigned long ___change_bit(unsigned long *addr, unsigned long mask)
|
||||||
|
{
|
||||||
|
unsigned long old, flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(ATOMIC_HASH(addr), flags);
|
||||||
|
old = *addr;
|
||||||
|
*addr = old ^ mask;
|
||||||
|
spin_unlock_irqrestore(ATOMIC_HASH(addr), flags);
|
||||||
|
|
||||||
|
return old & mask;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(___change_bit);
|
||||||
|
|
|
@ -1,109 +0,0 @@
|
||||||
/* bitops.S: Low level assembler bit operations.
|
|
||||||
*
|
|
||||||
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#include <asm/psr.h>
|
|
||||||
|
|
||||||
.text
|
|
||||||
.align 4
|
|
||||||
|
|
||||||
.globl __bitops_begin
|
|
||||||
__bitops_begin:
|
|
||||||
|
|
||||||
/* Take bits in %g2 and set them in word at %g1,
|
|
||||||
* return whether bits were set in original value
|
|
||||||
* in %g2. %g4 holds value to restore into %o7
|
|
||||||
* in delay slot of jmpl return, %g3 + %g5 + %g7 can be
|
|
||||||
* used as temporaries and thus is considered clobbered
|
|
||||||
* by all callers.
|
|
||||||
*/
|
|
||||||
.globl ___set_bit
|
|
||||||
___set_bit:
|
|
||||||
rd %psr, %g3
|
|
||||||
nop; nop; nop;
|
|
||||||
or %g3, PSR_PIL, %g5
|
|
||||||
wr %g5, 0x0, %psr
|
|
||||||
nop; nop; nop
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
set bitops_spinlock, %g5
|
|
||||||
2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
|
|
||||||
orcc %g7, 0x0, %g0 ! Did we get it?
|
|
||||||
bne 2b ! Nope...
|
|
||||||
#endif
|
|
||||||
ld [%g1], %g7
|
|
||||||
or %g7, %g2, %g5
|
|
||||||
and %g7, %g2, %g2
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
st %g5, [%g1]
|
|
||||||
set bitops_spinlock, %g5
|
|
||||||
stb %g0, [%g5]
|
|
||||||
#else
|
|
||||||
st %g5, [%g1]
|
|
||||||
#endif
|
|
||||||
wr %g3, 0x0, %psr
|
|
||||||
nop; nop; nop
|
|
||||||
jmpl %o7, %g0
|
|
||||||
mov %g4, %o7
|
|
||||||
|
|
||||||
/* Same as above, but clears the bits from %g2 instead. */
|
|
||||||
.globl ___clear_bit
|
|
||||||
___clear_bit:
|
|
||||||
rd %psr, %g3
|
|
||||||
nop; nop; nop
|
|
||||||
or %g3, PSR_PIL, %g5
|
|
||||||
wr %g5, 0x0, %psr
|
|
||||||
nop; nop; nop
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
set bitops_spinlock, %g5
|
|
||||||
2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
|
|
||||||
orcc %g7, 0x0, %g0 ! Did we get it?
|
|
||||||
bne 2b ! Nope...
|
|
||||||
#endif
|
|
||||||
ld [%g1], %g7
|
|
||||||
andn %g7, %g2, %g5
|
|
||||||
and %g7, %g2, %g2
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
st %g5, [%g1]
|
|
||||||
set bitops_spinlock, %g5
|
|
||||||
stb %g0, [%g5]
|
|
||||||
#else
|
|
||||||
st %g5, [%g1]
|
|
||||||
#endif
|
|
||||||
wr %g3, 0x0, %psr
|
|
||||||
nop; nop; nop
|
|
||||||
jmpl %o7, %g0
|
|
||||||
mov %g4, %o7
|
|
||||||
|
|
||||||
/* Same thing again, but this time toggles the bits from %g2. */
|
|
||||||
.globl ___change_bit
|
|
||||||
___change_bit:
|
|
||||||
rd %psr, %g3
|
|
||||||
nop; nop; nop
|
|
||||||
or %g3, PSR_PIL, %g5
|
|
||||||
wr %g5, 0x0, %psr
|
|
||||||
nop; nop; nop
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
set bitops_spinlock, %g5
|
|
||||||
2: ldstub [%g5], %g7 ! Spin on the byte lock for SMP.
|
|
||||||
orcc %g7, 0x0, %g0 ! Did we get it?
|
|
||||||
bne 2b ! Nope...
|
|
||||||
#endif
|
|
||||||
ld [%g1], %g7
|
|
||||||
xor %g7, %g2, %g5
|
|
||||||
and %g7, %g2, %g2
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
st %g5, [%g1]
|
|
||||||
set bitops_spinlock, %g5
|
|
||||||
stb %g0, [%g5]
|
|
||||||
#else
|
|
||||||
st %g5, [%g1]
|
|
||||||
#endif
|
|
||||||
wr %g3, 0x0, %psr
|
|
||||||
nop; nop; nop
|
|
||||||
jmpl %o7, %g0
|
|
||||||
mov %g4, %o7
|
|
||||||
|
|
||||||
.globl __bitops_end
|
|
||||||
__bitops_end:
|
|
|
@ -78,10 +78,6 @@ sparc_ramdisk_image64:
|
||||||
|
|
||||||
/* PROM cif handler code address is in %o4. */
|
/* PROM cif handler code address is in %o4. */
|
||||||
sparc64_boot:
|
sparc64_boot:
|
||||||
1: rd %pc, %g7
|
|
||||||
set 1b, %g1
|
|
||||||
cmp %g1, %g7
|
|
||||||
be,pn %xcc, sparc64_boot_after_remap
|
|
||||||
mov %o4, %l7
|
mov %o4, %l7
|
||||||
|
|
||||||
/* We need to remap the kernel. Use position independant
|
/* We need to remap the kernel. Use position independant
|
||||||
|
@ -295,7 +291,6 @@ is_sun4v:
|
||||||
|
|
||||||
add %sp, (192 + 128), %sp
|
add %sp, (192 + 128), %sp
|
||||||
|
|
||||||
sparc64_boot_after_remap:
|
|
||||||
sethi %hi(prom_root_compatible), %g1
|
sethi %hi(prom_root_compatible), %g1
|
||||||
or %g1, %lo(prom_root_compatible), %g1
|
or %g1, %lo(prom_root_compatible), %g1
|
||||||
sethi %hi(prom_sun4v_name), %g7
|
sethi %hi(prom_sun4v_name), %g7
|
||||||
|
|
|
@ -372,14 +372,14 @@ static void run_pre_handler(unsigned int virt_irq)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct hw_interrupt_type sun4u_irq = {
|
static struct irq_chip sun4u_irq = {
|
||||||
.typename = "sun4u",
|
.typename = "sun4u",
|
||||||
.enable = sun4u_irq_enable,
|
.enable = sun4u_irq_enable,
|
||||||
.disable = sun4u_irq_disable,
|
.disable = sun4u_irq_disable,
|
||||||
.end = sun4u_irq_end,
|
.end = sun4u_irq_end,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct hw_interrupt_type sun4u_irq_ack = {
|
static struct irq_chip sun4u_irq_ack = {
|
||||||
.typename = "sun4u+ack",
|
.typename = "sun4u+ack",
|
||||||
.enable = sun4u_irq_enable,
|
.enable = sun4u_irq_enable,
|
||||||
.disable = sun4u_irq_disable,
|
.disable = sun4u_irq_disable,
|
||||||
|
@ -387,14 +387,14 @@ static struct hw_interrupt_type sun4u_irq_ack = {
|
||||||
.end = sun4u_irq_end,
|
.end = sun4u_irq_end,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct hw_interrupt_type sun4v_irq = {
|
static struct irq_chip sun4v_irq = {
|
||||||
.typename = "sun4v",
|
.typename = "sun4v",
|
||||||
.enable = sun4v_irq_enable,
|
.enable = sun4v_irq_enable,
|
||||||
.disable = sun4v_irq_disable,
|
.disable = sun4v_irq_disable,
|
||||||
.end = sun4v_irq_end,
|
.end = sun4v_irq_end,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct hw_interrupt_type sun4v_irq_ack = {
|
static struct irq_chip sun4v_irq_ack = {
|
||||||
.typename = "sun4v+ack",
|
.typename = "sun4v+ack",
|
||||||
.enable = sun4v_irq_enable,
|
.enable = sun4v_irq_enable,
|
||||||
.disable = sun4v_irq_disable,
|
.disable = sun4v_irq_disable,
|
||||||
|
@ -493,22 +493,6 @@ out:
|
||||||
return bucket->virt_irq;
|
return bucket->virt_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hw_resend_irq(struct hw_interrupt_type *handler, unsigned int virt_irq)
|
|
||||||
{
|
|
||||||
struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
|
|
||||||
unsigned long pstate;
|
|
||||||
unsigned int *ent;
|
|
||||||
|
|
||||||
__asm__ __volatile__("rdpr %%pstate, %0" : "=r" (pstate));
|
|
||||||
__asm__ __volatile__("wrpr %0, %1, %%pstate"
|
|
||||||
: : "r" (pstate), "i" (PSTATE_IE));
|
|
||||||
ent = irq_work(smp_processor_id());
|
|
||||||
bucket->irq_chain = *ent;
|
|
||||||
*ent = __irq(bucket);
|
|
||||||
set_softint(1 << PIL_DEVICE_IRQ);
|
|
||||||
__asm__ __volatile__("wrpr %0, 0x0, %%pstate" : : "r" (pstate));
|
|
||||||
}
|
|
||||||
|
|
||||||
void ack_bad_irq(unsigned int virt_irq)
|
void ack_bad_irq(unsigned int virt_irq)
|
||||||
{
|
{
|
||||||
struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
|
struct ino_bucket *bucket = virt_irq_to_bucket(virt_irq);
|
||||||
|
|
|
@ -1447,11 +1447,8 @@ void __init setup_per_cpu_areas(void)
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
/* Copy section for each CPU (we discard the original) */
|
/* Copy section for each CPU (we discard the original) */
|
||||||
goal = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES);
|
|
||||||
#ifdef CONFIG_MODULES
|
|
||||||
if (goal < PERCPU_ENOUGH_ROOM)
|
|
||||||
goal = PERCPU_ENOUGH_ROOM;
|
goal = PERCPU_ENOUGH_ROOM;
|
||||||
#endif
|
|
||||||
__per_cpu_shift = 0;
|
__per_cpu_shift = 0;
|
||||||
for (size = 1UL; size < goal; size <<= 1UL)
|
for (size = 1UL; size < goal; size <<= 1UL)
|
||||||
__per_cpu_shift++;
|
__per_cpu_shift++;
|
||||||
|
|
|
@ -45,9 +45,7 @@ cflags-kernel-$(CONFIG_REORDER) += -ffunction-sections
|
||||||
# actually it makes the kernel smaller too.
|
# actually it makes the kernel smaller too.
|
||||||
cflags-y += -fno-reorder-blocks
|
cflags-y += -fno-reorder-blocks
|
||||||
cflags-y += -Wno-sign-compare
|
cflags-y += -Wno-sign-compare
|
||||||
ifneq ($(CONFIG_UNWIND_INFO),y)
|
|
||||||
cflags-y += -fno-asynchronous-unwind-tables
|
cflags-y += -fno-asynchronous-unwind-tables
|
||||||
endif
|
|
||||||
ifneq ($(CONFIG_DEBUG_INFO),y)
|
ifneq ($(CONFIG_DEBUG_INFO),y)
|
||||||
# -fweb shrinks the kernel a bit, but the difference is very small
|
# -fweb shrinks the kernel a bit, but the difference is very small
|
||||||
# it also messes up debugging, so don't use it for now.
|
# it also messes up debugging, so don't use it for now.
|
||||||
|
|
|
@ -1523,8 +1523,6 @@ CONFIG_DEBUG_FS=y
|
||||||
# CONFIG_DEBUG_VM is not set
|
# CONFIG_DEBUG_VM is not set
|
||||||
# CONFIG_DEBUG_LIST is not set
|
# CONFIG_DEBUG_LIST is not set
|
||||||
# CONFIG_FRAME_POINTER is not set
|
# CONFIG_FRAME_POINTER is not set
|
||||||
CONFIG_UNWIND_INFO=y
|
|
||||||
CONFIG_STACK_UNWIND=y
|
|
||||||
# CONFIG_FORCED_INLINING is not set
|
# CONFIG_FORCED_INLINING is not set
|
||||||
# CONFIG_HEADERS_CHECK is not set
|
# CONFIG_HEADERS_CHECK is not set
|
||||||
# CONFIG_RCU_TORTURE_TEST is not set
|
# CONFIG_RCU_TORTURE_TEST is not set
|
||||||
|
|
|
@ -1155,36 +1155,3 @@ ENTRY(call_softirq)
|
||||||
ret
|
ret
|
||||||
CFI_ENDPROC
|
CFI_ENDPROC
|
||||||
ENDPROC(call_softirq)
|
ENDPROC(call_softirq)
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
ENTRY(arch_unwind_init_running)
|
|
||||||
CFI_STARTPROC
|
|
||||||
movq %r15, R15(%rdi)
|
|
||||||
movq %r14, R14(%rdi)
|
|
||||||
xchgq %rsi, %rdx
|
|
||||||
movq %r13, R13(%rdi)
|
|
||||||
movq %r12, R12(%rdi)
|
|
||||||
xorl %eax, %eax
|
|
||||||
movq %rbp, RBP(%rdi)
|
|
||||||
movq %rbx, RBX(%rdi)
|
|
||||||
movq (%rsp), %rcx
|
|
||||||
movq %rax, R11(%rdi)
|
|
||||||
movq %rax, R10(%rdi)
|
|
||||||
movq %rax, R9(%rdi)
|
|
||||||
movq %rax, R8(%rdi)
|
|
||||||
movq %rax, RAX(%rdi)
|
|
||||||
movq %rax, RCX(%rdi)
|
|
||||||
movq %rax, RDX(%rdi)
|
|
||||||
movq %rax, RSI(%rdi)
|
|
||||||
movq %rax, RDI(%rdi)
|
|
||||||
movq %rax, ORIG_RAX(%rdi)
|
|
||||||
movq %rcx, RIP(%rdi)
|
|
||||||
leaq 8(%rsp), %rcx
|
|
||||||
movq $__KERNEL_CS, CS(%rdi)
|
|
||||||
movq %rax, EFLAGS(%rdi)
|
|
||||||
movq %rcx, RSP(%rdi)
|
|
||||||
movq $__KERNEL_DS, SS(%rdi)
|
|
||||||
jmpq *%rdx
|
|
||||||
CFI_ENDPROC
|
|
||||||
ENDPROC(arch_unwind_init_running)
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -110,11 +110,6 @@ static inline void preempt_conditional_cli(struct pt_regs *regs)
|
||||||
}
|
}
|
||||||
|
|
||||||
int kstack_depth_to_print = 12;
|
int kstack_depth_to_print = 12;
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
static int call_trace = 1;
|
|
||||||
#else
|
|
||||||
#define call_trace (-1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_KALLSYMS
|
#ifdef CONFIG_KALLSYMS
|
||||||
void printk_address(unsigned long address)
|
void printk_address(unsigned long address)
|
||||||
|
@ -217,32 +212,6 @@ static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ops_and_data {
|
|
||||||
struct stacktrace_ops *ops;
|
|
||||||
void *data;
|
|
||||||
};
|
|
||||||
|
|
||||||
static int dump_trace_unwind(struct unwind_frame_info *info, void *context)
|
|
||||||
{
|
|
||||||
struct ops_and_data *oad = (struct ops_and_data *)context;
|
|
||||||
int n = 0;
|
|
||||||
unsigned long sp = UNW_SP(info);
|
|
||||||
|
|
||||||
if (arch_unw_user_mode(info))
|
|
||||||
return -1;
|
|
||||||
while (unwind(info) == 0 && UNW_PC(info)) {
|
|
||||||
n++;
|
|
||||||
oad->ops->address(oad->data, UNW_PC(info));
|
|
||||||
if (arch_unw_user_mode(info))
|
|
||||||
break;
|
|
||||||
if ((sp & ~(PAGE_SIZE - 1)) == (UNW_SP(info) & ~(PAGE_SIZE - 1))
|
|
||||||
&& sp > UNW_SP(info))
|
|
||||||
break;
|
|
||||||
sp = UNW_SP(info);
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MSG(txt) ops->warning(data, txt)
|
#define MSG(txt) ops->warning(data, txt)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -270,40 +239,6 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
|
||||||
if (!tsk)
|
if (!tsk)
|
||||||
tsk = current;
|
tsk = current;
|
||||||
|
|
||||||
if (call_trace >= 0) {
|
|
||||||
int unw_ret = 0;
|
|
||||||
struct unwind_frame_info info;
|
|
||||||
struct ops_and_data oad = { .ops = ops, .data = data };
|
|
||||||
|
|
||||||
if (regs) {
|
|
||||||
if (unwind_init_frame_info(&info, tsk, regs) == 0)
|
|
||||||
unw_ret = dump_trace_unwind(&info, &oad);
|
|
||||||
} else if (tsk == current)
|
|
||||||
unw_ret = unwind_init_running(&info, dump_trace_unwind,
|
|
||||||
&oad);
|
|
||||||
else {
|
|
||||||
if (unwind_init_blocked(&info, tsk) == 0)
|
|
||||||
unw_ret = dump_trace_unwind(&info, &oad);
|
|
||||||
}
|
|
||||||
if (unw_ret > 0) {
|
|
||||||
if (call_trace == 1 && !arch_unw_user_mode(&info)) {
|
|
||||||
ops->warning_symbol(data,
|
|
||||||
"DWARF2 unwinder stuck at %s",
|
|
||||||
UNW_PC(&info));
|
|
||||||
if ((long)UNW_SP(&info) < 0) {
|
|
||||||
MSG("Leftover inexact backtrace:");
|
|
||||||
stack = (unsigned long *)UNW_SP(&info);
|
|
||||||
if (!stack)
|
|
||||||
goto out;
|
|
||||||
} else
|
|
||||||
MSG("Full inexact backtrace again:");
|
|
||||||
} else if (call_trace >= 1)
|
|
||||||
goto out;
|
|
||||||
else
|
|
||||||
MSG("Full inexact backtrace again:");
|
|
||||||
} else
|
|
||||||
MSG("Inexact backtrace:");
|
|
||||||
}
|
|
||||||
if (!stack) {
|
if (!stack) {
|
||||||
unsigned long dummy;
|
unsigned long dummy;
|
||||||
stack = &dummy;
|
stack = &dummy;
|
||||||
|
@ -387,7 +322,6 @@ void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
|
||||||
tinfo = current_thread_info();
|
tinfo = current_thread_info();
|
||||||
HANDLE_STACK (valid_stack_ptr(tinfo, stack));
|
HANDLE_STACK (valid_stack_ptr(tinfo, stack));
|
||||||
#undef HANDLE_STACK
|
#undef HANDLE_STACK
|
||||||
out:
|
|
||||||
put_cpu();
|
put_cpu();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dump_trace);
|
EXPORT_SYMBOL(dump_trace);
|
||||||
|
@ -1188,21 +1122,3 @@ static int __init kstack_setup(char *s)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
early_param("kstack", kstack_setup);
|
early_param("kstack", kstack_setup);
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
static int __init call_trace_setup(char *s)
|
|
||||||
{
|
|
||||||
if (!s)
|
|
||||||
return -EINVAL;
|
|
||||||
if (strcmp(s, "old") == 0)
|
|
||||||
call_trace = -1;
|
|
||||||
else if (strcmp(s, "both") == 0)
|
|
||||||
call_trace = 0;
|
|
||||||
else if (strcmp(s, "newfallback") == 0)
|
|
||||||
call_trace = 1;
|
|
||||||
else if (strcmp(s, "new") == 0)
|
|
||||||
call_trace = 2;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
early_param("call_trace", call_trace_setup);
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -221,9 +221,7 @@ SECTIONS
|
||||||
/* Sections to be discarded */
|
/* Sections to be discarded */
|
||||||
/DISCARD/ : {
|
/DISCARD/ : {
|
||||||
*(.exitcall.exit)
|
*(.exitcall.exit)
|
||||||
#ifndef CONFIG_UNWIND_INFO
|
|
||||||
*(.eh_frame)
|
*(.eh_frame)
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
STABS_DEBUG
|
STABS_DEBUG
|
||||||
|
|
|
@ -40,9 +40,9 @@ config ATA_PIIX
|
||||||
tristate "Intel PIIX/ICH SATA support"
|
tristate "Intel PIIX/ICH SATA support"
|
||||||
depends on PCI
|
depends on PCI
|
||||||
help
|
help
|
||||||
This option enables support for ICH5/6/7/8 Serial ATA.
|
This option enables support for ICH5/6/7/8 Serial ATA
|
||||||
If PATA support was enabled previously, this enables
|
and support for PATA on the Intel PIIX3/PIIX4/ICH series
|
||||||
support for select Intel PIIX/ICH PATA host controllers.
|
PATA host controllers.
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
|
|
|
@ -645,8 +645,6 @@ static int ahci_reset_controller(void __iomem *mmio, struct pci_dev *pdev)
|
||||||
u32 cap_save, impl_save, tmp;
|
u32 cap_save, impl_save, tmp;
|
||||||
|
|
||||||
cap_save = readl(mmio + HOST_CAP);
|
cap_save = readl(mmio + HOST_CAP);
|
||||||
cap_save &= ( (1<<28) | (1<<17) );
|
|
||||||
cap_save |= (1 << 27);
|
|
||||||
impl_save = readl(mmio + HOST_PORTS_IMPL);
|
impl_save = readl(mmio + HOST_PORTS_IMPL);
|
||||||
|
|
||||||
/* global controller reset */
|
/* global controller reset */
|
||||||
|
|
|
@ -226,14 +226,26 @@ static const struct pci_device_id piix_pci_tbl[] = {
|
||||||
{ 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
|
{ 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
|
||||||
/* 2801GBM/GHM (ICH7M, identical to ICH6M) */
|
/* 2801GBM/GHM (ICH7M, identical to ICH6M) */
|
||||||
{ 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci },
|
{ 0x8086, 0x27c4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6m_sata_ahci },
|
||||||
/* Enterprise Southbridge 2 (where's the datasheet?) */
|
/* Enterprise Southbridge 2 (631xESB/632xESB) */
|
||||||
{ 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
|
{ 0x8086, 0x2680, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
|
||||||
/* SATA Controller 1 IDE (ICH8, no datasheet yet) */
|
/* SATA Controller 1 IDE (ICH8) */
|
||||||
{ 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
{ 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
||||||
/* SATA Controller 2 IDE (ICH8, ditto) */
|
/* SATA Controller 2 IDE (ICH8) */
|
||||||
{ 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
{ 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
||||||
/* Mobile SATA Controller IDE (ICH8M, ditto) */
|
/* Mobile SATA Controller IDE (ICH8M) */
|
||||||
{ 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
{ 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
||||||
|
/* SATA Controller IDE (ICH9) */
|
||||||
|
{ 0x8086, 0x2920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
||||||
|
/* SATA Controller IDE (ICH9) */
|
||||||
|
{ 0x8086, 0x2921, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
||||||
|
/* SATA Controller IDE (ICH9) */
|
||||||
|
{ 0x8086, 0x2926, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
||||||
|
/* SATA Controller IDE (ICH9M) */
|
||||||
|
{ 0x8086, 0x2928, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
||||||
|
/* SATA Controller IDE (ICH9M) */
|
||||||
|
{ 0x8086, 0x292d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
||||||
|
/* SATA Controller IDE (ICH9M) */
|
||||||
|
{ 0x8086, 0x292e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci },
|
||||||
|
|
||||||
{ } /* terminate list */
|
{ } /* terminate list */
|
||||||
};
|
};
|
||||||
|
@ -330,7 +342,7 @@ static const struct ata_port_operations ich_pata_ops = {
|
||||||
|
|
||||||
.port_start = ata_port_start,
|
.port_start = ata_port_start,
|
||||||
.port_stop = ata_port_stop,
|
.port_stop = ata_port_stop,
|
||||||
.host_stop = ata_host_stop,
|
.host_stop = piix_host_stop,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ata_port_operations piix_sata_ops = {
|
static const struct ata_port_operations piix_sata_ops = {
|
||||||
|
|
|
@ -1332,7 +1332,7 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ata_exec_internal_sg - execute libata internal command
|
* ata_exec_internal - execute libata internal command
|
||||||
* @dev: Device to which the command is sent
|
* @dev: Device to which the command is sent
|
||||||
* @tf: Taskfile registers for the command and the result
|
* @tf: Taskfile registers for the command and the result
|
||||||
* @cdb: CDB for packet command
|
* @cdb: CDB for packet command
|
||||||
|
@ -1353,11 +1353,17 @@ unsigned ata_exec_internal(struct ata_device *dev,
|
||||||
struct ata_taskfile *tf, const u8 *cdb,
|
struct ata_taskfile *tf, const u8 *cdb,
|
||||||
int dma_dir, void *buf, unsigned int buflen)
|
int dma_dir, void *buf, unsigned int buflen)
|
||||||
{
|
{
|
||||||
struct scatterlist sg;
|
struct scatterlist *psg = NULL, sg;
|
||||||
|
unsigned int n_elem = 0;
|
||||||
|
|
||||||
|
if (dma_dir != DMA_NONE) {
|
||||||
|
WARN_ON(!buf);
|
||||||
sg_init_one(&sg, buf, buflen);
|
sg_init_one(&sg, buf, buflen);
|
||||||
|
psg = &sg;
|
||||||
|
n_elem++;
|
||||||
|
}
|
||||||
|
|
||||||
return ata_exec_internal_sg(dev, tf, cdb, dma_dir, &sg, 1);
|
return ata_exec_internal_sg(dev, tf, cdb, dma_dir, psg, n_elem);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1539,7 +1539,7 @@ static unsigned int ata_scsi_rbuf_get(struct scsi_cmnd *cmd, u8 **buf_out)
|
||||||
struct scatterlist *sg;
|
struct scatterlist *sg;
|
||||||
|
|
||||||
sg = (struct scatterlist *) cmd->request_buffer;
|
sg = (struct scatterlist *) cmd->request_buffer;
|
||||||
buf = kmap_atomic(sg->page, KM_USER0) + sg->offset;
|
buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
|
||||||
buflen = sg->length;
|
buflen = sg->length;
|
||||||
} else {
|
} else {
|
||||||
buf = cmd->request_buffer;
|
buf = cmd->request_buffer;
|
||||||
|
@ -1567,7 +1567,7 @@ static inline void ata_scsi_rbuf_put(struct scsi_cmnd *cmd, u8 *buf)
|
||||||
struct scatterlist *sg;
|
struct scatterlist *sg;
|
||||||
|
|
||||||
sg = (struct scatterlist *) cmd->request_buffer;
|
sg = (struct scatterlist *) cmd->request_buffer;
|
||||||
kunmap_atomic(buf - sg->offset, KM_USER0);
|
kunmap_atomic(buf - sg->offset, KM_IRQ0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -698,8 +698,10 @@ static __init int legacy_init_one(int port, unsigned long io, unsigned long ctrl
|
||||||
goto fail_io;
|
goto fail_io;
|
||||||
|
|
||||||
pdev = platform_device_register_simple(DRV_NAME, nr_legacy_host, NULL, 0);
|
pdev = platform_device_register_simple(DRV_NAME, nr_legacy_host, NULL, 0);
|
||||||
if (pdev == NULL)
|
if (IS_ERR(pdev)) {
|
||||||
|
ret = PTR_ERR(pdev);
|
||||||
goto fail_dev;
|
goto fail_dev;
|
||||||
|
}
|
||||||
|
|
||||||
if (ht6560a & mask) {
|
if (ht6560a & mask) {
|
||||||
ops = &ht6560a_port_ops;
|
ops = &ht6560a_port_ops;
|
||||||
|
|
|
@ -247,8 +247,8 @@ static __init int qdi_init_one(unsigned long port, int type, unsigned long io, i
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pdev = platform_device_register_simple(DRV_NAME, nr_qdi_host, NULL, 0);
|
pdev = platform_device_register_simple(DRV_NAME, nr_qdi_host, NULL, 0);
|
||||||
if (pdev == NULL)
|
if (IS_ERR(pdev))
|
||||||
return -ENOMEM;
|
return PTR_ERR(pdev);
|
||||||
|
|
||||||
memset(&ae, 0, sizeof(struct ata_probe_ent));
|
memset(&ae, 0, sizeof(struct ata_probe_ent));
|
||||||
INIT_LIST_HEAD(&ae.node);
|
INIT_LIST_HEAD(&ae.node);
|
||||||
|
|
|
@ -105,8 +105,6 @@ static struct ata_port_operations rz1000_port_ops = {
|
||||||
.exec_command = ata_exec_command,
|
.exec_command = ata_exec_command,
|
||||||
.dev_select = ata_std_dev_select,
|
.dev_select = ata_std_dev_select,
|
||||||
|
|
||||||
.error_handler = rz1000_error_handler,
|
|
||||||
|
|
||||||
.bmdma_setup = ata_bmdma_setup,
|
.bmdma_setup = ata_bmdma_setup,
|
||||||
.bmdma_start = ata_bmdma_start,
|
.bmdma_start = ata_bmdma_start,
|
||||||
.bmdma_stop = ata_bmdma_stop,
|
.bmdma_stop = ata_bmdma_stop,
|
||||||
|
|
|
@ -161,10 +161,15 @@ static int via_pre_reset(struct ata_port *ap)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((config->flags & VIA_UDMA) >= VIA_UDMA_66)
|
if ((config->flags & VIA_UDMA) >= VIA_UDMA_100)
|
||||||
ap->cbl = via_cable_detect(ap);
|
ap->cbl = via_cable_detect(ap);
|
||||||
else
|
/* The UDMA66 series has no cable detect so do drive side detect */
|
||||||
|
else if ((config->flags & VIA_UDMA) < VIA_UDMA_66)
|
||||||
ap->cbl = ATA_CBL_PATA40;
|
ap->cbl = ATA_CBL_PATA40;
|
||||||
|
else
|
||||||
|
ap->cbl = ATA_CBL_PATA_UNK;
|
||||||
|
|
||||||
|
|
||||||
return ata_std_prereset(ap);
|
return ata_std_prereset(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -206,8 +206,8 @@ static __init int winbond_init_one(unsigned long port)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pdev = platform_device_register_simple(DRV_NAME, nr_winbond_host, NULL, 0);
|
pdev = platform_device_register_simple(DRV_NAME, nr_winbond_host, NULL, 0);
|
||||||
if (pdev == NULL)
|
if (IS_ERR(pdev))
|
||||||
return -ENOMEM;
|
return PTR_ERR(pdev);
|
||||||
|
|
||||||
memset(&ae, 0, sizeof(struct ata_probe_ent));
|
memset(&ae, 0, sizeof(struct ata_probe_ent));
|
||||||
INIT_LIST_HEAD(&ae.node);
|
INIT_LIST_HEAD(&ae.node);
|
||||||
|
|
|
@ -56,6 +56,8 @@
|
||||||
#define DRV_VERSION "2.0"
|
#define DRV_VERSION "2.0"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
K2_FLAG_NO_ATAPI_DMA = (1 << 29),
|
||||||
|
|
||||||
/* Taskfile registers offsets */
|
/* Taskfile registers offsets */
|
||||||
K2_SATA_TF_CMD_OFFSET = 0x00,
|
K2_SATA_TF_CMD_OFFSET = 0x00,
|
||||||
K2_SATA_TF_DATA_OFFSET = 0x00,
|
K2_SATA_TF_DATA_OFFSET = 0x00,
|
||||||
|
@ -83,11 +85,33 @@ enum {
|
||||||
|
|
||||||
/* Port stride */
|
/* Port stride */
|
||||||
K2_SATA_PORT_OFFSET = 0x100,
|
K2_SATA_PORT_OFFSET = 0x100,
|
||||||
|
|
||||||
|
board_svw4 = 0,
|
||||||
|
board_svw8 = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct k2_board_info {
|
||||||
|
unsigned int n_ports;
|
||||||
|
unsigned long port_flags;
|
||||||
|
} k2_board_info[] = {
|
||||||
|
/* board_svw4 */
|
||||||
|
{ 4, K2_FLAG_NO_ATAPI_DMA },
|
||||||
|
|
||||||
|
/* board_svw8 */
|
||||||
|
{ 8, K2_FLAG_NO_ATAPI_DMA },
|
||||||
};
|
};
|
||||||
|
|
||||||
static u8 k2_stat_check_status(struct ata_port *ap);
|
static u8 k2_stat_check_status(struct ata_port *ap);
|
||||||
|
|
||||||
|
|
||||||
|
static int k2_sata_check_atapi_dma(struct ata_queued_cmd *qc)
|
||||||
|
{
|
||||||
|
if (qc->ap->flags & K2_FLAG_NO_ATAPI_DMA)
|
||||||
|
return -1; /* ATAPI DMA not supported */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static u32 k2_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
|
static u32 k2_sata_scr_read (struct ata_port *ap, unsigned int sc_reg)
|
||||||
{
|
{
|
||||||
if (sc_reg > SCR_CONTROL)
|
if (sc_reg > SCR_CONTROL)
|
||||||
|
@ -313,6 +337,7 @@ static const struct ata_port_operations k2_sata_ops = {
|
||||||
.check_status = k2_stat_check_status,
|
.check_status = k2_stat_check_status,
|
||||||
.exec_command = ata_exec_command,
|
.exec_command = ata_exec_command,
|
||||||
.dev_select = ata_std_dev_select,
|
.dev_select = ata_std_dev_select,
|
||||||
|
.check_atapi_dma = k2_sata_check_atapi_dma,
|
||||||
.bmdma_setup = k2_bmdma_setup_mmio,
|
.bmdma_setup = k2_bmdma_setup_mmio,
|
||||||
.bmdma_start = k2_bmdma_start_mmio,
|
.bmdma_start = k2_bmdma_start_mmio,
|
||||||
.bmdma_stop = ata_bmdma_stop,
|
.bmdma_stop = ata_bmdma_stop,
|
||||||
|
@ -359,6 +384,8 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
|
||||||
struct ata_probe_ent *probe_ent = NULL;
|
struct ata_probe_ent *probe_ent = NULL;
|
||||||
unsigned long base;
|
unsigned long base;
|
||||||
void __iomem *mmio_base;
|
void __iomem *mmio_base;
|
||||||
|
const struct k2_board_info *board_info =
|
||||||
|
&k2_board_info[ent->driver_data];
|
||||||
int pci_dev_busy = 0;
|
int pci_dev_busy = 0;
|
||||||
int rc;
|
int rc;
|
||||||
int i;
|
int i;
|
||||||
|
@ -424,7 +451,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
|
||||||
|
|
||||||
probe_ent->sht = &k2_sata_sht;
|
probe_ent->sht = &k2_sata_sht;
|
||||||
probe_ent->port_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
probe_ent->port_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
||||||
ATA_FLAG_MMIO;
|
ATA_FLAG_MMIO | board_info->port_flags;
|
||||||
probe_ent->port_ops = &k2_sata_ops;
|
probe_ent->port_ops = &k2_sata_ops;
|
||||||
probe_ent->n_ports = 4;
|
probe_ent->n_ports = 4;
|
||||||
probe_ent->irq = pdev->irq;
|
probe_ent->irq = pdev->irq;
|
||||||
|
@ -441,7 +468,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
|
||||||
/* different controllers have different number of ports - currently 4 or 8 */
|
/* different controllers have different number of ports - currently 4 or 8 */
|
||||||
/* All ports are on the same function. Multi-function device is no
|
/* All ports are on the same function. Multi-function device is no
|
||||||
* longer available. This should not be seen in any system. */
|
* longer available. This should not be seen in any system. */
|
||||||
for (i = 0; i < ent->driver_data; i++)
|
for (i = 0; i < board_info->n_ports; i++)
|
||||||
k2_sata_setup_port(&probe_ent->port[i], base + i * K2_SATA_PORT_OFFSET);
|
k2_sata_setup_port(&probe_ent->port[i], base + i * K2_SATA_PORT_OFFSET);
|
||||||
|
|
||||||
pci_set_master(pdev);
|
pci_set_master(pdev);
|
||||||
|
@ -469,11 +496,11 @@ err_out:
|
||||||
* controller
|
* controller
|
||||||
* */
|
* */
|
||||||
static const struct pci_device_id k2_sata_pci_tbl[] = {
|
static const struct pci_device_id k2_sata_pci_tbl[] = {
|
||||||
{ PCI_VDEVICE(SERVERWORKS, 0x0240), 4 },
|
{ PCI_VDEVICE(SERVERWORKS, 0x0240), board_svw4 },
|
||||||
{ PCI_VDEVICE(SERVERWORKS, 0x0241), 4 },
|
{ PCI_VDEVICE(SERVERWORKS, 0x0241), board_svw4 },
|
||||||
{ PCI_VDEVICE(SERVERWORKS, 0x0242), 8 },
|
{ PCI_VDEVICE(SERVERWORKS, 0x0242), board_svw8 },
|
||||||
{ PCI_VDEVICE(SERVERWORKS, 0x024a), 4 },
|
{ PCI_VDEVICE(SERVERWORKS, 0x024a), board_svw4 },
|
||||||
{ PCI_VDEVICE(SERVERWORKS, 0x024b), 4 },
|
{ PCI_VDEVICE(SERVERWORKS, 0x024b), board_svw4 },
|
||||||
|
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
void cn_queue_wrapper(struct work_struct *work)
|
void cn_queue_wrapper(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct cn_callback_entry *cbq =
|
struct cn_callback_entry *cbq =
|
||||||
container_of(work, struct cn_callback_entry, work.work);
|
container_of(work, struct cn_callback_entry, work);
|
||||||
struct cn_callback_data *d = &cbq->data;
|
struct cn_callback_data *d = &cbq->data;
|
||||||
|
|
||||||
d->callback(d->callback_priv);
|
d->callback(d->callback_priv);
|
||||||
|
@ -59,13 +59,12 @@ static struct cn_callback_entry *cn_queue_alloc_callback_entry(char *name, struc
|
||||||
memcpy(&cbq->id.id, id, sizeof(struct cb_id));
|
memcpy(&cbq->id.id, id, sizeof(struct cb_id));
|
||||||
cbq->data.callback = callback;
|
cbq->data.callback = callback;
|
||||||
|
|
||||||
INIT_DELAYED_WORK(&cbq->work, &cn_queue_wrapper);
|
INIT_WORK(&cbq->work, &cn_queue_wrapper);
|
||||||
return cbq;
|
return cbq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cn_queue_free_callback(struct cn_callback_entry *cbq)
|
static void cn_queue_free_callback(struct cn_callback_entry *cbq)
|
||||||
{
|
{
|
||||||
cancel_delayed_work(&cbq->work);
|
|
||||||
flush_workqueue(cbq->pdev->cn_queue);
|
flush_workqueue(cbq->pdev->cn_queue);
|
||||||
|
|
||||||
kfree(cbq);
|
kfree(cbq);
|
||||||
|
|
|
@ -135,17 +135,15 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v
|
||||||
spin_lock_bh(&dev->cbdev->queue_lock);
|
spin_lock_bh(&dev->cbdev->queue_lock);
|
||||||
list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) {
|
list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) {
|
||||||
if (cn_cb_equal(&__cbq->id.id, &msg->id)) {
|
if (cn_cb_equal(&__cbq->id.id, &msg->id)) {
|
||||||
if (likely(!test_bit(WORK_STRUCT_PENDING,
|
if (likely(!work_pending(&__cbq->work) &&
|
||||||
&__cbq->work.work.management) &&
|
|
||||||
__cbq->data.ddata == NULL)) {
|
__cbq->data.ddata == NULL)) {
|
||||||
__cbq->data.callback_priv = msg;
|
__cbq->data.callback_priv = msg;
|
||||||
|
|
||||||
__cbq->data.ddata = data;
|
__cbq->data.ddata = data;
|
||||||
__cbq->data.destruct_data = destruct_data;
|
__cbq->data.destruct_data = destruct_data;
|
||||||
|
|
||||||
if (queue_delayed_work(
|
if (queue_work(dev->cbdev->cn_queue,
|
||||||
dev->cbdev->cn_queue,
|
&__cbq->work))
|
||||||
&__cbq->work, 0))
|
|
||||||
err = 0;
|
err = 0;
|
||||||
} else {
|
} else {
|
||||||
struct cn_callback_data *d;
|
struct cn_callback_data *d;
|
||||||
|
@ -159,12 +157,11 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v
|
||||||
d->destruct_data = destruct_data;
|
d->destruct_data = destruct_data;
|
||||||
d->free = __cbq;
|
d->free = __cbq;
|
||||||
|
|
||||||
INIT_DELAYED_WORK(&__cbq->work,
|
INIT_WORK(&__cbq->work,
|
||||||
&cn_queue_wrapper);
|
&cn_queue_wrapper);
|
||||||
|
|
||||||
if (queue_delayed_work(
|
if (queue_work(dev->cbdev->cn_queue,
|
||||||
dev->cbdev->cn_queue,
|
&__cbq->work))
|
||||||
&__cbq->work, 0))
|
|
||||||
err = 0;
|
err = 0;
|
||||||
else {
|
else {
|
||||||
kfree(__cbq);
|
kfree(__cbq);
|
||||||
|
|
|
@ -959,7 +959,7 @@ static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpufreq_quick_get - get the CPU frequency (in kHz) frpm policy->cur
|
* cpufreq_quick_get - get the CPU frequency (in kHz) from policy->cur
|
||||||
* @cpu: CPU number
|
* @cpu: CPU number
|
||||||
*
|
*
|
||||||
* This is the last known freq, without actually getting it from the driver.
|
* This is the last known freq, without actually getting it from the driver.
|
||||||
|
|
|
@ -415,12 +415,31 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
||||||
case 0x000: goto ignore;
|
case 0x000: goto ignore;
|
||||||
case 0x034: map_key_clear(KEY_SLEEP); break;
|
case 0x034: map_key_clear(KEY_SLEEP); break;
|
||||||
case 0x036: map_key_clear(BTN_MISC); break;
|
case 0x036: map_key_clear(BTN_MISC); break;
|
||||||
|
case 0x040: map_key_clear(KEY_MENU); break;
|
||||||
case 0x045: map_key_clear(KEY_RADIO); break;
|
case 0x045: map_key_clear(KEY_RADIO); break;
|
||||||
|
|
||||||
|
case 0x088: map_key_clear(KEY_PC); break;
|
||||||
|
case 0x089: map_key_clear(KEY_TV); break;
|
||||||
case 0x08a: map_key_clear(KEY_WWW); break;
|
case 0x08a: map_key_clear(KEY_WWW); break;
|
||||||
|
case 0x08b: map_key_clear(KEY_DVD); break;
|
||||||
|
case 0x08c: map_key_clear(KEY_PHONE); break;
|
||||||
case 0x08d: map_key_clear(KEY_PROGRAM); break;
|
case 0x08d: map_key_clear(KEY_PROGRAM); break;
|
||||||
|
case 0x08e: map_key_clear(KEY_VIDEOPHONE); break;
|
||||||
|
case 0x08f: map_key_clear(KEY_GAMES); break;
|
||||||
|
case 0x090: map_key_clear(KEY_MEMO); break;
|
||||||
|
case 0x091: map_key_clear(KEY_CD); break;
|
||||||
|
case 0x092: map_key_clear(KEY_VCR); break;
|
||||||
|
case 0x093: map_key_clear(KEY_TUNER); break;
|
||||||
|
case 0x094: map_key_clear(KEY_EXIT); break;
|
||||||
case 0x095: map_key_clear(KEY_HELP); break;
|
case 0x095: map_key_clear(KEY_HELP); break;
|
||||||
|
case 0x096: map_key_clear(KEY_TAPE); break;
|
||||||
|
case 0x097: map_key_clear(KEY_TV2); break;
|
||||||
|
case 0x098: map_key_clear(KEY_SAT); break;
|
||||||
|
|
||||||
case 0x09c: map_key_clear(KEY_CHANNELUP); break;
|
case 0x09c: map_key_clear(KEY_CHANNELUP); break;
|
||||||
case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
|
case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
|
||||||
|
case 0x0a0: map_key_clear(KEY_VCR2); break;
|
||||||
|
|
||||||
case 0x0b0: map_key_clear(KEY_PLAY); break;
|
case 0x0b0: map_key_clear(KEY_PLAY); break;
|
||||||
case 0x0b1: map_key_clear(KEY_PAUSE); break;
|
case 0x0b1: map_key_clear(KEY_PAUSE); break;
|
||||||
case 0x0b2: map_key_clear(KEY_RECORD); break;
|
case 0x0b2: map_key_clear(KEY_RECORD); break;
|
||||||
|
@ -430,6 +449,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
||||||
case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break;
|
case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break;
|
||||||
case 0x0b7: map_key_clear(KEY_STOPCD); break;
|
case 0x0b7: map_key_clear(KEY_STOPCD); break;
|
||||||
case 0x0b8: map_key_clear(KEY_EJECTCD); break;
|
case 0x0b8: map_key_clear(KEY_EJECTCD); break;
|
||||||
|
|
||||||
case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
|
case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
|
||||||
case 0x0e0: map_abs_clear(ABS_VOLUME); break;
|
case 0x0e0: map_abs_clear(ABS_VOLUME); break;
|
||||||
case 0x0e2: map_key_clear(KEY_MUTE); break;
|
case 0x0e2: map_key_clear(KEY_MUTE); break;
|
||||||
|
@ -437,11 +457,30 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
||||||
case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
|
case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
|
||||||
case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
|
case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
|
||||||
case 0x183: map_key_clear(KEY_CONFIG); break;
|
case 0x183: map_key_clear(KEY_CONFIG); break;
|
||||||
|
case 0x184: map_key_clear(KEY_WORDPROCESSOR); break;
|
||||||
|
case 0x185: map_key_clear(KEY_EDITOR); break;
|
||||||
|
case 0x186: map_key_clear(KEY_SPREADSHEET); break;
|
||||||
|
case 0x187: map_key_clear(KEY_GRAPHICSEDITOR); break;
|
||||||
|
case 0x188: map_key_clear(KEY_PRESENTATION); break;
|
||||||
|
case 0x189: map_key_clear(KEY_DATABASE); break;
|
||||||
case 0x18a: map_key_clear(KEY_MAIL); break;
|
case 0x18a: map_key_clear(KEY_MAIL); break;
|
||||||
|
case 0x18b: map_key_clear(KEY_NEWS); break;
|
||||||
|
case 0x18c: map_key_clear(KEY_VOICEMAIL); break;
|
||||||
|
case 0x18d: map_key_clear(KEY_ADDRESSBOOK); break;
|
||||||
|
case 0x18e: map_key_clear(KEY_CALENDAR); break;
|
||||||
|
case 0x191: map_key_clear(KEY_FINANCE); break;
|
||||||
case 0x192: map_key_clear(KEY_CALC); break;
|
case 0x192: map_key_clear(KEY_CALC); break;
|
||||||
case 0x194: map_key_clear(KEY_FILE); break;
|
case 0x194: map_key_clear(KEY_FILE); break;
|
||||||
|
case 0x196: map_key_clear(KEY_WWW); break;
|
||||||
|
case 0x19e: map_key_clear(KEY_COFFEE); break;
|
||||||
|
case 0x1a6: map_key_clear(KEY_HELP); break;
|
||||||
case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
|
case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
|
||||||
|
case 0x1bc: map_key_clear(KEY_MESSENGER); break;
|
||||||
|
case 0x1bd: map_key_clear(KEY_INFO); break;
|
||||||
case 0x201: map_key_clear(KEY_NEW); break;
|
case 0x201: map_key_clear(KEY_NEW); break;
|
||||||
|
case 0x202: map_key_clear(KEY_OPEN); break;
|
||||||
|
case 0x203: map_key_clear(KEY_CLOSE); break;
|
||||||
|
case 0x204: map_key_clear(KEY_EXIT); break;
|
||||||
case 0x207: map_key_clear(KEY_SAVE); break;
|
case 0x207: map_key_clear(KEY_SAVE); break;
|
||||||
case 0x208: map_key_clear(KEY_PRINT); break;
|
case 0x208: map_key_clear(KEY_PRINT); break;
|
||||||
case 0x209: map_key_clear(KEY_PROPS); break;
|
case 0x209: map_key_clear(KEY_PROPS); break;
|
||||||
|
@ -456,10 +495,15 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
|
||||||
case 0x226: map_key_clear(KEY_STOP); break;
|
case 0x226: map_key_clear(KEY_STOP); break;
|
||||||
case 0x227: map_key_clear(KEY_REFRESH); break;
|
case 0x227: map_key_clear(KEY_REFRESH); break;
|
||||||
case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
|
case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
|
||||||
|
case 0x22d: map_key_clear(KEY_ZOOMIN); break;
|
||||||
|
case 0x22e: map_key_clear(KEY_ZOOMOUT); break;
|
||||||
|
case 0x22f: map_key_clear(KEY_ZOOMRESET); break;
|
||||||
case 0x233: map_key_clear(KEY_SCROLLUP); break;
|
case 0x233: map_key_clear(KEY_SCROLLUP); break;
|
||||||
case 0x234: map_key_clear(KEY_SCROLLDOWN); break;
|
case 0x234: map_key_clear(KEY_SCROLLDOWN); break;
|
||||||
case 0x238: map_rel(REL_HWHEEL); break;
|
case 0x238: map_rel(REL_HWHEEL); break;
|
||||||
|
case 0x25f: map_key_clear(KEY_CANCEL); break;
|
||||||
case 0x279: map_key_clear(KEY_REDO); break;
|
case 0x279: map_key_clear(KEY_REDO); break;
|
||||||
|
|
||||||
case 0x289: map_key_clear(KEY_REPLY); break;
|
case 0x289: map_key_clear(KEY_REPLY); break;
|
||||||
case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
|
case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
|
||||||
case 0x28c: map_key_clear(KEY_SEND); break;
|
case 0x28c: map_key_clear(KEY_SEND); break;
|
||||||
|
|
|
@ -80,24 +80,61 @@ static int tune_pci = 0;
|
||||||
module_param(tune_pci, int, 0444);
|
module_param(tune_pci, int, 0444);
|
||||||
MODULE_PARM_DESC(tune_pci, "increase PCI burst from the default set by BIOS if nonzero");
|
MODULE_PARM_DESC(tune_pci, "increase PCI burst from the default set by BIOS if nonzero");
|
||||||
|
|
||||||
struct mutex mthca_device_mutex;
|
DEFINE_MUTEX(mthca_device_mutex);
|
||||||
|
|
||||||
|
#define MTHCA_DEFAULT_NUM_QP (1 << 16)
|
||||||
|
#define MTHCA_DEFAULT_RDB_PER_QP (1 << 2)
|
||||||
|
#define MTHCA_DEFAULT_NUM_CQ (1 << 16)
|
||||||
|
#define MTHCA_DEFAULT_NUM_MCG (1 << 13)
|
||||||
|
#define MTHCA_DEFAULT_NUM_MPT (1 << 17)
|
||||||
|
#define MTHCA_DEFAULT_NUM_MTT (1 << 20)
|
||||||
|
#define MTHCA_DEFAULT_NUM_UDAV (1 << 15)
|
||||||
|
#define MTHCA_DEFAULT_NUM_RESERVED_MTTS (1 << 18)
|
||||||
|
#define MTHCA_DEFAULT_NUM_UARC_SIZE (1 << 18)
|
||||||
|
|
||||||
|
static struct mthca_profile hca_profile = {
|
||||||
|
.num_qp = MTHCA_DEFAULT_NUM_QP,
|
||||||
|
.rdb_per_qp = MTHCA_DEFAULT_RDB_PER_QP,
|
||||||
|
.num_cq = MTHCA_DEFAULT_NUM_CQ,
|
||||||
|
.num_mcg = MTHCA_DEFAULT_NUM_MCG,
|
||||||
|
.num_mpt = MTHCA_DEFAULT_NUM_MPT,
|
||||||
|
.num_mtt = MTHCA_DEFAULT_NUM_MTT,
|
||||||
|
.num_udav = MTHCA_DEFAULT_NUM_UDAV, /* Tavor only */
|
||||||
|
.fmr_reserved_mtts = MTHCA_DEFAULT_NUM_RESERVED_MTTS, /* Tavor only */
|
||||||
|
.uarc_size = MTHCA_DEFAULT_NUM_UARC_SIZE, /* Arbel only */
|
||||||
|
};
|
||||||
|
|
||||||
|
module_param_named(num_qp, hca_profile.num_qp, int, 0444);
|
||||||
|
MODULE_PARM_DESC(num_qp, "maximum number of QPs per HCA");
|
||||||
|
|
||||||
|
module_param_named(rdb_per_qp, hca_profile.rdb_per_qp, int, 0444);
|
||||||
|
MODULE_PARM_DESC(rdb_per_qp, "number of RDB buffers per QP");
|
||||||
|
|
||||||
|
module_param_named(num_cq, hca_profile.num_cq, int, 0444);
|
||||||
|
MODULE_PARM_DESC(num_cq, "maximum number of CQs per HCA");
|
||||||
|
|
||||||
|
module_param_named(num_mcg, hca_profile.num_mcg, int, 0444);
|
||||||
|
MODULE_PARM_DESC(num_mcg, "maximum number of multicast groups per HCA");
|
||||||
|
|
||||||
|
module_param_named(num_mpt, hca_profile.num_mpt, int, 0444);
|
||||||
|
MODULE_PARM_DESC(num_mpt,
|
||||||
|
"maximum number of memory protection table entries per HCA");
|
||||||
|
|
||||||
|
module_param_named(num_mtt, hca_profile.num_mtt, int, 0444);
|
||||||
|
MODULE_PARM_DESC(num_mtt,
|
||||||
|
"maximum number of memory translation table segments per HCA");
|
||||||
|
|
||||||
|
module_param_named(num_udav, hca_profile.num_udav, int, 0444);
|
||||||
|
MODULE_PARM_DESC(num_udav, "maximum number of UD address vectors per HCA");
|
||||||
|
|
||||||
|
module_param_named(fmr_reserved_mtts, hca_profile.fmr_reserved_mtts, int, 0444);
|
||||||
|
MODULE_PARM_DESC(fmr_reserved_mtts,
|
||||||
|
"number of memory translation table segments reserved for FMR");
|
||||||
|
|
||||||
static const char mthca_version[] __devinitdata =
|
static const char mthca_version[] __devinitdata =
|
||||||
DRV_NAME ": Mellanox InfiniBand HCA driver v"
|
DRV_NAME ": Mellanox InfiniBand HCA driver v"
|
||||||
DRV_VERSION " (" DRV_RELDATE ")\n";
|
DRV_VERSION " (" DRV_RELDATE ")\n";
|
||||||
|
|
||||||
static struct mthca_profile default_profile = {
|
|
||||||
.num_qp = 1 << 16,
|
|
||||||
.rdb_per_qp = 4,
|
|
||||||
.num_cq = 1 << 16,
|
|
||||||
.num_mcg = 1 << 13,
|
|
||||||
.num_mpt = 1 << 17,
|
|
||||||
.num_mtt = 1 << 20,
|
|
||||||
.num_udav = 1 << 15, /* Tavor only */
|
|
||||||
.fmr_reserved_mtts = 1 << 18, /* Tavor only */
|
|
||||||
.uarc_size = 1 << 18, /* Arbel only */
|
|
||||||
};
|
|
||||||
|
|
||||||
static int mthca_tune_pci(struct mthca_dev *mdev)
|
static int mthca_tune_pci(struct mthca_dev *mdev)
|
||||||
{
|
{
|
||||||
int cap;
|
int cap;
|
||||||
|
@ -303,7 +340,7 @@ static int mthca_init_tavor(struct mthca_dev *mdev)
|
||||||
goto err_disable;
|
goto err_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
profile = default_profile;
|
profile = hca_profile;
|
||||||
profile.num_uar = dev_lim.uar_size / PAGE_SIZE;
|
profile.num_uar = dev_lim.uar_size / PAGE_SIZE;
|
||||||
profile.uarc_size = 0;
|
profile.uarc_size = 0;
|
||||||
if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
|
if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
|
||||||
|
@ -621,7 +658,7 @@ static int mthca_init_arbel(struct mthca_dev *mdev)
|
||||||
goto err_stop_fw;
|
goto err_stop_fw;
|
||||||
}
|
}
|
||||||
|
|
||||||
profile = default_profile;
|
profile = hca_profile;
|
||||||
profile.num_uar = dev_lim.uar_size / PAGE_SIZE;
|
profile.num_uar = dev_lim.uar_size / PAGE_SIZE;
|
||||||
profile.num_udav = 0;
|
profile.num_udav = 0;
|
||||||
if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
|
if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
|
||||||
|
@ -1278,11 +1315,55 @@ static struct pci_driver mthca_driver = {
|
||||||
.remove = __devexit_p(mthca_remove_one)
|
.remove = __devexit_p(mthca_remove_one)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void __init __mthca_check_profile_val(const char *name, int *pval,
|
||||||
|
int pval_default)
|
||||||
|
{
|
||||||
|
/* value must be positive and power of 2 */
|
||||||
|
int old_pval = *pval;
|
||||||
|
|
||||||
|
if (old_pval <= 0)
|
||||||
|
*pval = pval_default;
|
||||||
|
else
|
||||||
|
*pval = roundup_pow_of_two(old_pval);
|
||||||
|
|
||||||
|
if (old_pval != *pval) {
|
||||||
|
printk(KERN_WARNING PFX "Invalid value %d for %s in module parameter.\n",
|
||||||
|
old_pval, name);
|
||||||
|
printk(KERN_WARNING PFX "Corrected %s to %d.\n", name, *pval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define mthca_check_profile_val(name, default) \
|
||||||
|
__mthca_check_profile_val(#name, &hca_profile.name, default)
|
||||||
|
|
||||||
|
static void __init mthca_validate_profile(void)
|
||||||
|
{
|
||||||
|
mthca_check_profile_val(num_qp, MTHCA_DEFAULT_NUM_QP);
|
||||||
|
mthca_check_profile_val(rdb_per_qp, MTHCA_DEFAULT_RDB_PER_QP);
|
||||||
|
mthca_check_profile_val(num_cq, MTHCA_DEFAULT_NUM_CQ);
|
||||||
|
mthca_check_profile_val(num_mcg, MTHCA_DEFAULT_NUM_MCG);
|
||||||
|
mthca_check_profile_val(num_mpt, MTHCA_DEFAULT_NUM_MPT);
|
||||||
|
mthca_check_profile_val(num_mtt, MTHCA_DEFAULT_NUM_MTT);
|
||||||
|
mthca_check_profile_val(num_udav, MTHCA_DEFAULT_NUM_UDAV);
|
||||||
|
mthca_check_profile_val(fmr_reserved_mtts, MTHCA_DEFAULT_NUM_RESERVED_MTTS);
|
||||||
|
|
||||||
|
if (hca_profile.fmr_reserved_mtts >= hca_profile.num_mtt) {
|
||||||
|
printk(KERN_WARNING PFX "Invalid fmr_reserved_mtts module parameter %d.\n",
|
||||||
|
hca_profile.fmr_reserved_mtts);
|
||||||
|
printk(KERN_WARNING PFX "(Must be smaller than num_mtt %d)\n",
|
||||||
|
hca_profile.num_mtt);
|
||||||
|
hca_profile.fmr_reserved_mtts = hca_profile.num_mtt / 2;
|
||||||
|
printk(KERN_WARNING PFX "Corrected fmr_reserved_mtts to %d.\n",
|
||||||
|
hca_profile.fmr_reserved_mtts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int __init mthca_init(void)
|
static int __init mthca_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mutex_init(&mthca_device_mutex);
|
mthca_validate_profile();
|
||||||
|
|
||||||
ret = mthca_catas_init();
|
ret = mthca_catas_init();
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1898,7 +1898,7 @@ static void srp_add_one(struct ib_device *device)
|
||||||
*/
|
*/
|
||||||
srp_dev->fmr_page_shift = max(9, ffs(dev_attr->page_size_cap) - 1);
|
srp_dev->fmr_page_shift = max(9, ffs(dev_attr->page_size_cap) - 1);
|
||||||
srp_dev->fmr_page_size = 1 << srp_dev->fmr_page_shift;
|
srp_dev->fmr_page_size = 1 << srp_dev->fmr_page_shift;
|
||||||
srp_dev->fmr_page_mask = ~((unsigned long) srp_dev->fmr_page_size - 1);
|
srp_dev->fmr_page_mask = ~((u64) srp_dev->fmr_page_size - 1);
|
||||||
|
|
||||||
INIT_LIST_HEAD(&srp_dev->dev_list);
|
INIT_LIST_HEAD(&srp_dev->dev_list);
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ struct srp_device {
|
||||||
struct ib_fmr_pool *fmr_pool;
|
struct ib_fmr_pool *fmr_pool;
|
||||||
int fmr_page_shift;
|
int fmr_page_shift;
|
||||||
int fmr_page_size;
|
int fmr_page_size;
|
||||||
unsigned long fmr_page_mask;
|
u64 fmr_page_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct srp_host {
|
struct srp_host {
|
||||||
|
|
|
@ -187,7 +187,7 @@ static irqreturn_t amikbd_interrupt(int irq, void *dummy)
|
||||||
|
|
||||||
static int __init amikbd_init(void)
|
static int __init amikbd_init(void)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j, err;
|
||||||
|
|
||||||
if (!AMIGAHW_PRESENT(AMI_KEYBOARD))
|
if (!AMIGAHW_PRESENT(AMI_KEYBOARD))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
|
@ -225,7 +225,7 @@ static void sunkbd_reinit(struct work_struct *work)
|
||||||
static void sunkbd_enable(struct sunkbd *sunkbd, int enable)
|
static void sunkbd_enable(struct sunkbd *sunkbd, int enable)
|
||||||
{
|
{
|
||||||
serio_pause_rx(sunkbd->serio);
|
serio_pause_rx(sunkbd->serio);
|
||||||
sunkbd->enabled = 1;
|
sunkbd->enabled = enable;
|
||||||
serio_continue_rx(sunkbd->serio);
|
serio_continue_rx(sunkbd->serio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@
|
||||||
|
|
||||||
#define DRV_MODULE_NAME "bnx2"
|
#define DRV_MODULE_NAME "bnx2"
|
||||||
#define PFX DRV_MODULE_NAME ": "
|
#define PFX DRV_MODULE_NAME ": "
|
||||||
#define DRV_MODULE_VERSION "1.5.1"
|
#define DRV_MODULE_VERSION "1.5.2"
|
||||||
#define DRV_MODULE_RELDATE "November 15, 2006"
|
#define DRV_MODULE_RELDATE "December 13, 2006"
|
||||||
|
|
||||||
#define RUN_AT(x) (jiffies + (x))
|
#define RUN_AT(x) (jiffies + (x))
|
||||||
|
|
||||||
|
@ -217,9 +217,16 @@ static inline u32 bnx2_tx_avail(struct bnx2 *bp)
|
||||||
u32 diff;
|
u32 diff;
|
||||||
|
|
||||||
smp_mb();
|
smp_mb();
|
||||||
diff = TX_RING_IDX(bp->tx_prod) - TX_RING_IDX(bp->tx_cons);
|
|
||||||
if (diff > MAX_TX_DESC_CNT)
|
/* The ring uses 256 indices for 255 entries, one of them
|
||||||
diff = (diff & MAX_TX_DESC_CNT) - 1;
|
* needs to be skipped.
|
||||||
|
*/
|
||||||
|
diff = bp->tx_prod - bp->tx_cons;
|
||||||
|
if (unlikely(diff >= TX_DESC_CNT)) {
|
||||||
|
diff &= 0xffff;
|
||||||
|
if (diff == TX_DESC_CNT)
|
||||||
|
diff = MAX_TX_DESC_CNT;
|
||||||
|
}
|
||||||
return (bp->tx_ring_size - diff);
|
return (bp->tx_ring_size - diff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3089,7 +3096,7 @@ bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf,
|
||||||
|
|
||||||
if ((align_start = (offset32 & 3))) {
|
if ((align_start = (offset32 & 3))) {
|
||||||
offset32 &= ~3;
|
offset32 &= ~3;
|
||||||
len32 += align_start;
|
len32 += (4 - align_start);
|
||||||
if ((rc = bnx2_nvram_read(bp, offset32, start, 4)))
|
if ((rc = bnx2_nvram_read(bp, offset32, start, 4)))
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@ -3107,7 +3114,7 @@ bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf,
|
||||||
|
|
||||||
if (align_start || align_end) {
|
if (align_start || align_end) {
|
||||||
buf = kmalloc(len32, GFP_KERNEL);
|
buf = kmalloc(len32, GFP_KERNEL);
|
||||||
if (buf == 0)
|
if (buf == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
if (align_start) {
|
if (align_start) {
|
||||||
memcpy(buf, start, 4);
|
memcpy(buf, start, 4);
|
||||||
|
@ -3998,7 +4005,7 @@ bnx2_run_loopback(struct bnx2 *bp, int loopback_mode)
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
packet = skb_put(skb, pkt_size);
|
packet = skb_put(skb, pkt_size);
|
||||||
memcpy(packet, bp->mac_addr, 6);
|
memcpy(packet, bp->dev->dev_addr, 6);
|
||||||
memset(packet + 6, 0x0, 8);
|
memset(packet + 6, 0x0, 8);
|
||||||
for (i = 14; i < pkt_size; i++)
|
for (i = 14; i < pkt_size; i++)
|
||||||
packet[i] = (unsigned char) (i & 0xff);
|
packet[i] = (unsigned char) (i & 0xff);
|
||||||
|
|
|
@ -68,8 +68,8 @@
|
||||||
|
|
||||||
#define DRV_MODULE_NAME "tg3"
|
#define DRV_MODULE_NAME "tg3"
|
||||||
#define PFX DRV_MODULE_NAME ": "
|
#define PFX DRV_MODULE_NAME ": "
|
||||||
#define DRV_MODULE_VERSION "3.70"
|
#define DRV_MODULE_VERSION "3.71"
|
||||||
#define DRV_MODULE_RELDATE "December 1, 2006"
|
#define DRV_MODULE_RELDATE "December 15, 2006"
|
||||||
|
|
||||||
#define TG3_DEF_MAC_MODE 0
|
#define TG3_DEF_MAC_MODE 0
|
||||||
#define TG3_DEF_RX_MODE 0
|
#define TG3_DEF_RX_MODE 0
|
||||||
|
@ -959,6 +959,13 @@ static int tg3_phy_reset(struct tg3 *tp)
|
||||||
u32 phy_status;
|
u32 phy_status;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
val = tr32(GRC_MISC_CFG);
|
||||||
|
tw32_f(GRC_MISC_CFG, val & ~GRC_MISC_CFG_EPHY_IDDQ);
|
||||||
|
udelay(40);
|
||||||
|
}
|
||||||
err = tg3_readphy(tp, MII_BMSR, &phy_status);
|
err = tg3_readphy(tp, MII_BMSR, &phy_status);
|
||||||
err |= tg3_readphy(tp, MII_BMSR, &phy_status);
|
err |= tg3_readphy(tp, MII_BMSR, &phy_status);
|
||||||
if (err != 0)
|
if (err != 0)
|
||||||
|
@ -1170,7 +1177,15 @@ static void tg3_power_down_phy(struct tg3 *tp)
|
||||||
if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
|
if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5906) {
|
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) {
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
tg3_bmcr_reset(tp);
|
||||||
|
val = tr32(GRC_MISC_CFG);
|
||||||
|
tw32_f(GRC_MISC_CFG, val | GRC_MISC_CFG_EPHY_IDDQ);
|
||||||
|
udelay(40);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
tg3_writephy(tp, MII_TG3_EXT_CTRL,
|
tg3_writephy(tp, MII_TG3_EXT_CTRL,
|
||||||
MII_TG3_EXT_CTRL_FORCE_LED_OFF);
|
MII_TG3_EXT_CTRL_FORCE_LED_OFF);
|
||||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2);
|
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x01b2);
|
||||||
|
@ -4426,7 +4441,7 @@ static void tg3_free_consistent(struct tg3 *tp)
|
||||||
*/
|
*/
|
||||||
static int tg3_alloc_consistent(struct tg3 *tp)
|
static int tg3_alloc_consistent(struct tg3 *tp)
|
||||||
{
|
{
|
||||||
tp->rx_std_buffers = kmalloc((sizeof(struct ring_info) *
|
tp->rx_std_buffers = kzalloc((sizeof(struct ring_info) *
|
||||||
(TG3_RX_RING_SIZE +
|
(TG3_RX_RING_SIZE +
|
||||||
TG3_RX_JUMBO_RING_SIZE)) +
|
TG3_RX_JUMBO_RING_SIZE)) +
|
||||||
(sizeof(struct tx_ring_info) *
|
(sizeof(struct tx_ring_info) *
|
||||||
|
@ -4435,13 +4450,6 @@ static int tg3_alloc_consistent(struct tg3 *tp)
|
||||||
if (!tp->rx_std_buffers)
|
if (!tp->rx_std_buffers)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
memset(tp->rx_std_buffers, 0,
|
|
||||||
(sizeof(struct ring_info) *
|
|
||||||
(TG3_RX_RING_SIZE +
|
|
||||||
TG3_RX_JUMBO_RING_SIZE)) +
|
|
||||||
(sizeof(struct tx_ring_info) *
|
|
||||||
TG3_TX_RING_SIZE));
|
|
||||||
|
|
||||||
tp->rx_jumbo_buffers = &tp->rx_std_buffers[TG3_RX_RING_SIZE];
|
tp->rx_jumbo_buffers = &tp->rx_std_buffers[TG3_RX_RING_SIZE];
|
||||||
tp->tx_buffers = (struct tx_ring_info *)
|
tp->tx_buffers = (struct tx_ring_info *)
|
||||||
&tp->rx_jumbo_buffers[TG3_RX_JUMBO_RING_SIZE];
|
&tp->rx_jumbo_buffers[TG3_RX_JUMBO_RING_SIZE];
|
||||||
|
@ -6988,6 +6996,8 @@ static int tg3_open(struct net_device *dev)
|
||||||
struct tg3 *tp = netdev_priv(dev);
|
struct tg3 *tp = netdev_priv(dev);
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
netif_carrier_off(tp->dev);
|
||||||
|
|
||||||
tg3_full_lock(tp, 0);
|
tg3_full_lock(tp, 0);
|
||||||
|
|
||||||
err = tg3_set_power_state(tp, PCI_D0);
|
err = tg3_set_power_state(tp, PCI_D0);
|
||||||
|
@ -7981,6 +7991,10 @@ static int tg3_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
|
||||||
tp->link_config.duplex = cmd->duplex;
|
tp->link_config.duplex = cmd->duplex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tp->link_config.orig_speed = tp->link_config.speed;
|
||||||
|
tp->link_config.orig_duplex = tp->link_config.duplex;
|
||||||
|
tp->link_config.orig_autoneg = tp->link_config.autoneg;
|
||||||
|
|
||||||
if (netif_running(dev))
|
if (netif_running(dev))
|
||||||
tg3_setup_phy(tp, 1);
|
tg3_setup_phy(tp, 1);
|
||||||
|
|
||||||
|
@ -11923,6 +11937,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
||||||
*/
|
*/
|
||||||
pci_save_state(tp->pdev);
|
pci_save_state(tp->pdev);
|
||||||
|
|
||||||
|
pci_set_drvdata(pdev, dev);
|
||||||
|
|
||||||
err = register_netdev(dev);
|
err = register_netdev(dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR PFX "Cannot register net device, "
|
printk(KERN_ERR PFX "Cannot register net device, "
|
||||||
|
@ -11930,8 +11946,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
||||||
goto err_out_iounmap;
|
goto err_out_iounmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_set_drvdata(pdev, dev);
|
|
||||||
|
|
||||||
printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %s Ethernet ",
|
printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %s Ethernet ",
|
||||||
dev->name,
|
dev->name,
|
||||||
tp->board_part_number,
|
tp->board_part_number,
|
||||||
|
@ -11962,8 +11976,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
||||||
(pdev->dma_mask == DMA_32BIT_MASK) ? 32 :
|
(pdev->dma_mask == DMA_32BIT_MASK) ? 32 :
|
||||||
(((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64));
|
(((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64));
|
||||||
|
|
||||||
netif_carrier_off(tp->dev);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_out_iounmap:
|
err_out_iounmap:
|
||||||
|
|
|
@ -1350,6 +1350,7 @@
|
||||||
#define GRC_MISC_CFG_BOARD_ID_5788 0x00010000
|
#define GRC_MISC_CFG_BOARD_ID_5788 0x00010000
|
||||||
#define GRC_MISC_CFG_BOARD_ID_5788M 0x00018000
|
#define GRC_MISC_CFG_BOARD_ID_5788M 0x00018000
|
||||||
#define GRC_MISC_CFG_BOARD_ID_AC91002A1 0x00018000
|
#define GRC_MISC_CFG_BOARD_ID_AC91002A1 0x00018000
|
||||||
|
#define GRC_MISC_CFG_EPHY_IDDQ 0x00200000
|
||||||
#define GRC_MISC_CFG_KEEP_GPHY_POWER 0x04000000
|
#define GRC_MISC_CFG_KEEP_GPHY_POWER 0x04000000
|
||||||
#define GRC_LOCAL_CTRL 0x00006808
|
#define GRC_LOCAL_CTRL 0x00006808
|
||||||
#define GRC_LCLCTRL_INT_ACTIVE 0x00000001
|
#define GRC_LCLCTRL_INT_ACTIVE 0x00000001
|
||||||
|
|
|
@ -49,6 +49,8 @@ static struct sclp_register sclp_cpi_event =
|
||||||
.send_mask = EvTyp_CtlProgIdent_Mask
|
.send_mask = EvTyp_CtlProgIdent_Mask
|
||||||
};
|
};
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
MODULE_AUTHOR(
|
MODULE_AUTHOR(
|
||||||
"Martin Peschke, IBM Deutschland Entwicklung GmbH "
|
"Martin Peschke, IBM Deutschland Entwicklung GmbH "
|
||||||
"<mpeschke@de.ibm.com>");
|
"<mpeschke@de.ibm.com>");
|
||||||
|
|
|
@ -871,11 +871,32 @@ __clear_subchannel_easy(struct subchannel_id schid)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int pgm_check_occured;
|
||||||
|
|
||||||
|
static void cio_reset_pgm_check_handler(void)
|
||||||
|
{
|
||||||
|
pgm_check_occured = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int stsch_reset(struct subchannel_id schid, volatile struct schib *addr)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
pgm_check_occured = 0;
|
||||||
|
s390_reset_pgm_handler = cio_reset_pgm_check_handler;
|
||||||
|
rc = stsch(schid, addr);
|
||||||
|
s390_reset_pgm_handler = NULL;
|
||||||
|
if (pgm_check_occured)
|
||||||
|
return -EIO;
|
||||||
|
else
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
static int __shutdown_subchannel_easy(struct subchannel_id schid, void *data)
|
static int __shutdown_subchannel_easy(struct subchannel_id schid, void *data)
|
||||||
{
|
{
|
||||||
struct schib schib;
|
struct schib schib;
|
||||||
|
|
||||||
if (stsch_err(schid, &schib))
|
if (stsch_reset(schid, &schib))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
if (!schib.pmcw.ena)
|
if (!schib.pmcw.ena)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -972,7 +993,7 @@ static int __reipl_subchannel_match(struct subchannel_id schid, void *data)
|
||||||
struct schib schib;
|
struct schib schib;
|
||||||
struct sch_match_id *match_id = data;
|
struct sch_match_id *match_id = data;
|
||||||
|
|
||||||
if (stsch_err(schid, &schib))
|
if (stsch_reset(schid, &schib))
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
if (schib.pmcw.dnv &&
|
if (schib.pmcw.dnv &&
|
||||||
(schib.pmcw.dev == match_id->devid.devno) &&
|
(schib.pmcw.dev == match_id->devid.devno) &&
|
||||||
|
|
|
@ -139,6 +139,8 @@ css_register_subchannel(struct subchannel *sch)
|
||||||
sch->dev.release = &css_subchannel_release;
|
sch->dev.release = &css_subchannel_release;
|
||||||
sch->dev.groups = subch_attr_groups;
|
sch->dev.groups = subch_attr_groups;
|
||||||
|
|
||||||
|
css_get_ssd_info(sch);
|
||||||
|
|
||||||
/* make it known to the system */
|
/* make it known to the system */
|
||||||
ret = css_sch_device_register(sch);
|
ret = css_sch_device_register(sch);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -146,7 +148,6 @@ css_register_subchannel(struct subchannel *sch)
|
||||||
__func__, sch->dev.bus_id);
|
__func__, sch->dev.bus_id);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
css_get_ssd_info(sch);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -979,12 +979,11 @@ __qdio_outbound_processing(struct qdio_q *q)
|
||||||
|
|
||||||
if (q->is_iqdio_q) {
|
if (q->is_iqdio_q) {
|
||||||
/*
|
/*
|
||||||
* for asynchronous queues, we better check, if the fill
|
* for asynchronous queues, we better check, if the sent
|
||||||
* level is too high. for synchronous queues, the fill
|
* buffer is already switched from PRIMED to EMPTY.
|
||||||
* level will never be that high.
|
|
||||||
*/
|
*/
|
||||||
if (atomic_read(&q->number_of_buffers_used)>
|
if ((q->queue_type == QDIO_IQDIO_QFMT_ASYNCH) &&
|
||||||
IQDIO_FILL_LEVEL_TO_POLL)
|
!qdio_is_outbound_q_done(q))
|
||||||
qdio_mark_q(q);
|
qdio_mark_q(q);
|
||||||
|
|
||||||
} else if (!q->hydra_gives_outbound_pcis)
|
} else if (!q->hydra_gives_outbound_pcis)
|
||||||
|
@ -1825,6 +1824,10 @@ qdio_fill_qs(struct qdio_irq *irq_ptr, struct ccw_device *cdev,
|
||||||
q->sbal[j]=*(outbound_sbals_array++);
|
q->sbal[j]=*(outbound_sbals_array++);
|
||||||
|
|
||||||
q->queue_type=q_format;
|
q->queue_type=q_format;
|
||||||
|
if ((q->queue_type == QDIO_IQDIO_QFMT) &&
|
||||||
|
(no_output_qs > 1) &&
|
||||||
|
(i == no_output_qs-1))
|
||||||
|
q->queue_type = QDIO_IQDIO_QFMT_ASYNCH;
|
||||||
q->int_parm=int_parm;
|
q->int_parm=int_parm;
|
||||||
q->is_input_q=0;
|
q->is_input_q=0;
|
||||||
q->schid = irq_ptr->schid;
|
q->schid = irq_ptr->schid;
|
||||||
|
|
|
@ -1129,7 +1129,15 @@ static void ap_poll_thread_stop(void)
|
||||||
mutex_unlock(&ap_poll_thread_mutex);
|
mutex_unlock(&ap_poll_thread_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ap_reset(void)
|
static void ap_reset_domain(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < AP_DEVICES; i++)
|
||||||
|
ap_reset_queue(AP_MKQID(i, ap_domain_index));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ap_reset_all(void)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
|
@ -1139,7 +1147,7 @@ static void ap_reset(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct reset_call ap_reset_call = {
|
static struct reset_call ap_reset_call = {
|
||||||
.fn = ap_reset,
|
.fn = ap_reset_all,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1229,10 +1237,12 @@ void ap_module_exit(void)
|
||||||
int i;
|
int i;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
|
|
||||||
|
ap_reset_domain();
|
||||||
ap_poll_thread_stop();
|
ap_poll_thread_stop();
|
||||||
del_timer_sync(&ap_config_timer);
|
del_timer_sync(&ap_config_timer);
|
||||||
del_timer_sync(&ap_poll_timer);
|
del_timer_sync(&ap_poll_timer);
|
||||||
destroy_workqueue(ap_work_queue);
|
destroy_workqueue(ap_work_queue);
|
||||||
|
tasklet_kill(&ap_tasklet);
|
||||||
s390_root_dev_unregister(ap_root_device);
|
s390_root_dev_unregister(ap_root_device);
|
||||||
while ((dev = bus_find_device(&ap_bus_type, NULL, NULL,
|
while ((dev = bus_find_device(&ap_bus_type, NULL, NULL,
|
||||||
__ap_match_all)))
|
__ap_match_all)))
|
||||||
|
|
|
@ -266,7 +266,7 @@ static struct scsi_host_template *the_template = NULL;
|
||||||
(struct NCR5380_hostdata *)(in)->hostdata
|
(struct NCR5380_hostdata *)(in)->hostdata
|
||||||
#define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata)
|
#define HOSTDATA(in) ((struct NCR5380_hostdata *)(in)->hostdata)
|
||||||
|
|
||||||
#define NEXT(cmd) ((struct scsi_cmnd *)((cmd)->host_scribble))
|
#define NEXT(cmd) (*(struct scsi_cmnd **)&((cmd)->host_scribble))
|
||||||
#define NEXTADDR(cmd) ((struct scsi_cmnd **)&((cmd)->host_scribble))
|
#define NEXTADDR(cmd) ((struct scsi_cmnd **)&((cmd)->host_scribble))
|
||||||
|
|
||||||
#define HOSTNO instance->host_no
|
#define HOSTNO instance->host_no
|
||||||
|
@ -650,7 +650,7 @@ __inline__ void NCR5380_print_phase(struct Scsi_Host *instance) { };
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
static volatile int main_running = 0;
|
static volatile int main_running = 0;
|
||||||
static DECLARE_WORK(NCR5380_tqueue, (void (*)(void*))NCR5380_main, NULL);
|
static DECLARE_WORK(NCR5380_tqueue, NCR5380_main);
|
||||||
|
|
||||||
static __inline__ void queue_main(void)
|
static __inline__ void queue_main(void)
|
||||||
{
|
{
|
||||||
|
@ -1031,7 +1031,7 @@ static int NCR5380_queue_command(struct scsi_cmnd *cmd,
|
||||||
* reenable them. This prevents reentrancy and kernel stack overflow.
|
* reenable them. This prevents reentrancy and kernel stack overflow.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void NCR5380_main (void *bl)
|
static void NCR5380_main (struct work_struct *bl)
|
||||||
{
|
{
|
||||||
struct scsi_cmnd *tmp, *prev;
|
struct scsi_cmnd *tmp, *prev;
|
||||||
struct Scsi_Host *instance = first_instance;
|
struct Scsi_Host *instance = first_instance;
|
||||||
|
|
|
@ -7,7 +7,8 @@ comment "USB Input Devices"
|
||||||
config USB_HID
|
config USB_HID
|
||||||
tristate "USB Human Interface Device (full HID) support"
|
tristate "USB Human Interface Device (full HID) support"
|
||||||
default y
|
default y
|
||||||
depends on USB && HID
|
depends on USB
|
||||||
|
select HID
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you want full HID support to connect USB keyboards,
|
Say Y here if you want full HID support to connect USB keyboards,
|
||||||
mice, joysticks, graphic tablets, or any other HID based devices
|
mice, joysticks, graphic tablets, or any other HID based devices
|
||||||
|
|
|
@ -119,8 +119,6 @@
|
||||||
*(__ksymtab_strings) \
|
*(__ksymtab_strings) \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
EH_FRAME \
|
|
||||||
\
|
|
||||||
/* Built-in module parameters. */ \
|
/* Built-in module parameters. */ \
|
||||||
__param : AT(ADDR(__param) - LOAD_OFFSET) { \
|
__param : AT(ADDR(__param) - LOAD_OFFSET) { \
|
||||||
VMLINUX_SYMBOL(__start___param) = .; \
|
VMLINUX_SYMBOL(__start___param) = .; \
|
||||||
|
@ -160,26 +158,6 @@
|
||||||
*(.kprobes.text) \
|
*(.kprobes.text) \
|
||||||
VMLINUX_SYMBOL(__kprobes_text_end) = .;
|
VMLINUX_SYMBOL(__kprobes_text_end) = .;
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
#define EH_FRAME \
|
|
||||||
/* Unwind data binary search table */ \
|
|
||||||
. = ALIGN(8); \
|
|
||||||
.eh_frame_hdr : AT(ADDR(.eh_frame_hdr) - LOAD_OFFSET) { \
|
|
||||||
VMLINUX_SYMBOL(__start_unwind_hdr) = .; \
|
|
||||||
*(.eh_frame_hdr) \
|
|
||||||
VMLINUX_SYMBOL(__end_unwind_hdr) = .; \
|
|
||||||
} \
|
|
||||||
/* Unwind data */ \
|
|
||||||
. = ALIGN(8); \
|
|
||||||
.eh_frame : AT(ADDR(.eh_frame) - LOAD_OFFSET) { \
|
|
||||||
VMLINUX_SYMBOL(__start_unwind) = .; \
|
|
||||||
*(.eh_frame) \
|
|
||||||
VMLINUX_SYMBOL(__end_unwind) = .; \
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define EH_FRAME
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* DWARF debug sections.
|
/* DWARF debug sections.
|
||||||
Symbols in the DWARF debugging sections are relative to
|
Symbols in the DWARF debugging sections are relative to
|
||||||
the beginning of the section so we begin them at 0. */
|
the beginning of the section so we begin them at 0. */
|
||||||
|
|
|
@ -1,95 +1,6 @@
|
||||||
#ifndef _ASM_I386_UNWIND_H
|
#ifndef _ASM_I386_UNWIND_H
|
||||||
#define _ASM_I386_UNWIND_H
|
#define _ASM_I386_UNWIND_H
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2002-2006 Novell, Inc.
|
|
||||||
* Jan Beulich <jbeulich@novell.com>
|
|
||||||
* This code is released under version 2 of the GNU GPL.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <asm/fixmap.h>
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#include <asm/uaccess.h>
|
|
||||||
|
|
||||||
struct unwind_frame_info
|
|
||||||
{
|
|
||||||
struct pt_regs regs;
|
|
||||||
struct task_struct *task;
|
|
||||||
unsigned call_frame:1;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define UNW_PC(frame) (frame)->regs.eip
|
|
||||||
#define UNW_SP(frame) (frame)->regs.esp
|
|
||||||
#ifdef CONFIG_FRAME_POINTER
|
|
||||||
#define UNW_FP(frame) (frame)->regs.ebp
|
|
||||||
#define FRAME_RETADDR_OFFSET 4
|
|
||||||
#define FRAME_LINK_OFFSET 0
|
|
||||||
#define STACK_BOTTOM(tsk) STACK_LIMIT((tsk)->thread.esp0)
|
|
||||||
#define STACK_TOP(tsk) ((tsk)->thread.esp0)
|
|
||||||
#else
|
|
||||||
#define UNW_FP(frame) ((void)(frame), 0)
|
|
||||||
#endif
|
|
||||||
#define STACK_LIMIT(ptr) (((ptr) - 1) & ~(THREAD_SIZE - 1))
|
|
||||||
|
|
||||||
#define UNW_REGISTER_INFO \
|
|
||||||
PTREGS_INFO(eax), \
|
|
||||||
PTREGS_INFO(ecx), \
|
|
||||||
PTREGS_INFO(edx), \
|
|
||||||
PTREGS_INFO(ebx), \
|
|
||||||
PTREGS_INFO(esp), \
|
|
||||||
PTREGS_INFO(ebp), \
|
|
||||||
PTREGS_INFO(esi), \
|
|
||||||
PTREGS_INFO(edi), \
|
|
||||||
PTREGS_INFO(eip)
|
|
||||||
|
|
||||||
#define UNW_DEFAULT_RA(raItem, dataAlign) \
|
|
||||||
((raItem).where == Memory && \
|
|
||||||
!((raItem).value * (dataAlign) + 4))
|
|
||||||
|
|
||||||
static inline void arch_unw_init_frame_info(struct unwind_frame_info *info,
|
|
||||||
/*const*/ struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
if (user_mode_vm(regs))
|
|
||||||
info->regs = *regs;
|
|
||||||
else {
|
|
||||||
memcpy(&info->regs, regs, offsetof(struct pt_regs, esp));
|
|
||||||
info->regs.esp = (unsigned long)®s->esp;
|
|
||||||
info->regs.xss = __KERNEL_DS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void arch_unw_init_blocked(struct unwind_frame_info *info)
|
|
||||||
{
|
|
||||||
memset(&info->regs, 0, sizeof(info->regs));
|
|
||||||
info->regs.eip = info->task->thread.eip;
|
|
||||||
info->regs.xcs = __KERNEL_CS;
|
|
||||||
__get_user(info->regs.ebp, (long *)info->task->thread.esp);
|
|
||||||
info->regs.esp = info->task->thread.esp;
|
|
||||||
info->regs.xss = __KERNEL_DS;
|
|
||||||
info->regs.xds = __USER_DS;
|
|
||||||
info->regs.xes = __USER_DS;
|
|
||||||
info->regs.xgs = __KERNEL_PDA;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern asmlinkage int arch_unwind_init_running(struct unwind_frame_info *,
|
|
||||||
asmlinkage int (*callback)(struct unwind_frame_info *,
|
|
||||||
void *arg),
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
static inline int arch_unw_user_mode(/*const*/ struct unwind_frame_info *info)
|
|
||||||
{
|
|
||||||
return user_mode_vm(&info->regs)
|
|
||||||
|| info->regs.eip < PAGE_OFFSET
|
|
||||||
|| (info->regs.eip >= __fix_to_virt(FIX_VDSO)
|
|
||||||
&& info->regs.eip < __fix_to_virt(FIX_VDSO) + PAGE_SIZE)
|
|
||||||
|| info->regs.esp < PAGE_OFFSET;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define UNW_PC(frame) ((void)(frame), 0)
|
#define UNW_PC(frame) ((void)(frame), 0)
|
||||||
#define UNW_SP(frame) ((void)(frame), 0)
|
#define UNW_SP(frame) ((void)(frame), 0)
|
||||||
#define UNW_FP(frame) ((void)(frame), 0)
|
#define UNW_FP(frame) ((void)(frame), 0)
|
||||||
|
@ -99,6 +10,4 @@ static inline int arch_unw_user_mode(const void *info)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _ASM_I386_UNWIND_H */
|
#endif /* _ASM_I386_UNWIND_H */
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#define QDIO_QETH_QFMT 0
|
#define QDIO_QETH_QFMT 0
|
||||||
#define QDIO_ZFCP_QFMT 1
|
#define QDIO_ZFCP_QFMT 1
|
||||||
#define QDIO_IQDIO_QFMT 2
|
#define QDIO_IQDIO_QFMT 2
|
||||||
|
#define QDIO_IQDIO_QFMT_ASYNCH 3
|
||||||
|
|
||||||
struct qdio_buffer_element{
|
struct qdio_buffer_element{
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
|
|
|
@ -19,5 +19,6 @@ extern void register_reset_call(struct reset_call *reset);
|
||||||
extern void unregister_reset_call(struct reset_call *reset);
|
extern void unregister_reset_call(struct reset_call *reset);
|
||||||
extern void s390_reset_system(void);
|
extern void s390_reset_system(void);
|
||||||
extern void (*s390_reset_mcck_handler)(void);
|
extern void (*s390_reset_mcck_handler)(void);
|
||||||
|
extern void (*s390_reset_pgm_handler)(void);
|
||||||
|
|
||||||
#endif /* _ASM_S390_RESET_H */
|
#endif /* _ASM_S390_RESET_H */
|
||||||
|
|
|
@ -14,6 +14,10 @@
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
extern unsigned long ___set_bit(unsigned long *addr, unsigned long mask);
|
||||||
|
extern unsigned long ___clear_bit(unsigned long *addr, unsigned long mask);
|
||||||
|
extern unsigned long ___change_bit(unsigned long *addr, unsigned long mask);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set bit 'nr' in 32-bit quantity at address 'addr' where bit '0'
|
* Set bit 'nr' in 32-bit quantity at address 'addr' where bit '0'
|
||||||
* is in the highest of the four bytes and bit '31' is the high bit
|
* is in the highest of the four bytes and bit '31' is the high bit
|
||||||
|
@ -22,134 +26,62 @@
|
||||||
*/
|
*/
|
||||||
static inline int test_and_set_bit(unsigned long nr, volatile unsigned long *addr)
|
static inline int test_and_set_bit(unsigned long nr, volatile unsigned long *addr)
|
||||||
{
|
{
|
||||||
register unsigned long mask asm("g2");
|
unsigned long *ADDR, mask;
|
||||||
register unsigned long *ADDR asm("g1");
|
|
||||||
register int tmp1 asm("g3");
|
|
||||||
register int tmp2 asm("g4");
|
|
||||||
register int tmp3 asm("g5");
|
|
||||||
register int tmp4 asm("g7");
|
|
||||||
|
|
||||||
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
||||||
mask = 1 << (nr & 31);
|
mask = 1 << (nr & 31);
|
||||||
|
|
||||||
__asm__ __volatile__(
|
return ___set_bit(ADDR, mask) != 0;
|
||||||
"mov %%o7, %%g4\n\t"
|
|
||||||
"call ___set_bit\n\t"
|
|
||||||
" add %%o7, 8, %%o7\n"
|
|
||||||
: "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
|
|
||||||
: "0" (mask), "r" (ADDR)
|
|
||||||
: "memory", "cc");
|
|
||||||
|
|
||||||
return mask != 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void set_bit(unsigned long nr, volatile unsigned long *addr)
|
static inline void set_bit(unsigned long nr, volatile unsigned long *addr)
|
||||||
{
|
{
|
||||||
register unsigned long mask asm("g2");
|
unsigned long *ADDR, mask;
|
||||||
register unsigned long *ADDR asm("g1");
|
|
||||||
register int tmp1 asm("g3");
|
|
||||||
register int tmp2 asm("g4");
|
|
||||||
register int tmp3 asm("g5");
|
|
||||||
register int tmp4 asm("g7");
|
|
||||||
|
|
||||||
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
||||||
mask = 1 << (nr & 31);
|
mask = 1 << (nr & 31);
|
||||||
|
|
||||||
__asm__ __volatile__(
|
(void) ___set_bit(ADDR, mask);
|
||||||
"mov %%o7, %%g4\n\t"
|
|
||||||
"call ___set_bit\n\t"
|
|
||||||
" add %%o7, 8, %%o7\n"
|
|
||||||
: "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
|
|
||||||
: "0" (mask), "r" (ADDR)
|
|
||||||
: "memory", "cc");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr)
|
static inline int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr)
|
||||||
{
|
{
|
||||||
register unsigned long mask asm("g2");
|
unsigned long *ADDR, mask;
|
||||||
register unsigned long *ADDR asm("g1");
|
|
||||||
register int tmp1 asm("g3");
|
|
||||||
register int tmp2 asm("g4");
|
|
||||||
register int tmp3 asm("g5");
|
|
||||||
register int tmp4 asm("g7");
|
|
||||||
|
|
||||||
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
||||||
mask = 1 << (nr & 31);
|
mask = 1 << (nr & 31);
|
||||||
|
|
||||||
__asm__ __volatile__(
|
return ___clear_bit(ADDR, mask) != 0;
|
||||||
"mov %%o7, %%g4\n\t"
|
|
||||||
"call ___clear_bit\n\t"
|
|
||||||
" add %%o7, 8, %%o7\n"
|
|
||||||
: "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
|
|
||||||
: "0" (mask), "r" (ADDR)
|
|
||||||
: "memory", "cc");
|
|
||||||
|
|
||||||
return mask != 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void clear_bit(unsigned long nr, volatile unsigned long *addr)
|
static inline void clear_bit(unsigned long nr, volatile unsigned long *addr)
|
||||||
{
|
{
|
||||||
register unsigned long mask asm("g2");
|
unsigned long *ADDR, mask;
|
||||||
register unsigned long *ADDR asm("g1");
|
|
||||||
register int tmp1 asm("g3");
|
|
||||||
register int tmp2 asm("g4");
|
|
||||||
register int tmp3 asm("g5");
|
|
||||||
register int tmp4 asm("g7");
|
|
||||||
|
|
||||||
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
||||||
mask = 1 << (nr & 31);
|
mask = 1 << (nr & 31);
|
||||||
|
|
||||||
__asm__ __volatile__(
|
(void) ___clear_bit(ADDR, mask);
|
||||||
"mov %%o7, %%g4\n\t"
|
|
||||||
"call ___clear_bit\n\t"
|
|
||||||
" add %%o7, 8, %%o7\n"
|
|
||||||
: "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
|
|
||||||
: "0" (mask), "r" (ADDR)
|
|
||||||
: "memory", "cc");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int test_and_change_bit(unsigned long nr, volatile unsigned long *addr)
|
static inline int test_and_change_bit(unsigned long nr, volatile unsigned long *addr)
|
||||||
{
|
{
|
||||||
register unsigned long mask asm("g2");
|
unsigned long *ADDR, mask;
|
||||||
register unsigned long *ADDR asm("g1");
|
|
||||||
register int tmp1 asm("g3");
|
|
||||||
register int tmp2 asm("g4");
|
|
||||||
register int tmp3 asm("g5");
|
|
||||||
register int tmp4 asm("g7");
|
|
||||||
|
|
||||||
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
||||||
mask = 1 << (nr & 31);
|
mask = 1 << (nr & 31);
|
||||||
|
|
||||||
__asm__ __volatile__(
|
return ___change_bit(ADDR, mask) != 0;
|
||||||
"mov %%o7, %%g4\n\t"
|
|
||||||
"call ___change_bit\n\t"
|
|
||||||
" add %%o7, 8, %%o7\n"
|
|
||||||
: "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
|
|
||||||
: "0" (mask), "r" (ADDR)
|
|
||||||
: "memory", "cc");
|
|
||||||
|
|
||||||
return mask != 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void change_bit(unsigned long nr, volatile unsigned long *addr)
|
static inline void change_bit(unsigned long nr, volatile unsigned long *addr)
|
||||||
{
|
{
|
||||||
register unsigned long mask asm("g2");
|
unsigned long *ADDR, mask;
|
||||||
register unsigned long *ADDR asm("g1");
|
|
||||||
register int tmp1 asm("g3");
|
|
||||||
register int tmp2 asm("g4");
|
|
||||||
register int tmp3 asm("g5");
|
|
||||||
register int tmp4 asm("g7");
|
|
||||||
|
|
||||||
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
ADDR = ((unsigned long *) addr) + (nr >> 5);
|
||||||
mask = 1 << (nr & 31);
|
mask = 1 << (nr & 31);
|
||||||
|
|
||||||
__asm__ __volatile__(
|
(void) ___change_bit(ADDR, mask);
|
||||||
"mov %%o7, %%g4\n\t"
|
|
||||||
"call ___change_bit\n\t"
|
|
||||||
" add %%o7, 8, %%o7\n"
|
|
||||||
: "=&r" (mask), "=r" (tmp1), "=r" (tmp2), "=r" (tmp3), "=r" (tmp4)
|
|
||||||
: "0" (mask), "r" (ADDR)
|
|
||||||
: "memory", "cc");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <asm-generic/bitops/non-atomic.h>
|
#include <asm-generic/bitops/non-atomic.h>
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
#ifndef __ASM_SPARC64_HW_IRQ_H
|
#ifndef __ASM_SPARC64_HW_IRQ_H
|
||||||
#define __ASM_SPARC64_HW_IRQ_H
|
#define __ASM_SPARC64_HW_IRQ_H
|
||||||
|
|
||||||
extern void hw_resend_irq(struct hw_interrupt_type *handler, unsigned int virt_irq);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -5,6 +5,16 @@
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
|
||||||
|
#ifdef CONFIG_MODULES
|
||||||
|
# define PERCPU_MODULE_RESERVE 8192
|
||||||
|
#else
|
||||||
|
# define PERCPU_MODULE_RESERVE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PERCPU_ENOUGH_ROOM \
|
||||||
|
(ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES) + \
|
||||||
|
PERCPU_MODULE_RESERVE)
|
||||||
|
|
||||||
extern void setup_per_cpu_areas(void);
|
extern void setup_per_cpu_areas(void);
|
||||||
|
|
||||||
extern unsigned long __per_cpu_base;
|
extern unsigned long __per_cpu_base;
|
||||||
|
|
|
@ -1,100 +1,6 @@
|
||||||
#ifndef _ASM_X86_64_UNWIND_H
|
#ifndef _ASM_X86_64_UNWIND_H
|
||||||
#define _ASM_X86_64_UNWIND_H
|
#define _ASM_X86_64_UNWIND_H
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2002-2006 Novell, Inc.
|
|
||||||
* Jan Beulich <jbeulich@novell.com>
|
|
||||||
* This code is released under version 2 of the GNU GPL.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <asm/ptrace.h>
|
|
||||||
#include <asm/uaccess.h>
|
|
||||||
#include <asm/vsyscall.h>
|
|
||||||
|
|
||||||
struct unwind_frame_info
|
|
||||||
{
|
|
||||||
struct pt_regs regs;
|
|
||||||
struct task_struct *task;
|
|
||||||
unsigned call_frame:1;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define UNW_PC(frame) (frame)->regs.rip
|
|
||||||
#define UNW_SP(frame) (frame)->regs.rsp
|
|
||||||
#ifdef CONFIG_FRAME_POINTER
|
|
||||||
#define UNW_FP(frame) (frame)->regs.rbp
|
|
||||||
#define FRAME_RETADDR_OFFSET 8
|
|
||||||
#define FRAME_LINK_OFFSET 0
|
|
||||||
#define STACK_BOTTOM(tsk) (((tsk)->thread.rsp0 - 1) & ~(THREAD_SIZE - 1))
|
|
||||||
#define STACK_TOP(tsk) ((tsk)->thread.rsp0)
|
|
||||||
#endif
|
|
||||||
/* Might need to account for the special exception and interrupt handling
|
|
||||||
stacks here, since normally
|
|
||||||
EXCEPTION_STACK_ORDER < THREAD_ORDER < IRQSTACK_ORDER,
|
|
||||||
but the construct is needed only for getting across the stack switch to
|
|
||||||
the interrupt stack - thus considering the IRQ stack itself is unnecessary,
|
|
||||||
and the overhead of comparing against all exception handling stacks seems
|
|
||||||
not desirable. */
|
|
||||||
#define STACK_LIMIT(ptr) (((ptr) - 1) & ~(THREAD_SIZE - 1))
|
|
||||||
|
|
||||||
#define UNW_REGISTER_INFO \
|
|
||||||
PTREGS_INFO(rax), \
|
|
||||||
PTREGS_INFO(rdx), \
|
|
||||||
PTREGS_INFO(rcx), \
|
|
||||||
PTREGS_INFO(rbx), \
|
|
||||||
PTREGS_INFO(rsi), \
|
|
||||||
PTREGS_INFO(rdi), \
|
|
||||||
PTREGS_INFO(rbp), \
|
|
||||||
PTREGS_INFO(rsp), \
|
|
||||||
PTREGS_INFO(r8), \
|
|
||||||
PTREGS_INFO(r9), \
|
|
||||||
PTREGS_INFO(r10), \
|
|
||||||
PTREGS_INFO(r11), \
|
|
||||||
PTREGS_INFO(r12), \
|
|
||||||
PTREGS_INFO(r13), \
|
|
||||||
PTREGS_INFO(r14), \
|
|
||||||
PTREGS_INFO(r15), \
|
|
||||||
PTREGS_INFO(rip)
|
|
||||||
|
|
||||||
#define UNW_DEFAULT_RA(raItem, dataAlign) \
|
|
||||||
((raItem).where == Memory && \
|
|
||||||
!((raItem).value * (dataAlign) + 8))
|
|
||||||
|
|
||||||
static inline void arch_unw_init_frame_info(struct unwind_frame_info *info,
|
|
||||||
/*const*/ struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
info->regs = *regs;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void arch_unw_init_blocked(struct unwind_frame_info *info)
|
|
||||||
{
|
|
||||||
extern const char thread_return[];
|
|
||||||
|
|
||||||
memset(&info->regs, 0, sizeof(info->regs));
|
|
||||||
info->regs.rip = (unsigned long)thread_return;
|
|
||||||
info->regs.cs = __KERNEL_CS;
|
|
||||||
__get_user(info->regs.rbp, (unsigned long *)info->task->thread.rsp);
|
|
||||||
info->regs.rsp = info->task->thread.rsp;
|
|
||||||
info->regs.ss = __KERNEL_DS;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern int arch_unwind_init_running(struct unwind_frame_info *,
|
|
||||||
int (*callback)(struct unwind_frame_info *,
|
|
||||||
void *arg),
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
static inline int arch_unw_user_mode(const struct unwind_frame_info *info)
|
|
||||||
{
|
|
||||||
return user_mode(&info->regs)
|
|
||||||
|| (long)info->regs.rip >= 0
|
|
||||||
|| (info->regs.rip >= VSYSCALL_START && info->regs.rip < VSYSCALL_END)
|
|
||||||
|| (long)info->regs.rsp >= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define UNW_PC(frame) ((void)(frame), 0UL)
|
#define UNW_PC(frame) ((void)(frame), 0UL)
|
||||||
#define UNW_SP(frame) ((void)(frame), 0UL)
|
#define UNW_SP(frame) ((void)(frame), 0UL)
|
||||||
|
|
||||||
|
@ -103,6 +9,4 @@ static inline int arch_unw_user_mode(const void *info)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _ASM_X86_64_UNWIND_H */
|
#endif /* _ASM_X86_64_UNWIND_H */
|
||||||
|
|
|
@ -133,7 +133,7 @@ struct cn_callback_data {
|
||||||
struct cn_callback_entry {
|
struct cn_callback_entry {
|
||||||
struct list_head callback_entry;
|
struct list_head callback_entry;
|
||||||
struct cn_callback *cb;
|
struct cn_callback *cb;
|
||||||
struct delayed_work work;
|
struct work_struct work;
|
||||||
struct cn_queue_dev *pdev;
|
struct cn_queue_dev *pdev;
|
||||||
|
|
||||||
struct cn_callback_id id;
|
struct cn_callback_id id;
|
||||||
|
|
|
@ -491,6 +491,21 @@ struct input_absinfo {
|
||||||
#define KEY_DIGITS 0x19d
|
#define KEY_DIGITS 0x19d
|
||||||
#define KEY_TEEN 0x19e
|
#define KEY_TEEN 0x19e
|
||||||
#define KEY_TWEN 0x19f
|
#define KEY_TWEN 0x19f
|
||||||
|
#define KEY_VIDEOPHONE 0x1a0
|
||||||
|
#define KEY_GAMES 0x1a1
|
||||||
|
#define KEY_ZOOMIN 0x1a2
|
||||||
|
#define KEY_ZOOMOUT 0x1a3
|
||||||
|
#define KEY_ZOOMRESET 0x1a4
|
||||||
|
#define KEY_WORDPROCESSOR 0x1a5
|
||||||
|
#define KEY_EDITOR 0x1a6
|
||||||
|
#define KEY_SPREADSHEET 0x1a7
|
||||||
|
#define KEY_GRAPHICSEDITOR 0x1a8
|
||||||
|
#define KEY_PRESENTATION 0x1a9
|
||||||
|
#define KEY_DATABASE 0x1aa
|
||||||
|
#define KEY_NEWS 0x1ab
|
||||||
|
#define KEY_VOICEMAIL 0x1ac
|
||||||
|
#define KEY_ADDRESSBOOK 0x1ad
|
||||||
|
#define KEY_MESSENGER 0x1ae
|
||||||
|
|
||||||
#define KEY_DEL_EOL 0x1c0
|
#define KEY_DEL_EOL 0x1c0
|
||||||
#define KEY_DEL_EOS 0x1c1
|
#define KEY_DEL_EOS 0x1c1
|
||||||
|
|
|
@ -14,63 +14,6 @@
|
||||||
|
|
||||||
struct module;
|
struct module;
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
|
||||||
|
|
||||||
#include <asm/unwind.h>
|
|
||||||
|
|
||||||
#ifndef ARCH_UNWIND_SECTION_NAME
|
|
||||||
#define ARCH_UNWIND_SECTION_NAME ".eh_frame"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize unwind support.
|
|
||||||
*/
|
|
||||||
extern void unwind_init(void);
|
|
||||||
extern void unwind_setup(void);
|
|
||||||
|
|
||||||
#ifdef CONFIG_MODULES
|
|
||||||
|
|
||||||
extern void *unwind_add_table(struct module *,
|
|
||||||
const void *table_start,
|
|
||||||
unsigned long table_size);
|
|
||||||
|
|
||||||
extern void unwind_remove_table(void *handle, int init_only);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern int unwind_init_frame_info(struct unwind_frame_info *,
|
|
||||||
struct task_struct *,
|
|
||||||
/*const*/ struct pt_regs *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prepare to unwind a blocked task.
|
|
||||||
*/
|
|
||||||
extern int unwind_init_blocked(struct unwind_frame_info *,
|
|
||||||
struct task_struct *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Prepare to unwind the currently running thread.
|
|
||||||
*/
|
|
||||||
extern int unwind_init_running(struct unwind_frame_info *,
|
|
||||||
asmlinkage int (*callback)(struct unwind_frame_info *,
|
|
||||||
void *arg),
|
|
||||||
void *arg);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unwind to previous to frame. Returns 0 if successful, negative
|
|
||||||
* number in case of an error.
|
|
||||||
*/
|
|
||||||
extern int unwind(struct unwind_frame_info *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Unwind until the return pointer is in user-land (or until an error
|
|
||||||
* occurs). Returns 0 if successful, negative number in case of
|
|
||||||
* error.
|
|
||||||
*/
|
|
||||||
extern int unwind_to_user(struct unwind_frame_info *);
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
struct unwind_frame_info {};
|
struct unwind_frame_info {};
|
||||||
|
|
||||||
static inline void unwind_init(void) {}
|
static inline void unwind_init(void) {}
|
||||||
|
@ -85,12 +28,12 @@ static inline void *unwind_add_table(struct module *mod,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline void unwind_remove_table(void *handle, int init_only)
|
static inline void unwind_remove_table(void *handle, int init_only)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline int unwind_init_frame_info(struct unwind_frame_info *info,
|
static inline int unwind_init_frame_info(struct unwind_frame_info *info,
|
||||||
struct task_struct *tsk,
|
struct task_struct *tsk,
|
||||||
const struct pt_regs *regs)
|
const struct pt_regs *regs)
|
||||||
|
@ -122,6 +65,4 @@ static inline int unwind_to_user(struct unwind_frame_info *info)
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _LINUX_UNWIND_H */
|
#endif /* _LINUX_UNWIND_H */
|
||||||
|
|
|
@ -8,16 +8,21 @@
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <asm/atomic.h>
|
||||||
|
|
||||||
struct workqueue_struct;
|
struct workqueue_struct;
|
||||||
|
|
||||||
struct work_struct;
|
struct work_struct;
|
||||||
typedef void (*work_func_t)(struct work_struct *work);
|
typedef void (*work_func_t)(struct work_struct *work);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The first word is the work queue pointer and the flags rolled into
|
||||||
|
* one
|
||||||
|
*/
|
||||||
|
#define work_data_bits(work) ((unsigned long *)(&(work)->data))
|
||||||
|
|
||||||
struct work_struct {
|
struct work_struct {
|
||||||
/* the first word is the work queue pointer and the flags rolled into
|
atomic_long_t data;
|
||||||
* one */
|
|
||||||
unsigned long management;
|
|
||||||
#define WORK_STRUCT_PENDING 0 /* T if work item pending execution */
|
#define WORK_STRUCT_PENDING 0 /* T if work item pending execution */
|
||||||
#define WORK_STRUCT_NOAUTOREL 1 /* F if work item automatically released on exec */
|
#define WORK_STRUCT_NOAUTOREL 1 /* F if work item automatically released on exec */
|
||||||
#define WORK_STRUCT_FLAG_MASK (3UL)
|
#define WORK_STRUCT_FLAG_MASK (3UL)
|
||||||
|
@ -26,6 +31,9 @@ struct work_struct {
|
||||||
work_func_t func;
|
work_func_t func;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define WORK_DATA_INIT(autorelease) \
|
||||||
|
ATOMIC_LONG_INIT((autorelease) << WORK_STRUCT_NOAUTOREL)
|
||||||
|
|
||||||
struct delayed_work {
|
struct delayed_work {
|
||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
struct timer_list timer;
|
struct timer_list timer;
|
||||||
|
@ -36,13 +44,13 @@ struct execute_work {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define __WORK_INITIALIZER(n, f) { \
|
#define __WORK_INITIALIZER(n, f) { \
|
||||||
.management = 0, \
|
.data = WORK_DATA_INIT(0), \
|
||||||
.entry = { &(n).entry, &(n).entry }, \
|
.entry = { &(n).entry, &(n).entry }, \
|
||||||
.func = (f), \
|
.func = (f), \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define __WORK_INITIALIZER_NAR(n, f) { \
|
#define __WORK_INITIALIZER_NAR(n, f) { \
|
||||||
.management = (1 << WORK_STRUCT_NOAUTOREL), \
|
.data = WORK_DATA_INIT(1), \
|
||||||
.entry = { &(n).entry, &(n).entry }, \
|
.entry = { &(n).entry, &(n).entry }, \
|
||||||
.func = (f), \
|
.func = (f), \
|
||||||
}
|
}
|
||||||
|
@ -82,17 +90,21 @@ struct execute_work {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* initialize all of a work item in one go
|
* initialize all of a work item in one go
|
||||||
|
*
|
||||||
|
* NOTE! No point in using "atomic_long_set()": useing a direct
|
||||||
|
* assignment of the work data initializer allows the compiler
|
||||||
|
* to generate better code.
|
||||||
*/
|
*/
|
||||||
#define INIT_WORK(_work, _func) \
|
#define INIT_WORK(_work, _func) \
|
||||||
do { \
|
do { \
|
||||||
(_work)->management = 0; \
|
(_work)->data = (atomic_long_t) WORK_DATA_INIT(0); \
|
||||||
INIT_LIST_HEAD(&(_work)->entry); \
|
INIT_LIST_HEAD(&(_work)->entry); \
|
||||||
PREPARE_WORK((_work), (_func)); \
|
PREPARE_WORK((_work), (_func)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define INIT_WORK_NAR(_work, _func) \
|
#define INIT_WORK_NAR(_work, _func) \
|
||||||
do { \
|
do { \
|
||||||
(_work)->management = (1 << WORK_STRUCT_NOAUTOREL); \
|
(_work)->data = (atomic_long_t) WORK_DATA_INIT(1); \
|
||||||
INIT_LIST_HEAD(&(_work)->entry); \
|
INIT_LIST_HEAD(&(_work)->entry); \
|
||||||
PREPARE_WORK((_work), (_func)); \
|
PREPARE_WORK((_work), (_func)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -114,15 +126,15 @@ struct execute_work {
|
||||||
* @work: The work item in question
|
* @work: The work item in question
|
||||||
*/
|
*/
|
||||||
#define work_pending(work) \
|
#define work_pending(work) \
|
||||||
test_bit(WORK_STRUCT_PENDING, &(work)->management)
|
test_bit(WORK_STRUCT_PENDING, work_data_bits(work))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* delayed_work_pending - Find out whether a delayable work item is currently
|
* delayed_work_pending - Find out whether a delayable work item is currently
|
||||||
* pending
|
* pending
|
||||||
* @work: The work item in question
|
* @work: The work item in question
|
||||||
*/
|
*/
|
||||||
#define delayed_work_pending(work) \
|
#define delayed_work_pending(w) \
|
||||||
test_bit(WORK_STRUCT_PENDING, &(work)->work.management)
|
work_pending(&(w)->work)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* work_release - Release a work item under execution
|
* work_release - Release a work item under execution
|
||||||
|
@ -143,7 +155,7 @@ struct execute_work {
|
||||||
* This should also be used to release a delayed work item.
|
* This should also be used to release a delayed work item.
|
||||||
*/
|
*/
|
||||||
#define work_release(work) \
|
#define work_release(work) \
|
||||||
clear_bit(WORK_STRUCT_PENDING, &(work)->management)
|
clear_bit(WORK_STRUCT_PENDING, work_data_bits(work))
|
||||||
|
|
||||||
|
|
||||||
extern struct workqueue_struct *__create_workqueue(const char *name,
|
extern struct workqueue_struct *__create_workqueue(const char *name,
|
||||||
|
@ -188,7 +200,7 @@ static inline int cancel_delayed_work(struct delayed_work *work)
|
||||||
|
|
||||||
ret = del_timer_sync(&work->timer);
|
ret = del_timer_sync(&work->timer);
|
||||||
if (ret)
|
if (ret)
|
||||||
clear_bit(WORK_STRUCT_PENDING, &work->work.management);
|
work_release(&work->work);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -277,7 +277,7 @@ struct sock *ax25_get_socket(ax25_address *, ax25_address *, int);
|
||||||
extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
|
extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
|
||||||
extern void ax25_send_to_raw(ax25_address *, struct sk_buff *, int);
|
extern void ax25_send_to_raw(ax25_address *, struct sk_buff *, int);
|
||||||
extern void ax25_destroy_socket(ax25_cb *);
|
extern void ax25_destroy_socket(ax25_cb *);
|
||||||
extern ax25_cb *ax25_create_cb(void);
|
extern ax25_cb * __must_check ax25_create_cb(void);
|
||||||
extern void ax25_fillin_cb(ax25_cb *, ax25_dev *);
|
extern void ax25_fillin_cb(ax25_cb *, ax25_dev *);
|
||||||
extern struct sock *ax25_make_new(struct sock *, struct ax25_dev *);
|
extern struct sock *ax25_make_new(struct sock *, struct ax25_dev *);
|
||||||
|
|
||||||
|
@ -333,11 +333,25 @@ extern void ax25_ds_t3timer_expiry(ax25_cb *);
|
||||||
extern void ax25_ds_idletimer_expiry(ax25_cb *);
|
extern void ax25_ds_idletimer_expiry(ax25_cb *);
|
||||||
|
|
||||||
/* ax25_iface.c */
|
/* ax25_iface.c */
|
||||||
extern int ax25_protocol_register(unsigned int, int (*)(struct sk_buff *, ax25_cb *));
|
|
||||||
|
struct ax25_protocol {
|
||||||
|
struct ax25_protocol *next;
|
||||||
|
unsigned int pid;
|
||||||
|
int (*func)(struct sk_buff *, ax25_cb *);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern void ax25_register_pid(struct ax25_protocol *ap);
|
||||||
extern void ax25_protocol_release(unsigned int);
|
extern void ax25_protocol_release(unsigned int);
|
||||||
extern int ax25_linkfail_register(void (*)(ax25_cb *, int));
|
|
||||||
extern void ax25_linkfail_release(void (*)(ax25_cb *, int));
|
struct ax25_linkfail {
|
||||||
extern int ax25_listen_register(ax25_address *, struct net_device *);
|
struct hlist_node lf_node;
|
||||||
|
void (*func)(ax25_cb *, int);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern void ax25_linkfail_register(struct ax25_linkfail *lf);
|
||||||
|
extern void ax25_linkfail_release(struct ax25_linkfail *lf);
|
||||||
|
extern int __must_check ax25_listen_register(ax25_address *,
|
||||||
|
struct net_device *);
|
||||||
extern void ax25_listen_release(ax25_address *, struct net_device *);
|
extern void ax25_listen_release(ax25_address *, struct net_device *);
|
||||||
extern int (*ax25_protocol_function(unsigned int))(struct sk_buff *, ax25_cb *);
|
extern int (*ax25_protocol_function(unsigned int))(struct sk_buff *, ax25_cb *);
|
||||||
extern int ax25_listen_mine(ax25_address *, struct net_device *);
|
extern int ax25_listen_mine(ax25_address *, struct net_device *);
|
||||||
|
@ -415,7 +429,7 @@ extern unsigned long ax25_display_timer(struct timer_list *);
|
||||||
/* ax25_uid.c */
|
/* ax25_uid.c */
|
||||||
extern int ax25_uid_policy;
|
extern int ax25_uid_policy;
|
||||||
extern ax25_uid_assoc *ax25_findbyuid(uid_t);
|
extern ax25_uid_assoc *ax25_findbyuid(uid_t);
|
||||||
extern int ax25_uid_ioctl(int, struct sockaddr_ax25 *);
|
extern int __must_check ax25_uid_ioctl(int, struct sockaddr_ax25 *);
|
||||||
extern struct file_operations ax25_uid_fops;
|
extern struct file_operations ax25_uid_fops;
|
||||||
extern void ax25_uid_free(void);
|
extern void ax25_uid_free(void);
|
||||||
|
|
||||||
|
|
|
@ -188,13 +188,13 @@ extern void rose_kick(struct sock *);
|
||||||
extern void rose_enquiry_response(struct sock *);
|
extern void rose_enquiry_response(struct sock *);
|
||||||
|
|
||||||
/* rose_route.c */
|
/* rose_route.c */
|
||||||
extern struct rose_neigh *rose_loopback_neigh;
|
extern struct rose_neigh rose_loopback_neigh;
|
||||||
extern struct file_operations rose_neigh_fops;
|
extern struct file_operations rose_neigh_fops;
|
||||||
extern struct file_operations rose_nodes_fops;
|
extern struct file_operations rose_nodes_fops;
|
||||||
extern struct file_operations rose_routes_fops;
|
extern struct file_operations rose_routes_fops;
|
||||||
|
|
||||||
extern int rose_add_loopback_neigh(void);
|
extern void rose_add_loopback_neigh(void);
|
||||||
extern int rose_add_loopback_node(rose_address *);
|
extern int __must_check rose_add_loopback_node(rose_address *);
|
||||||
extern void rose_del_loopback_node(rose_address *);
|
extern void rose_del_loopback_node(rose_address *);
|
||||||
extern void rose_rt_device_down(struct net_device *);
|
extern void rose_rt_device_down(struct net_device *);
|
||||||
extern void rose_link_device_down(struct net_device *);
|
extern void rose_link_device_down(struct net_device *);
|
||||||
|
|
|
@ -1639,7 +1639,14 @@ static inline void *ib_dma_alloc_coherent(struct ib_device *dev,
|
||||||
{
|
{
|
||||||
if (dev->dma_ops)
|
if (dev->dma_ops)
|
||||||
return dev->dma_ops->alloc_coherent(dev, size, dma_handle, flag);
|
return dev->dma_ops->alloc_coherent(dev, size, dma_handle, flag);
|
||||||
return dma_alloc_coherent(dev->dma_device, size, dma_handle, flag);
|
else {
|
||||||
|
dma_addr_t handle;
|
||||||
|
void *ret;
|
||||||
|
|
||||||
|
ret = dma_alloc_coherent(dev->dma_device, size, &handle, flag);
|
||||||
|
*dma_handle = handle;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -31,7 +31,6 @@ obj-$(CONFIG_PROVE_LOCKING) += spinlock.o
|
||||||
obj-$(CONFIG_UID16) += uid16.o
|
obj-$(CONFIG_UID16) += uid16.o
|
||||||
obj-$(CONFIG_MODULES) += module.o
|
obj-$(CONFIG_MODULES) += module.o
|
||||||
obj-$(CONFIG_KALLSYMS) += kallsyms.o
|
obj-$(CONFIG_KALLSYMS) += kallsyms.o
|
||||||
obj-$(CONFIG_STACK_UNWIND) += unwind.o
|
|
||||||
obj-$(CONFIG_PM) += power/
|
obj-$(CONFIG_PM) += power/
|
||||||
obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
|
obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
|
||||||
obj-$(CONFIG_KEXEC) += kexec.o
|
obj-$(CONFIG_KEXEC) += kexec.o
|
||||||
|
|
1305
kernel/unwind.c
1305
kernel/unwind.c
File diff suppressed because it is too large
Load Diff
|
@ -96,13 +96,13 @@ static inline void set_wq_data(struct work_struct *work, void *wq)
|
||||||
BUG_ON(!work_pending(work));
|
BUG_ON(!work_pending(work));
|
||||||
|
|
||||||
new = (unsigned long) wq | (1UL << WORK_STRUCT_PENDING);
|
new = (unsigned long) wq | (1UL << WORK_STRUCT_PENDING);
|
||||||
new |= work->management & WORK_STRUCT_FLAG_MASK;
|
new |= WORK_STRUCT_FLAG_MASK & *work_data_bits(work);
|
||||||
work->management = new;
|
atomic_long_set(&work->data, new);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void *get_wq_data(struct work_struct *work)
|
static inline void *get_wq_data(struct work_struct *work)
|
||||||
{
|
{
|
||||||
return (void *) (work->management & WORK_STRUCT_WQ_DATA_MASK);
|
return (void *) (atomic_long_read(&work->data) & WORK_STRUCT_WQ_DATA_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __run_work(struct cpu_workqueue_struct *cwq, struct work_struct *work)
|
static int __run_work(struct cpu_workqueue_struct *cwq, struct work_struct *work)
|
||||||
|
@ -133,7 +133,7 @@ static int __run_work(struct cpu_workqueue_struct *cwq, struct work_struct *work
|
||||||
list_del_init(&work->entry);
|
list_del_init(&work->entry);
|
||||||
spin_unlock_irqrestore(&cwq->lock, flags);
|
spin_unlock_irqrestore(&cwq->lock, flags);
|
||||||
|
|
||||||
if (!test_bit(WORK_STRUCT_NOAUTOREL, &work->management))
|
if (!test_bit(WORK_STRUCT_NOAUTOREL, work_data_bits(work)))
|
||||||
work_release(work);
|
work_release(work);
|
||||||
f(work);
|
f(work);
|
||||||
|
|
||||||
|
@ -206,7 +206,7 @@ int fastcall queue_work(struct workqueue_struct *wq, struct work_struct *work)
|
||||||
{
|
{
|
||||||
int ret = 0, cpu = get_cpu();
|
int ret = 0, cpu = get_cpu();
|
||||||
|
|
||||||
if (!test_and_set_bit(WORK_STRUCT_PENDING, &work->management)) {
|
if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work))) {
|
||||||
if (unlikely(is_single_threaded(wq)))
|
if (unlikely(is_single_threaded(wq)))
|
||||||
cpu = singlethread_cpu;
|
cpu = singlethread_cpu;
|
||||||
BUG_ON(!list_empty(&work->entry));
|
BUG_ON(!list_empty(&work->entry));
|
||||||
|
@ -248,7 +248,7 @@ int fastcall queue_delayed_work(struct workqueue_struct *wq,
|
||||||
if (delay == 0)
|
if (delay == 0)
|
||||||
return queue_work(wq, work);
|
return queue_work(wq, work);
|
||||||
|
|
||||||
if (!test_and_set_bit(WORK_STRUCT_PENDING, &work->management)) {
|
if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work))) {
|
||||||
BUG_ON(timer_pending(timer));
|
BUG_ON(timer_pending(timer));
|
||||||
BUG_ON(!list_empty(&work->entry));
|
BUG_ON(!list_empty(&work->entry));
|
||||||
|
|
||||||
|
@ -280,7 +280,7 @@ int queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
|
||||||
struct timer_list *timer = &dwork->timer;
|
struct timer_list *timer = &dwork->timer;
|
||||||
struct work_struct *work = &dwork->work;
|
struct work_struct *work = &dwork->work;
|
||||||
|
|
||||||
if (!test_and_set_bit(WORK_STRUCT_PENDING, &work->management)) {
|
if (!test_and_set_bit(WORK_STRUCT_PENDING, work_data_bits(work))) {
|
||||||
BUG_ON(timer_pending(timer));
|
BUG_ON(timer_pending(timer));
|
||||||
BUG_ON(!list_empty(&work->entry));
|
BUG_ON(!list_empty(&work->entry));
|
||||||
|
|
||||||
|
@ -321,7 +321,7 @@ static void run_workqueue(struct cpu_workqueue_struct *cwq)
|
||||||
spin_unlock_irqrestore(&cwq->lock, flags);
|
spin_unlock_irqrestore(&cwq->lock, flags);
|
||||||
|
|
||||||
BUG_ON(get_wq_data(work) != cwq);
|
BUG_ON(get_wq_data(work) != cwq);
|
||||||
if (!test_bit(WORK_STRUCT_NOAUTOREL, &work->management))
|
if (!test_bit(WORK_STRUCT_NOAUTOREL, work_data_bits(work)))
|
||||||
work_release(work);
|
work_release(work);
|
||||||
f(work);
|
f(work);
|
||||||
|
|
||||||
|
|
|
@ -354,24 +354,6 @@ config FRAME_POINTER
|
||||||
some architectures or if you use external debuggers.
|
some architectures or if you use external debuggers.
|
||||||
If you don't debug the kernel, you can say N.
|
If you don't debug the kernel, you can say N.
|
||||||
|
|
||||||
config UNWIND_INFO
|
|
||||||
bool "Compile the kernel with frame unwind information"
|
|
||||||
depends on !IA64 && !PARISC && !ARM
|
|
||||||
depends on !MODULES || !(MIPS || PPC || SUPERH || V850)
|
|
||||||
help
|
|
||||||
If you say Y here the resulting kernel image will be slightly larger
|
|
||||||
but not slower, and it will give very useful debugging information.
|
|
||||||
If you don't debug the kernel, you can say N, but we may not be able
|
|
||||||
to solve problems without frame unwind information or frame pointers.
|
|
||||||
|
|
||||||
config STACK_UNWIND
|
|
||||||
bool "Stack unwind support"
|
|
||||||
depends on UNWIND_INFO
|
|
||||||
depends on X86
|
|
||||||
help
|
|
||||||
This enables more precise stack traces, omitting all unrelated
|
|
||||||
occurrences of pointers into kernel code from the dump.
|
|
||||||
|
|
||||||
config FORCED_INLINING
|
config FORCED_INLINING
|
||||||
bool "Force gcc to inline functions marked 'inline'"
|
bool "Force gcc to inline functions marked 'inline'"
|
||||||
depends on DEBUG_KERNEL
|
depends on DEBUG_KERNEL
|
||||||
|
|
|
@ -55,37 +55,7 @@ static bool fail_task(struct fault_attr *attr, struct task_struct *task)
|
||||||
|
|
||||||
#define MAX_STACK_TRACE_DEPTH 32
|
#define MAX_STACK_TRACE_DEPTH 32
|
||||||
|
|
||||||
#ifdef CONFIG_STACK_UNWIND
|
#if defined(CONFIG_STACKTRACE)
|
||||||
|
|
||||||
static asmlinkage int fail_stacktrace_callback(struct unwind_frame_info *info,
|
|
||||||
void *arg)
|
|
||||||
{
|
|
||||||
int depth;
|
|
||||||
struct fault_attr *attr = arg;
|
|
||||||
bool found = (attr->require_start == 0 && attr->require_end == ULONG_MAX);
|
|
||||||
|
|
||||||
for (depth = 0; depth < attr->stacktrace_depth
|
|
||||||
&& unwind(info) == 0 && UNW_PC(info); depth++) {
|
|
||||||
if (arch_unw_user_mode(info))
|
|
||||||
break;
|
|
||||||
if (attr->reject_start <= UNW_PC(info) &&
|
|
||||||
UNW_PC(info) < attr->reject_end)
|
|
||||||
return false;
|
|
||||||
if (attr->require_start <= UNW_PC(info) &&
|
|
||||||
UNW_PC(info) < attr->require_end)
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool fail_stacktrace(struct fault_attr *attr)
|
|
||||||
{
|
|
||||||
struct unwind_frame_info info;
|
|
||||||
|
|
||||||
return unwind_init_running(&info, fail_stacktrace_callback, attr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(CONFIG_STACKTRACE)
|
|
||||||
|
|
||||||
static bool fail_stacktrace(struct fault_attr *attr)
|
static bool fail_stacktrace(struct fault_attr *attr)
|
||||||
{
|
{
|
||||||
|
|
189
mm/mincore.c
189
mm/mincore.c
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* linux/mm/mincore.c
|
* linux/mm/mincore.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994-1999 Linus Torvalds
|
* Copyright (C) 1994-2006 Linus Torvalds
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -38,46 +38,51 @@ static unsigned char mincore_page(struct vm_area_struct * vma,
|
||||||
return present;
|
return present;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long mincore_vma(struct vm_area_struct * vma,
|
/*
|
||||||
unsigned long start, unsigned long end, unsigned char __user * vec)
|
* Do a chunk of "sys_mincore()". We've already checked
|
||||||
|
* all the arguments, we hold the mmap semaphore: we should
|
||||||
|
* just return the amount of info we're asked for.
|
||||||
|
*/
|
||||||
|
static long do_mincore(unsigned long addr, unsigned char *vec, unsigned long pages)
|
||||||
{
|
{
|
||||||
long error, i, remaining;
|
unsigned long i, nr, pgoff;
|
||||||
unsigned char * tmp;
|
struct vm_area_struct *vma = find_vma(current->mm, addr);
|
||||||
|
|
||||||
error = -ENOMEM;
|
/*
|
||||||
|
* find_vma() didn't find anything above us, or we're
|
||||||
|
* in an unmapped hole in the address space: ENOMEM.
|
||||||
|
*/
|
||||||
|
if (!vma || addr < vma->vm_start)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ok, got it. But check whether it's a segment we support
|
||||||
|
* mincore() on. Right now, we don't do any anonymous mappings.
|
||||||
|
*
|
||||||
|
* FIXME: This is just stupid. And returning ENOMEM is
|
||||||
|
* stupid too. We should just look at the page tables. But
|
||||||
|
* this is what we've traditionally done, so we'll just
|
||||||
|
* continue doing it.
|
||||||
|
*/
|
||||||
if (!vma->vm_file)
|
if (!vma->vm_file)
|
||||||
return error;
|
return -ENOMEM;
|
||||||
|
|
||||||
start = ((start - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
|
/*
|
||||||
if (end > vma->vm_end)
|
* Calculate how many pages there are left in the vma, and
|
||||||
end = vma->vm_end;
|
* what the pgoff is for our address.
|
||||||
end = ((end - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
|
*/
|
||||||
|
nr = (vma->vm_end - addr) >> PAGE_SHIFT;
|
||||||
|
if (nr > pages)
|
||||||
|
nr = pages;
|
||||||
|
|
||||||
error = -EAGAIN;
|
pgoff = (addr - vma->vm_start) >> PAGE_SHIFT;
|
||||||
tmp = (unsigned char *) __get_free_page(GFP_KERNEL);
|
pgoff += vma->vm_pgoff;
|
||||||
if (!tmp)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
/* (end - start) is # of pages, and also # of bytes in "vec */
|
/* And then we just fill the sucker in.. */
|
||||||
remaining = (end - start),
|
for (i = 0 ; i < nr; i++, pgoff++)
|
||||||
|
vec[i] = mincore_page(vma, pgoff);
|
||||||
|
|
||||||
error = 0;
|
return nr;
|
||||||
for (i = 0; remaining > 0; remaining -= PAGE_SIZE, i++) {
|
|
||||||
int j = 0;
|
|
||||||
long thispiece = (remaining < PAGE_SIZE) ?
|
|
||||||
remaining : PAGE_SIZE;
|
|
||||||
|
|
||||||
while (j < thispiece)
|
|
||||||
tmp[j++] = mincore_page(vma, start++);
|
|
||||||
|
|
||||||
if (copy_to_user(vec + PAGE_SIZE * i, tmp, thispiece)) {
|
|
||||||
error = -EFAULT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free_page((unsigned long) tmp);
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -107,82 +112,50 @@ static long mincore_vma(struct vm_area_struct * vma,
|
||||||
asmlinkage long sys_mincore(unsigned long start, size_t len,
|
asmlinkage long sys_mincore(unsigned long start, size_t len,
|
||||||
unsigned char __user * vec)
|
unsigned char __user * vec)
|
||||||
{
|
{
|
||||||
int index = 0;
|
long retval;
|
||||||
unsigned long end, limit;
|
unsigned long pages;
|
||||||
struct vm_area_struct * vma;
|
unsigned char *tmp;
|
||||||
size_t max;
|
|
||||||
int unmapped_error = 0;
|
|
||||||
long error;
|
|
||||||
|
|
||||||
/* check the arguments */
|
/* Check the start address: needs to be page-aligned.. */
|
||||||
if (start & ~PAGE_CACHE_MASK)
|
if (start & ~PAGE_CACHE_MASK)
|
||||||
goto einval;
|
|
||||||
|
|
||||||
limit = TASK_SIZE;
|
|
||||||
if (start >= limit)
|
|
||||||
goto enomem;
|
|
||||||
|
|
||||||
if (!len)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
max = limit - start;
|
|
||||||
len = PAGE_CACHE_ALIGN(len);
|
|
||||||
if (len > max || !len)
|
|
||||||
goto enomem;
|
|
||||||
|
|
||||||
end = start + len;
|
|
||||||
|
|
||||||
/* check the output buffer whilst holding the lock */
|
|
||||||
error = -EFAULT;
|
|
||||||
down_read(¤t->mm->mmap_sem);
|
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, vec, len >> PAGE_SHIFT))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If the interval [start,end) covers some unmapped address
|
|
||||||
* ranges, just ignore them, but return -ENOMEM at the end.
|
|
||||||
*/
|
|
||||||
error = 0;
|
|
||||||
|
|
||||||
vma = find_vma(current->mm, start);
|
|
||||||
while (vma) {
|
|
||||||
/* Here start < vma->vm_end. */
|
|
||||||
if (start < vma->vm_start) {
|
|
||||||
unmapped_error = -ENOMEM;
|
|
||||||
start = vma->vm_start;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here vma->vm_start <= start < vma->vm_end. */
|
|
||||||
if (end <= vma->vm_end) {
|
|
||||||
if (start < end) {
|
|
||||||
error = mincore_vma(vma, start, end,
|
|
||||||
&vec[index]);
|
|
||||||
if (error)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
error = unmapped_error;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Here vma->vm_start <= start < vma->vm_end < end. */
|
|
||||||
error = mincore_vma(vma, start, vma->vm_end, &vec[index]);
|
|
||||||
if (error)
|
|
||||||
goto out;
|
|
||||||
index += (vma->vm_end - start) >> PAGE_CACHE_SHIFT;
|
|
||||||
start = vma->vm_end;
|
|
||||||
vma = vma->vm_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we found a hole in the area queried if we arrive here */
|
|
||||||
error = -ENOMEM;
|
|
||||||
|
|
||||||
out:
|
|
||||||
up_read(¤t->mm->mmap_sem);
|
|
||||||
return error;
|
|
||||||
|
|
||||||
einval:
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
enomem:
|
|
||||||
|
/* ..and we need to be passed a valid user-space range */
|
||||||
|
if (!access_ok(VERIFY_READ, (void __user *) start, len))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
/* This also avoids any overflows on PAGE_CACHE_ALIGN */
|
||||||
|
pages = len >> PAGE_SHIFT;
|
||||||
|
pages += (len & ~PAGE_MASK) != 0;
|
||||||
|
|
||||||
|
if (!access_ok(VERIFY_WRITE, vec, pages))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
tmp = (void *) __get_free_page(GFP_USER);
|
||||||
|
if (!tmp)
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
|
retval = 0;
|
||||||
|
while (pages) {
|
||||||
|
/*
|
||||||
|
* Do at most PAGE_SIZE entries per iteration, due to
|
||||||
|
* the temporary buffer size.
|
||||||
|
*/
|
||||||
|
down_read(¤t->mm->mmap_sem);
|
||||||
|
retval = do_mincore(start, tmp, min(pages, PAGE_SIZE));
|
||||||
|
up_read(¤t->mm->mmap_sem);
|
||||||
|
|
||||||
|
if (retval <= 0)
|
||||||
|
break;
|
||||||
|
if (copy_to_user(vec, tmp, retval)) {
|
||||||
|
retval = -EFAULT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
pages -= retval;
|
||||||
|
vec += retval;
|
||||||
|
start += retval << PAGE_SHIFT;
|
||||||
|
retval = 0;
|
||||||
|
}
|
||||||
|
free_page((unsigned long) tmp);
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1088,8 +1088,8 @@ out:
|
||||||
/*
|
/*
|
||||||
* FIXME: nonblock behaviour looks like it may have a bug.
|
* FIXME: nonblock behaviour looks like it may have a bug.
|
||||||
*/
|
*/
|
||||||
static int ax25_connect(struct socket *sock, struct sockaddr *uaddr,
|
static int __must_check ax25_connect(struct socket *sock,
|
||||||
int addr_len, int flags)
|
struct sockaddr *uaddr, int addr_len, int flags)
|
||||||
{
|
{
|
||||||
struct sock *sk = sock->sk;
|
struct sock *sk = sock->sk;
|
||||||
ax25_cb *ax25 = ax25_sk(sk), *ax25t;
|
ax25_cb *ax25 = ax25_sk(sk), *ax25t;
|
||||||
|
|
|
@ -29,17 +29,10 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
|
|
||||||
static struct protocol_struct {
|
static struct ax25_protocol *protocol_list;
|
||||||
struct protocol_struct *next;
|
|
||||||
unsigned int pid;
|
|
||||||
int (*func)(struct sk_buff *, ax25_cb *);
|
|
||||||
} *protocol_list = NULL;
|
|
||||||
static DEFINE_RWLOCK(protocol_list_lock);
|
static DEFINE_RWLOCK(protocol_list_lock);
|
||||||
|
|
||||||
static struct linkfail_struct {
|
static HLIST_HEAD(ax25_linkfail_list);
|
||||||
struct linkfail_struct *next;
|
|
||||||
void (*func)(ax25_cb *, int);
|
|
||||||
} *linkfail_list = NULL;
|
|
||||||
static DEFINE_SPINLOCK(linkfail_lock);
|
static DEFINE_SPINLOCK(linkfail_lock);
|
||||||
|
|
||||||
static struct listen_struct {
|
static struct listen_struct {
|
||||||
|
@ -49,36 +42,23 @@ static struct listen_struct {
|
||||||
} *listen_list = NULL;
|
} *listen_list = NULL;
|
||||||
static DEFINE_SPINLOCK(listen_lock);
|
static DEFINE_SPINLOCK(listen_lock);
|
||||||
|
|
||||||
int ax25_protocol_register(unsigned int pid,
|
/*
|
||||||
int (*func)(struct sk_buff *, ax25_cb *))
|
* Do not register the internal protocols AX25_P_TEXT, AX25_P_SEGMENT,
|
||||||
|
* AX25_P_IP or AX25_P_ARP ...
|
||||||
|
*/
|
||||||
|
void ax25_register_pid(struct ax25_protocol *ap)
|
||||||
{
|
{
|
||||||
struct protocol_struct *protocol;
|
|
||||||
|
|
||||||
if (pid == AX25_P_TEXT || pid == AX25_P_SEGMENT)
|
|
||||||
return 0;
|
|
||||||
#ifdef CONFIG_INET
|
|
||||||
if (pid == AX25_P_IP || pid == AX25_P_ARP)
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
if ((protocol = kmalloc(sizeof(*protocol), GFP_ATOMIC)) == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
protocol->pid = pid;
|
|
||||||
protocol->func = func;
|
|
||||||
|
|
||||||
write_lock_bh(&protocol_list_lock);
|
write_lock_bh(&protocol_list_lock);
|
||||||
protocol->next = protocol_list;
|
ap->next = protocol_list;
|
||||||
protocol_list = protocol;
|
protocol_list = ap;
|
||||||
write_unlock_bh(&protocol_list_lock);
|
write_unlock_bh(&protocol_list_lock);
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(ax25_protocol_register);
|
EXPORT_SYMBOL_GPL(ax25_register_pid);
|
||||||
|
|
||||||
void ax25_protocol_release(unsigned int pid)
|
void ax25_protocol_release(unsigned int pid)
|
||||||
{
|
{
|
||||||
struct protocol_struct *s, *protocol;
|
struct ax25_protocol *s, *protocol;
|
||||||
|
|
||||||
write_lock_bh(&protocol_list_lock);
|
write_lock_bh(&protocol_list_lock);
|
||||||
protocol = protocol_list;
|
protocol = protocol_list;
|
||||||
|
@ -110,54 +90,19 @@ void ax25_protocol_release(unsigned int pid)
|
||||||
|
|
||||||
EXPORT_SYMBOL(ax25_protocol_release);
|
EXPORT_SYMBOL(ax25_protocol_release);
|
||||||
|
|
||||||
int ax25_linkfail_register(void (*func)(ax25_cb *, int))
|
void ax25_linkfail_register(struct ax25_linkfail *lf)
|
||||||
{
|
{
|
||||||
struct linkfail_struct *linkfail;
|
|
||||||
|
|
||||||
if ((linkfail = kmalloc(sizeof(*linkfail), GFP_ATOMIC)) == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
linkfail->func = func;
|
|
||||||
|
|
||||||
spin_lock_bh(&linkfail_lock);
|
spin_lock_bh(&linkfail_lock);
|
||||||
linkfail->next = linkfail_list;
|
hlist_add_head(&lf->lf_node, &ax25_linkfail_list);
|
||||||
linkfail_list = linkfail;
|
|
||||||
spin_unlock_bh(&linkfail_lock);
|
spin_unlock_bh(&linkfail_lock);
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(ax25_linkfail_register);
|
EXPORT_SYMBOL(ax25_linkfail_register);
|
||||||
|
|
||||||
void ax25_linkfail_release(void (*func)(ax25_cb *, int))
|
void ax25_linkfail_release(struct ax25_linkfail *lf)
|
||||||
{
|
{
|
||||||
struct linkfail_struct *s, *linkfail;
|
|
||||||
|
|
||||||
spin_lock_bh(&linkfail_lock);
|
spin_lock_bh(&linkfail_lock);
|
||||||
linkfail = linkfail_list;
|
hlist_del_init(&lf->lf_node);
|
||||||
if (linkfail == NULL) {
|
|
||||||
spin_unlock_bh(&linkfail_lock);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (linkfail->func == func) {
|
|
||||||
linkfail_list = linkfail->next;
|
|
||||||
spin_unlock_bh(&linkfail_lock);
|
|
||||||
kfree(linkfail);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (linkfail != NULL && linkfail->next != NULL) {
|
|
||||||
if (linkfail->next->func == func) {
|
|
||||||
s = linkfail->next;
|
|
||||||
linkfail->next = linkfail->next->next;
|
|
||||||
spin_unlock_bh(&linkfail_lock);
|
|
||||||
kfree(s);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
linkfail = linkfail->next;
|
|
||||||
}
|
|
||||||
spin_unlock_bh(&linkfail_lock);
|
spin_unlock_bh(&linkfail_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +116,7 @@ int ax25_listen_register(ax25_address *callsign, struct net_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((listen = kmalloc(sizeof(*listen), GFP_ATOMIC)) == NULL)
|
if ((listen = kmalloc(sizeof(*listen), GFP_ATOMIC)) == NULL)
|
||||||
return 0;
|
return -ENOMEM;
|
||||||
|
|
||||||
listen->callsign = *callsign;
|
listen->callsign = *callsign;
|
||||||
listen->dev = dev;
|
listen->dev = dev;
|
||||||
|
@ -181,7 +126,7 @@ int ax25_listen_register(ax25_address *callsign, struct net_device *dev)
|
||||||
listen_list = listen;
|
listen_list = listen;
|
||||||
spin_unlock_bh(&listen_lock);
|
spin_unlock_bh(&listen_lock);
|
||||||
|
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(ax25_listen_register);
|
EXPORT_SYMBOL(ax25_listen_register);
|
||||||
|
@ -223,7 +168,7 @@ EXPORT_SYMBOL(ax25_listen_release);
|
||||||
int (*ax25_protocol_function(unsigned int pid))(struct sk_buff *, ax25_cb *)
|
int (*ax25_protocol_function(unsigned int pid))(struct sk_buff *, ax25_cb *)
|
||||||
{
|
{
|
||||||
int (*res)(struct sk_buff *, ax25_cb *) = NULL;
|
int (*res)(struct sk_buff *, ax25_cb *) = NULL;
|
||||||
struct protocol_struct *protocol;
|
struct ax25_protocol *protocol;
|
||||||
|
|
||||||
read_lock(&protocol_list_lock);
|
read_lock(&protocol_list_lock);
|
||||||
for (protocol = protocol_list; protocol != NULL; protocol = protocol->next)
|
for (protocol = protocol_list; protocol != NULL; protocol = protocol->next)
|
||||||
|
@ -242,7 +187,8 @@ int ax25_listen_mine(ax25_address *callsign, struct net_device *dev)
|
||||||
|
|
||||||
spin_lock_bh(&listen_lock);
|
spin_lock_bh(&listen_lock);
|
||||||
for (listen = listen_list; listen != NULL; listen = listen->next)
|
for (listen = listen_list; listen != NULL; listen = listen->next)
|
||||||
if (ax25cmp(&listen->callsign, callsign) == 0 && (listen->dev == dev || listen->dev == NULL)) {
|
if (ax25cmp(&listen->callsign, callsign) == 0 &&
|
||||||
|
(listen->dev == dev || listen->dev == NULL)) {
|
||||||
spin_unlock_bh(&listen_lock);
|
spin_unlock_bh(&listen_lock);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -253,17 +199,18 @@ int ax25_listen_mine(ax25_address *callsign, struct net_device *dev)
|
||||||
|
|
||||||
void ax25_link_failed(ax25_cb *ax25, int reason)
|
void ax25_link_failed(ax25_cb *ax25, int reason)
|
||||||
{
|
{
|
||||||
struct linkfail_struct *linkfail;
|
struct ax25_linkfail *lf;
|
||||||
|
struct hlist_node *node;
|
||||||
|
|
||||||
spin_lock_bh(&linkfail_lock);
|
spin_lock_bh(&linkfail_lock);
|
||||||
for (linkfail = linkfail_list; linkfail != NULL; linkfail = linkfail->next)
|
hlist_for_each_entry(lf, node, &ax25_linkfail_list, lf_node)
|
||||||
(linkfail->func)(ax25, reason);
|
lf->func(ax25, reason);
|
||||||
spin_unlock_bh(&linkfail_lock);
|
spin_unlock_bh(&linkfail_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ax25_protocol_is_registered(unsigned int pid)
|
int ax25_protocol_is_registered(unsigned int pid)
|
||||||
{
|
{
|
||||||
struct protocol_struct *protocol;
|
struct ax25_protocol *protocol;
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
read_lock_bh(&protocol_list_lock);
|
read_lock_bh(&protocol_list_lock);
|
||||||
|
|
|
@ -71,7 +71,7 @@ void ax25_rt_device_down(struct net_device *dev)
|
||||||
write_unlock(&ax25_route_lock);
|
write_unlock(&ax25_route_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ax25_rt_add(struct ax25_routes_struct *route)
|
static int __must_check ax25_rt_add(struct ax25_routes_struct *route)
|
||||||
{
|
{
|
||||||
ax25_route *ax25_rt;
|
ax25_route *ax25_rt;
|
||||||
ax25_dev *ax25_dev;
|
ax25_dev *ax25_dev;
|
||||||
|
|
|
@ -1325,7 +1325,8 @@ void ip_rt_send_redirect(struct sk_buff *skb)
|
||||||
/* Check for load limit; set rate_last to the latest sent
|
/* Check for load limit; set rate_last to the latest sent
|
||||||
* redirect.
|
* redirect.
|
||||||
*/
|
*/
|
||||||
if (time_after(jiffies,
|
if (rt->u.dst.rate_tokens == 0 ||
|
||||||
|
time_after(jiffies,
|
||||||
(rt->u.dst.rate_last +
|
(rt->u.dst.rate_last +
|
||||||
(ip_rt_redirect_load << rt->u.dst.rate_tokens)))) {
|
(ip_rt_redirect_load << rt->u.dst.rate_tokens)))) {
|
||||||
icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway);
|
icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway);
|
||||||
|
|
|
@ -928,6 +928,7 @@ int tcp_v4_md5_do_del(struct sock *sk, __be32 addr)
|
||||||
if (tp->md5sig_info->entries4 == 0) {
|
if (tp->md5sig_info->entries4 == 0) {
|
||||||
kfree(tp->md5sig_info->keys4);
|
kfree(tp->md5sig_info->keys4);
|
||||||
tp->md5sig_info->keys4 = NULL;
|
tp->md5sig_info->keys4 = NULL;
|
||||||
|
tp->md5sig_info->alloced4 = 0;
|
||||||
} else if (tp->md5sig_info->entries4 != i) {
|
} else if (tp->md5sig_info->entries4 != i) {
|
||||||
/* Need to do some manipulation */
|
/* Need to do some manipulation */
|
||||||
memcpy(&tp->md5sig_info->keys4[i],
|
memcpy(&tp->md5sig_info->keys4[i],
|
||||||
|
@ -1185,7 +1186,7 @@ done_opts:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (hash_expected && !hash_location) {
|
if (hash_expected && !hash_location) {
|
||||||
LIMIT_NETDEBUG(KERN_INFO "MD5 Hash NOT expected but found "
|
LIMIT_NETDEBUG(KERN_INFO "MD5 Hash expected but NOT found "
|
||||||
"(" NIPQUAD_FMT ", %d)->(" NIPQUAD_FMT ", %d)\n",
|
"(" NIPQUAD_FMT ", %d)->(" NIPQUAD_FMT ", %d)\n",
|
||||||
NIPQUAD(iph->saddr), ntohs(th->source),
|
NIPQUAD(iph->saddr), ntohs(th->source),
|
||||||
NIPQUAD(iph->daddr), ntohs(th->dest));
|
NIPQUAD(iph->daddr), ntohs(th->dest));
|
||||||
|
|
|
@ -7,7 +7,7 @@ menu "IPv6: Netfilter Configuration (EXPERIMENTAL)"
|
||||||
|
|
||||||
config NF_CONNTRACK_IPV6
|
config NF_CONNTRACK_IPV6
|
||||||
tristate "IPv6 connection tracking support (EXPERIMENTAL)"
|
tristate "IPv6 connection tracking support (EXPERIMENTAL)"
|
||||||
depends on EXPERIMENTAL && NF_CONNTRACK
|
depends on INET && IPV6 && EXPERIMENTAL && NF_CONNTRACK
|
||||||
---help---
|
---help---
|
||||||
Connection tracking keeps a record of what packets have passed
|
Connection tracking keeps a record of what packets have passed
|
||||||
through your machine, in order to figure out how they are related
|
through your machine, in order to figure out how they are related
|
||||||
|
@ -21,6 +21,7 @@ config NF_CONNTRACK_IPV6
|
||||||
|
|
||||||
config IP6_NF_QUEUE
|
config IP6_NF_QUEUE
|
||||||
tristate "IP6 Userspace queueing via NETLINK (OBSOLETE)"
|
tristate "IP6 Userspace queueing via NETLINK (OBSOLETE)"
|
||||||
|
depends on INET && IPV6 && NETFILTER && EXPERIMENTAL
|
||||||
---help---
|
---help---
|
||||||
|
|
||||||
This option adds a queue handler to the kernel for IPv6
|
This option adds a queue handler to the kernel for IPv6
|
||||||
|
@ -41,7 +42,7 @@ config IP6_NF_QUEUE
|
||||||
|
|
||||||
config IP6_NF_IPTABLES
|
config IP6_NF_IPTABLES
|
||||||
tristate "IP6 tables support (required for filtering)"
|
tristate "IP6 tables support (required for filtering)"
|
||||||
depends on NETFILTER_XTABLES
|
depends on INET && IPV6 && EXPERIMENTAL && NETFILTER_XTABLES
|
||||||
help
|
help
|
||||||
ip6tables is a general, extensible packet identification framework.
|
ip6tables is a general, extensible packet identification framework.
|
||||||
Currently only the packet filtering and packet mangling subsystem
|
Currently only the packet filtering and packet mangling subsystem
|
||||||
|
|
|
@ -1377,6 +1377,15 @@ static struct notifier_block nr_dev_notifier = {
|
||||||
|
|
||||||
static struct net_device **dev_nr;
|
static struct net_device **dev_nr;
|
||||||
|
|
||||||
|
static struct ax25_protocol nr_pid = {
|
||||||
|
.pid = AX25_P_NETROM,
|
||||||
|
.func = nr_route_frame
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ax25_linkfail nr_linkfail_notifier = {
|
||||||
|
.func = nr_link_failed,
|
||||||
|
};
|
||||||
|
|
||||||
static int __init nr_proto_init(void)
|
static int __init nr_proto_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1424,8 +1433,8 @@ static int __init nr_proto_init(void)
|
||||||
|
|
||||||
register_netdevice_notifier(&nr_dev_notifier);
|
register_netdevice_notifier(&nr_dev_notifier);
|
||||||
|
|
||||||
ax25_protocol_register(AX25_P_NETROM, nr_route_frame);
|
ax25_register_pid(&nr_pid);
|
||||||
ax25_linkfail_register(nr_link_failed);
|
ax25_linkfail_register(&nr_linkfail_notifier);
|
||||||
|
|
||||||
#ifdef CONFIG_SYSCTL
|
#ifdef CONFIG_SYSCTL
|
||||||
nr_register_sysctl();
|
nr_register_sysctl();
|
||||||
|
@ -1474,7 +1483,7 @@ static void __exit nr_exit(void)
|
||||||
nr_unregister_sysctl();
|
nr_unregister_sysctl();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ax25_linkfail_release(nr_link_failed);
|
ax25_linkfail_release(&nr_linkfail_notifier);
|
||||||
ax25_protocol_release(AX25_P_NETROM);
|
ax25_protocol_release(AX25_P_NETROM);
|
||||||
|
|
||||||
unregister_netdevice_notifier(&nr_dev_notifier);
|
unregister_netdevice_notifier(&nr_dev_notifier);
|
||||||
|
|
|
@ -128,25 +128,37 @@ static int nr_header(struct sk_buff *skb, struct net_device *dev, unsigned short
|
||||||
return -37;
|
return -37;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nr_set_mac_address(struct net_device *dev, void *addr)
|
static int __must_check nr_set_mac_address(struct net_device *dev, void *addr)
|
||||||
{
|
{
|
||||||
struct sockaddr *sa = addr;
|
struct sockaddr *sa = addr;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (!memcmp(dev->dev_addr, sa->sa_data, dev->addr_len))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (dev->flags & IFF_UP) {
|
||||||
|
err = ax25_listen_register((ax25_address *)sa->sa_data, NULL);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
if (dev->flags & IFF_UP)
|
|
||||||
ax25_listen_release((ax25_address *)dev->dev_addr, NULL);
|
ax25_listen_release((ax25_address *)dev->dev_addr, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
|
memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
|
||||||
|
|
||||||
if (dev->flags & IFF_UP)
|
|
||||||
ax25_listen_register((ax25_address *)dev->dev_addr, NULL);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nr_open(struct net_device *dev)
|
static int nr_open(struct net_device *dev)
|
||||||
{
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = ax25_listen_register((ax25_address *)dev->dev_addr, NULL);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
netif_start_queue(dev);
|
netif_start_queue(dev);
|
||||||
ax25_listen_register((ax25_address *)dev->dev_addr, NULL);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,8 +87,9 @@ static void nr_remove_neigh(struct nr_neigh *);
|
||||||
* Add a new route to a node, and in the process add the node and the
|
* Add a new route to a node, and in the process add the node and the
|
||||||
* neighbour if it is new.
|
* neighbour if it is new.
|
||||||
*/
|
*/
|
||||||
static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax25,
|
static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
|
||||||
ax25_digi *ax25_digi, struct net_device *dev, int quality, int obs_count)
|
ax25_address *ax25, ax25_digi *ax25_digi, struct net_device *dev,
|
||||||
|
int quality, int obs_count)
|
||||||
{
|
{
|
||||||
struct nr_node *nr_node;
|
struct nr_node *nr_node;
|
||||||
struct nr_neigh *nr_neigh;
|
struct nr_neigh *nr_neigh;
|
||||||
|
@ -406,7 +407,8 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
|
||||||
/*
|
/*
|
||||||
* Lock a neighbour with a quality.
|
* Lock a neighbour with a quality.
|
||||||
*/
|
*/
|
||||||
static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net_device *dev, unsigned int quality)
|
static int __must_check nr_add_neigh(ax25_address *callsign,
|
||||||
|
ax25_digi *ax25_digi, struct net_device *dev, unsigned int quality)
|
||||||
{
|
{
|
||||||
struct nr_neigh *nr_neigh;
|
struct nr_neigh *nr_neigh;
|
||||||
|
|
||||||
|
@ -777,9 +779,13 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
|
||||||
nr_src = (ax25_address *)(skb->data + 0);
|
nr_src = (ax25_address *)(skb->data + 0);
|
||||||
nr_dest = (ax25_address *)(skb->data + 7);
|
nr_dest = (ax25_address *)(skb->data + 7);
|
||||||
|
|
||||||
if (ax25 != NULL)
|
if (ax25 != NULL) {
|
||||||
nr_add_node(nr_src, "", &ax25->dest_addr, ax25->digipeat,
|
ret = nr_add_node(nr_src, "", &ax25->dest_addr, ax25->digipeat,
|
||||||
ax25->ax25_dev->dev, 0, sysctl_netrom_obsolescence_count_initialiser);
|
ax25->ax25_dev->dev, 0,
|
||||||
|
sysctl_netrom_obsolescence_count_initialiser);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if ((dev = nr_dev_get(nr_dest)) != NULL) { /* Its for me */
|
if ((dev = nr_dev_get(nr_dest)) != NULL) { /* Its for me */
|
||||||
if (ax25 == NULL) /* Its from me */
|
if (ax25 == NULL) /* Its from me */
|
||||||
|
@ -844,6 +850,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
|
||||||
ret = (nr_neigh->ax25 != NULL);
|
ret = (nr_neigh->ax25 != NULL);
|
||||||
nr_node_unlock(nr_node);
|
nr_node_unlock(nr_node);
|
||||||
nr_node_put(nr_node);
|
nr_node_put(nr_node);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1314,7 +1314,8 @@ static int rose_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
|
||||||
if (copy_from_user(&rose_callsign, argp, sizeof(ax25_address)))
|
if (copy_from_user(&rose_callsign, argp, sizeof(ax25_address)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (ax25cmp(&rose_callsign, &null_ax25_address) != 0)
|
if (ax25cmp(&rose_callsign, &null_ax25_address) != 0)
|
||||||
ax25_listen_register(&rose_callsign, NULL);
|
return ax25_listen_register(&rose_callsign, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case SIOCRSGL2CALL:
|
case SIOCRSGL2CALL:
|
||||||
|
@ -1481,6 +1482,15 @@ static struct notifier_block rose_dev_notifier = {
|
||||||
|
|
||||||
static struct net_device **dev_rose;
|
static struct net_device **dev_rose;
|
||||||
|
|
||||||
|
static struct ax25_protocol rose_pid = {
|
||||||
|
.pid = AX25_P_ROSE,
|
||||||
|
.func = rose_route_frame
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ax25_linkfail rose_linkfail_notifier = {
|
||||||
|
.func = rose_link_failed
|
||||||
|
};
|
||||||
|
|
||||||
static int __init rose_proto_init(void)
|
static int __init rose_proto_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1530,8 +1540,8 @@ static int __init rose_proto_init(void)
|
||||||
sock_register(&rose_family_ops);
|
sock_register(&rose_family_ops);
|
||||||
register_netdevice_notifier(&rose_dev_notifier);
|
register_netdevice_notifier(&rose_dev_notifier);
|
||||||
|
|
||||||
ax25_protocol_register(AX25_P_ROSE, rose_route_frame);
|
ax25_register_pid(&rose_pid);
|
||||||
ax25_linkfail_register(rose_link_failed);
|
ax25_linkfail_register(&rose_linkfail_notifier);
|
||||||
|
|
||||||
#ifdef CONFIG_SYSCTL
|
#ifdef CONFIG_SYSCTL
|
||||||
rose_register_sysctl();
|
rose_register_sysctl();
|
||||||
|
@ -1579,7 +1589,7 @@ static void __exit rose_exit(void)
|
||||||
rose_rt_free();
|
rose_rt_free();
|
||||||
|
|
||||||
ax25_protocol_release(AX25_P_ROSE);
|
ax25_protocol_release(AX25_P_ROSE);
|
||||||
ax25_linkfail_release(rose_link_failed);
|
ax25_linkfail_release(&rose_linkfail_notifier);
|
||||||
|
|
||||||
if (ax25cmp(&rose_callsign, &null_ax25_address) != 0)
|
if (ax25cmp(&rose_callsign, &null_ax25_address) != 0)
|
||||||
ax25_listen_release(&rose_callsign, NULL);
|
ax25_listen_release(&rose_callsign, NULL);
|
||||||
|
|
|
@ -93,20 +93,34 @@ static int rose_rebuild_header(struct sk_buff *skb)
|
||||||
static int rose_set_mac_address(struct net_device *dev, void *addr)
|
static int rose_set_mac_address(struct net_device *dev, void *addr)
|
||||||
{
|
{
|
||||||
struct sockaddr *sa = addr;
|
struct sockaddr *sa = addr;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (!memcpy(dev->dev_addr, sa->sa_data, dev->addr_len))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (dev->flags & IFF_UP) {
|
||||||
|
err = rose_add_loopback_node((rose_address *)dev->dev_addr);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
rose_del_loopback_node((rose_address *)dev->dev_addr);
|
rose_del_loopback_node((rose_address *)dev->dev_addr);
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
|
memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
|
||||||
|
|
||||||
rose_add_loopback_node((rose_address *)dev->dev_addr);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rose_open(struct net_device *dev)
|
static int rose_open(struct net_device *dev)
|
||||||
{
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = rose_add_loopback_node((rose_address *)dev->dev_addr);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
netif_start_queue(dev);
|
netif_start_queue(dev);
|
||||||
rose_add_loopback_node((rose_address *)dev->dev_addr);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,8 @@ static void rose_loopback_timer(unsigned long param)
|
||||||
|
|
||||||
skb->h.raw = skb->data;
|
skb->h.raw = skb->data;
|
||||||
|
|
||||||
if ((sk = rose_find_socket(lci_o, rose_loopback_neigh)) != NULL) {
|
sk = rose_find_socket(lci_o, &rose_loopback_neigh);
|
||||||
|
if (sk) {
|
||||||
if (rose_process_rx_frame(sk, skb) == 0)
|
if (rose_process_rx_frame(sk, skb) == 0)
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
continue;
|
continue;
|
||||||
|
@ -87,7 +88,7 @@ static void rose_loopback_timer(unsigned long param)
|
||||||
|
|
||||||
if (frametype == ROSE_CALL_REQUEST) {
|
if (frametype == ROSE_CALL_REQUEST) {
|
||||||
if ((dev = rose_dev_get(dest)) != NULL) {
|
if ((dev = rose_dev_get(dest)) != NULL) {
|
||||||
if (rose_rx_call_request(skb, dev, rose_loopback_neigh, lci_o) == 0)
|
if (rose_rx_call_request(skb, dev, &rose_loopback_neigh, lci_o) == 0)
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
} else {
|
} else {
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
|
|
|
@ -46,13 +46,13 @@ static DEFINE_SPINLOCK(rose_neigh_list_lock);
|
||||||
static struct rose_route *rose_route_list;
|
static struct rose_route *rose_route_list;
|
||||||
static DEFINE_SPINLOCK(rose_route_list_lock);
|
static DEFINE_SPINLOCK(rose_route_list_lock);
|
||||||
|
|
||||||
struct rose_neigh *rose_loopback_neigh;
|
struct rose_neigh rose_loopback_neigh;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add a new route to a node, and in the process add the node and the
|
* Add a new route to a node, and in the process add the node and the
|
||||||
* neighbour if it is new.
|
* neighbour if it is new.
|
||||||
*/
|
*/
|
||||||
static int rose_add_node(struct rose_route_struct *rose_route,
|
static int __must_check rose_add_node(struct rose_route_struct *rose_route,
|
||||||
struct net_device *dev)
|
struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct rose_node *rose_node, *rose_tmpn, *rose_tmpp;
|
struct rose_node *rose_node, *rose_tmpn, *rose_tmpp;
|
||||||
|
@ -361,33 +361,30 @@ out:
|
||||||
/*
|
/*
|
||||||
* Add the loopback neighbour.
|
* Add the loopback neighbour.
|
||||||
*/
|
*/
|
||||||
int rose_add_loopback_neigh(void)
|
void rose_add_loopback_neigh(void)
|
||||||
{
|
{
|
||||||
if ((rose_loopback_neigh = kmalloc(sizeof(struct rose_neigh), GFP_ATOMIC)) == NULL)
|
struct rose_neigh *sn = &rose_loopback_neigh;
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
rose_loopback_neigh->callsign = null_ax25_address;
|
sn->callsign = null_ax25_address;
|
||||||
rose_loopback_neigh->digipeat = NULL;
|
sn->digipeat = NULL;
|
||||||
rose_loopback_neigh->ax25 = NULL;
|
sn->ax25 = NULL;
|
||||||
rose_loopback_neigh->dev = NULL;
|
sn->dev = NULL;
|
||||||
rose_loopback_neigh->count = 0;
|
sn->count = 0;
|
||||||
rose_loopback_neigh->use = 0;
|
sn->use = 0;
|
||||||
rose_loopback_neigh->dce_mode = 1;
|
sn->dce_mode = 1;
|
||||||
rose_loopback_neigh->loopback = 1;
|
sn->loopback = 1;
|
||||||
rose_loopback_neigh->number = rose_neigh_no++;
|
sn->number = rose_neigh_no++;
|
||||||
rose_loopback_neigh->restarted = 1;
|
sn->restarted = 1;
|
||||||
|
|
||||||
skb_queue_head_init(&rose_loopback_neigh->queue);
|
skb_queue_head_init(&sn->queue);
|
||||||
|
|
||||||
init_timer(&rose_loopback_neigh->ftimer);
|
init_timer(&sn->ftimer);
|
||||||
init_timer(&rose_loopback_neigh->t0timer);
|
init_timer(&sn->t0timer);
|
||||||
|
|
||||||
spin_lock_bh(&rose_neigh_list_lock);
|
spin_lock_bh(&rose_neigh_list_lock);
|
||||||
rose_loopback_neigh->next = rose_neigh_list;
|
sn->next = rose_neigh_list;
|
||||||
rose_neigh_list = rose_loopback_neigh;
|
rose_neigh_list = sn;
|
||||||
spin_unlock_bh(&rose_neigh_list_lock);
|
spin_unlock_bh(&rose_neigh_list_lock);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -421,13 +418,13 @@ int rose_add_loopback_node(rose_address *address)
|
||||||
rose_node->mask = 10;
|
rose_node->mask = 10;
|
||||||
rose_node->count = 1;
|
rose_node->count = 1;
|
||||||
rose_node->loopback = 1;
|
rose_node->loopback = 1;
|
||||||
rose_node->neighbour[0] = rose_loopback_neigh;
|
rose_node->neighbour[0] = &rose_loopback_neigh;
|
||||||
|
|
||||||
/* Insert at the head of list. Address is always mask=10 */
|
/* Insert at the head of list. Address is always mask=10 */
|
||||||
rose_node->next = rose_node_list;
|
rose_node->next = rose_node_list;
|
||||||
rose_node_list = rose_node;
|
rose_node_list = rose_node;
|
||||||
|
|
||||||
rose_loopback_neigh->count++;
|
rose_loopback_neigh.count++;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
spin_unlock_bh(&rose_node_list_lock);
|
spin_unlock_bh(&rose_node_list_lock);
|
||||||
|
@ -458,7 +455,7 @@ void rose_del_loopback_node(rose_address *address)
|
||||||
|
|
||||||
rose_remove_node(rose_node);
|
rose_remove_node(rose_node);
|
||||||
|
|
||||||
rose_loopback_neigh->count--;
|
rose_loopback_neigh.count--;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
spin_unlock_bh(&rose_node_list_lock);
|
spin_unlock_bh(&rose_node_list_lock);
|
||||||
|
|
|
@ -50,6 +50,7 @@ struct tas3001c_data_t {
|
||||||
int output_id;
|
int output_id;
|
||||||
int speaker_id;
|
int speaker_id;
|
||||||
struct tas_drce_t drce_state;
|
struct tas_drce_t drce_state;
|
||||||
|
struct work_struct change;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -667,14 +668,13 @@ tas3001c_update_device_parameters(struct tas3001c_data_t *self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tas3001c_device_change_handler(void *self)
|
tas3001c_device_change_handler(struct work_struct *work)
|
||||||
{
|
{
|
||||||
if (self)
|
struct tas3001c_data_t *self;
|
||||||
|
self = container_of(work, struct tas3001c_data_t, change);
|
||||||
tas3001c_update_device_parameters(self);
|
tas3001c_update_device_parameters(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct work_struct device_change;
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tas3001c_output_device_change( struct tas3001c_data_t *self,
|
tas3001c_output_device_change( struct tas3001c_data_t *self,
|
||||||
int device_id,
|
int device_id,
|
||||||
|
@ -685,7 +685,7 @@ tas3001c_output_device_change( struct tas3001c_data_t *self,
|
||||||
self->output_id=output_id;
|
self->output_id=output_id;
|
||||||
self->speaker_id=speaker_id;
|
self->speaker_id=speaker_id;
|
||||||
|
|
||||||
schedule_work(&device_change);
|
schedule_work(&self->change);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -823,7 +823,7 @@ tas3001c_init(struct i2c_client *client)
|
||||||
tas3001c_write_biquad_shadow(self, i, j,
|
tas3001c_write_biquad_shadow(self, i, j,
|
||||||
&tas3001c_eq_unity);
|
&tas3001c_eq_unity);
|
||||||
|
|
||||||
INIT_WORK(&device_change, tas3001c_device_change_handler, self);
|
INIT_WORK(&self->change, tas3001c_device_change_handler);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@ struct tas3004_data_t {
|
||||||
int output_id;
|
int output_id;
|
||||||
int speaker_id;
|
int speaker_id;
|
||||||
struct tas_drce_t drce_state;
|
struct tas_drce_t drce_state;
|
||||||
|
struct work_struct change;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAKE_TIME(sec,usec) (((sec)<<12) + (50000+(usec/10)*(1<<12))/100000)
|
#define MAKE_TIME(sec,usec) (((sec)<<12) + (50000+(usec/10)*(1<<12))/100000)
|
||||||
|
@ -914,15 +915,13 @@ tas3004_update_device_parameters(struct tas3004_data_t *self)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
tas3004_device_change_handler(void *self)
|
tas3004_device_change_handler(struct work_struct *work)
|
||||||
{
|
{
|
||||||
if (!self) return;
|
struct tas3004_data_t *self;
|
||||||
|
self = container_of(work, struct tas3004_data_t, change);
|
||||||
tas3004_update_device_parameters((struct tas3004_data_t *)self);
|
tas3004_update_device_parameters(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct work_struct device_change;
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
tas3004_output_device_change( struct tas3004_data_t *self,
|
tas3004_output_device_change( struct tas3004_data_t *self,
|
||||||
int device_id,
|
int device_id,
|
||||||
|
@ -933,7 +932,7 @@ tas3004_output_device_change( struct tas3004_data_t *self,
|
||||||
self->output_id=output_id;
|
self->output_id=output_id;
|
||||||
self->speaker_id=speaker_id;
|
self->speaker_id=speaker_id;
|
||||||
|
|
||||||
schedule_work(&device_change);
|
schedule_work(&self->change);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1112,7 +1111,7 @@ tas3004_init(struct i2c_client *client)
|
||||||
tas3004_write_register(self, TAS3004_REG_MCR2, &mcr2, WRITE_SHADOW);
|
tas3004_write_register(self, TAS3004_REG_MCR2, &mcr2, WRITE_SHADOW);
|
||||||
tas3004_write_register(self, TAS3004_REG_DRC, drce_init, WRITE_SHADOW);
|
tas3004_write_register(self, TAS3004_REG_DRC, drce_init, WRITE_SHADOW);
|
||||||
|
|
||||||
INIT_WORK(&device_change, tas3004_device_change_handler, self);
|
INIT_WORK(&self->change, tas3004_device_change_handler);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue