mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-22 20:23:57 +08:00
Merge branch 'merge'
This commit is contained in:
commit
c029cc66cb
@ -259,9 +259,9 @@ sub dibusb {
|
||||
}
|
||||
|
||||
sub nxt2002 {
|
||||
my $sourcefile = "Broadband4PC_4_2_11.zip";
|
||||
my $sourcefile = "Technisat_DVB-PC_4_4_COMPACT.zip";
|
||||
my $url = "http://www.bbti.us/download/windows/$sourcefile";
|
||||
my $hash = "c6d2ea47a8f456d887ada0cfb718ff2a";
|
||||
my $hash = "476befae8c7c1bb9648954060b1eec1f";
|
||||
my $outfile = "dvb-fe-nxt2002.fw";
|
||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||
|
||||
@ -269,8 +269,8 @@ sub nxt2002 {
|
||||
|
||||
wgetfile($sourcefile, $url);
|
||||
unzip($sourcefile, $tmpdir);
|
||||
verify("$tmpdir/SkyNETU.sys", $hash);
|
||||
extract("$tmpdir/SkyNETU.sys", 375832, 5908, $outfile);
|
||||
verify("$tmpdir/SkyNET.sys", $hash);
|
||||
extract("$tmpdir/SkyNET.sys", 331624, 5908, $outfile);
|
||||
|
||||
$outfile;
|
||||
}
|
||||
|
@ -105,20 +105,3 @@
|
||||
on the setup, so I think that the choice on what firmware to make
|
||||
persistent should be left to userspace.
|
||||
|
||||
- Why register_firmware()+__init can be useful:
|
||||
- For boot devices needing firmware.
|
||||
- To make the transition easier:
|
||||
The firmware can be declared __init and register_firmware()
|
||||
called on module_init. Then the firmware is warranted to be
|
||||
there even if "firmware hotplug userspace" is not there yet or
|
||||
it doesn't yet provide the needed firmware.
|
||||
Once the firmware is widely available in userspace, it can be
|
||||
removed from the kernel. Or made optional (CONFIG_.*_FIRMWARE).
|
||||
|
||||
In either case, if firmware hotplug support is there, it can move the
|
||||
firmware out of kernel memory into the real filesystem for later
|
||||
usage.
|
||||
|
||||
Note: If persistence is implemented on top of initramfs,
|
||||
register_firmware() may not be appropriate.
|
||||
|
||||
|
@ -5,8 +5,6 @@
|
||||
*
|
||||
* Sample code on how to use request_firmware() from drivers.
|
||||
*
|
||||
* Note that register_firmware() is currently useless.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@ -17,11 +15,6 @@
|
||||
|
||||
#include "linux/firmware.h"
|
||||
|
||||
#define WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE
|
||||
#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE
|
||||
char __init inkernel_firmware[] = "let's say that this is firmware\n";
|
||||
#endif
|
||||
|
||||
static struct device ghost_device = {
|
||||
.bus_id = "ghost0",
|
||||
};
|
||||
@ -104,10 +97,6 @@ static void sample_probe_async(void)
|
||||
|
||||
static int sample_init(void)
|
||||
{
|
||||
#ifdef WE_CAN_NEED_FIRMWARE_BEFORE_USERSPACE_IS_AVAILABLE
|
||||
register_firmware("sample_driver_fw", inkernel_firmware,
|
||||
sizeof(inkernel_firmware));
|
||||
#endif
|
||||
device_initialize(&ghost_device);
|
||||
/* since there is no real hardware insertion I just call the
|
||||
* sample probe functions here */
|
||||
|
@ -36,6 +36,9 @@ timeout or margin. The simplest way to ping the watchdog is to write
|
||||
some data to the device. So a very simple watchdog daemon would look
|
||||
like this:
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
int fd=open("/dev/watchdog",O_WRONLY);
|
||||
if (fd==-1) {
|
||||
|
39
MAINTAINERS
39
MAINTAINERS
@ -40,11 +40,20 @@ trivial patch so apply some common sense.
|
||||
PLEASE document known bugs. If it doesn't work for everything
|
||||
or does something very odd once a month document it.
|
||||
|
||||
PLEASE remember that submissions must be made under the terms
|
||||
of the OSDL certificate of contribution
|
||||
(http://www.osdl.org/newsroom/press_releases/2004/2004_05_24_dco.html)
|
||||
and should include a Signed-off-by: line.
|
||||
|
||||
6. Make sure you have the right to send any changes you make. If you
|
||||
do changes at work you may find your employer owns the patch
|
||||
not you.
|
||||
|
||||
7. Happy hacking.
|
||||
7. When sending security related changes or reports to a maintainer
|
||||
please Cc: security@kernel.org, especially if the maintainer
|
||||
does not respond.
|
||||
|
||||
8. Happy hacking.
|
||||
|
||||
-----------------------------------
|
||||
|
||||
@ -556,7 +565,7 @@ BROADBAND PROCESSOR ARCHITECTURE
|
||||
P: Arnd Bergmann
|
||||
M: arnd@arndb.de
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
W: http://linuxppc64.org
|
||||
W: http://www.penguinppc.org/ppc64/
|
||||
S: Supported
|
||||
|
||||
BTTV VIDEO4LINUX DRIVER
|
||||
@ -969,7 +978,7 @@ S: Maintained
|
||||
EXT3 FILE SYSTEM
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@osdl.org, adilger@clusterfs.com
|
||||
L: ext3-users@redhat.com
|
||||
L: ext2-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
F71805F HARDWARE MONITORING DRIVER
|
||||
@ -1530,12 +1539,28 @@ W: http://jfs.sourceforge.net/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/shaggy/jfs-2.6.git
|
||||
S: Supported
|
||||
|
||||
JOURNALLING LAYER FOR BLOCK DEVICS (JBD)
|
||||
P: Stephen Tweedie, Andrew Morton
|
||||
M: sct@redhat.com, akpm@osdl.org
|
||||
L: ext2-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
KCONFIG
|
||||
P: Roman Zippel
|
||||
M: zippel@linux-m68k.org
|
||||
L: kbuild-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
KDUMP
|
||||
P: Vivek Goyal
|
||||
M: vgoyal@in.ibm.com
|
||||
P: Haren Myneni
|
||||
M: hbabu@us.ibm.com
|
||||
L: fastboot@lists.osdl.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
W: http://lse.sourceforge.net/kdump/
|
||||
S: Maintained
|
||||
|
||||
KERNEL AUTOMOUNTER (AUTOFS)
|
||||
P: H. Peter Anvin
|
||||
M: hpa@zytor.com
|
||||
@ -1691,7 +1716,7 @@ M: paulus@au.ibm.com
|
||||
P: Anton Blanchard
|
||||
M: anton@samba.org
|
||||
M: anton@au.ibm.com
|
||||
W: http://linuxppc64.org
|
||||
W: http://www.penguinppc.org/ppc64/
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
S: Supported
|
||||
|
||||
@ -1874,6 +1899,12 @@ M: James.Bottomley@HansenPartnership.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
NETEM NETWORK EMULATOR
|
||||
P: Stephen Hemminger
|
||||
M: shemminger@osdl.org
|
||||
L: netem@osdl.org
|
||||
S: Maintained
|
||||
|
||||
NETFILTER/IPTABLES/IPCHAINS
|
||||
P: Rusty Russell
|
||||
P: Marc Boucher
|
||||
|
4
Makefile
4
Makefile
@ -1,8 +1,8 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 17
|
||||
EXTRAVERSION =-rc4
|
||||
NAME=Sliding Snow Leopard
|
||||
EXTRAVERSION =-rc5
|
||||
NAME=Lordi Rules
|
||||
|
||||
# *DOCUMENTATION*
|
||||
# To see a list of typical targets execute "make help"
|
||||
|
@ -95,7 +95,10 @@ static void __init mainstone_init_irq(void)
|
||||
for(irq = MAINSTONE_IRQ(0); irq <= MAINSTONE_IRQ(15); irq++) {
|
||||
set_irq_chip(irq, &mainstone_irq_chip);
|
||||
set_irq_handler(irq, do_level_IRQ);
|
||||
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
|
||||
if (irq == MAINSTONE_IRQ(10) || irq == MAINSTONE_IRQ(14))
|
||||
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE | IRQF_NOAUTOEN);
|
||||
else
|
||||
set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
|
||||
}
|
||||
set_irq_flags(MAINSTONE_IRQ(8), 0);
|
||||
set_irq_flags(MAINSTONE_IRQ(12), 0);
|
||||
|
@ -59,8 +59,7 @@ ENTRY(s3c2410_cpu_suspend)
|
||||
mrc p15, 0, r5, c13, c0, 0 @ PID
|
||||
mrc p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mrc p15, 0, r7, c2, c0, 0 @ translation table base address
|
||||
mrc p15, 0, r8, c2, c0, 0 @ auxiliary control register
|
||||
mrc p15, 0, r9, c1, c0, 0 @ control register
|
||||
mrc p15, 0, r8, c1, c0, 0 @ control register
|
||||
|
||||
stmia r0, { r4 - r13 }
|
||||
|
||||
@ -165,7 +164,6 @@ ENTRY(s3c2410_cpu_resume)
|
||||
mcr p15, 0, r5, c13, c0, 0 @ PID
|
||||
mcr p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mcr p15, 0, r7, c2, c0, 0 @ translation table base
|
||||
mcr p15, 0, r8, c1, c1, 0 @ auxilliary control
|
||||
|
||||
#ifdef CONFIG_DEBUG_RESUME
|
||||
mov r3, #'R'
|
||||
@ -173,7 +171,7 @@ ENTRY(s3c2410_cpu_resume)
|
||||
#endif
|
||||
|
||||
ldr r2, =resume_with_mmu
|
||||
mcr p15, 0, r9, c1, c0, 0 @ turn on MMU, etc
|
||||
mcr p15, 0, r8, c1, c0, 0 @ turn on MMU, etc
|
||||
nop @ second-to-last before mmu
|
||||
mov pc, r2 @ go back to virtual address
|
||||
|
||||
|
@ -376,7 +376,7 @@ void __init build_mem_type_table(void)
|
||||
ecc_mask = 0;
|
||||
}
|
||||
|
||||
if (cpu_arch <= CPU_ARCH_ARMv5TEJ) {
|
||||
if (cpu_arch <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale()) {
|
||||
for (i = 0; i < ARRAY_SIZE(mem_types); i++) {
|
||||
if (mem_types[i].prot_l1)
|
||||
mem_types[i].prot_l1 |= PMD_BIT4;
|
||||
@ -631,7 +631,7 @@ void setup_mm_for_reboot(char mode)
|
||||
pgd = init_mm.pgd;
|
||||
|
||||
base_pmdval = PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_TYPE_SECT;
|
||||
if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ)
|
||||
if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ && !cpu_is_xscale())
|
||||
base_pmdval |= PMD_BIT4;
|
||||
|
||||
for (i = 0; i < FIRST_USER_PGD_NR + USER_PTRS_PER_PGD; i++, pgd++) {
|
||||
|
@ -427,12 +427,13 @@ __xsc3_setup:
|
||||
#endif
|
||||
mcr p15, 0, r0, c1, c0, 1 @ set auxiliary control reg
|
||||
mrc p15, 0, r0, c1, c0, 0 @ get control register
|
||||
bic r0, r0, #0x0200 @ .... ..R. .... ....
|
||||
bic r0, r0, #0x0002 @ .... .... .... ..A.
|
||||
orr r0, r0, #0x0005 @ .... .... .... .C.M
|
||||
#if BTB_ENABLE
|
||||
bic r0, r0, #0x0200 @ .... ..R. .... ....
|
||||
orr r0, r0, #0x3900 @ ..VI Z..S .... ....
|
||||
#else
|
||||
bic r0, r0, #0x0a00 @ .... Z.R. .... ....
|
||||
orr r0, r0, #0x3100 @ ..VI ...S .... ....
|
||||
#endif
|
||||
#if L2_CACHE_ENABLE
|
||||
|
@ -1066,14 +1066,6 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = disable_acpi_pci,
|
||||
.ident = "HP xw9300",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP xw9300 Workstation"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -1341,6 +1341,14 @@ int __init APIC_init_uniprocessor (void)
|
||||
|
||||
connect_bsp_APIC();
|
||||
|
||||
/*
|
||||
* Hack: In case of kdump, after a crash, kernel might be booting
|
||||
* on a cpu with non-zero lapic id. But boot_cpu_physical_apicid
|
||||
* might be zero if read from MP tables. Get it from LAPIC.
|
||||
*/
|
||||
#ifdef CONFIG_CRASH_DUMP
|
||||
boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID));
|
||||
#endif
|
||||
phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid);
|
||||
|
||||
setup_local_APIC();
|
||||
|
@ -315,3 +315,4 @@ ENTRY(sys_call_table)
|
||||
.long sys_splice
|
||||
.long sys_sync_file_range
|
||||
.long sys_tee /* 315 */
|
||||
.long sys_vmsplice
|
||||
|
@ -130,9 +130,8 @@ static inline int print_addr_and_symbol(unsigned long addr, char *log_lvl,
|
||||
print_symbol("%s", addr);
|
||||
|
||||
printed = (printed + 1) % CONFIG_STACK_BACKTRACE_COLS;
|
||||
|
||||
if (printed)
|
||||
printk(" ");
|
||||
printk(" ");
|
||||
else
|
||||
printk("\n");
|
||||
|
||||
@ -212,7 +211,6 @@ static void show_stack_log_lvl(struct task_struct *task, unsigned long *esp,
|
||||
}
|
||||
|
||||
stack = esp;
|
||||
printk(log_lvl);
|
||||
for(i = 0; i < kstack_depth_to_print; i++) {
|
||||
if (kstack_end(stack))
|
||||
break;
|
||||
|
@ -93,9 +93,11 @@ int __init mps_oem_check(struct mp_config_table *mpc, char *oem, char *productid
|
||||
int i;
|
||||
for (i = 0; apic_probe[i]; ++i) {
|
||||
if (apic_probe[i]->mps_oem_check(mpc,oem,productid)) {
|
||||
genapic = apic_probe[i];
|
||||
printk(KERN_INFO "Switched to APIC driver `%s'.\n",
|
||||
genapic->name);
|
||||
if (!cmdline_apic) {
|
||||
genapic = apic_probe[i];
|
||||
printk(KERN_INFO "Switched to APIC driver `%s'.\n",
|
||||
genapic->name);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@ -107,9 +109,11 @@ int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
|
||||
int i;
|
||||
for (i = 0; apic_probe[i]; ++i) {
|
||||
if (apic_probe[i]->acpi_madt_oem_check(oem_id, oem_table_id)) {
|
||||
genapic = apic_probe[i];
|
||||
printk(KERN_INFO "Switched to APIC driver `%s'.\n",
|
||||
genapic->name);
|
||||
if (!cmdline_apic) {
|
||||
genapic = apic_probe[i];
|
||||
printk(KERN_INFO "Switched to APIC driver `%s'.\n",
|
||||
genapic->name);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -651,7 +651,7 @@ void __init mem_init(void)
|
||||
* Specifically, in the case of x86, we will always add
|
||||
* memory to the highmem for now.
|
||||
*/
|
||||
#ifdef CONFIG_HOTPLUG_MEMORY
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
||||
int add_memory(u64 start, u64 size)
|
||||
{
|
||||
|
@ -92,7 +92,7 @@ void __restore_processor_state(struct saved_context *ctxt)
|
||||
write_cr4(ctxt->cr4);
|
||||
write_cr3(ctxt->cr3);
|
||||
write_cr2(ctxt->cr2);
|
||||
write_cr2(ctxt->cr0);
|
||||
write_cr0(ctxt->cr0);
|
||||
|
||||
/*
|
||||
* now restore the descriptor tables to their proper values
|
||||
|
@ -13,7 +13,7 @@ choice
|
||||
default SGI_IP22
|
||||
|
||||
config MIPS_MTX1
|
||||
bool "Support for 4G Systems MTX-1 board"
|
||||
bool "4G Systems MTX-1 board"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select SOC_AU1500
|
||||
@ -120,7 +120,7 @@ config MIPS_MIRAGE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config MIPS_COBALT
|
||||
bool "Support for Cobalt Server"
|
||||
bool "Cobalt Server"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select I8259
|
||||
@ -132,7 +132,7 @@ config MIPS_COBALT
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config MACH_DECSTATION
|
||||
bool "Support for DECstations"
|
||||
bool "DECstations"
|
||||
select BOOT_ELF32
|
||||
select DMA_NONCOHERENT
|
||||
select EARLY_PRINTK
|
||||
@ -158,7 +158,7 @@ config MACH_DECSTATION
|
||||
otherwise choose R3000.
|
||||
|
||||
config MIPS_EV64120
|
||||
bool "Support for Galileo EV64120 Evaluation board (EXPERIMENTAL)"
|
||||
bool "Galileo EV64120 Evaluation board (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
@ -175,7 +175,7 @@ config MIPS_EV64120
|
||||
kernel for this platform.
|
||||
|
||||
config MIPS_EV96100
|
||||
bool "Support for Galileo EV96100 Evaluation board (EXPERIMENTAL)"
|
||||
bool "Galileo EV96100 Evaluation board (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
@ -195,7 +195,7 @@ config MIPS_EV96100
|
||||
here if you wish to build a kernel for this platform.
|
||||
|
||||
config MIPS_IVR
|
||||
bool "Support for Globespan IVR board"
|
||||
bool "Globespan IVR board"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select ITE_BOARD_GEN
|
||||
@ -211,7 +211,7 @@ config MIPS_IVR
|
||||
build a kernel for this platform.
|
||||
|
||||
config MIPS_ITE8172
|
||||
bool "Support for ITE 8172G board"
|
||||
bool "ITE 8172G board"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select ITE_BOARD_GEN
|
||||
@ -228,7 +228,7 @@ config MIPS_ITE8172
|
||||
a kernel for this platform.
|
||||
|
||||
config MACH_JAZZ
|
||||
bool "Support for the Jazz family of machines"
|
||||
bool "Jazz family of machines"
|
||||
select ARC
|
||||
select ARC32
|
||||
select ARCH_MAY_HAVE_PC_FDC
|
||||
@ -246,7 +246,7 @@ config MACH_JAZZ
|
||||
Olivetti M700-10 workstations.
|
||||
|
||||
config LASAT
|
||||
bool "Support for LASAT Networks platforms"
|
||||
bool "LASAT Networks platforms"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select MIPS_GT64120
|
||||
@ -258,7 +258,7 @@ config LASAT
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config MIPS_ATLAS
|
||||
bool "Support for MIPS Atlas board"
|
||||
bool "MIPS Atlas board"
|
||||
select BOOT_ELF32
|
||||
select DMA_NONCOHERENT
|
||||
select IRQ_CPU
|
||||
@ -283,7 +283,7 @@ config MIPS_ATLAS
|
||||
board.
|
||||
|
||||
config MIPS_MALTA
|
||||
bool "Support for MIPS Malta board"
|
||||
bool "MIPS Malta board"
|
||||
select ARCH_MAY_HAVE_PC_FDC
|
||||
select BOOT_ELF32
|
||||
select HAVE_STD_PC_SERIAL_PORT
|
||||
@ -311,7 +311,7 @@ config MIPS_MALTA
|
||||
board.
|
||||
|
||||
config MIPS_SEAD
|
||||
bool "Support for MIPS SEAD board (EXPERIMENTAL)"
|
||||
bool "MIPS SEAD board (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
select IRQ_CPU
|
||||
select DMA_NONCOHERENT
|
||||
@ -328,7 +328,7 @@ config MIPS_SEAD
|
||||
board.
|
||||
|
||||
config MIPS_SIM
|
||||
bool 'Support for MIPS simulator (MIPSsim)'
|
||||
bool 'MIPS simulator (MIPSsim)'
|
||||
select DMA_NONCOHERENT
|
||||
select IRQ_CPU
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
@ -341,7 +341,7 @@ config MIPS_SIM
|
||||
emulator.
|
||||
|
||||
config MOMENCO_JAGUAR_ATX
|
||||
bool "Support for Momentum Jaguar board"
|
||||
bool "Momentum Jaguar board"
|
||||
select BOOT_ELF32
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
@ -361,7 +361,7 @@ config MOMENCO_JAGUAR_ATX
|
||||
Momentum Computer <http://www.momenco.com/>.
|
||||
|
||||
config MOMENCO_OCELOT
|
||||
bool "Support for Momentum Ocelot board"
|
||||
bool "Momentum Ocelot board"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select IRQ_CPU
|
||||
@ -378,7 +378,7 @@ config MOMENCO_OCELOT
|
||||
Momentum Computer <http://www.momenco.com/>.
|
||||
|
||||
config MOMENCO_OCELOT_3
|
||||
bool "Support for Momentum Ocelot-3 board"
|
||||
bool "Momentum Ocelot-3 board"
|
||||
select BOOT_ELF32
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
@ -397,7 +397,7 @@ config MOMENCO_OCELOT_3
|
||||
PMC-Sierra Rm79000 core.
|
||||
|
||||
config MOMENCO_OCELOT_C
|
||||
bool "Support for Momentum Ocelot-C board"
|
||||
bool "Momentum Ocelot-C board"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select IRQ_CPU
|
||||
@ -414,7 +414,7 @@ config MOMENCO_OCELOT_C
|
||||
Momentum Computer <http://www.momenco.com/>.
|
||||
|
||||
config MOMENCO_OCELOT_G
|
||||
bool "Support for Momentum Ocelot-G board"
|
||||
bool "Momentum Ocelot-G board"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select IRQ_CPU
|
||||
@ -431,23 +431,23 @@ config MOMENCO_OCELOT_G
|
||||
Momentum Computer <http://www.momenco.com/>.
|
||||
|
||||
config MIPS_XXS1500
|
||||
bool "Support for MyCable XXS1500 board"
|
||||
bool "MyCable XXS1500 board"
|
||||
select DMA_NONCOHERENT
|
||||
select SOC_AU1500
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config PNX8550_V2PCI
|
||||
bool "Support for Philips PNX8550 based Viper2-PCI board"
|
||||
bool "Philips PNX8550 based Viper2-PCI board"
|
||||
select PNX8550
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config PNX8550_JBS
|
||||
bool "Support for Philips PNX8550 based JBS board"
|
||||
bool "Philips PNX8550 based JBS board"
|
||||
select PNX8550
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config DDB5074
|
||||
bool "Support for NEC DDB Vrc-5074 (EXPERIMENTAL)"
|
||||
bool "NEC DDB Vrc-5074 (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
select DDB5XXX_COMMON
|
||||
select DMA_NONCOHERENT
|
||||
@ -465,7 +465,7 @@ config DDB5074
|
||||
evaluation board.
|
||||
|
||||
config DDB5476
|
||||
bool "Support for NEC DDB Vrc-5476"
|
||||
bool "NEC DDB Vrc-5476"
|
||||
select DDB5XXX_COMMON
|
||||
select DMA_NONCOHERENT
|
||||
select HAVE_STD_PC_SERIAL_PORT
|
||||
@ -486,7 +486,7 @@ config DDB5476
|
||||
IDE controller, PS2 keyboard, PS2 mouse, etc.
|
||||
|
||||
config DDB5477
|
||||
bool "Support for NEC DDB Vrc-5477"
|
||||
bool "NEC DDB Vrc-5477"
|
||||
select DDB5XXX_COMMON
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
@ -504,13 +504,13 @@ config DDB5477
|
||||
ether port USB, AC97, PCI, etc.
|
||||
|
||||
config MACH_VR41XX
|
||||
bool "Support for NEC VR4100 series based machines"
|
||||
bool "NEC VR41XX-based machines"
|
||||
select SYS_HAS_CPU_VR41XX
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_64BIT_KERNEL if EXPERIMENTAL
|
||||
|
||||
config PMC_YOSEMITE
|
||||
bool "Support for PMC-Sierra Yosemite eval board"
|
||||
bool "PMC-Sierra Yosemite eval board"
|
||||
select DMA_COHERENT
|
||||
select HW_HAS_PCI
|
||||
select IRQ_CPU
|
||||
@ -527,7 +527,7 @@ config PMC_YOSEMITE
|
||||
manufactured by PMC-Sierra.
|
||||
|
||||
config QEMU
|
||||
bool "Support for Qemu"
|
||||
bool "Qemu"
|
||||
select DMA_COHERENT
|
||||
select GENERIC_ISA_DMA
|
||||
select HAVE_STD_PC_SERIAL_PORT
|
||||
@ -547,7 +547,7 @@ config QEMU
|
||||
can be found at http://www.linux-mips.org/wiki/Qemu.
|
||||
|
||||
config SGI_IP22
|
||||
bool "Support for SGI IP22 (Indy/Indigo2)"
|
||||
bool "SGI IP22 (Indy/Indigo2)"
|
||||
select ARC
|
||||
select ARC32
|
||||
select BOOT_ELF32
|
||||
@ -567,7 +567,7 @@ config SGI_IP22
|
||||
that runs on these, say Y here.
|
||||
|
||||
config SGI_IP27
|
||||
bool "Support for SGI IP27 (Origin200/2000)"
|
||||
bool "SGI IP27 (Origin200/2000)"
|
||||
select ARC
|
||||
select ARC64
|
||||
select BOOT_ELF64
|
||||
@ -583,7 +583,7 @@ config SGI_IP27
|
||||
here.
|
||||
|
||||
config SGI_IP32
|
||||
bool "Support for SGI IP32 (O2) (EXPERIMENTAL)"
|
||||
bool "SGI IP32 (O2) (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
select ARC
|
||||
select ARC32
|
||||
@ -604,7 +604,7 @@ config SGI_IP32
|
||||
If you want this kernel to run on SGI O2 workstation, say Y here.
|
||||
|
||||
config SIBYTE_BIGSUR
|
||||
bool "Support for Sibyte BCM91480B-BigSur"
|
||||
bool "Sibyte BCM91480B-BigSur"
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
select PCI_DOMAINS
|
||||
@ -615,7 +615,7 @@ config SIBYTE_BIGSUR
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config SIBYTE_SWARM
|
||||
bool "Support for Sibyte BCM91250A-SWARM"
|
||||
bool "Sibyte BCM91250A-SWARM"
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
select SIBYTE_SB1250
|
||||
@ -626,7 +626,7 @@ config SIBYTE_SWARM
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config SIBYTE_SENTOSA
|
||||
bool "Support for Sibyte BCM91250E-Sentosa"
|
||||
bool "Sibyte BCM91250E-Sentosa"
|
||||
depends on EXPERIMENTAL
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
@ -637,7 +637,7 @@ config SIBYTE_SENTOSA
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config SIBYTE_RHONE
|
||||
bool "Support for Sibyte BCM91125E-Rhone"
|
||||
bool "Sibyte BCM91125E-Rhone"
|
||||
depends on EXPERIMENTAL
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
@ -648,7 +648,7 @@ config SIBYTE_RHONE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config SIBYTE_CARMEL
|
||||
bool "Support for Sibyte BCM91120x-Carmel"
|
||||
bool "Sibyte BCM91120x-Carmel"
|
||||
depends on EXPERIMENTAL
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
@ -659,7 +659,7 @@ config SIBYTE_CARMEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config SIBYTE_PTSWARM
|
||||
bool "Support for Sibyte BCM91250PT-PTSWARM"
|
||||
bool "Sibyte BCM91250PT-PTSWARM"
|
||||
depends on EXPERIMENTAL
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
@ -671,7 +671,7 @@ config SIBYTE_PTSWARM
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config SIBYTE_LITTLESUR
|
||||
bool "Support for Sibyte BCM91250C2-LittleSur"
|
||||
bool "Sibyte BCM91250C2-LittleSur"
|
||||
depends on EXPERIMENTAL
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
@ -683,7 +683,7 @@ config SIBYTE_LITTLESUR
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config SIBYTE_CRHINE
|
||||
bool "Support for Sibyte BCM91120C-CRhine"
|
||||
bool "Sibyte BCM91120C-CRhine"
|
||||
depends on EXPERIMENTAL
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
@ -694,7 +694,7 @@ config SIBYTE_CRHINE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config SIBYTE_CRHONE
|
||||
bool "Support for Sibyte BCM91125C-CRhone"
|
||||
bool "Sibyte BCM91125C-CRhone"
|
||||
depends on EXPERIMENTAL
|
||||
select BOOT_ELF32
|
||||
select DMA_COHERENT
|
||||
@ -706,7 +706,7 @@ config SIBYTE_CRHONE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config SNI_RM200_PCI
|
||||
bool "Support for SNI RM200 PCI"
|
||||
bool "SNI RM200 PCI"
|
||||
select ARC
|
||||
select ARC32
|
||||
select ARCH_MAY_HAVE_PC_FDC
|
||||
@ -732,7 +732,7 @@ config SNI_RM200_PCI
|
||||
support this machine type.
|
||||
|
||||
config TOSHIBA_JMR3927
|
||||
bool "Support for Toshiba JMR-TX3927 board"
|
||||
bool "Toshiba JMR-TX3927 board"
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select MIPS_TX3927
|
||||
@ -743,7 +743,7 @@ config TOSHIBA_JMR3927
|
||||
select TOSHIBA_BOARDS
|
||||
|
||||
config TOSHIBA_RBTX4927
|
||||
bool "Support for Toshiba TBTX49[23]7 board"
|
||||
bool "Toshiba TBTX49[23]7 board"
|
||||
select DMA_NONCOHERENT
|
||||
select HAS_TXX9_SERIAL
|
||||
select HW_HAS_PCI
|
||||
@ -760,7 +760,7 @@ config TOSHIBA_RBTX4927
|
||||
support this machine type
|
||||
|
||||
config TOSHIBA_RBTX4938
|
||||
bool "Support for Toshiba RBTX4938 board"
|
||||
bool "Toshiba RBTX4938 board"
|
||||
select HAVE_STD_PC_SERIAL_PORT
|
||||
select DMA_NONCOHERENT
|
||||
select GENERIC_ISA_DMA
|
||||
@ -1411,13 +1411,12 @@ config PAGE_SIZE_8KB
|
||||
|
||||
config PAGE_SIZE_16KB
|
||||
bool "16kB"
|
||||
depends on EXPERIMENTAL && !CPU_R3000 && !CPU_TX39XX
|
||||
depends on !CPU_R3000 && !CPU_TX39XX
|
||||
help
|
||||
Using 16kB page size will result in higher performance kernel at
|
||||
the price of higher memory consumption. This option is available on
|
||||
all non-R3000 family processor. Not that at the time of this
|
||||
writing this option is still high experimental; there are also
|
||||
issues with compatibility of user applications.
|
||||
all non-R3000 family processors. Note that you will need a suitable
|
||||
Linux distribution to support this.
|
||||
|
||||
config PAGE_SIZE_64KB
|
||||
bool "64kB"
|
||||
@ -1426,8 +1425,7 @@ config PAGE_SIZE_64KB
|
||||
Using 64kB page size will result in higher performance kernel at
|
||||
the price of higher memory consumption. This option is available on
|
||||
all non-R3000 family processor. Not that at the time of this
|
||||
writing this option is still high experimental; there are also
|
||||
issues with compatibility of user applications.
|
||||
writing this option is still high experimental.
|
||||
|
||||
endchoice
|
||||
|
||||
|
@ -68,6 +68,7 @@
|
||||
|
||||
extern void set_debug_traps(void);
|
||||
extern irq_cpustat_t irq_stat [NR_CPUS];
|
||||
extern void mips_timer_interrupt(struct pt_regs *regs);
|
||||
|
||||
static void setup_local_irq(unsigned int irq, int type, int int_req);
|
||||
static unsigned int startup_irq(unsigned int irq);
|
||||
|
@ -116,6 +116,7 @@ void mips_timer_interrupt(struct pt_regs *regs)
|
||||
|
||||
null:
|
||||
ack_r4ktimer(0);
|
||||
irq_exit();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -272,8 +272,8 @@ void output_sc_defines(void)
|
||||
text("/* Linux sigcontext offsets. */");
|
||||
offset("#define SC_REGS ", struct sigcontext, sc_regs);
|
||||
offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs);
|
||||
offset("#define SC_MDHI ", struct sigcontext, sc_hi);
|
||||
offset("#define SC_MDLO ", struct sigcontext, sc_lo);
|
||||
offset("#define SC_MDHI ", struct sigcontext, sc_mdhi);
|
||||
offset("#define SC_MDLO ", struct sigcontext, sc_mdlo);
|
||||
offset("#define SC_PC ", struct sigcontext, sc_pc);
|
||||
offset("#define SC_FPC_CSR ", struct sigcontext, sc_fpc_csr);
|
||||
linefeed;
|
||||
|
@ -121,6 +121,7 @@ static inline void check_wait(void)
|
||||
case CPU_24K:
|
||||
case CPU_25KF:
|
||||
case CPU_34K:
|
||||
case CPU_74K:
|
||||
case CPU_PR4450:
|
||||
cpu_wait = r4k_wait;
|
||||
printk(" available.\n");
|
||||
@ -432,6 +433,15 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
||||
MIPS_CPU_LLSC;
|
||||
c->tlbsize = 64;
|
||||
break;
|
||||
case PRID_IMP_R14000:
|
||||
c->cputype = CPU_R14000;
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
|
||||
MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_COUNTER | MIPS_CPU_WATCH |
|
||||
MIPS_CPU_LLSC;
|
||||
c->tlbsize = 64;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -593,6 +603,9 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c)
|
||||
case PRID_IMP_34K:
|
||||
c->cputype = CPU_34K;
|
||||
break;
|
||||
case PRID_IMP_74K:
|
||||
c->cputype = CPU_74K;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -101,7 +101,7 @@ FEXPORT(restore_all) # restore full frame
|
||||
EMT
|
||||
1:
|
||||
mfc0 v1, CP0_TCSTATUS
|
||||
/* We set IXMT above, XOR should cler it here */
|
||||
/* We set IXMT above, XOR should clear it here */
|
||||
xori v1, v1, TCSTATUS_IXMT
|
||||
or v1, v0, v1
|
||||
mtc0 v1, CP0_TCSTATUS
|
||||
|
@ -54,9 +54,11 @@
|
||||
*/
|
||||
mfc0 k0, CP0_CAUSE
|
||||
andi k0, k0, 0x7c
|
||||
add k1, k1, k0
|
||||
PTR_L k0, saved_vectors(k1)
|
||||
jr k0
|
||||
#ifdef CONFIG_64BIT
|
||||
dsll k0, k0, 1
|
||||
#endif
|
||||
PTR_L k1, saved_vectors(k0)
|
||||
jr k1
|
||||
nop
|
||||
1:
|
||||
move k0, sp
|
||||
|
@ -42,6 +42,7 @@ static const char *cpu_name[] = {
|
||||
[CPU_R8000] = "R8000",
|
||||
[CPU_R10000] = "R10000",
|
||||
[CPU_R12000] = "R12000",
|
||||
[CPU_R14000] = "R14000",
|
||||
[CPU_R4300] = "R4300",
|
||||
[CPU_R4650] = "R4650",
|
||||
[CPU_R4700] = "R4700",
|
||||
@ -74,6 +75,7 @@ static const char *cpu_name[] = {
|
||||
[CPU_24K] = "MIPS 24K",
|
||||
[CPU_25KF] = "MIPS 25Kf",
|
||||
[CPU_34K] = "MIPS 34K",
|
||||
[CPU_74K] = "MIPS 74K",
|
||||
[CPU_VR4111] = "NEC VR4111",
|
||||
[CPU_VR4121] = "NEC VR4121",
|
||||
[CPU_VR4122] = "NEC VR4122",
|
||||
|
@ -31,7 +31,6 @@ setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
|
||||
save_gp_reg(31);
|
||||
#undef save_gp_reg
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
err |= __put_user(regs->hi, &sc->sc_mdhi);
|
||||
err |= __put_user(regs->lo, &sc->sc_mdlo);
|
||||
if (cpu_has_dsp) {
|
||||
@ -43,20 +42,6 @@ setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
|
||||
err |= __put_user(mflo3(), &sc->sc_lo3);
|
||||
err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_64BIT
|
||||
err |= __put_user(regs->hi, &sc->sc_hi[0]);
|
||||
err |= __put_user(regs->lo, &sc->sc_lo[0]);
|
||||
if (cpu_has_dsp) {
|
||||
err |= __put_user(mfhi1(), &sc->sc_hi[1]);
|
||||
err |= __put_user(mflo1(), &sc->sc_lo[1]);
|
||||
err |= __put_user(mfhi2(), &sc->sc_hi[2]);
|
||||
err |= __put_user(mflo2(), &sc->sc_lo[2]);
|
||||
err |= __put_user(mfhi3(), &sc->sc_hi[3]);
|
||||
err |= __put_user(mflo3(), &sc->sc_lo[3]);
|
||||
err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
|
||||
}
|
||||
#endif
|
||||
|
||||
err |= __put_user(!!used_math(), &sc->sc_used_math);
|
||||
|
||||
@ -92,7 +77,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
|
||||
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
||||
|
||||
err |= __get_user(regs->cp0_epc, &sc->sc_pc);
|
||||
#ifdef CONFIG_32BIT
|
||||
err |= __get_user(regs->hi, &sc->sc_mdhi);
|
||||
err |= __get_user(regs->lo, &sc->sc_mdlo);
|
||||
if (cpu_has_dsp) {
|
||||
@ -104,20 +88,6 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
|
||||
err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
|
||||
err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_64BIT
|
||||
err |= __get_user(regs->hi, &sc->sc_hi[0]);
|
||||
err |= __get_user(regs->lo, &sc->sc_lo[0]);
|
||||
if (cpu_has_dsp) {
|
||||
err |= __get_user(treg, &sc->sc_hi[1]); mthi1(treg);
|
||||
err |= __get_user(treg, &sc->sc_lo[1]); mthi1(treg);
|
||||
err |= __get_user(treg, &sc->sc_hi[2]); mthi2(treg);
|
||||
err |= __get_user(treg, &sc->sc_lo[2]); mthi2(treg);
|
||||
err |= __get_user(treg, &sc->sc_hi[3]); mthi3(treg);
|
||||
err |= __get_user(treg, &sc->sc_lo[3]); mthi3(treg);
|
||||
err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define restore_gp_reg(i) do { \
|
||||
err |= __get_user(regs->regs[i], &sc->sc_regs[i]); \
|
||||
|
@ -280,27 +280,6 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
|
||||
char __user *name;
|
||||
|
||||
switch(cmd) {
|
||||
case SETNAME: {
|
||||
char nodename[__NEW_UTS_LEN + 1];
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
|
||||
name = (char __user *) arg1;
|
||||
|
||||
len = strncpy_from_user(nodename, name, __NEW_UTS_LEN);
|
||||
if (len < 0)
|
||||
return -EFAULT;
|
||||
|
||||
down_write(&uts_sem);
|
||||
strncpy(system_utsname.nodename, nodename, len);
|
||||
nodename[__NEW_UTS_LEN] = '\0';
|
||||
strlcpy(system_utsname.nodename, nodename,
|
||||
sizeof(system_utsname.nodename));
|
||||
up_write(&uts_sem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
case MIPS_ATOMIC_SET:
|
||||
printk(KERN_CRIT "How did I get here?\n");
|
||||
return -EINVAL;
|
||||
@ -313,9 +292,6 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
|
||||
case FLUSH_CACHE:
|
||||
__flush_cache_all();
|
||||
return 0;
|
||||
|
||||
case MIPS_RDNVRAM:
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
|
@ -902,6 +902,7 @@ static inline void parity_protection_init(void)
|
||||
{
|
||||
switch (current_cpu_data.cputype) {
|
||||
case CPU_24K:
|
||||
case CPU_34K:
|
||||
case CPU_5KC:
|
||||
write_c0_ecc(0x80000000);
|
||||
back_to_back_c0_hazard();
|
||||
|
@ -151,23 +151,13 @@ SECTIONS
|
||||
|
||||
/* This is the MIPS specific mdebug section. */
|
||||
.mdebug : { *(.mdebug) }
|
||||
/* These are needed for ELF backends which have not yet been
|
||||
converted to the new style linker. */
|
||||
.stab 0 : { *(.stab) }
|
||||
.stabstr 0 : { *(.stabstr) }
|
||||
/* DWARF debug sections.
|
||||
Symbols in the .debug DWARF section are relative to the beginning of the
|
||||
section so we begin .debug at 0. It's not clear yet what needs to happen
|
||||
for the others. */
|
||||
.debug 0 : { *(.debug) }
|
||||
.debug_srcinfo 0 : { *(.debug_srcinfo) }
|
||||
.debug_aranges 0 : { *(.debug_aranges) }
|
||||
.debug_pubnames 0 : { *(.debug_pubnames) }
|
||||
.debug_sfnames 0 : { *(.debug_sfnames) }
|
||||
.line 0 : { *(.line) }
|
||||
|
||||
STABS_DEBUG
|
||||
|
||||
DWARF_DEBUG
|
||||
|
||||
/* These must appear regardless of . */
|
||||
.gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
|
||||
.gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
|
||||
.comment : { *(.comment) }
|
||||
.note : { *(.note) }
|
||||
}
|
||||
|
@ -29,6 +29,27 @@
|
||||
#include <asm/war.h>
|
||||
#include <asm/cacheflush.h> /* for run_uncached() */
|
||||
|
||||
|
||||
/*
|
||||
* Special Variant of smp_call_function for use by cache functions:
|
||||
*
|
||||
* o No return value
|
||||
* o collapses to normal function call on UP kernels
|
||||
* o collapses to normal function call on systems with a single shared
|
||||
* primary cache.
|
||||
*/
|
||||
static inline void r4k_on_each_cpu(void (*func) (void *info), void *info,
|
||||
int retry, int wait)
|
||||
{
|
||||
preempt_disable();
|
||||
|
||||
#if !defined(CONFIG_MIPS_MT_SMP) && !defined(CONFIG_MIPS_MT_SMTC)
|
||||
smp_call_function(func, info, retry, wait);
|
||||
#endif
|
||||
func(info);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
* Must die.
|
||||
*/
|
||||
@ -299,7 +320,7 @@ static void r4k_flush_cache_all(void)
|
||||
if (!cpu_has_dc_aliases)
|
||||
return;
|
||||
|
||||
on_each_cpu(local_r4k_flush_cache_all, NULL, 1, 1);
|
||||
r4k_on_each_cpu(local_r4k_flush_cache_all, NULL, 1, 1);
|
||||
}
|
||||
|
||||
static inline void local_r4k___flush_cache_all(void * args)
|
||||
@ -314,13 +335,14 @@ static inline void local_r4k___flush_cache_all(void * args)
|
||||
case CPU_R4400MC:
|
||||
case CPU_R10000:
|
||||
case CPU_R12000:
|
||||
case CPU_R14000:
|
||||
r4k_blast_scache();
|
||||
}
|
||||
}
|
||||
|
||||
static void r4k___flush_cache_all(void)
|
||||
{
|
||||
on_each_cpu(local_r4k___flush_cache_all, NULL, 1, 1);
|
||||
r4k_on_each_cpu(local_r4k___flush_cache_all, NULL, 1, 1);
|
||||
}
|
||||
|
||||
static inline void local_r4k_flush_cache_range(void * args)
|
||||
@ -341,7 +363,7 @@ static inline void local_r4k_flush_cache_range(void * args)
|
||||
static void r4k_flush_cache_range(struct vm_area_struct *vma,
|
||||
unsigned long start, unsigned long end)
|
||||
{
|
||||
on_each_cpu(local_r4k_flush_cache_range, vma, 1, 1);
|
||||
r4k_on_each_cpu(local_r4k_flush_cache_range, vma, 1, 1);
|
||||
}
|
||||
|
||||
static inline void local_r4k_flush_cache_mm(void * args)
|
||||
@ -370,7 +392,7 @@ static void r4k_flush_cache_mm(struct mm_struct *mm)
|
||||
if (!cpu_has_dc_aliases)
|
||||
return;
|
||||
|
||||
on_each_cpu(local_r4k_flush_cache_mm, mm, 1, 1);
|
||||
r4k_on_each_cpu(local_r4k_flush_cache_mm, mm, 1, 1);
|
||||
}
|
||||
|
||||
struct flush_cache_page_args {
|
||||
@ -461,7 +483,7 @@ static void r4k_flush_cache_page(struct vm_area_struct *vma,
|
||||
args.addr = addr;
|
||||
args.pfn = pfn;
|
||||
|
||||
on_each_cpu(local_r4k_flush_cache_page, &args, 1, 1);
|
||||
r4k_on_each_cpu(local_r4k_flush_cache_page, &args, 1, 1);
|
||||
}
|
||||
|
||||
static inline void local_r4k_flush_data_cache_page(void * addr)
|
||||
@ -471,7 +493,7 @@ static inline void local_r4k_flush_data_cache_page(void * addr)
|
||||
|
||||
static void r4k_flush_data_cache_page(unsigned long addr)
|
||||
{
|
||||
on_each_cpu(local_r4k_flush_data_cache_page, (void *) addr, 1, 1);
|
||||
r4k_on_each_cpu(local_r4k_flush_data_cache_page, (void *) addr, 1, 1);
|
||||
}
|
||||
|
||||
struct flush_icache_range_args {
|
||||
@ -514,7 +536,7 @@ static void r4k_flush_icache_range(unsigned long start, unsigned long end)
|
||||
args.start = start;
|
||||
args.end = end;
|
||||
|
||||
on_each_cpu(local_r4k_flush_icache_range, &args, 1, 1);
|
||||
r4k_on_each_cpu(local_r4k_flush_icache_range, &args, 1, 1);
|
||||
instruction_hazard();
|
||||
}
|
||||
|
||||
@ -590,7 +612,7 @@ static void r4k_flush_icache_page(struct vm_area_struct *vma,
|
||||
args.vma = vma;
|
||||
args.page = page;
|
||||
|
||||
on_each_cpu(local_r4k_flush_icache_page, &args, 1, 1);
|
||||
r4k_on_each_cpu(local_r4k_flush_icache_page, &args, 1, 1);
|
||||
}
|
||||
|
||||
|
||||
@ -689,7 +711,7 @@ static void local_r4k_flush_cache_sigtramp(void * arg)
|
||||
|
||||
static void r4k_flush_cache_sigtramp(unsigned long addr)
|
||||
{
|
||||
on_each_cpu(local_r4k_flush_cache_sigtramp, (void *) addr, 1, 1);
|
||||
r4k_on_each_cpu(local_r4k_flush_cache_sigtramp, (void *) addr, 1, 1);
|
||||
}
|
||||
|
||||
static void r4k_flush_icache_all(void)
|
||||
@ -812,6 +834,7 @@ static void __init probe_pcache(void)
|
||||
|
||||
case CPU_R10000:
|
||||
case CPU_R12000:
|
||||
case CPU_R14000:
|
||||
icache_size = 1 << (12 + ((config & R10K_CONF_IC) >> 29));
|
||||
c->icache.linesz = 64;
|
||||
c->icache.ways = 2;
|
||||
@ -965,9 +988,11 @@ static void __init probe_pcache(void)
|
||||
c->dcache.flags |= MIPS_CACHE_PINDEX;
|
||||
case CPU_R10000:
|
||||
case CPU_R12000:
|
||||
case CPU_R14000:
|
||||
case CPU_SB1:
|
||||
break;
|
||||
case CPU_24K:
|
||||
case CPU_34K:
|
||||
if (!(read_c0_config7() & (1 << 16)))
|
||||
default:
|
||||
if (c->dcache.waysize > PAGE_SIZE)
|
||||
@ -1091,6 +1116,7 @@ static void __init setup_scache(void)
|
||||
|
||||
case CPU_R10000:
|
||||
case CPU_R12000:
|
||||
case CPU_R14000:
|
||||
scache_size = 0x80000 << ((config & R10K_CONF_SS) >> 16);
|
||||
c->scache.linesz = 64 << ((config >> 13) & 1);
|
||||
c->scache.ways = 2;
|
||||
|
@ -357,6 +357,7 @@ void __init build_clear_page(void)
|
||||
|
||||
case CPU_R10000:
|
||||
case CPU_R12000:
|
||||
case CPU_R14000:
|
||||
pref_src_mode = Pref_LoadStreamed;
|
||||
pref_dst_mode = Pref_StoreStreamed;
|
||||
break;
|
||||
|
@ -875,6 +875,7 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l,
|
||||
|
||||
case CPU_R10000:
|
||||
case CPU_R12000:
|
||||
case CPU_R14000:
|
||||
case CPU_4KC:
|
||||
case CPU_SB1:
|
||||
case CPU_SB1A:
|
||||
@ -906,6 +907,7 @@ static __init void build_tlb_write_entry(u32 **p, struct label **l,
|
||||
case CPU_4KEC:
|
||||
case CPU_24K:
|
||||
case CPU_34K:
|
||||
case CPU_74K:
|
||||
i_ehb(p);
|
||||
tlbw(p);
|
||||
break;
|
||||
|
@ -80,6 +80,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||
case CPU_24K:
|
||||
case CPU_25KF:
|
||||
case CPU_34K:
|
||||
case CPU_74K:
|
||||
case CPU_SB1:
|
||||
case CPU_SB1A:
|
||||
lmodel = &op_model_mipsxx;
|
||||
|
@ -205,6 +205,10 @@ static int __init mipsxx_init(void)
|
||||
case CPU_34K:
|
||||
op_model_mipsxx.cpu_type = "mips/34K";
|
||||
break;
|
||||
|
||||
case CPU_74K:
|
||||
op_model_mipsxx.cpu_type = "mips/74K";
|
||||
break;
|
||||
#endif
|
||||
|
||||
case CPU_5KC:
|
||||
|
@ -1975,10 +1975,45 @@ static void __init flatten_device_tree(void)
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void __init fixup_device_tree(void)
|
||||
#ifdef CONFIG_PPC_MAPLE
|
||||
/* PIBS Version 1.05.0000 04/26/2005 has an incorrect /ht/isa/ranges property.
|
||||
* The values are bad, and it doesn't even have the right number of cells. */
|
||||
static void __init fixup_device_tree_maple(void)
|
||||
{
|
||||
phandle isa;
|
||||
u32 isa_ranges[6];
|
||||
|
||||
isa = call_prom("finddevice", 1, 1, ADDR("/ht@0/isa@4"));
|
||||
if (!PHANDLE_VALID(isa))
|
||||
return;
|
||||
|
||||
if (prom_getprop(isa, "ranges", isa_ranges, sizeof(isa_ranges))
|
||||
== PROM_ERROR)
|
||||
return;
|
||||
|
||||
if (isa_ranges[0] != 0x1 ||
|
||||
isa_ranges[1] != 0xf4000000 ||
|
||||
isa_ranges[2] != 0x00010000)
|
||||
return;
|
||||
|
||||
prom_printf("fixing up bogus ISA range on Maple...\n");
|
||||
|
||||
isa_ranges[0] = 0x1;
|
||||
isa_ranges[1] = 0x0;
|
||||
isa_ranges[2] = 0x01002000; /* IO space; PCI device = 4 */
|
||||
isa_ranges[3] = 0x0;
|
||||
isa_ranges[4] = 0x0;
|
||||
isa_ranges[5] = 0x00010000;
|
||||
prom_setprop(isa, "/ht@0/isa@4", "ranges",
|
||||
isa_ranges, sizeof(isa_ranges));
|
||||
}
|
||||
#else
|
||||
#define fixup_device_tree_maple()
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PPC64) && defined(CONFIG_PPC_PMAC)
|
||||
static void __init fixup_device_tree_pmac(void)
|
||||
{
|
||||
phandle u3, i2c, mpic;
|
||||
u32 u3_rev;
|
||||
u32 interrupts[2];
|
||||
@ -2015,9 +2050,16 @@ static void __init fixup_device_tree(void)
|
||||
parent = (u32)mpic;
|
||||
prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent",
|
||||
&parent, sizeof(parent));
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
#define fixup_device_tree_pmac()
|
||||
#endif
|
||||
|
||||
static void __init fixup_device_tree(void)
|
||||
{
|
||||
fixup_device_tree_maple();
|
||||
fixup_device_tree_pmac();
|
||||
}
|
||||
|
||||
static void __init prom_find_boot_cpu(void)
|
||||
{
|
||||
|
@ -338,6 +338,8 @@ SYSCALL(symlinkat)
|
||||
SYSCALL(readlinkat)
|
||||
SYSCALL(fchmodat)
|
||||
SYSCALL(faccessat)
|
||||
COMPAT_SYS(get_robust_list)
|
||||
COMPAT_SYS(set_robust_list)
|
||||
|
||||
/*
|
||||
* please add new calls to arch/powerpc/platforms/cell/spu_callbacks.c
|
||||
|
@ -258,6 +258,7 @@ void *spu_syscall_table[] = {
|
||||
[__NR_futex] sys_futex,
|
||||
[__NR_sched_setaffinity] sys_sched_setaffinity,
|
||||
[__NR_sched_getaffinity] sys_sched_getaffinity,
|
||||
[224] sys_ni_syscall,
|
||||
[__NR_tuxcall] sys_ni_syscall,
|
||||
[226] sys_ni_syscall,
|
||||
[__NR_io_setup] sys_io_setup,
|
||||
@ -332,19 +333,21 @@ void *spu_syscall_table[] = {
|
||||
[__NR_readlinkat] sys_readlinkat,
|
||||
[__NR_fchmodat] sys_fchmodat,
|
||||
[__NR_faccessat] sys_faccessat,
|
||||
[__NR_get_robust_list] sys_get_robust_list,
|
||||
[__NR_set_robust_list] sys_set_robust_list,
|
||||
};
|
||||
|
||||
long spu_sys_callback(struct spu_syscall_block *s)
|
||||
{
|
||||
long (*syscall)(u64 a1, u64 a2, u64 a3, u64 a4, u64 a5, u64 a6);
|
||||
|
||||
syscall = spu_syscall_table[s->nr_ret];
|
||||
|
||||
if (s->nr_ret >= ARRAY_SIZE(spu_syscall_table)) {
|
||||
pr_debug("%s: invalid syscall #%ld", __FUNCTION__, s->nr_ret);
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
syscall = spu_syscall_table[s->nr_ret];
|
||||
|
||||
#ifdef DEBUG
|
||||
print_symbol(KERN_DEBUG "SPU-syscall %s:", (unsigned long)syscall);
|
||||
printk("syscall%ld(%lx, %lx, %lx, %lx, %lx, %lx)\n",
|
||||
|
@ -1157,6 +1157,7 @@ EXPORT_SYMBOL_GPL(pmac_i2c_xfer);
|
||||
/* some quirks for platform function decoding */
|
||||
enum {
|
||||
pmac_i2c_quirk_invmask = 0x00000001u,
|
||||
pmac_i2c_quirk_skip = 0x00000002u,
|
||||
};
|
||||
|
||||
static void pmac_i2c_devscan(void (*callback)(struct device_node *dev,
|
||||
@ -1172,6 +1173,15 @@ static void pmac_i2c_devscan(void (*callback)(struct device_node *dev,
|
||||
/* XXX Study device-tree's & apple drivers are get the quirks
|
||||
* right !
|
||||
*/
|
||||
/* Workaround: It seems that running the clockspreading
|
||||
* properties on the eMac will cause lockups during boot.
|
||||
* The machine seems to work fine without that. So for now,
|
||||
* let's make sure i2c-hwclock doesn't match about "imic"
|
||||
* clocks and we'll figure out if we really need to do
|
||||
* something special about those later.
|
||||
*/
|
||||
{ "i2c-hwclock", "imic5002", pmac_i2c_quirk_skip },
|
||||
{ "i2c-hwclock", "imic5003", pmac_i2c_quirk_skip },
|
||||
{ "i2c-hwclock", NULL, pmac_i2c_quirk_invmask },
|
||||
{ "i2c-cpu-voltage", NULL, 0},
|
||||
{ "temp-monitor", NULL, 0 },
|
||||
@ -1198,6 +1208,8 @@ static void pmac_i2c_devscan(void (*callback)(struct device_node *dev,
|
||||
if (p->compatible &&
|
||||
!device_is_compatible(np, p->compatible))
|
||||
continue;
|
||||
if (p->quirks & pmac_i2c_quirk_skip)
|
||||
break;
|
||||
callback(np, p->quirks);
|
||||
break;
|
||||
}
|
||||
|
@ -463,11 +463,23 @@ static int pmac_pm_finish(suspend_state_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pmac_pm_valid(suspend_state_t state)
|
||||
{
|
||||
switch (state) {
|
||||
case PM_SUSPEND_DISK:
|
||||
return 1;
|
||||
/* can't do any other states via generic mechanism yet */
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static struct pm_ops pmac_pm_ops = {
|
||||
.pm_disk_mode = PM_DISK_SHUTDOWN,
|
||||
.prepare = pmac_pm_prepare,
|
||||
.enter = pmac_pm_enter,
|
||||
.finish = pmac_pm_finish,
|
||||
.valid = pmac_pm_valid,
|
||||
};
|
||||
|
||||
#endif /* CONFIG_SOFTWARE_SUSPEND */
|
||||
|
@ -134,7 +134,7 @@ main(void)
|
||||
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
||||
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
||||
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
||||
DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, flags));
|
||||
DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags));
|
||||
DEFINE(TI_CPU, offsetof(struct thread_info, cpu));
|
||||
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
|
||||
|
||||
|
@ -279,11 +279,11 @@ static int mpc8272ads_platform_notify(struct device *dev)
|
||||
static const struct platform_notify_dev_map dev_map[] = {
|
||||
{
|
||||
.bus_id = "fsl-cpm-fcc",
|
||||
.rtn = mpc8272ads_fixup_enet_pdata
|
||||
.rtn = mpc8272ads_fixup_enet_pdata,
|
||||
},
|
||||
{
|
||||
.bus_id = "fsl-cpm-scc:uart",
|
||||
.rtn = mpc
|
||||
.rtn = mpc8272ads_fixup_uart_pdata,
|
||||
},
|
||||
{
|
||||
.bus_id = NULL
|
||||
@ -335,15 +335,15 @@ struct platform_device* early_uart_get_pdev(int index)
|
||||
struct platform_device* pdev = NULL;
|
||||
if(index) { /*assume SCC4 here*/
|
||||
pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC4];
|
||||
pinfo = &mpc8272<F12>_uart_pdata[1];
|
||||
pinfo = &mpc8272_uart_pdata[fsid_scc4_uart];
|
||||
} else { /*over SCC1*/
|
||||
pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC1];
|
||||
pinfo = &mpc8272_uart_pdata[0];
|
||||
pinfo = &mpc8272_uart_pdata[fsid_scc1_uart];
|
||||
}
|
||||
|
||||
pinfo->uart_clk = bd->bi_intfreq;
|
||||
pdev->dev.platform_data = pinfo;
|
||||
ppc_sys_fixup_mem_resource(pdev, IMAP_ADDR);
|
||||
ppc_sys_fixup_mem_resource(pdev, CPM_MAP_ADDR);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -121,13 +121,13 @@ struct platform_device ppc_sys_platform_devices[] = {
|
||||
.num_resources = 3,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "scc_mem",
|
||||
.name = "regs",
|
||||
.start = 0x11A00,
|
||||
.end = 0x11A1F,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "scc_pram",
|
||||
.name = "pram",
|
||||
.start = 0x8000,
|
||||
.end = 0x80ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
@ -145,13 +145,13 @@ struct platform_device ppc_sys_platform_devices[] = {
|
||||
.num_resources = 3,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "scc_mem",
|
||||
.name = "regs",
|
||||
.start = 0x11A20,
|
||||
.end = 0x11A3F,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "scc_pram",
|
||||
.name = "pram",
|
||||
.start = 0x8100,
|
||||
.end = 0x81ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
@ -169,13 +169,13 @@ struct platform_device ppc_sys_platform_devices[] = {
|
||||
.num_resources = 3,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "scc_mem",
|
||||
.name = "regs",
|
||||
.start = 0x11A40,
|
||||
.end = 0x11A5F,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "scc_pram",
|
||||
.name = "pram",
|
||||
.start = 0x8200,
|
||||
.end = 0x82ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
@ -193,13 +193,13 @@ struct platform_device ppc_sys_platform_devices[] = {
|
||||
.num_resources = 3,
|
||||
.resource = (struct resource[]) {
|
||||
{
|
||||
.name = "scc_mem",
|
||||
.name = "regs",
|
||||
.start = 0x11A60,
|
||||
.end = 0x11A7F,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.name = "scc_pram",
|
||||
.name = "pram",
|
||||
.start = 0x8300,
|
||||
.end = 0x83ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
|
@ -139,13 +139,13 @@ struct ppc_sys_spec ppc_sys_specs[] = {
|
||||
.ppc_sys_name = "8272",
|
||||
.mask = 0x0000ff00,
|
||||
.value = 0x00000c00,
|
||||
.num_devices = 11,
|
||||
.num_devices = 12,
|
||||
.device_list = (enum ppc_sys_devices[])
|
||||
{
|
||||
MPC82xx_CPM_FCC1, MPC82xx_CPM_FCC2, MPC82xx_CPM_SCC1,
|
||||
MPC82xx_CPM_SCC2, MPC82xx_CPM_SCC3, MPC82xx_CPM_SMC1,
|
||||
MPC82xx_CPM_SMC2, MPC82xx_CPM_SPI, MPC82xx_CPM_I2C,
|
||||
MPC82xx_CPM_USB, MPC82xx_SEC1,
|
||||
MPC82xx_CPM_SCC2, MPC82xx_CPM_SCC3, MPC82xx_CPM_SCC4,
|
||||
MPC82xx_CPM_SMC1, MPC82xx_CPM_SMC2, MPC82xx_CPM_SPI,
|
||||
MPC82xx_CPM_I2C, MPC82xx_CPM_USB, MPC82xx_SEC1,
|
||||
},
|
||||
},
|
||||
/* below is a list of the 8280 family of processors */
|
||||
|
@ -272,7 +272,7 @@ static inline void stop_hz_timer(void)
|
||||
next = next_timer_interrupt();
|
||||
do {
|
||||
seq = read_seqbegin_irqsave(&xtime_lock, flags);
|
||||
timer = (__u64)(next - jiffies) + jiffies_64;
|
||||
timer = ((__u64) next) - ((__u64) jiffies) + jiffies_64;
|
||||
} while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
|
||||
todval = -1ULL;
|
||||
/* Be careful about overflows. */
|
||||
|
@ -79,6 +79,7 @@ sys_call_table:
|
||||
/*285*/ .long sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64
|
||||
/*290*/ .long sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
/*295*/ .long sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare
|
||||
/*300*/ .long sys_set_robust_list, sys_get_robust_list
|
||||
|
||||
#ifdef CONFIG_SUNOS_EMUL
|
||||
/* Now the SunOS syscall table. */
|
||||
@ -190,6 +191,6 @@ sunos_sys_table:
|
||||
/*290*/ .long sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.long sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.long sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.long sunos_nosys
|
||||
.long sunos_nosys, sunos_nosys, sunos_nosys
|
||||
|
||||
#endif
|
||||
|
@ -218,7 +218,7 @@ static inline void iommu_free_ctx(struct pci_iommu *iommu, int ctx)
|
||||
* DMA for PCI device PDEV. Return non-NULL cpu-side address if
|
||||
* successful and set *DMA_ADDRP to the PCI side dma address.
|
||||
*/
|
||||
static void *pci_4u_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp)
|
||||
static void *pci_4u_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp, gfp_t gfp)
|
||||
{
|
||||
struct pcidev_cookie *pcp;
|
||||
struct pci_iommu *iommu;
|
||||
@ -232,7 +232,7 @@ static void *pci_4u_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr
|
||||
if (order >= 10)
|
||||
return NULL;
|
||||
|
||||
first_page = __get_free_pages(GFP_ATOMIC, order);
|
||||
first_page = __get_free_pages(gfp, order);
|
||||
if (first_page == 0UL)
|
||||
return NULL;
|
||||
memset((char *)first_page, 0, PAGE_SIZE << order);
|
||||
|
@ -154,7 +154,7 @@ static void pci_arena_free(struct pci_iommu_arena *arena, unsigned long base, un
|
||||
__clear_bit(i, arena->map);
|
||||
}
|
||||
|
||||
static void *pci_4v_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp)
|
||||
static void *pci_4v_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp, gfp_t gfp)
|
||||
{
|
||||
struct pcidev_cookie *pcp;
|
||||
struct pci_iommu *iommu;
|
||||
@ -169,7 +169,7 @@ static void *pci_4v_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr
|
||||
|
||||
npages = size >> IO_PAGE_SHIFT;
|
||||
|
||||
first_page = __get_free_pages(GFP_ATOMIC, order);
|
||||
first_page = __get_free_pages(gfp, order);
|
||||
if (unlikely(first_page == 0UL))
|
||||
return NULL;
|
||||
|
||||
|
@ -78,8 +78,9 @@ sys_call_table32:
|
||||
.word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid
|
||||
/*280*/ .word sys32_tee, sys_add_key, sys_request_key, sys_keyctl, compat_sys_openat
|
||||
.word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64
|
||||
/*285*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
/*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
.word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare
|
||||
/*300*/ .word compat_sys_set_robust_list, compat_sys_get_robust_list
|
||||
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
@ -147,8 +148,9 @@ sys_call_table:
|
||||
.word sys_mq_timedsend, sys_mq_timedreceive, sys_mq_notify, sys_mq_getsetattr, sys_waitid
|
||||
/*280*/ .word sys_tee, sys_add_key, sys_request_key, sys_keyctl, sys_openat
|
||||
.word sys_mkdirat, sys_mknodat, sys_fchownat, sys_futimesat, sys_fstatat64
|
||||
/*285*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
/*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
.word sys_fchmodat, sys_faccessat, sys_pselect6, sys_ppoll, sys_unshare
|
||||
/*300*/ .word sys_set_robust_list, sys_get_robust_list
|
||||
|
||||
#if defined(CONFIG_SUNOS_EMUL) || defined(CONFIG_SOLARIS_EMUL) || \
|
||||
defined(CONFIG_SOLARIS_EMUL_MODULE)
|
||||
@ -261,5 +263,5 @@ sunos_sys_table:
|
||||
/*290*/ .word sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.word sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.word sunos_nosys, sunos_nosys, sunos_nosys
|
||||
.word sunos_nosys
|
||||
.word sunos_nosys, sunos_nosys, sunos_nosys
|
||||
#endif
|
||||
|
@ -339,7 +339,7 @@ int ia32_setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top,
|
||||
struct mm_struct *mm = current->mm;
|
||||
int i, ret;
|
||||
|
||||
stack_base = IA32_STACK_TOP - MAX_ARG_PAGES * PAGE_SIZE;
|
||||
stack_base = stack_top - MAX_ARG_PAGES * PAGE_SIZE;
|
||||
mm->arg_start = bprm->p + stack_base;
|
||||
|
||||
bprm->p += stack_base;
|
||||
@ -357,7 +357,7 @@ int ia32_setup_arg_pages(struct linux_binprm *bprm, unsigned long stack_top,
|
||||
{
|
||||
mpnt->vm_mm = mm;
|
||||
mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
|
||||
mpnt->vm_end = IA32_STACK_TOP;
|
||||
mpnt->vm_end = stack_top;
|
||||
if (executable_stack == EXSTACK_ENABLE_X)
|
||||
mpnt->vm_flags = VM_STACK_FLAGS | VM_EXEC;
|
||||
else if (executable_stack == EXSTACK_DISABLE_X)
|
||||
|
@ -149,7 +149,7 @@ unsigned long __init find_e820_area(unsigned long start, unsigned long end, unsi
|
||||
addr = start;
|
||||
if (addr > ei->addr + ei->size)
|
||||
continue;
|
||||
while (bad_addr(&addr, size) && addr+size < ei->addr + ei->size)
|
||||
while (bad_addr(&addr, size) && addr+size <= ei->addr+ei->size)
|
||||
;
|
||||
last = addr + size;
|
||||
if (last > ei->addr + ei->size)
|
||||
|
@ -281,12 +281,7 @@ tracesys:
|
||||
ja 1f
|
||||
movq %r10,%rcx /* fixup for C */
|
||||
call *sys_call_table(,%rax,8)
|
||||
movq %rax,RAX-ARGOFFSET(%rsp)
|
||||
1: SAVE_REST
|
||||
movq %rsp,%rdi
|
||||
call syscall_trace_leave
|
||||
RESTORE_TOP_OF_STACK %rbx
|
||||
RESTORE_REST
|
||||
1: movq %rax,RAX-ARGOFFSET(%rsp)
|
||||
/* Use IRET because user could have changed frame */
|
||||
jmp int_ret_from_sys_call
|
||||
CFI_ENDPROC
|
||||
|
@ -514,13 +514,13 @@ static void __kprobes resume_execution(struct kprobe *p,
|
||||
*tos = orig_rip + (*tos - copy_rip);
|
||||
break;
|
||||
case 0xff:
|
||||
if ((*insn & 0x30) == 0x10) {
|
||||
if ((insn[1] & 0x30) == 0x10) {
|
||||
/* call absolute, indirect */
|
||||
/* Fix return addr; rip is correct. */
|
||||
next_rip = regs->rip;
|
||||
*tos = orig_rip + (*tos - copy_rip);
|
||||
} else if (((*insn & 0x31) == 0x20) || /* jmp near, absolute indirect */
|
||||
((*insn & 0x31) == 0x21)) { /* jmp far, absolute indirect */
|
||||
} else if (((insn[1] & 0x31) == 0x20) || /* jmp near, absolute indirect */
|
||||
((insn[1] & 0x31) == 0x21)) { /* jmp far, absolute indirect */
|
||||
/* rip is correct. */
|
||||
next_rip = regs->rip;
|
||||
}
|
||||
|
@ -54,6 +54,10 @@ dma_alloc_pages(struct device *dev, gfp_t gfp, unsigned order)
|
||||
else
|
||||
#endif
|
||||
node = numa_node_id();
|
||||
|
||||
if (node < first_node(node_online_map))
|
||||
node = first_node(node_online_map);
|
||||
|
||||
page = alloc_pages_node(node, gfp, order);
|
||||
return page ? page_address(page) : NULL;
|
||||
}
|
||||
|
@ -631,10 +631,8 @@ static int __init pci_iommu_init(void)
|
||||
printk(KERN_INFO "PCI-DMA: Disabling IOMMU.\n");
|
||||
if (end_pfn > MAX_DMA32_PFN) {
|
||||
printk(KERN_ERR "WARNING more than 4GB of memory "
|
||||
"but IOMMU not compiled in.\n"
|
||||
KERN_ERR "WARNING 32bit PCI may malfunction.\n"
|
||||
KERN_ERR "You might want to enable "
|
||||
"CONFIG_GART_IOMMU\n");
|
||||
"but IOMMU not available.\n"
|
||||
KERN_ERR "WARNING 32bit PCI may malfunction.\n");
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ int pmtimer_mark_offset(void)
|
||||
offset_delay = delta % (USEC_PER_SEC / HZ);
|
||||
|
||||
rdtscll(tsc);
|
||||
vxtime.last_tsc = tsc - offset_delay * cpu_khz;
|
||||
vxtime.last_tsc = tsc - offset_delay * (u64)cpu_khz / 1000;
|
||||
|
||||
/* don't calculate delay for first run,
|
||||
or if we've got less then a tick */
|
||||
|
@ -1051,7 +1051,7 @@ static void srat_detect_node(void)
|
||||
for now. */
|
||||
node = apicid_to_node[hard_smp_processor_id()];
|
||||
if (node == NUMA_NO_NODE)
|
||||
node = 0;
|
||||
node = first_node(node_online_map);
|
||||
numa_set_node(cpu, node);
|
||||
|
||||
if (acpi_numa > 0)
|
||||
|
@ -399,8 +399,10 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end)
|
||||
/* First clean up the node list */
|
||||
for (i = 0; i < MAX_NUMNODES; i++) {
|
||||
cutoff_node(i, start, end);
|
||||
if ((nodes[i].end - nodes[i].start) < NODE_MIN_SIZE)
|
||||
if ((nodes[i].end - nodes[i].start) < NODE_MIN_SIZE) {
|
||||
unparse_node(i);
|
||||
node_set_offline(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (acpi_numa <= 0)
|
||||
|
@ -33,7 +33,7 @@ static int cfq_slice_idle = HZ / 70;
|
||||
|
||||
#define CFQ_KEY_ASYNC (0)
|
||||
|
||||
static DEFINE_RWLOCK(cfq_exit_lock);
|
||||
static DEFINE_SPINLOCK(cfq_exit_lock);
|
||||
|
||||
/*
|
||||
* for the hash of cfqq inside the cfqd
|
||||
@ -1284,7 +1284,7 @@ static void cfq_exit_io_context(struct io_context *ioc)
|
||||
/*
|
||||
* put the reference this task is holding to the various queues
|
||||
*/
|
||||
read_lock_irqsave(&cfq_exit_lock, flags);
|
||||
spin_lock_irqsave(&cfq_exit_lock, flags);
|
||||
|
||||
n = rb_first(&ioc->cic_root);
|
||||
while (n != NULL) {
|
||||
@ -1294,7 +1294,7 @@ static void cfq_exit_io_context(struct io_context *ioc)
|
||||
n = rb_next(n);
|
||||
}
|
||||
|
||||
read_unlock_irqrestore(&cfq_exit_lock, flags);
|
||||
spin_unlock_irqrestore(&cfq_exit_lock, flags);
|
||||
}
|
||||
|
||||
static struct cfq_io_context *
|
||||
@ -1400,17 +1400,17 @@ static int cfq_ioc_set_ioprio(struct io_context *ioc, unsigned int ioprio)
|
||||
struct cfq_io_context *cic;
|
||||
struct rb_node *n;
|
||||
|
||||
write_lock(&cfq_exit_lock);
|
||||
spin_lock(&cfq_exit_lock);
|
||||
|
||||
n = rb_first(&ioc->cic_root);
|
||||
while (n != NULL) {
|
||||
cic = rb_entry(n, struct cfq_io_context, rb_node);
|
||||
|
||||
|
||||
changed_ioprio(cic);
|
||||
n = rb_next(n);
|
||||
}
|
||||
|
||||
write_unlock(&cfq_exit_lock);
|
||||
spin_unlock(&cfq_exit_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1475,9 +1475,10 @@ out:
|
||||
static void
|
||||
cfq_drop_dead_cic(struct io_context *ioc, struct cfq_io_context *cic)
|
||||
{
|
||||
read_lock(&cfq_exit_lock);
|
||||
spin_lock(&cfq_exit_lock);
|
||||
rb_erase(&cic->rb_node, &ioc->cic_root);
|
||||
read_unlock(&cfq_exit_lock);
|
||||
list_del_init(&cic->queue_list);
|
||||
spin_unlock(&cfq_exit_lock);
|
||||
kmem_cache_free(cfq_ioc_pool, cic);
|
||||
atomic_dec(&ioc_count);
|
||||
}
|
||||
@ -1545,11 +1546,11 @@ restart:
|
||||
BUG();
|
||||
}
|
||||
|
||||
read_lock(&cfq_exit_lock);
|
||||
spin_lock(&cfq_exit_lock);
|
||||
rb_link_node(&cic->rb_node, parent, p);
|
||||
rb_insert_color(&cic->rb_node, &ioc->cic_root);
|
||||
list_add(&cic->queue_list, &cfqd->cic_list);
|
||||
read_unlock(&cfq_exit_lock);
|
||||
spin_unlock(&cfq_exit_lock);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -2187,7 +2188,7 @@ static void cfq_exit_queue(elevator_t *e)
|
||||
|
||||
cfq_shutdown_timer_wq(cfqd);
|
||||
|
||||
write_lock(&cfq_exit_lock);
|
||||
spin_lock(&cfq_exit_lock);
|
||||
spin_lock_irq(q->queue_lock);
|
||||
|
||||
if (cfqd->active_queue)
|
||||
@ -2210,7 +2211,7 @@ static void cfq_exit_queue(elevator_t *e)
|
||||
}
|
||||
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
write_unlock(&cfq_exit_lock);
|
||||
spin_unlock(&cfq_exit_lock);
|
||||
|
||||
cfq_shutdown_timer_wq(cfqd);
|
||||
|
||||
|
@ -3452,7 +3452,12 @@ void end_that_request_last(struct request *req, int uptodate)
|
||||
if (unlikely(laptop_mode) && blk_fs_request(req))
|
||||
laptop_io_completion();
|
||||
|
||||
if (disk && blk_fs_request(req)) {
|
||||
/*
|
||||
* Account IO completion. bar_rq isn't accounted as a normal
|
||||
* IO on queueing nor completion. Accounting the containing
|
||||
* request is enough.
|
||||
*/
|
||||
if (disk && blk_fs_request(req) && req != &req->q->bar_rq) {
|
||||
unsigned long duration = jiffies - req->start_time;
|
||||
const int rw = rq_data_dir(req);
|
||||
|
||||
|
@ -86,18 +86,9 @@ firmware_timeout_store(struct class *class, const char *buf, size_t count)
|
||||
static CLASS_ATTR(timeout, 0644, firmware_timeout_show, firmware_timeout_store);
|
||||
|
||||
static void fw_class_dev_release(struct class_device *class_dev);
|
||||
int firmware_class_uevent(struct class_device *dev, char **envp,
|
||||
int num_envp, char *buffer, int buffer_size);
|
||||
|
||||
static struct class firmware_class = {
|
||||
.name = "firmware",
|
||||
.uevent = firmware_class_uevent,
|
||||
.release = fw_class_dev_release,
|
||||
};
|
||||
|
||||
int
|
||||
firmware_class_uevent(struct class_device *class_dev, char **envp,
|
||||
int num_envp, char *buffer, int buffer_size)
|
||||
static int firmware_class_uevent(struct class_device *class_dev, char **envp,
|
||||
int num_envp, char *buffer, int buffer_size)
|
||||
{
|
||||
struct firmware_priv *fw_priv = class_get_devdata(class_dev);
|
||||
int i = 0, len = 0;
|
||||
@ -116,6 +107,12 @@ firmware_class_uevent(struct class_device *class_dev, char **envp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct class firmware_class = {
|
||||
.name = "firmware",
|
||||
.uevent = firmware_class_uevent,
|
||||
.release = fw_class_dev_release,
|
||||
};
|
||||
|
||||
static ssize_t
|
||||
firmware_loading_show(struct class_device *class_dev, char *buf)
|
||||
{
|
||||
@ -493,25 +490,6 @@ release_firmware(const struct firmware *fw)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* register_firmware: - provide a firmware image for later usage
|
||||
* @name: name of firmware image file
|
||||
* @data: buffer pointer for the firmware image
|
||||
* @size: size of the data buffer area
|
||||
*
|
||||
* Make sure that @data will be available by requesting firmware @name.
|
||||
*
|
||||
* Note: This will not be possible until some kind of persistence
|
||||
* is available.
|
||||
**/
|
||||
void
|
||||
register_firmware(const char *name, const u8 *data, size_t size)
|
||||
{
|
||||
/* This is meaningless without firmware caching, so until we
|
||||
* decide if firmware caching is reasonable just leave it as a
|
||||
* noop */
|
||||
}
|
||||
|
||||
/* Async support */
|
||||
struct firmware_work {
|
||||
struct work_struct work;
|
||||
@ -630,4 +608,3 @@ module_exit(firmware_class_exit);
|
||||
EXPORT_SYMBOL(release_firmware);
|
||||
EXPORT_SYMBOL(request_firmware);
|
||||
EXPORT_SYMBOL(request_firmware_nowait);
|
||||
EXPORT_SYMBOL(register_firmware);
|
||||
|
@ -8,7 +8,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/vt_kern.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/pm.h>
|
||||
@ -66,6 +65,7 @@ int suspend_device(struct device * dev, pm_message_t state)
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* device_suspend - Save state and stop all devices in system.
|
||||
* @state: Power state to put each device in.
|
||||
@ -85,9 +85,6 @@ int device_suspend(pm_message_t state)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
if (!is_console_suspend_safe())
|
||||
return -EINVAL;
|
||||
|
||||
down(&dpm_sem);
|
||||
down(&dpm_list_sem);
|
||||
while (!list_empty(&dpm_active) && error == 0) {
|
||||
|
@ -86,7 +86,7 @@ config AGP_NVIDIA
|
||||
|
||||
config AGP_SIS
|
||||
tristate "SiS chipset support"
|
||||
depends on AGP && X86_32
|
||||
depends on AGP
|
||||
help
|
||||
This option gives you AGP support for the GLX component of
|
||||
X on Silicon Integrated Systems [SiS] chipsets.
|
||||
|
@ -617,6 +617,9 @@ static int agp_amd64_resume(struct pci_dev *pdev)
|
||||
pci_set_power_state(pdev, PCI_D0);
|
||||
pci_restore_state(pdev);
|
||||
|
||||
if (pdev->vendor == PCI_VENDOR_ID_NVIDIA)
|
||||
nforce3_agp_init(pdev);
|
||||
|
||||
return amd_8151_configure();
|
||||
}
|
||||
|
||||
|
@ -345,6 +345,12 @@ static struct agp_device_ids via_agp_device_ids[] __devinitdata =
|
||||
.chipset_name = "PT880",
|
||||
},
|
||||
|
||||
/* PT880 Ultra */
|
||||
{
|
||||
.device_id = PCI_DEVICE_ID_VIA_PT880ULTRA,
|
||||
.chipset_name = "PT880 Ultra",
|
||||
},
|
||||
|
||||
/* PT890 */
|
||||
{
|
||||
.device_id = PCI_DEVICE_ID_VIA_8783_0,
|
||||
@ -511,6 +517,7 @@ static struct pci_device_id agp_via_pci_table[] = {
|
||||
ID(PCI_DEVICE_ID_VIA_8763_0),
|
||||
ID(PCI_DEVICE_ID_VIA_8378_0),
|
||||
ID(PCI_DEVICE_ID_VIA_PT880),
|
||||
ID(PCI_DEVICE_ID_VIA_PT880ULTRA),
|
||||
ID(PCI_DEVICE_ID_VIA_8783_0),
|
||||
ID(PCI_DEVICE_ID_VIA_PX8X0_0),
|
||||
ID(PCI_DEVICE_ID_VIA_3269_0),
|
||||
|
@ -1184,20 +1184,20 @@ static void port_outl(struct si_sm_io *io, unsigned int offset,
|
||||
static void port_cleanup(struct smi_info *info)
|
||||
{
|
||||
unsigned int addr = info->io.addr_data;
|
||||
int mapsize;
|
||||
int idx;
|
||||
|
||||
if (addr) {
|
||||
mapsize = ((info->io_size * info->io.regspacing)
|
||||
- (info->io.regspacing - info->io.regsize));
|
||||
|
||||
release_region (addr, mapsize);
|
||||
for (idx = 0; idx < info->io_size; idx++) {
|
||||
release_region(addr + idx * info->io.regspacing,
|
||||
info->io.regsize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int port_setup(struct smi_info *info)
|
||||
{
|
||||
unsigned int addr = info->io.addr_data;
|
||||
int mapsize;
|
||||
int idx;
|
||||
|
||||
if (!addr)
|
||||
return -ENODEV;
|
||||
@ -1225,16 +1225,22 @@ static int port_setup(struct smi_info *info)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Calculate the total amount of memory to claim. This is an
|
||||
* unusual looking calculation, but it avoids claiming any
|
||||
* more memory than it has to. It will claim everything
|
||||
* between the first address to the end of the last full
|
||||
* register. */
|
||||
mapsize = ((info->io_size * info->io.regspacing)
|
||||
- (info->io.regspacing - info->io.regsize));
|
||||
|
||||
if (request_region(addr, mapsize, DEVICE_NAME) == NULL)
|
||||
return -EIO;
|
||||
/* Some BIOSes reserve disjoint I/O regions in their ACPI
|
||||
* tables. This causes problems when trying to register the
|
||||
* entire I/O region. Therefore we must register each I/O
|
||||
* port separately.
|
||||
*/
|
||||
for (idx = 0; idx < info->io_size; idx++) {
|
||||
if (request_region(addr + idx * info->io.regspacing,
|
||||
info->io.regsize, DEVICE_NAME) == NULL) {
|
||||
/* Undo allocations */
|
||||
while (idx--) {
|
||||
release_region(addr + idx * info->io.regspacing,
|
||||
info->io.regsize);
|
||||
}
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -105,6 +105,12 @@ static const char* tcpa_event_type_strings[] = {
|
||||
"Non-Host Info"
|
||||
};
|
||||
|
||||
struct tcpa_pc_event {
|
||||
u32 event_id;
|
||||
u32 event_size;
|
||||
u8 event_data[0];
|
||||
};
|
||||
|
||||
enum tcpa_pc_event_ids {
|
||||
SMBIOS = 1,
|
||||
BIS_CERT,
|
||||
@ -114,14 +120,15 @@ enum tcpa_pc_event_ids {
|
||||
NVRAM,
|
||||
OPTION_ROM_EXEC,
|
||||
OPTION_ROM_CONFIG,
|
||||
OPTION_ROM_MICROCODE,
|
||||
OPTION_ROM_MICROCODE = 10,
|
||||
S_CRTM_VERSION,
|
||||
S_CRTM_CONTENTS,
|
||||
POST_CONTENTS,
|
||||
HOST_TABLE_OF_DEVICES,
|
||||
};
|
||||
|
||||
static const char* tcpa_pc_event_id_strings[] = {
|
||||
""
|
||||
"",
|
||||
"SMBIOS",
|
||||
"BIS Certificate",
|
||||
"POST BIOS ",
|
||||
@ -130,11 +137,12 @@ static const char* tcpa_pc_event_id_strings[] = {
|
||||
"NVRAM",
|
||||
"Option ROM",
|
||||
"Option ROM config",
|
||||
"Option ROM microcode",
|
||||
"",
|
||||
"Option ROM microcode ",
|
||||
"S-CRTM Version",
|
||||
"S-CRTM Contents",
|
||||
"S-CRTM POST Contents",
|
||||
"POST Contents",
|
||||
"S-CRTM Contents ",
|
||||
"POST Contents ",
|
||||
"Table of Devices",
|
||||
};
|
||||
|
||||
/* returns pointer to start of pos. entry of tcg log */
|
||||
@ -206,7 +214,7 @@ static int get_event_name(char *dest, struct tcpa_event *event,
|
||||
const char *name = "";
|
||||
char data[40] = "";
|
||||
int i, n_len = 0, d_len = 0;
|
||||
u32 event_id;
|
||||
struct tcpa_pc_event *pc_event;
|
||||
|
||||
switch(event->event_type) {
|
||||
case PREBOOT:
|
||||
@ -235,31 +243,32 @@ static int get_event_name(char *dest, struct tcpa_event *event,
|
||||
}
|
||||
break;
|
||||
case EVENT_TAG:
|
||||
event_id = be32_to_cpu(*((u32 *)event_entry));
|
||||
pc_event = (struct tcpa_pc_event *)event_entry;
|
||||
|
||||
/* ToDo Row data -> Base64 */
|
||||
|
||||
switch (event_id) {
|
||||
switch (pc_event->event_id) {
|
||||
case SMBIOS:
|
||||
case BIS_CERT:
|
||||
case CMOS:
|
||||
case NVRAM:
|
||||
case OPTION_ROM_EXEC:
|
||||
case OPTION_ROM_CONFIG:
|
||||
case OPTION_ROM_MICROCODE:
|
||||
case S_CRTM_VERSION:
|
||||
case S_CRTM_CONTENTS:
|
||||
case POST_CONTENTS:
|
||||
name = tcpa_pc_event_id_strings[event_id];
|
||||
name = tcpa_pc_event_id_strings[pc_event->event_id];
|
||||
n_len = strlen(name);
|
||||
break;
|
||||
/* hash data */
|
||||
case POST_BIOS_ROM:
|
||||
case ESCD:
|
||||
name = tcpa_pc_event_id_strings[event_id];
|
||||
case OPTION_ROM_MICROCODE:
|
||||
case S_CRTM_CONTENTS:
|
||||
case POST_CONTENTS:
|
||||
name = tcpa_pc_event_id_strings[pc_event->event_id];
|
||||
n_len = strlen(name);
|
||||
for (i = 0; i < 20; i++)
|
||||
d_len += sprintf(data, "%02x",
|
||||
event_entry[8 + i]);
|
||||
d_len += sprintf(&data[2*i], "%02x",
|
||||
pc_event->event_data[i]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -275,53 +284,13 @@ static int get_event_name(char *dest, struct tcpa_event *event,
|
||||
|
||||
static int tpm_binary_bios_measurements_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct tcpa_event *event = v;
|
||||
char *data = v;
|
||||
int i;
|
||||
|
||||
char *eventname;
|
||||
char data[4];
|
||||
u32 help;
|
||||
int i, len;
|
||||
struct tcpa_event *event = (struct tcpa_event *) v;
|
||||
unsigned char *event_entry =
|
||||
(unsigned char *) (v + sizeof(struct tcpa_event));
|
||||
|
||||
eventname = kmalloc(MAX_TEXT_EVENT, GFP_KERNEL);
|
||||
if (!eventname) {
|
||||
printk(KERN_ERR "%s: ERROR - No Memory for event name\n ",
|
||||
__func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* 1st: PCR used is in little-endian format (4 bytes) */
|
||||
help = le32_to_cpu(event->pcr_index);
|
||||
memcpy(data, &help, 4);
|
||||
for (i = 0; i < 4; i++)
|
||||
for (i = 0; i < sizeof(struct tcpa_event) + event->event_size; i++)
|
||||
seq_putc(m, data[i]);
|
||||
|
||||
/* 2nd: SHA1 (20 bytes) */
|
||||
for (i = 0; i < 20; i++)
|
||||
seq_putc(m, event->pcr_value[i]);
|
||||
|
||||
/* 3rd: event type identifier (4 bytes) */
|
||||
help = le32_to_cpu(event->event_type);
|
||||
memcpy(data, &help, 4);
|
||||
for (i = 0; i < 4; i++)
|
||||
seq_putc(m, data[i]);
|
||||
|
||||
len = 0;
|
||||
|
||||
len += get_event_name(eventname, event, event_entry);
|
||||
|
||||
/* 4th: filename <= 255 + \'0' delimiter */
|
||||
if (len > TCG_EVENT_NAME_LEN_MAX)
|
||||
len = TCG_EVENT_NAME_LEN_MAX;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
seq_putc(m, eventname[i]);
|
||||
|
||||
/* 5th: delimiter */
|
||||
seq_putc(m, '\0');
|
||||
|
||||
kfree(eventname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -457,10 +457,6 @@ static int __devinit tpm_tis_pnp_init(struct pnp_dev *pnp_dev,
|
||||
}
|
||||
|
||||
vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0));
|
||||
if ((vendor & 0xFFFF) == 0xFFFF) {
|
||||
rc = -ENODEV;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
/* Default timeouts */
|
||||
chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
|
||||
|
@ -398,7 +398,7 @@ int tty_insert_flip_string_flags(struct tty_struct *tty,
|
||||
while (unlikely(size > copied));
|
||||
return copied;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tty_insert_flip_string_flags);
|
||||
EXPORT_SYMBOL(tty_insert_flip_string_flags);
|
||||
|
||||
void tty_schedule_flip(struct tty_struct *tty)
|
||||
{
|
||||
|
@ -3238,14 +3238,6 @@ void vcs_scr_writew(struct vc_data *vc, u16 val, u16 *org)
|
||||
}
|
||||
}
|
||||
|
||||
int is_console_suspend_safe(void)
|
||||
{
|
||||
/* It is unsafe to suspend devices while X has control of the
|
||||
* hardware. Make sure we are running on a kernel-controlled console.
|
||||
*/
|
||||
return vc_cons[fg_console].d->vc_mode == KD_TEXT;
|
||||
}
|
||||
|
||||
/*
|
||||
* Visible symbols for modules
|
||||
*/
|
||||
|
@ -33,11 +33,6 @@
|
||||
* 82801E (C-ICH) : document number 273599-001, 273645-002,
|
||||
* 82801EB (ICH5) : document number 252516-001, 252517-003,
|
||||
* 82801ER (ICH5R) : document number 252516-001, 252517-003,
|
||||
* 82801FB (ICH6) : document number 301473-002, 301474-007,
|
||||
* 82801FR (ICH6R) : document number 301473-002, 301474-007,
|
||||
* 82801FBM (ICH6-M) : document number 301473-002, 301474-007,
|
||||
* 82801FW (ICH6W) : document number 301473-001, 301474-007,
|
||||
* 82801FRW (ICH6RW) : document number 301473-001, 301474-007
|
||||
*
|
||||
* 20000710 Nils Faerber
|
||||
* Initial Version 0.01
|
||||
@ -66,6 +61,10 @@
|
||||
* 20050807 Wim Van Sebroeck <wim@iguana.be>
|
||||
* 0.08 Make sure that the watchdog is only "armed" when started.
|
||||
* (Kernel Bug 4251)
|
||||
* 20060416 Wim Van Sebroeck <wim@iguana.be>
|
||||
* 0.09 Remove support for the ICH6, ICH6R, ICH6-M, ICH6W and ICH6RW and
|
||||
* ICH7 chipsets. (See Kernel Bug 6031 - other code will support these
|
||||
* chipsets)
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -90,7 +89,7 @@
|
||||
#include "i8xx_tco.h"
|
||||
|
||||
/* Module and version information */
|
||||
#define TCO_VERSION "0.08"
|
||||
#define TCO_VERSION "0.09"
|
||||
#define TCO_MODULE_NAME "i8xx TCO timer"
|
||||
#define TCO_DRIVER_NAME TCO_MODULE_NAME ", v" TCO_VERSION
|
||||
#define PFX TCO_MODULE_NAME ": "
|
||||
@ -391,11 +390,6 @@ static struct pci_device_id i8xx_tco_pci_tbl[] = {
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_0, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_2, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_0, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_1, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1, PCI_ANY_ID, PCI_ANY_ID, },
|
||||
{ 0, }, /* End of list */
|
||||
};
|
||||
|
@ -423,6 +423,12 @@ static int s3c2410wdt_probe(struct platform_device *pdev)
|
||||
if (tmr_atboot && started == 0) {
|
||||
printk(KERN_INFO PFX "Starting Watchdog Timer\n");
|
||||
s3c2410wdt_start();
|
||||
} else if (!tmr_atboot) {
|
||||
/* if we're not enabling the watchdog, then ensure it is
|
||||
* disabled if it has been left running from the bootloader
|
||||
* or other source */
|
||||
|
||||
s3c2410wdt_stop();
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -377,7 +377,7 @@ static int __init sc1200wdt_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
printk(banner);
|
||||
printk("%s\n", banner);
|
||||
|
||||
spin_lock_init(&sc1200wdt_lock);
|
||||
sema_init(&open_sem, 1);
|
||||
|
@ -491,7 +491,7 @@ static struct pci_device_id divil_pci[] = {
|
||||
|
||||
#define MSR_LBAR_SMB 0x5140000B
|
||||
|
||||
static int scx200_add_cs553x(void)
|
||||
static __init int scx200_add_cs553x(void)
|
||||
{
|
||||
u32 low, hi;
|
||||
u32 smb_base;
|
||||
|
@ -345,17 +345,17 @@ sgiioc4_resetproc(ide_drive_t * drive)
|
||||
static u8
|
||||
sgiioc4_INB(unsigned long port)
|
||||
{
|
||||
u8 reg = (u8) inb(port);
|
||||
u8 reg = (u8) readb((void __iomem *) port);
|
||||
|
||||
if ((port & 0xFFF) == 0x11C) { /* Status register of IOC4 */
|
||||
if (reg & 0x51) { /* Not busy...check for interrupt */
|
||||
unsigned long other_ir = port - 0x110;
|
||||
unsigned int intr_reg = (u32) inl(other_ir);
|
||||
unsigned int intr_reg = (u32) readl((void __iomem *) other_ir);
|
||||
|
||||
/* Clear the Interrupt, Error bits on the IOC4 */
|
||||
if (intr_reg & 0x03) {
|
||||
outl(0x03, other_ir);
|
||||
intr_reg = (u32) inl(other_ir);
|
||||
writel(0x03, (void __iomem *) other_ir);
|
||||
intr_reg = (u32) readl((void __iomem *) other_ir);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -606,6 +606,12 @@ ide_init_sgiioc4(ide_hwif_t * hwif)
|
||||
hwif->ide_dma_host_off = &sgiioc4_ide_dma_host_off;
|
||||
hwif->ide_dma_lostirq = &sgiioc4_ide_dma_lostirq;
|
||||
hwif->ide_dma_timeout = &__ide_dma_timeout;
|
||||
|
||||
/*
|
||||
* The IOC4 uses MMIO rather than Port IO.
|
||||
* It also needs special workarounds for INB.
|
||||
*/
|
||||
default_hwif_mmiops(hwif);
|
||||
hwif->INB = &sgiioc4_INB;
|
||||
}
|
||||
|
||||
@ -743,6 +749,6 @@ ioc4_ide_exit(void)
|
||||
module_init(ioc4_ide_init);
|
||||
module_exit(ioc4_ide_exit);
|
||||
|
||||
MODULE_AUTHOR("Aniket Malatpure - Silicon Graphics Inc. (SGI)");
|
||||
MODULE_AUTHOR("Aniket Malatpure/Jeremy Higdon");
|
||||
MODULE_DESCRIPTION("IDE PCI driver module for SGI IOC4 Base-IO Card");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -553,6 +553,8 @@ pmac_ide_init_hwif_ports(hw_regs_t *hw,
|
||||
|
||||
if (irq != NULL)
|
||||
*irq = pmac_ide[ix].irq;
|
||||
|
||||
hw->dev = &pmac_ide[ix].mdev->ofdev.dev;
|
||||
}
|
||||
|
||||
#define PMAC_IDE_REG(x) ((void __iomem *)(IDE_DATA_REG+(x)))
|
||||
|
@ -211,8 +211,10 @@ void ib_umem_release_on_close(struct ib_device *dev, struct ib_umem *umem)
|
||||
*/
|
||||
|
||||
work = kmalloc(sizeof *work, GFP_KERNEL);
|
||||
if (!work)
|
||||
if (!work) {
|
||||
mmput(mm);
|
||||
return;
|
||||
}
|
||||
|
||||
INIT_WORK(&work->work, ib_umem_account, work);
|
||||
work->mm = mm;
|
||||
|
@ -1905,19 +1905,19 @@ static void __exit infinipath_cleanup(void)
|
||||
} else
|
||||
ipath_dbg("irq is 0, not doing free_irq "
|
||||
"for unit %u\n", dd->ipath_unit);
|
||||
|
||||
/*
|
||||
* we check for NULL here, because it's outside
|
||||
* the kregbase check, and we need to call it
|
||||
* after the free_irq. Thus it's possible that
|
||||
* the function pointers were never initialized.
|
||||
*/
|
||||
if (dd->ipath_f_cleanup)
|
||||
/* clean up chip-specific stuff */
|
||||
dd->ipath_f_cleanup(dd);
|
||||
|
||||
dd->pcidev = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* we check for NULL here, because it's outside the kregbase
|
||||
* check, and we need to call it after the free_irq. Thus
|
||||
* it's possible that the function pointers were never
|
||||
* initialized.
|
||||
*/
|
||||
if (dd->ipath_f_cleanup)
|
||||
/* clean up chip-specific stuff */
|
||||
dd->ipath_f_cleanup(dd);
|
||||
|
||||
spin_lock_irqsave(&ipath_devs_lock, flags);
|
||||
}
|
||||
|
||||
|
@ -505,11 +505,10 @@ static u8 flash_csum(struct ipath_flash *ifp, int adjust)
|
||||
* ipath_get_guid - get the GUID from the i2c device
|
||||
* @dd: the infinipath device
|
||||
*
|
||||
* When we add the multi-chip support, we will probably have to add
|
||||
* the ability to use the number of guids field, and get the guid from
|
||||
* the first chip's flash, to use for all of them.
|
||||
* We have the capability to use the ipath_nguid field, and get
|
||||
* the guid from the first chip's flash, to use for all of them.
|
||||
*/
|
||||
void ipath_get_guid(struct ipath_devdata *dd)
|
||||
void ipath_get_eeprom_info(struct ipath_devdata *dd)
|
||||
{
|
||||
void *buf;
|
||||
struct ipath_flash *ifp;
|
||||
|
@ -139,7 +139,7 @@ static int ipath_get_base_info(struct ipath_portdata *pd,
|
||||
kinfo->spi_piosize = dd->ipath_ibmaxlen;
|
||||
kinfo->spi_mtu = dd->ipath_ibmaxlen; /* maxlen, not ibmtu */
|
||||
kinfo->spi_port = pd->port_port;
|
||||
kinfo->spi_sw_version = IPATH_USER_SWVERSION;
|
||||
kinfo->spi_sw_version = IPATH_KERN_SWVERSION;
|
||||
kinfo->spi_hw_version = dd->ipath_revision;
|
||||
|
||||
if (copy_to_user(ubase, kinfo, sizeof(*kinfo)))
|
||||
@ -1224,6 +1224,10 @@ static unsigned int ipath_poll(struct file *fp,
|
||||
|
||||
if (tail == head) {
|
||||
set_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag);
|
||||
if(dd->ipath_rhdrhead_intr_off) /* arm rcv interrupt */
|
||||
(void)ipath_write_ureg(dd, ur_rcvhdrhead,
|
||||
dd->ipath_rhdrhead_intr_off
|
||||
| head, pd->port_port);
|
||||
poll_wait(fp, &pd->port_wait, pt);
|
||||
|
||||
if (test_bit(IPATH_PORT_WAITING_RCV, &pd->port_flag)) {
|
||||
|
@ -607,7 +607,12 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name,
|
||||
case 4: /* Ponderosa is one of the bringup boards */
|
||||
n = "Ponderosa";
|
||||
break;
|
||||
case 5: /* HT-460 original production board */
|
||||
case 5:
|
||||
/*
|
||||
* HT-460 original production board; two production levels, with
|
||||
* different serial number ranges. See ipath_ht_early_init() for
|
||||
* case where we enable IPATH_GPIO_INTR for later serial # range.
|
||||
*/
|
||||
n = "InfiniPath_HT-460";
|
||||
break;
|
||||
case 6:
|
||||
@ -642,7 +647,7 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name,
|
||||
if (n)
|
||||
snprintf(name, namelen, "%s", n);
|
||||
|
||||
if (dd->ipath_majrev != 3 || dd->ipath_minrev != 2) {
|
||||
if (dd->ipath_majrev != 3 || (dd->ipath_minrev < 2 || dd->ipath_minrev > 3)) {
|
||||
/*
|
||||
* This version of the driver only supports the HT-400
|
||||
* Rev 3.2
|
||||
@ -1520,6 +1525,18 @@ static int ipath_ht_early_init(struct ipath_devdata *dd)
|
||||
*/
|
||||
ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl,
|
||||
INFINIPATH_S_ABORT);
|
||||
|
||||
ipath_get_eeprom_info(dd);
|
||||
if(dd->ipath_boardrev == 5 && dd->ipath_serial[0] == '1' &&
|
||||
dd->ipath_serial[1] == '2' && dd->ipath_serial[2] == '8') {
|
||||
/*
|
||||
* Later production HT-460 has same changes as HT-465, so
|
||||
* can use GPIO interrupts. They have serial #'s starting
|
||||
* with 128, rather than 112.
|
||||
*/
|
||||
dd->ipath_flags |= IPATH_GPIO_INTR;
|
||||
dd->ipath_flags &= ~IPATH_POLL_RX_INTR;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -879,7 +879,6 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit)
|
||||
|
||||
done:
|
||||
if (!ret) {
|
||||
ipath_get_guid(dd);
|
||||
*dd->ipath_statusp |= IPATH_STATUS_CHIP_PRESENT;
|
||||
if (!dd->ipath_f_intrsetup(dd)) {
|
||||
/* now we can enable all interrupts from the chip */
|
||||
|
@ -650,7 +650,7 @@ u32 __iomem *ipath_getpiobuf(struct ipath_devdata *, u32 *);
|
||||
void ipath_init_pe800_funcs(struct ipath_devdata *);
|
||||
/* init HT-400-specific func */
|
||||
void ipath_init_ht400_funcs(struct ipath_devdata *);
|
||||
void ipath_get_guid(struct ipath_devdata *);
|
||||
void ipath_get_eeprom_info(struct ipath_devdata *);
|
||||
u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg);
|
||||
|
||||
/*
|
||||
|
@ -136,9 +136,7 @@ int ipath_lkey_ok(struct ipath_lkey_table *rkt, struct ipath_sge *isge,
|
||||
ret = 1;
|
||||
goto bail;
|
||||
}
|
||||
spin_lock(&rkt->lock);
|
||||
mr = rkt->table[(sge->lkey >> (32 - ib_ipath_lkey_table_size))];
|
||||
spin_unlock(&rkt->lock);
|
||||
if (unlikely(mr == NULL || mr->lkey != sge->lkey)) {
|
||||
ret = 0;
|
||||
goto bail;
|
||||
@ -184,8 +182,6 @@ bail:
|
||||
* @acc: access flags
|
||||
*
|
||||
* Return 1 if successful, otherwise 0.
|
||||
*
|
||||
* The QP r_rq.lock should be held.
|
||||
*/
|
||||
int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
|
||||
u32 len, u64 vaddr, u32 rkey, int acc)
|
||||
@ -196,9 +192,7 @@ int ipath_rkey_ok(struct ipath_ibdev *dev, struct ipath_sge_state *ss,
|
||||
size_t off;
|
||||
int ret;
|
||||
|
||||
spin_lock(&rkt->lock);
|
||||
mr = rkt->table[(rkey >> (32 - ib_ipath_lkey_table_size))];
|
||||
spin_unlock(&rkt->lock);
|
||||
if (unlikely(mr == NULL || mr->lkey != rkey)) {
|
||||
ret = 0;
|
||||
goto bail;
|
||||
|
@ -872,12 +872,13 @@ static void copy_io(u32 __iomem *piobuf, struct ipath_sge_state *ss,
|
||||
update_sge(ss, len);
|
||||
length -= len;
|
||||
}
|
||||
/* Update address before sending packet. */
|
||||
update_sge(ss, length);
|
||||
/* must flush early everything before trigger word */
|
||||
ipath_flush_wc();
|
||||
__raw_writel(last, piobuf);
|
||||
/* be sure trigger word is written */
|
||||
ipath_flush_wc();
|
||||
update_sge(ss, length);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -943,17 +944,18 @@ int ipath_verbs_send(struct ipath_devdata *dd, u32 hdrwords,
|
||||
if (likely(ss->num_sge == 1 && len <= ss->sge.length &&
|
||||
!((unsigned long)ss->sge.vaddr & (sizeof(u32) - 1)))) {
|
||||
u32 w;
|
||||
u32 *addr = (u32 *) ss->sge.vaddr;
|
||||
|
||||
/* Update address before sending packet. */
|
||||
update_sge(ss, len);
|
||||
/* Need to round up for the last dword in the packet. */
|
||||
w = (len + 3) >> 2;
|
||||
__iowrite32_copy(piobuf, ss->sge.vaddr, w - 1);
|
||||
__iowrite32_copy(piobuf, addr, w - 1);
|
||||
/* must flush early everything before trigger word */
|
||||
ipath_flush_wc();
|
||||
__raw_writel(((u32 *) ss->sge.vaddr)[w - 1],
|
||||
piobuf + w - 1);
|
||||
__raw_writel(addr[w - 1], piobuf + w - 1);
|
||||
/* be sure trigger word is written */
|
||||
ipath_flush_wc();
|
||||
update_sge(ss, len);
|
||||
ret = 0;
|
||||
goto bail;
|
||||
}
|
||||
|
@ -1180,6 +1180,8 @@ static int ipath_pe_early_init(struct ipath_devdata *dd)
|
||||
*/
|
||||
dd->ipath_rhdrhead_intr_off = 1ULL<<32;
|
||||
|
||||
ipath_get_eeprom_info(dd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -375,10 +375,10 @@ static void ipath_error_qp(struct ipath_qp *qp)
|
||||
|
||||
spin_lock(&dev->pending_lock);
|
||||
/* XXX What if its already removed by the timeout code? */
|
||||
if (qp->timerwait.next != LIST_POISON1)
|
||||
list_del(&qp->timerwait);
|
||||
if (qp->piowait.next != LIST_POISON1)
|
||||
list_del(&qp->piowait);
|
||||
if (!list_empty(&qp->timerwait))
|
||||
list_del_init(&qp->timerwait);
|
||||
if (!list_empty(&qp->piowait))
|
||||
list_del_init(&qp->piowait);
|
||||
spin_unlock(&dev->pending_lock);
|
||||
|
||||
wc.status = IB_WC_WR_FLUSH_ERR;
|
||||
@ -427,6 +427,7 @@ static void ipath_error_qp(struct ipath_qp *qp)
|
||||
int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
int attr_mask)
|
||||
{
|
||||
struct ipath_ibdev *dev = to_idev(ibqp->device);
|
||||
struct ipath_qp *qp = to_iqp(ibqp);
|
||||
enum ib_qp_state cur_state, new_state;
|
||||
unsigned long flags;
|
||||
@ -443,6 +444,19 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
attr_mask))
|
||||
goto inval;
|
||||
|
||||
if (attr_mask & IB_QP_AV)
|
||||
if (attr->ah_attr.dlid == 0 ||
|
||||
attr->ah_attr.dlid >= IPS_MULTICAST_LID_BASE)
|
||||
goto inval;
|
||||
|
||||
if (attr_mask & IB_QP_PKEY_INDEX)
|
||||
if (attr->pkey_index >= ipath_layer_get_npkeys(dev->dd))
|
||||
goto inval;
|
||||
|
||||
if (attr_mask & IB_QP_MIN_RNR_TIMER)
|
||||
if (attr->min_rnr_timer > 31)
|
||||
goto inval;
|
||||
|
||||
switch (new_state) {
|
||||
case IB_QPS_RESET:
|
||||
ipath_reset_qp(qp);
|
||||
@ -457,13 +471,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
|
||||
}
|
||||
|
||||
if (attr_mask & IB_QP_PKEY_INDEX) {
|
||||
struct ipath_ibdev *dev = to_idev(ibqp->device);
|
||||
|
||||
if (attr->pkey_index >= ipath_layer_get_npkeys(dev->dd))
|
||||
goto inval;
|
||||
if (attr_mask & IB_QP_PKEY_INDEX)
|
||||
qp->s_pkey_index = attr->pkey_index;
|
||||
}
|
||||
|
||||
if (attr_mask & IB_QP_DEST_QPN)
|
||||
qp->remote_qpn = attr->dest_qp_num;
|
||||
@ -479,12 +488,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
if (attr_mask & IB_QP_ACCESS_FLAGS)
|
||||
qp->qp_access_flags = attr->qp_access_flags;
|
||||
|
||||
if (attr_mask & IB_QP_AV) {
|
||||
if (attr->ah_attr.dlid == 0 ||
|
||||
attr->ah_attr.dlid >= IPS_MULTICAST_LID_BASE)
|
||||
goto inval;
|
||||
if (attr_mask & IB_QP_AV)
|
||||
qp->remote_ah_attr = attr->ah_attr;
|
||||
}
|
||||
|
||||
if (attr_mask & IB_QP_PATH_MTU)
|
||||
qp->path_mtu = attr->path_mtu;
|
||||
@ -499,11 +504,8 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
||||
qp->s_rnr_retry_cnt = qp->s_rnr_retry;
|
||||
}
|
||||
|
||||
if (attr_mask & IB_QP_MIN_RNR_TIMER) {
|
||||
if (attr->min_rnr_timer > 31)
|
||||
goto inval;
|
||||
if (attr_mask & IB_QP_MIN_RNR_TIMER)
|
||||
qp->s_min_rnr_timer = attr->min_rnr_timer;
|
||||
}
|
||||
|
||||
if (attr_mask & IB_QP_QKEY)
|
||||
qp->qkey = attr->qkey;
|
||||
@ -710,10 +712,8 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
|
||||
init_attr->qp_type == IB_QPT_RC ?
|
||||
ipath_do_rc_send : ipath_do_uc_send,
|
||||
(unsigned long)qp);
|
||||
qp->piowait.next = LIST_POISON1;
|
||||
qp->piowait.prev = LIST_POISON2;
|
||||
qp->timerwait.next = LIST_POISON1;
|
||||
qp->timerwait.prev = LIST_POISON2;
|
||||
INIT_LIST_HEAD(&qp->piowait);
|
||||
INIT_LIST_HEAD(&qp->timerwait);
|
||||
qp->state = IB_QPS_RESET;
|
||||
qp->s_wq = swq;
|
||||
qp->s_size = init_attr->cap.max_send_wr + 1;
|
||||
@ -734,7 +734,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
|
||||
ipath_reset_qp(qp);
|
||||
|
||||
/* Tell the core driver that the kernel SMA is present. */
|
||||
if (qp->ibqp.qp_type == IB_QPT_SMI)
|
||||
if (init_attr->qp_type == IB_QPT_SMI)
|
||||
ipath_layer_set_verbs_flags(dev->dd,
|
||||
IPATH_VERBS_KERNEL_SMA);
|
||||
break;
|
||||
@ -783,10 +783,10 @@ int ipath_destroy_qp(struct ib_qp *ibqp)
|
||||
|
||||
/* Make sure the QP isn't on the timeout list. */
|
||||
spin_lock_irqsave(&dev->pending_lock, flags);
|
||||
if (qp->timerwait.next != LIST_POISON1)
|
||||
list_del(&qp->timerwait);
|
||||
if (qp->piowait.next != LIST_POISON1)
|
||||
list_del(&qp->piowait);
|
||||
if (!list_empty(&qp->timerwait))
|
||||
list_del_init(&qp->timerwait);
|
||||
if (!list_empty(&qp->piowait))
|
||||
list_del_init(&qp->piowait);
|
||||
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
||||
|
||||
/*
|
||||
@ -855,10 +855,10 @@ void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc)
|
||||
|
||||
spin_lock(&dev->pending_lock);
|
||||
/* XXX What if its already removed by the timeout code? */
|
||||
if (qp->timerwait.next != LIST_POISON1)
|
||||
list_del(&qp->timerwait);
|
||||
if (qp->piowait.next != LIST_POISON1)
|
||||
list_del(&qp->piowait);
|
||||
if (!list_empty(&qp->timerwait))
|
||||
list_del_init(&qp->timerwait);
|
||||
if (!list_empty(&qp->piowait))
|
||||
list_del_init(&qp->piowait);
|
||||
spin_unlock(&dev->pending_lock);
|
||||
|
||||
ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1);
|
||||
|
@ -57,7 +57,7 @@ static void ipath_init_restart(struct ipath_qp *qp, struct ipath_swqe *wqe)
|
||||
qp->s_len = wqe->length - len;
|
||||
dev = to_idev(qp->ibqp.device);
|
||||
spin_lock(&dev->pending_lock);
|
||||
if (qp->timerwait.next == LIST_POISON1)
|
||||
if (list_empty(&qp->timerwait))
|
||||
list_add_tail(&qp->timerwait,
|
||||
&dev->pending[dev->pending_index]);
|
||||
spin_unlock(&dev->pending_lock);
|
||||
@ -356,7 +356,7 @@ static inline int ipath_make_rc_req(struct ipath_qp *qp,
|
||||
if ((int)(qp->s_psn - qp->s_next_psn) > 0)
|
||||
qp->s_next_psn = qp->s_psn;
|
||||
spin_lock(&dev->pending_lock);
|
||||
if (qp->timerwait.next == LIST_POISON1)
|
||||
if (list_empty(&qp->timerwait))
|
||||
list_add_tail(&qp->timerwait,
|
||||
&dev->pending[dev->pending_index]);
|
||||
spin_unlock(&dev->pending_lock);
|
||||
@ -726,8 +726,8 @@ void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc)
|
||||
*/
|
||||
dev = to_idev(qp->ibqp.device);
|
||||
spin_lock(&dev->pending_lock);
|
||||
if (qp->timerwait.next != LIST_POISON1)
|
||||
list_del(&qp->timerwait);
|
||||
if (!list_empty(&qp->timerwait))
|
||||
list_del_init(&qp->timerwait);
|
||||
spin_unlock(&dev->pending_lock);
|
||||
|
||||
if (wqe->wr.opcode == IB_WR_RDMA_READ)
|
||||
@ -886,8 +886,8 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode)
|
||||
* just won't find anything to restart if we ACK everything.
|
||||
*/
|
||||
spin_lock(&dev->pending_lock);
|
||||
if (qp->timerwait.next != LIST_POISON1)
|
||||
list_del(&qp->timerwait);
|
||||
if (!list_empty(&qp->timerwait))
|
||||
list_del_init(&qp->timerwait);
|
||||
spin_unlock(&dev->pending_lock);
|
||||
|
||||
/*
|
||||
@ -1194,8 +1194,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev,
|
||||
IB_WR_RDMA_READ))
|
||||
goto ack_done;
|
||||
spin_lock(&dev->pending_lock);
|
||||
if (qp->s_rnr_timeout == 0 &&
|
||||
qp->timerwait.next != LIST_POISON1)
|
||||
if (qp->s_rnr_timeout == 0 && !list_empty(&qp->timerwait))
|
||||
list_move_tail(&qp->timerwait,
|
||||
&dev->pending[dev->pending_index]);
|
||||
spin_unlock(&dev->pending_lock);
|
||||
|
@ -435,7 +435,7 @@ void ipath_no_bufs_available(struct ipath_qp *qp, struct ipath_ibdev *dev)
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&dev->pending_lock, flags);
|
||||
if (qp->piowait.next == LIST_POISON1)
|
||||
if (list_empty(&qp->piowait))
|
||||
list_add_tail(&qp->piowait, &dev->piowait);
|
||||
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
||||
/*
|
||||
|
@ -464,7 +464,7 @@ static void ipath_ib_timer(void *arg)
|
||||
last = &dev->pending[dev->pending_index];
|
||||
while (!list_empty(last)) {
|
||||
qp = list_entry(last->next, struct ipath_qp, timerwait);
|
||||
list_del(&qp->timerwait);
|
||||
list_del_init(&qp->timerwait);
|
||||
qp->timer_next = resend;
|
||||
resend = qp;
|
||||
atomic_inc(&qp->refcount);
|
||||
@ -474,7 +474,7 @@ static void ipath_ib_timer(void *arg)
|
||||
qp = list_entry(last->next, struct ipath_qp, timerwait);
|
||||
if (--qp->s_rnr_timeout == 0) {
|
||||
do {
|
||||
list_del(&qp->timerwait);
|
||||
list_del_init(&qp->timerwait);
|
||||
tasklet_hi_schedule(&qp->s_task);
|
||||
if (list_empty(last))
|
||||
break;
|
||||
@ -554,7 +554,7 @@ static int ipath_ib_piobufavail(void *arg)
|
||||
while (!list_empty(&dev->piowait)) {
|
||||
qp = list_entry(dev->piowait.next, struct ipath_qp,
|
||||
piowait);
|
||||
list_del(&qp->piowait);
|
||||
list_del_init(&qp->piowait);
|
||||
tasklet_hi_schedule(&qp->s_task);
|
||||
}
|
||||
spin_unlock_irqrestore(&dev->pending_lock, flags);
|
||||
@ -951,6 +951,7 @@ static void *ipath_register_ib_device(int unit, struct ipath_devdata *dd)
|
||||
idev->dd = dd;
|
||||
|
||||
strlcpy(dev->name, "ipath%d", IB_DEVICE_NAME_MAX);
|
||||
dev->owner = THIS_MODULE;
|
||||
dev->node_guid = ipath_layer_get_guid(dd);
|
||||
dev->uverbs_abi_ver = IPATH_UVERBS_ABI_VERSION;
|
||||
dev->uverbs_cmd_mask =
|
||||
|
@ -182,7 +182,7 @@ struct mthca_cmd_context {
|
||||
u8 status;
|
||||
};
|
||||
|
||||
static int fw_cmd_doorbell = 1;
|
||||
static int fw_cmd_doorbell = 0;
|
||||
module_param(fw_cmd_doorbell, int, 0644);
|
||||
MODULE_PARM_DESC(fw_cmd_doorbell, "post FW commands through doorbell page if nonzero "
|
||||
"(and supported by FW)");
|
||||
|
@ -1727,23 +1727,7 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
||||
|
||||
ind = qp->rq.next_ind;
|
||||
|
||||
for (nreq = 0; wr; ++nreq, wr = wr->next) {
|
||||
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
|
||||
nreq = 0;
|
||||
|
||||
doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
|
||||
doorbell[1] = cpu_to_be32(qp->qpn << 8);
|
||||
|
||||
wmb();
|
||||
|
||||
mthca_write64(doorbell,
|
||||
dev->kar + MTHCA_RECEIVE_DOORBELL,
|
||||
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
||||
|
||||
qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB;
|
||||
size0 = 0;
|
||||
}
|
||||
|
||||
for (nreq = 0; wr; wr = wr->next) {
|
||||
if (mthca_wq_overflow(&qp->rq, nreq, qp->ibqp.recv_cq)) {
|
||||
mthca_err(dev, "RQ %06x full (%u head, %u tail,"
|
||||
" %d max, %d nreq)\n", qp->qpn,
|
||||
@ -1797,6 +1781,23 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
||||
++ind;
|
||||
if (unlikely(ind >= qp->rq.max))
|
||||
ind -= qp->rq.max;
|
||||
|
||||
++nreq;
|
||||
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
|
||||
nreq = 0;
|
||||
|
||||
doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
|
||||
doorbell[1] = cpu_to_be32(qp->qpn << 8);
|
||||
|
||||
wmb();
|
||||
|
||||
mthca_write64(doorbell,
|
||||
dev->kar + MTHCA_RECEIVE_DOORBELL,
|
||||
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
||||
|
||||
qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB;
|
||||
size0 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -490,26 +490,7 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
|
||||
|
||||
first_ind = srq->first_free;
|
||||
|
||||
for (nreq = 0; wr; ++nreq, wr = wr->next) {
|
||||
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
|
||||
nreq = 0;
|
||||
|
||||
doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
|
||||
doorbell[1] = cpu_to_be32(srq->srqn << 8);
|
||||
|
||||
/*
|
||||
* Make sure that descriptors are written
|
||||
* before doorbell is rung.
|
||||
*/
|
||||
wmb();
|
||||
|
||||
mthca_write64(doorbell,
|
||||
dev->kar + MTHCA_RECEIVE_DOORBELL,
|
||||
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
||||
|
||||
first_ind = srq->first_free;
|
||||
}
|
||||
|
||||
for (nreq = 0; wr; wr = wr->next) {
|
||||
ind = srq->first_free;
|
||||
|
||||
if (ind < 0) {
|
||||
@ -569,6 +550,26 @@ int mthca_tavor_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
|
||||
|
||||
srq->wrid[ind] = wr->wr_id;
|
||||
srq->first_free = next_ind;
|
||||
|
||||
++nreq;
|
||||
if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
|
||||
nreq = 0;
|
||||
|
||||
doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
|
||||
doorbell[1] = cpu_to_be32(srq->srqn << 8);
|
||||
|
||||
/*
|
||||
* Make sure that descriptors are written
|
||||
* before doorbell is rung.
|
||||
*/
|
||||
wmb();
|
||||
|
||||
mthca_write64(doorbell,
|
||||
dev->kar + MTHCA_RECEIVE_DOORBELL,
|
||||
MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
||||
|
||||
first_ind = srq->first_free;
|
||||
}
|
||||
}
|
||||
|
||||
if (likely(nreq)) {
|
||||
|
@ -340,7 +340,10 @@ static void srp_disconnect_target(struct srp_target_port *target)
|
||||
/* XXX should send SRP_I_LOGOUT request */
|
||||
|
||||
init_completion(&target->done);
|
||||
ib_send_cm_dreq(target->cm_id, NULL, 0);
|
||||
if (ib_send_cm_dreq(target->cm_id, NULL, 0)) {
|
||||
printk(KERN_DEBUG PFX "Sending CM DREQ failed\n");
|
||||
return;
|
||||
}
|
||||
wait_for_completion(&target->done);
|
||||
}
|
||||
|
||||
@ -351,7 +354,6 @@ static void srp_remove_work(void *target_ptr)
|
||||
spin_lock_irq(target->scsi_host->host_lock);
|
||||
if (target->state != SRP_TARGET_DEAD) {
|
||||
spin_unlock_irq(target->scsi_host->host_lock);
|
||||
scsi_host_put(target->scsi_host);
|
||||
return;
|
||||
}
|
||||
target->state = SRP_TARGET_REMOVED;
|
||||
@ -365,8 +367,6 @@ static void srp_remove_work(void *target_ptr)
|
||||
ib_destroy_cm_id(target->cm_id);
|
||||
srp_free_target_ib(target);
|
||||
scsi_host_put(target->scsi_host);
|
||||
/* And another put to really free the target port... */
|
||||
scsi_host_put(target->scsi_host);
|
||||
}
|
||||
|
||||
static int srp_connect_target(struct srp_target_port *target)
|
||||
@ -1241,7 +1241,7 @@ static int srp_reset_device(struct scsi_cmnd *scmnd)
|
||||
list_for_each_entry_safe(req, tmp, &target->req_queue, list)
|
||||
if (req->scmnd->device == scmnd->device) {
|
||||
req->scmnd->result = DID_RESET << 16;
|
||||
scmnd->scsi_done(scmnd);
|
||||
req->scmnd->scsi_done(req->scmnd);
|
||||
srp_remove_req(target, req);
|
||||
}
|
||||
|
||||
|
@ -589,7 +589,7 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv)
|
||||
struct sw *sw;
|
||||
struct input_dev *input_dev;
|
||||
int i, j, k, l;
|
||||
int err;
|
||||
int err = 0;
|
||||
unsigned char *buf = NULL; /* [SW_LENGTH] */
|
||||
unsigned char *idbuf = NULL; /* [SW_LENGTH] */
|
||||
unsigned char m = 1;
|
||||
@ -776,7 +776,10 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv)
|
||||
goto fail4;
|
||||
}
|
||||
|
||||
return 0;
|
||||
out: kfree(buf);
|
||||
kfree(idbuf);
|
||||
|
||||
return err;
|
||||
|
||||
fail4: input_free_device(sw->dev[i]);
|
||||
fail3: while (--i >= 0)
|
||||
@ -784,9 +787,7 @@ static int sw_connect(struct gameport *gameport, struct gameport_driver *drv)
|
||||
fail2: gameport_close(gameport);
|
||||
fail1: gameport_set_drvdata(gameport, NULL);
|
||||
kfree(sw);
|
||||
kfree(buf);
|
||||
kfree(idbuf);
|
||||
return err;
|
||||
goto out;
|
||||
}
|
||||
|
||||
static void sw_disconnect(struct gameport *gameport)
|
||||
|
@ -245,9 +245,9 @@ static void corgikbd_hinge_timer(unsigned long data)
|
||||
if (hinge_count >= HINGE_STABLE_COUNT) {
|
||||
spin_lock_irqsave(&corgikbd_data->lock, flags);
|
||||
|
||||
input_report_switch(corgikbd_data->input, SW_0, ((sharpsl_hinge_state & CORGI_SCP_SWA) != 0));
|
||||
input_report_switch(corgikbd_data->input, SW_1, ((sharpsl_hinge_state & CORGI_SCP_SWB) != 0));
|
||||
input_report_switch(corgikbd_data->input, SW_2, (READ_GPIO_BIT(CORGI_GPIO_AK_INT) != 0));
|
||||
input_report_switch(corgikbd_data->input, SW_LID, ((sharpsl_hinge_state & CORGI_SCP_SWA) != 0));
|
||||
input_report_switch(corgikbd_data->input, SW_TABLET_MODE, ((sharpsl_hinge_state & CORGI_SCP_SWB) != 0));
|
||||
input_report_switch(corgikbd_data->input, SW_HEADPHONE_INSERT, (READ_GPIO_BIT(CORGI_GPIO_AK_INT) != 0));
|
||||
input_sync(corgikbd_data->input);
|
||||
|
||||
spin_unlock_irqrestore(&corgikbd_data->lock, flags);
|
||||
@ -340,9 +340,9 @@ static int __init corgikbd_probe(struct platform_device *pdev)
|
||||
for (i = 0; i < ARRAY_SIZE(corgikbd_keycode); i++)
|
||||
set_bit(corgikbd->keycode[i], input_dev->keybit);
|
||||
clear_bit(0, input_dev->keybit);
|
||||
set_bit(SW_0, input_dev->swbit);
|
||||
set_bit(SW_1, input_dev->swbit);
|
||||
set_bit(SW_2, input_dev->swbit);
|
||||
set_bit(SW_LID, input_dev->swbit);
|
||||
set_bit(SW_TABLET_MODE, input_dev->swbit);
|
||||
set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
|
||||
|
||||
input_register_device(corgikbd->input);
|
||||
|
||||
|
@ -299,9 +299,9 @@ static void spitzkbd_hinge_timer(unsigned long data)
|
||||
if (hinge_count >= HINGE_STABLE_COUNT) {
|
||||
spin_lock_irqsave(&spitzkbd_data->lock, flags);
|
||||
|
||||
input_report_switch(spitzkbd_data->input, SW_0, ((GPLR(SPITZ_GPIO_SWA) & GPIO_bit(SPITZ_GPIO_SWA)) != 0));
|
||||
input_report_switch(spitzkbd_data->input, SW_1, ((GPLR(SPITZ_GPIO_SWB) & GPIO_bit(SPITZ_GPIO_SWB)) != 0));
|
||||
input_report_switch(spitzkbd_data->input, SW_2, ((GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)) != 0));
|
||||
input_report_switch(spitzkbd_data->input, SW_LID, ((GPLR(SPITZ_GPIO_SWA) & GPIO_bit(SPITZ_GPIO_SWA)) != 0));
|
||||
input_report_switch(spitzkbd_data->input, SW_TABLET_MODE, ((GPLR(SPITZ_GPIO_SWB) & GPIO_bit(SPITZ_GPIO_SWB)) != 0));
|
||||
input_report_switch(spitzkbd_data->input, SW_HEADPHONE_INSERT, ((GPLR(SPITZ_GPIO_AK_INT) & GPIO_bit(SPITZ_GPIO_AK_INT)) != 0));
|
||||
input_sync(spitzkbd_data->input);
|
||||
|
||||
spin_unlock_irqrestore(&spitzkbd_data->lock, flags);
|
||||
@ -398,9 +398,9 @@ static int __init spitzkbd_probe(struct platform_device *dev)
|
||||
for (i = 0; i < ARRAY_SIZE(spitzkbd_keycode); i++)
|
||||
set_bit(spitzkbd->keycode[i], input_dev->keybit);
|
||||
clear_bit(0, input_dev->keybit);
|
||||
set_bit(SW_0, input_dev->swbit);
|
||||
set_bit(SW_1, input_dev->swbit);
|
||||
set_bit(SW_2, input_dev->swbit);
|
||||
set_bit(SW_LID, input_dev->swbit);
|
||||
set_bit(SW_TABLET_MODE, input_dev->swbit);
|
||||
set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
|
||||
|
||||
input_register_device(input_dev);
|
||||
|
||||
|
@ -318,6 +318,16 @@ static struct key_entry keymap_acer_travelmate_240[] = {
|
||||
{ KE_END, 0 }
|
||||
};
|
||||
|
||||
static struct key_entry keymap_aopen_1559as[] = {
|
||||
{ KE_KEY, 0x01, KEY_HELP },
|
||||
{ KE_KEY, 0x06, KEY_PROG3 },
|
||||
{ KE_KEY, 0x11, KEY_PROG1 },
|
||||
{ KE_KEY, 0x12, KEY_PROG2 },
|
||||
{ KE_WIFI, 0x30, 0 },
|
||||
{ KE_KEY, 0x31, KEY_MAIL },
|
||||
{ KE_KEY, 0x36, KEY_WWW },
|
||||
};
|
||||
|
||||
/*
|
||||
* If your machine is not here (which is currently rather likely), please send
|
||||
* a list of buttons and their key codes (reported when loading this module
|
||||
@ -369,6 +379,15 @@ static struct dmi_system_id dmi_ids[] = {
|
||||
},
|
||||
.driver_data = keymap_acer_travelmate_240
|
||||
},
|
||||
{
|
||||
.callback = dmi_matched,
|
||||
.ident = "AOpen 1559AS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "E2U"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "E2U"),
|
||||
},
|
||||
.driver_data = keymap_aopen_1559as
|
||||
},
|
||||
{ NULL, }
|
||||
};
|
||||
|
||||
|
@ -100,8 +100,8 @@ static void alps_process_packet(struct psmouse *psmouse, struct pt_regs *regs)
|
||||
}
|
||||
|
||||
if (priv->i->flags & ALPS_OLDPROTO) {
|
||||
left = packet[2] & 0x08;
|
||||
right = packet[2] & 0x10;
|
||||
left = packet[2] & 0x10;
|
||||
right = packet[2] & 0x08;
|
||||
middle = 0;
|
||||
x = packet[1] | ((packet[0] & 0x07) << 7);
|
||||
y = packet[4] | ((packet[3] & 0x07) << 7);
|
||||
|
@ -21,12 +21,36 @@
|
||||
#include "lifebook.h"
|
||||
|
||||
static struct dmi_system_id lifebook_dmi_table[] = {
|
||||
{
|
||||
.ident = "LifeBook B",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B Series"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Lifebook B",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK B Series"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Lifebook B213x/B2150",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "LifeBook B2131/B2133/B2150"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Zephyr",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ZEPHYR"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "CF-18",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "CF-18"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Lifebook B142",
|
||||
.matches = {
|
||||
|
@ -19,6 +19,7 @@
|
||||
#define PS2PP_KIND_WHEEL 1
|
||||
#define PS2PP_KIND_MX 2
|
||||
#define PS2PP_KIND_TP3 3
|
||||
#define PS2PP_KIND_TRACKMAN 4
|
||||
|
||||
/* Logitech mouse features */
|
||||
#define PS2PP_WHEEL 0x01
|
||||
@ -223,6 +224,7 @@ static struct ps2pp_info *get_model_info(unsigned char model)
|
||||
{ 73, 0, PS2PP_SIDE_BTN },
|
||||
{ 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
{ 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
{ 79, PS2PP_KIND_TRACKMAN, PS2PP_WHEEL }, /* TrackMan with wheel */
|
||||
{ 80, PS2PP_KIND_WHEEL, PS2PP_SIDE_BTN | PS2PP_WHEEL },
|
||||
{ 81, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
{ 83, PS2PP_KIND_WHEEL, PS2PP_WHEEL },
|
||||
@ -298,6 +300,10 @@ static void ps2pp_set_model_properties(struct psmouse *psmouse, struct ps2pp_inf
|
||||
psmouse->name = "TouchPad 3";
|
||||
break;
|
||||
|
||||
case PS2PP_KIND_TRACKMAN:
|
||||
psmouse->name = "TrackMan";
|
||||
break;
|
||||
|
||||
default:
|
||||
/*
|
||||
* Set name to "Mouse" only when using PS2++,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user