Merge branch 'from-linus' into upstream
This commit is contained in:
Коммит
dea58b80f2
|
@ -214,12 +214,13 @@ hardware.
|
|||
The interaction of the iflag bits is as follows (parity error
|
||||
given as an example):
|
||||
Parity error INPCK IGNPAR
|
||||
None n/a n/a character received
|
||||
Yes n/a 0 character discarded
|
||||
Yes 0 1 character received, marked as
|
||||
n/a 0 n/a character received, marked as
|
||||
TTY_NORMAL
|
||||
Yes 1 1 character received, marked as
|
||||
None 1 n/a character received, marked as
|
||||
TTY_NORMAL
|
||||
Yes 1 0 character received, marked as
|
||||
TTY_PARITY
|
||||
Yes 1 1 character discarded
|
||||
|
||||
Other flags may be used (eg, xon/xoff characters) if your
|
||||
hardware supports hardware "soft" flow control.
|
||||
|
|
10
MAINTAINERS
10
MAINTAINERS
|
@ -565,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
|
||||
|
@ -1716,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
|
||||
|
||||
|
@ -1899,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
|
||||
|
|
|
@ -178,8 +178,12 @@ static int ixp23xx_irq_set_type(unsigned int irq, unsigned int type)
|
|||
|
||||
static void ixp23xx_irq_mask(unsigned int irq)
|
||||
{
|
||||
volatile unsigned long *intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
|
||||
volatile unsigned long *intr_reg;
|
||||
|
||||
if (irq >= 56)
|
||||
irq += 8;
|
||||
|
||||
intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
|
||||
*intr_reg &= ~(1 << (irq % 32));
|
||||
}
|
||||
|
||||
|
@ -199,17 +203,25 @@ static void ixp23xx_irq_ack(unsigned int irq)
|
|||
*/
|
||||
static void ixp23xx_irq_level_unmask(unsigned int irq)
|
||||
{
|
||||
volatile unsigned long *intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
|
||||
volatile unsigned long *intr_reg;
|
||||
|
||||
ixp23xx_irq_ack(irq);
|
||||
|
||||
if (irq >= 56)
|
||||
irq += 8;
|
||||
|
||||
intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
|
||||
*intr_reg |= (1 << (irq % 32));
|
||||
}
|
||||
|
||||
static void ixp23xx_irq_edge_unmask(unsigned int irq)
|
||||
{
|
||||
volatile unsigned long *intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
|
||||
volatile unsigned long *intr_reg;
|
||||
|
||||
if (irq >= 56)
|
||||
irq += 8;
|
||||
|
||||
intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
|
||||
*intr_reg |= (1 << (irq % 32));
|
||||
}
|
||||
|
||||
|
|
|
@ -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"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
|
|
@ -315,3 +315,4 @@ ENTRY(sys_call_table)
|
|||
.long sys_splice
|
||||
.long sys_sync_file_range
|
||||
.long sys_tee /* 315 */
|
||||
.long sys_vmsplice
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -2057,10 +2057,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];
|
||||
|
@ -2097,9 +2132,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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/config.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/threads.h>
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/asi.h>
|
||||
#include <asm/pstate.h>
|
||||
|
@ -493,6 +494,35 @@ tlb_fixup_done:
|
|||
call prom_init
|
||||
mov %l7, %o0 ! OpenPROM cif handler
|
||||
|
||||
/* Initialize current_thread_info()->cpu as early as possible.
|
||||
* In order to do that accurately we have to patch up the get_cpuid()
|
||||
* assembler sequences. And that, in turn, requires that we know
|
||||
* if we are on a Starfire box or not. While we're here, patch up
|
||||
* the sun4v sequences as well.
|
||||
*/
|
||||
call check_if_starfire
|
||||
nop
|
||||
call per_cpu_patch
|
||||
nop
|
||||
call sun4v_patch
|
||||
nop
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
call hard_smp_processor_id
|
||||
nop
|
||||
cmp %o0, NR_CPUS
|
||||
blu,pt %xcc, 1f
|
||||
nop
|
||||
call boot_cpu_id_too_large
|
||||
nop
|
||||
/* Not reached... */
|
||||
|
||||
1:
|
||||
#else
|
||||
mov 0, %o0
|
||||
#endif
|
||||
stb %o0, [%g6 + TI_CPU]
|
||||
|
||||
/* Off we go.... */
|
||||
call start_kernel
|
||||
nop
|
||||
|
|
|
@ -220,7 +220,7 @@ char reboot_command[COMMAND_LINE_SIZE];
|
|||
|
||||
static struct pt_regs fake_swapper_regs = { { 0, }, 0, 0, 0, 0 };
|
||||
|
||||
static void __init per_cpu_patch(void)
|
||||
void __init per_cpu_patch(void)
|
||||
{
|
||||
struct cpuid_patch_entry *p;
|
||||
unsigned long ver;
|
||||
|
@ -280,7 +280,7 @@ static void __init per_cpu_patch(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void __init sun4v_patch(void)
|
||||
void __init sun4v_patch(void)
|
||||
{
|
||||
struct sun4v_1insn_patch_entry *p1;
|
||||
struct sun4v_2insn_patch_entry *p2;
|
||||
|
@ -315,6 +315,15 @@ static void __init sun4v_patch(void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
void __init boot_cpu_id_too_large(int cpu)
|
||||
{
|
||||
prom_printf("Serious problem, boot cpu id (%d) >= NR_CPUS (%d)\n",
|
||||
cpu, NR_CPUS);
|
||||
prom_halt();
|
||||
}
|
||||
#endif
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
{
|
||||
/* Initialize PROM console and command line. */
|
||||
|
@ -332,16 +341,6 @@ void __init setup_arch(char **cmdline_p)
|
|||
conswitchp = &prom_con;
|
||||
#endif
|
||||
|
||||
/* Work out if we are starfire early on */
|
||||
check_if_starfire();
|
||||
|
||||
/* Now we know enough to patch the get_cpuid sequences
|
||||
* used by trap code.
|
||||
*/
|
||||
per_cpu_patch();
|
||||
|
||||
sun4v_patch();
|
||||
|
||||
boot_flags_init(*cmdline_p);
|
||||
|
||||
idprom_init();
|
||||
|
|
|
@ -1264,7 +1264,6 @@ void __init smp_tick_init(void)
|
|||
boot_cpu_id = hard_smp_processor_id();
|
||||
current_tick_offset = timer_tick_offset;
|
||||
|
||||
cpu_set(boot_cpu_id, cpu_online_map);
|
||||
prof_counter(boot_cpu_id) = prof_multiplier(boot_cpu_id) = 1;
|
||||
}
|
||||
|
||||
|
@ -1345,18 +1344,6 @@ void __init smp_setup_cpu_possible_map(void)
|
|||
|
||||
void __devinit smp_prepare_boot_cpu(void)
|
||||
{
|
||||
int cpu = hard_smp_processor_id();
|
||||
|
||||
if (cpu >= NR_CPUS) {
|
||||
prom_printf("Serious problem, boot cpu id >= NR_CPUS\n");
|
||||
prom_halt();
|
||||
}
|
||||
|
||||
current_thread_info()->cpu = cpu;
|
||||
__local_per_cpu_offset = __per_cpu_offset(cpu);
|
||||
|
||||
cpu_set(smp_processor_id(), cpu_online_map);
|
||||
cpu_set(smp_processor_id(), phys_cpu_present_map);
|
||||
}
|
||||
|
||||
int __devinit __cpu_up(unsigned int cpu)
|
||||
|
@ -1433,4 +1420,7 @@ void __init setup_per_cpu_areas(void)
|
|||
|
||||
for (i = 0; i < NR_CPUS; i++, ptr += size)
|
||||
memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
|
||||
|
||||
/* Setup %g5 for the boot cpu. */
|
||||
__local_per_cpu_offset = __per_cpu_offset(smp_processor_id());
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
@ -133,6 +133,7 @@ struct cfq_data {
|
|||
mempool_t *crq_pool;
|
||||
|
||||
int rq_in_driver;
|
||||
int hw_tag;
|
||||
|
||||
/*
|
||||
* schedule slice state info
|
||||
|
@ -500,10 +501,13 @@ static void cfq_resort_rr_list(struct cfq_queue *cfqq, int preempted)
|
|||
|
||||
/*
|
||||
* if queue was preempted, just add to front to be fair. busy_rr
|
||||
* isn't sorted.
|
||||
* isn't sorted, but insert at the back for fairness.
|
||||
*/
|
||||
if (preempted || list == &cfqd->busy_rr) {
|
||||
list_add(&cfqq->cfq_list, list);
|
||||
if (preempted)
|
||||
list = list->prev;
|
||||
|
||||
list_add_tail(&cfqq->cfq_list, list);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -664,6 +668,15 @@ static void cfq_activate_request(request_queue_t *q, struct request *rq)
|
|||
struct cfq_data *cfqd = q->elevator->elevator_data;
|
||||
|
||||
cfqd->rq_in_driver++;
|
||||
|
||||
/*
|
||||
* If the depth is larger 1, it really could be queueing. But lets
|
||||
* make the mark a little higher - idling could still be good for
|
||||
* low queueing, and a low queueing number could also just indicate
|
||||
* a SCSI mid layer like behaviour where limit+1 is often seen.
|
||||
*/
|
||||
if (!cfqd->hw_tag && cfqd->rq_in_driver > 4)
|
||||
cfqd->hw_tag = 1;
|
||||
}
|
||||
|
||||
static void cfq_deactivate_request(request_queue_t *q, struct request *rq)
|
||||
|
@ -878,6 +891,13 @@ static struct cfq_queue *cfq_set_active_queue(struct cfq_data *cfqd)
|
|||
if (!list_empty(&cfqd->cur_rr) || cfq_get_next_prio_level(cfqd) != -1)
|
||||
cfqq = list_entry_cfqq(cfqd->cur_rr.next);
|
||||
|
||||
/*
|
||||
* If no new queues are available, check if the busy list has some
|
||||
* before falling back to idle io.
|
||||
*/
|
||||
if (!cfqq && !list_empty(&cfqd->busy_rr))
|
||||
cfqq = list_entry_cfqq(cfqd->busy_rr.next);
|
||||
|
||||
/*
|
||||
* if we have idle queues and no rt or be queues had pending
|
||||
* requests, either allow immediate service if the grace period
|
||||
|
@ -1284,7 +1304,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 +1314,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 +1420,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;
|
||||
}
|
||||
|
@ -1458,7 +1478,8 @@ retry:
|
|||
* set ->slice_left to allow preemption for a new process
|
||||
*/
|
||||
cfqq->slice_left = 2 * cfqd->cfq_slice_idle;
|
||||
cfq_mark_cfqq_idle_window(cfqq);
|
||||
if (!cfqd->hw_tag)
|
||||
cfq_mark_cfqq_idle_window(cfqq);
|
||||
cfq_mark_cfqq_prio_changed(cfqq);
|
||||
cfq_init_prio_data(cfqq);
|
||||
}
|
||||
|
@ -1475,9 +1496,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 +1567,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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1648,7 +1670,7 @@ cfq_update_idle_window(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
|||
{
|
||||
int enable_idle = cfq_cfqq_idle_window(cfqq);
|
||||
|
||||
if (!cic->ioc->task || !cfqd->cfq_slice_idle)
|
||||
if (!cic->ioc->task || !cfqd->cfq_slice_idle || cfqd->hw_tag)
|
||||
enable_idle = 0;
|
||||
else if (sample_valid(cic->ttime_samples)) {
|
||||
if (cic->ttime_mean > cfqd->cfq_slice_idle)
|
||||
|
@ -1739,14 +1761,24 @@ cfq_crq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
|||
|
||||
cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq);
|
||||
|
||||
cic = crq->io_context;
|
||||
|
||||
/*
|
||||
* we never wait for an async request and we don't allow preemption
|
||||
* of an async request. so just return early
|
||||
*/
|
||||
if (!cfq_crq_is_sync(crq))
|
||||
if (!cfq_crq_is_sync(crq)) {
|
||||
/*
|
||||
* sync process issued an async request, if it's waiting
|
||||
* then expire it and kick rq handling.
|
||||
*/
|
||||
if (cic == cfqd->active_cic &&
|
||||
del_timer(&cfqd->idle_slice_timer)) {
|
||||
cfq_slice_expired(cfqd, 0);
|
||||
cfq_start_queueing(cfqd, cfqq);
|
||||
}
|
||||
return;
|
||||
|
||||
cic = crq->io_context;
|
||||
}
|
||||
|
||||
cfq_update_io_thinktime(cfqd, cic);
|
||||
cfq_update_io_seektime(cfqd, cic, crq);
|
||||
|
@ -2164,10 +2196,9 @@ static void cfq_idle_class_timer(unsigned long data)
|
|||
* race with a non-idle queue, reset timer
|
||||
*/
|
||||
end = cfqd->last_end_request + CFQ_IDLE_GRACE;
|
||||
if (!time_after_eq(jiffies, end)) {
|
||||
cfqd->idle_class_timer.expires = end;
|
||||
add_timer(&cfqd->idle_class_timer);
|
||||
} else
|
||||
if (!time_after_eq(jiffies, end))
|
||||
mod_timer(&cfqd->idle_class_timer, end);
|
||||
else
|
||||
cfq_schedule_dispatch(cfqd);
|
||||
|
||||
spin_unlock_irqrestore(cfqd->queue->queue_lock, flags);
|
||||
|
@ -2187,7 +2218,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 +2241,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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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++,
|
||||
|
|
|
@ -36,13 +36,10 @@
|
|||
|
||||
|
||||
/*
|
||||
* This code has been tested on an ads7846 / N770 device.
|
||||
* This code has been heavily tested on a Nokia 770, and lightly
|
||||
* tested on other ads7846 devices (OSK/Mistral, Lubbock).
|
||||
* Support for ads7843 and ads7845 has only been stubbed in.
|
||||
*
|
||||
* Not yet done: How accurate are the temperature and voltage
|
||||
* readings? (System-specific calibration should support
|
||||
* accuracy of 0.3 degrees C; otherwise it's 2.0 degrees.)
|
||||
*
|
||||
* IRQ handling needs a workaround because of a shortcoming in handling
|
||||
* edge triggered IRQs on some platforms like the OMAP1/2. These
|
||||
* platforms don't handle the ARM lazy IRQ disabling properly, thus we
|
||||
|
@ -248,10 +245,13 @@ static int ads7846_read12_ser(struct device *dev, unsigned command)
|
|||
|
||||
if (req->msg.status)
|
||||
status = req->msg.status;
|
||||
sample = be16_to_cpu(req->sample);
|
||||
sample = sample >> 4;
|
||||
kfree(req);
|
||||
|
||||
/* on-wire is a must-ignore bit, a BE12 value, then padding */
|
||||
sample = be16_to_cpu(req->sample);
|
||||
sample = sample >> 3;
|
||||
sample &= 0x0fff;
|
||||
|
||||
kfree(req);
|
||||
return status ? status : sample;
|
||||
}
|
||||
|
||||
|
@ -336,13 +336,13 @@ static void ads7846_rx(void *ads)
|
|||
u16 x, y, z1, z2;
|
||||
unsigned long flags;
|
||||
|
||||
/* adjust: 12 bit samples (left aligned), built from
|
||||
* two 8 bit values writen msb-first.
|
||||
/* adjust: on-wire is a must-ignore bit, a BE12 value, then padding;
|
||||
* built from two 8 bit values written msb-first.
|
||||
*/
|
||||
x = be16_to_cpu(ts->tc.x) >> 4;
|
||||
y = be16_to_cpu(ts->tc.y) >> 4;
|
||||
z1 = be16_to_cpu(ts->tc.z1) >> 4;
|
||||
z2 = be16_to_cpu(ts->tc.z2) >> 4;
|
||||
x = (be16_to_cpu(ts->tc.x) >> 3) & 0x0fff;
|
||||
y = (be16_to_cpu(ts->tc.y) >> 3) & 0x0fff;
|
||||
z1 = (be16_to_cpu(ts->tc.z1) >> 3) & 0x0fff;
|
||||
z2 = (be16_to_cpu(ts->tc.z2) >> 3) & 0x0fff;
|
||||
|
||||
/* range filtering */
|
||||
if (x == MAX_12BIT)
|
||||
|
@ -420,7 +420,7 @@ static void ads7846_debounce(void *ads)
|
|||
|
||||
m = &ts->msg[ts->msg_idx];
|
||||
t = list_entry(m->transfers.prev, struct spi_transfer, transfer_list);
|
||||
val = (*(u16 *)t->rx_buf) >> 3;
|
||||
val = (be16_to_cpu(*(__be16 *)t->rx_buf) >> 3) & 0x0fff;
|
||||
if (!ts->read_cnt || (abs(ts->last_read - val) > ts->debounce_tol)) {
|
||||
/* Repeat it, if this was the first read or the read
|
||||
* wasn't consistent enough. */
|
||||
|
@ -469,7 +469,7 @@ static void ads7846_timer(unsigned long handle)
|
|||
spin_lock_irq(&ts->lock);
|
||||
|
||||
if (unlikely(ts->msg_idx && !ts->pendown)) {
|
||||
/* measurment cycle ended */
|
||||
/* measurement cycle ended */
|
||||
if (!device_suspended(&ts->spi->dev)) {
|
||||
ts->irq_disabled = 0;
|
||||
enable_irq(ts->spi->irq);
|
||||
|
@ -495,11 +495,10 @@ static irqreturn_t ads7846_irq(int irq, void *handle, struct pt_regs *regs)
|
|||
spin_lock_irqsave(&ts->lock, flags);
|
||||
if (likely(ts->get_pendown_state())) {
|
||||
if (!ts->irq_disabled) {
|
||||
/* REVISIT irq logic for many ARM chips has cloned a
|
||||
* bug wherein disabling an irq in its handler won't
|
||||
* work;(it's disabled lazily, and too late to work.
|
||||
* until all their irq logic is fixed, we must shadow
|
||||
* that state here.
|
||||
/* The ARM do_simple_IRQ() dispatcher doesn't act
|
||||
* like the other dispatchers: it will report IRQs
|
||||
* even after they've been disabled. We work around
|
||||
* that here. (The "generic irq" framework may help...)
|
||||
*/
|
||||
ts->irq_disabled = 1;
|
||||
disable_irq(ts->spi->irq);
|
||||
|
@ -609,16 +608,20 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* REVISIT when the irq can be triggered active-low, or if for some
|
||||
* reason the touchscreen isn't hooked up, we don't need to access
|
||||
* the pendown state.
|
||||
*/
|
||||
if (pdata->get_pendown_state == NULL) {
|
||||
dev_dbg(&spi->dev, "no get_pendown_state function?\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* We'd set the wordsize to 12 bits ... except that some controllers
|
||||
* will then treat the 8 bit command words as 12 bits (and drop the
|
||||
* four MSBs of the 12 bit result). Result: inputs must be shifted
|
||||
* to discard the four garbage LSBs.
|
||||
/* We'd set TX wordsize 8 bits and RX wordsize to 13 bits ... except
|
||||
* that even if the hardware can do that, the SPI controller driver
|
||||
* may not. So we stick to very-portable 8 bit words, both RX and TX.
|
||||
*/
|
||||
spi->bits_per_word = 8;
|
||||
|
||||
ts = kzalloc(sizeof(struct ads7846), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
|
@ -772,7 +775,7 @@ static int __devinit ads7846_probe(struct spi_device *spi)
|
|||
|
||||
if (request_irq(spi->irq, ads7846_irq,
|
||||
SA_SAMPLE_RANDOM | SA_TRIGGER_FALLING,
|
||||
spi->dev.bus_id, ts)) {
|
||||
spi->dev.driver->name, ts)) {
|
||||
dev_dbg(&spi->dev, "irq %d busy?\n", spi->irq);
|
||||
err = -EBUSY;
|
||||
goto err_free_mem;
|
||||
|
|
|
@ -167,6 +167,15 @@ void md_new_event(mddev_t *mddev)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(md_new_event);
|
||||
|
||||
/* Alternate version that can be called from interrupts
|
||||
* when calling sysfs_notify isn't needed.
|
||||
*/
|
||||
void md_new_event_inintr(mddev_t *mddev)
|
||||
{
|
||||
atomic_inc(&md_event_count);
|
||||
wake_up(&md_event_waiters);
|
||||
}
|
||||
|
||||
/*
|
||||
* Enables to iterate over all existing md arrays
|
||||
* all_mddevs_lock protects this list.
|
||||
|
@ -4149,7 +4158,7 @@ void md_error(mddev_t *mddev, mdk_rdev_t *rdev)
|
|||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
|
||||
md_wakeup_thread(mddev->thread);
|
||||
md_new_event(mddev);
|
||||
md_new_event_inintr(mddev);
|
||||
}
|
||||
|
||||
/* seq_file implementation /proc/mdstat */
|
||||
|
@ -5028,8 +5037,10 @@ static int md_notify_reboot(struct notifier_block *this,
|
|||
printk(KERN_INFO "md: stopping all md devices.\n");
|
||||
|
||||
ITERATE_MDDEV(mddev,tmp)
|
||||
if (mddev_trylock(mddev))
|
||||
if (mddev_trylock(mddev)) {
|
||||
do_md_stop (mddev, 1);
|
||||
mddev_unlock(mddev);
|
||||
}
|
||||
/*
|
||||
* certain more exotic SCSI devices are known to be
|
||||
* volatile wrt too early system reboots. While the
|
||||
|
|
|
@ -1605,6 +1605,21 @@ mpt_resume(struct pci_dev *pdev)
|
|||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
mpt_signal_reset(int index, MPT_ADAPTER *ioc, int reset_phase)
|
||||
{
|
||||
if ((MptDriverClass[index] == MPTSPI_DRIVER &&
|
||||
ioc->bus_type != SPI) ||
|
||||
(MptDriverClass[index] == MPTFC_DRIVER &&
|
||||
ioc->bus_type != FC) ||
|
||||
(MptDriverClass[index] == MPTSAS_DRIVER &&
|
||||
ioc->bus_type != SAS))
|
||||
/* make sure we only call the relevant reset handler
|
||||
* for the bus */
|
||||
return 0;
|
||||
return (MptResetHandlers[index])(ioc, reset_phase);
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* mpt_do_ioc_recovery - Initialize or recover MPT adapter.
|
||||
|
@ -1885,14 +1900,14 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
|||
if ((ret == 0) && MptResetHandlers[ii]) {
|
||||
dprintk((MYIOC_s_INFO_FMT "Calling IOC post_reset handler #%d\n",
|
||||
ioc->name, ii));
|
||||
rc += (*(MptResetHandlers[ii]))(ioc, MPT_IOC_POST_RESET);
|
||||
rc += mpt_signal_reset(ii, ioc, MPT_IOC_POST_RESET);
|
||||
handlers++;
|
||||
}
|
||||
|
||||
if (alt_ioc_ready && MptResetHandlers[ii]) {
|
||||
drsprintk((MYIOC_s_INFO_FMT "Calling alt-%s post_reset handler #%d\n",
|
||||
ioc->name, ioc->alt_ioc->name, ii));
|
||||
rc += (*(MptResetHandlers[ii]))(ioc->alt_ioc, MPT_IOC_POST_RESET);
|
||||
rc += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_POST_RESET);
|
||||
handlers++;
|
||||
}
|
||||
}
|
||||
|
@ -3267,11 +3282,11 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
|||
if (MptResetHandlers[ii]) {
|
||||
dprintk((MYIOC_s_INFO_FMT "Calling IOC pre_reset handler #%d\n",
|
||||
ioc->name, ii));
|
||||
r += (*(MptResetHandlers[ii]))(ioc, MPT_IOC_PRE_RESET);
|
||||
r += mpt_signal_reset(ii, ioc, MPT_IOC_PRE_RESET);
|
||||
if (ioc->alt_ioc) {
|
||||
dprintk((MYIOC_s_INFO_FMT "Calling alt-%s pre_reset handler #%d\n",
|
||||
ioc->name, ioc->alt_ioc->name, ii));
|
||||
r += (*(MptResetHandlers[ii]))(ioc->alt_ioc, MPT_IOC_PRE_RESET);
|
||||
r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_PRE_RESET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5706,11 +5721,11 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
|||
if (MptResetHandlers[ii]) {
|
||||
dtmprintk((MYIOC_s_INFO_FMT "Calling IOC reset_setup handler #%d\n",
|
||||
ioc->name, ii));
|
||||
r += (*(MptResetHandlers[ii]))(ioc, MPT_IOC_SETUP_RESET);
|
||||
r += mpt_signal_reset(ii, ioc, MPT_IOC_SETUP_RESET);
|
||||
if (ioc->alt_ioc) {
|
||||
dtmprintk((MYIOC_s_INFO_FMT "Calling alt-%s setup reset handler #%d\n",
|
||||
ioc->name, ioc->alt_ioc->name, ii));
|
||||
r += (*(MptResetHandlers[ii]))(ioc->alt_ioc, MPT_IOC_SETUP_RESET);
|
||||
r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_SETUP_RESET);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -220,6 +220,7 @@ static void e1000_restore_vlan(struct e1000_adapter *adapter);
|
|||
static int e1000_suspend(struct pci_dev *pdev, pm_message_t state);
|
||||
static int e1000_resume(struct pci_dev *pdev);
|
||||
#endif
|
||||
static void e1000_shutdown(struct pci_dev *pdev);
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
/* for netdump / net console */
|
||||
|
@ -235,8 +236,9 @@ static struct pci_driver e1000_driver = {
|
|||
/* Power Managment Hooks */
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = e1000_suspend,
|
||||
.resume = e1000_resume
|
||||
.resume = e1000_resume,
|
||||
#endif
|
||||
.shutdown = e1000_shutdown
|
||||
};
|
||||
|
||||
MODULE_AUTHOR("Intel Corporation, <linux.nics@intel.com>");
|
||||
|
@ -4611,6 +4613,12 @@ e1000_resume(struct pci_dev *pdev)
|
|||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void e1000_shutdown(struct pci_dev *pdev)
|
||||
{
|
||||
e1000_suspend(pdev, PMSG_SUSPEND);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
/*
|
||||
* Polling 'interrupt' - used by things like netconsole to send skbs
|
||||
|
|
|
@ -33,7 +33,7 @@ config DONGLE
|
|||
|
||||
config ESI_DONGLE
|
||||
tristate "ESI JetEye PC dongle"
|
||||
depends on DONGLE && IRDA
|
||||
depends on IRTTY_SIR && DONGLE && IRDA
|
||||
help
|
||||
Say Y here if you want to build support for the Extended Systems
|
||||
JetEye PC dongle. To compile it as a module, choose M here. The ESI
|
||||
|
@ -44,7 +44,7 @@ config ESI_DONGLE
|
|||
|
||||
config ACTISYS_DONGLE
|
||||
tristate "ACTiSYS IR-220L and IR220L+ dongle"
|
||||
depends on DONGLE && IRDA
|
||||
depends on IRTTY_SIR && DONGLE && IRDA
|
||||
help
|
||||
Say Y here if you want to build support for the ACTiSYS IR-220L and
|
||||
IR220L+ dongles. To compile it as a module, choose M here. The
|
||||
|
@ -55,7 +55,7 @@ config ACTISYS_DONGLE
|
|||
|
||||
config TEKRAM_DONGLE
|
||||
tristate "Tekram IrMate 210B dongle"
|
||||
depends on DONGLE && IRDA
|
||||
depends on IRTTY_SIR && DONGLE && IRDA
|
||||
help
|
||||
Say Y here if you want to build support for the Tekram IrMate 210B
|
||||
dongle. To compile it as a module, choose M here. The Tekram dongle
|
||||
|
@ -66,7 +66,7 @@ config TEKRAM_DONGLE
|
|||
|
||||
config TOIM3232_DONGLE
|
||||
tristate "TOIM3232 IrDa dongle"
|
||||
depends on DONGLE && IRDA
|
||||
depends on IRTTY_SIR && DONGLE && IRDA
|
||||
help
|
||||
Say Y here if you want to build support for the Vishay/Temic
|
||||
TOIM3232 and TOIM4232 based dongles.
|
||||
|
@ -74,7 +74,7 @@ config TOIM3232_DONGLE
|
|||
|
||||
config LITELINK_DONGLE
|
||||
tristate "Parallax LiteLink dongle"
|
||||
depends on DONGLE && IRDA
|
||||
depends on IRTTY_SIR && DONGLE && IRDA
|
||||
help
|
||||
Say Y here if you want to build support for the Parallax Litelink
|
||||
dongle. To compile it as a module, choose M here. The Parallax
|
||||
|
@ -85,7 +85,7 @@ config LITELINK_DONGLE
|
|||
|
||||
config MA600_DONGLE
|
||||
tristate "Mobile Action MA600 dongle"
|
||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
||||
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||
help
|
||||
Say Y here if you want to build support for the Mobile Action MA600
|
||||
dongle. To compile it as a module, choose M here. The MA600 dongle
|
||||
|
@ -98,7 +98,7 @@ config MA600_DONGLE
|
|||
|
||||
config GIRBIL_DONGLE
|
||||
tristate "Greenwich GIrBIL dongle"
|
||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
||||
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||
help
|
||||
Say Y here if you want to build support for the Greenwich GIrBIL
|
||||
dongle. If you want to compile it as a module, choose M here.
|
||||
|
@ -109,7 +109,7 @@ config GIRBIL_DONGLE
|
|||
|
||||
config MCP2120_DONGLE
|
||||
tristate "Microchip MCP2120"
|
||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
||||
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||
help
|
||||
Say Y here if you want to build support for the Microchip MCP2120
|
||||
dongle. If you want to compile it as a module, choose M here.
|
||||
|
@ -123,7 +123,7 @@ config MCP2120_DONGLE
|
|||
|
||||
config OLD_BELKIN_DONGLE
|
||||
tristate "Old Belkin dongle"
|
||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
||||
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||
help
|
||||
Say Y here if you want to build support for the Adaptec Airport 1000
|
||||
and 2000 dongles. If you want to compile it as a module, choose
|
||||
|
@ -132,7 +132,7 @@ config OLD_BELKIN_DONGLE
|
|||
|
||||
config ACT200L_DONGLE
|
||||
tristate "ACTiSYS IR-200L dongle"
|
||||
depends on DONGLE && IRDA && EXPERIMENTAL
|
||||
depends on IRTTY_SIR && DONGLE && IRDA && EXPERIMENTAL
|
||||
help
|
||||
Say Y here if you want to build support for the ACTiSYS IR-200L
|
||||
dongle. If you want to compile it as a module, choose M here.
|
||||
|
|
|
@ -1774,8 +1774,6 @@ static int pcnet32_open(struct net_device *dev)
|
|||
lp->rx_dma_addr[i] = 0;
|
||||
}
|
||||
|
||||
pcnet32_free_ring(dev);
|
||||
|
||||
/*
|
||||
* Switch back to 16bit mode to avoid problems with dumb
|
||||
* DOS packet driver after a warm reboot
|
||||
|
|
|
@ -1486,13 +1486,13 @@ ch_action_iofatal(fsm_instance * fi, int event, void *arg)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
static void
|
||||
ch_action_reinit(fsm_instance *fi, int event, void *arg)
|
||||
{
|
||||
struct channel *ch = (struct channel *)arg;
|
||||
struct net_device *dev = ch->netdev;
|
||||
struct ctc_priv *privptr = dev->priv;
|
||||
|
||||
|
||||
DBF_TEXT(trace, 4, __FUNCTION__);
|
||||
ch_action_iofatal(fi, event, arg);
|
||||
fsm_addtimer(&privptr->restart_timer, 1000, DEV_EVENT_RESTART, dev);
|
||||
|
@ -1624,7 +1624,7 @@ less_than(char *id1, char *id2)
|
|||
}
|
||||
dev1 = simple_strtoul(id1, &id1, 16);
|
||||
dev2 = simple_strtoul(id2, &id2, 16);
|
||||
|
||||
|
||||
return (dev1 < dev2);
|
||||
}
|
||||
|
||||
|
@ -1895,7 +1895,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
|
|||
irb->scsw.dstat);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
priv = ((struct ccwgroup_device *)cdev->dev.driver_data)
|
||||
->dev.driver_data;
|
||||
|
||||
|
@ -1909,7 +1909,7 @@ ctc_irq_handler(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
|
|||
"device %s\n", cdev->dev.bus_id);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
dev = (struct net_device *) (ch->netdev);
|
||||
if (dev == NULL) {
|
||||
ctc_pr_crit("ctc: ctc_irq_handler dev=NULL bus_id=%s, ch=0x%p\n",
|
||||
|
@ -2008,12 +2008,12 @@ dev_action_stop(fsm_instance * fi, int event, void *arg)
|
|||
fsm_event(ch->fsm, CH_EVENT_STOP, ch);
|
||||
}
|
||||
}
|
||||
static void
|
||||
static void
|
||||
dev_action_restart(fsm_instance *fi, int event, void *arg)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *)arg;
|
||||
struct ctc_priv *privptr = dev->priv;
|
||||
|
||||
|
||||
DBF_TEXT(trace, 3, __FUNCTION__);
|
||||
ctc_pr_debug("%s: Restarting\n", dev->name);
|
||||
dev_action_stop(fi, event, arg);
|
||||
|
@ -2193,7 +2193,7 @@ transmit_skb(struct channel *ch, struct sk_buff *skb)
|
|||
|
||||
DBF_TEXT(trace, 5, __FUNCTION__);
|
||||
/* we need to acquire the lock for testing the state
|
||||
* otherwise we can have an IRQ changing the state to
|
||||
* otherwise we can have an IRQ changing the state to
|
||||
* TXIDLE after the test but before acquiring the lock.
|
||||
*/
|
||||
spin_lock_irqsave(&ch->collect_lock, saveflags);
|
||||
|
@ -2393,7 +2393,7 @@ ctc_tx(struct sk_buff *skb, struct net_device * dev)
|
|||
|
||||
/**
|
||||
* If channels are not running, try to restart them
|
||||
* and throw away packet.
|
||||
* and throw away packet.
|
||||
*/
|
||||
if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) {
|
||||
fsm_event(privptr->fsm, DEV_EVENT_START, dev);
|
||||
|
@ -2738,7 +2738,7 @@ ctc_remove_files(struct device *dev)
|
|||
/**
|
||||
* Add ctc specific attributes.
|
||||
* Add ctc private data.
|
||||
*
|
||||
*
|
||||
* @param cgdev pointer to ccwgroup_device just added
|
||||
*
|
||||
* @returns 0 on success, !0 on failure.
|
||||
|
@ -2869,7 +2869,7 @@ ctc_new_device(struct ccwgroup_device *cgdev)
|
|||
DBF_TEXT(setup, 3, buffer);
|
||||
|
||||
type = get_channel_type(&cgdev->cdev[0]->id);
|
||||
|
||||
|
||||
snprintf(read_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[0]->dev.bus_id);
|
||||
snprintf(write_id, CTC_ID_SIZE, "ch-%s", cgdev->cdev[1]->dev.bus_id);
|
||||
|
||||
|
@ -2907,7 +2907,7 @@ ctc_new_device(struct ccwgroup_device *cgdev)
|
|||
channel_get(type, direction == READ ? read_id : write_id,
|
||||
direction);
|
||||
if (privptr->channel[direction] == NULL) {
|
||||
if (direction == WRITE)
|
||||
if (direction == WRITE)
|
||||
channel_free(privptr->channel[READ]);
|
||||
|
||||
ctc_free_netdevice(dev, 1);
|
||||
|
@ -2955,7 +2955,7 @@ ctc_shutdown_device(struct ccwgroup_device *cgdev)
|
|||
{
|
||||
struct ctc_priv *priv;
|
||||
struct net_device *ndev;
|
||||
|
||||
|
||||
DBF_TEXT(setup, 3, __FUNCTION__);
|
||||
pr_debug("%s() called\n", __FUNCTION__);
|
||||
|
||||
|
|
|
@ -130,7 +130,7 @@ ctc_tty_readmodem(ctc_tty_info *info)
|
|||
if ((tty = info->tty)) {
|
||||
if (info->mcr & UART_MCR_RTS) {
|
||||
struct sk_buff *skb;
|
||||
|
||||
|
||||
if ((skb = skb_dequeue(&info->rx_queue))) {
|
||||
int len = skb->len;
|
||||
tty_insert_flip_string(tty, skb->data, len);
|
||||
|
@ -328,7 +328,7 @@ ctc_tty_inject(ctc_tty_info *info, char c)
|
|||
{
|
||||
int skb_res;
|
||||
struct sk_buff *skb;
|
||||
|
||||
|
||||
DBF_TEXT(trace, 4, __FUNCTION__);
|
||||
if (ctc_tty_shuttingdown)
|
||||
return;
|
||||
|
@ -497,7 +497,7 @@ ctc_tty_write(struct tty_struct *tty, const u_char * buf, int count)
|
|||
c = (count < CTC_TTY_XMIT_SIZE) ? count : CTC_TTY_XMIT_SIZE;
|
||||
if (c <= 0)
|
||||
break;
|
||||
|
||||
|
||||
skb_res = info->netdev->hard_header_len + sizeof(info->mcr) +
|
||||
+ sizeof(__u32);
|
||||
skb = dev_alloc_skb(skb_res + c);
|
||||
|
@ -828,7 +828,7 @@ ctc_tty_block_til_ready(struct tty_struct *tty, struct file *filp, ctc_tty_info
|
|||
if (tty_hung_up_p(filp) ||
|
||||
(info->flags & CTC_ASYNC_CLOSING)) {
|
||||
if (info->flags & CTC_ASYNC_CLOSING)
|
||||
wait_event(info->close_wait,
|
||||
wait_event(info->close_wait,
|
||||
!(info->flags & CTC_ASYNC_CLOSING));
|
||||
#ifdef MODEM_DO_RESTART
|
||||
if (info->flags & CTC_ASYNC_HUP_NOTIFY)
|
||||
|
@ -1247,7 +1247,7 @@ ctc_tty_unregister_netdev(struct net_device *dev) {
|
|||
void
|
||||
ctc_tty_cleanup(void) {
|
||||
unsigned long saveflags;
|
||||
|
||||
|
||||
DBF_TEXT(trace, 2, __FUNCTION__);
|
||||
spin_lock_irqsave(&ctc_tty_lock, saveflags);
|
||||
ctc_tty_shuttingdown = 1;
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/err.h>
|
||||
|
@ -77,7 +77,7 @@ group_write(struct device_driver *drv, const char *buf, size_t count)
|
|||
int len;
|
||||
|
||||
if (!(end = strchr(start, delim[i])))
|
||||
return count;
|
||||
return -EINVAL;
|
||||
len = min_t(ptrdiff_t, BUS_ID_SIZE, end - start + 1);
|
||||
strlcpy (bus_ids[i], start, len);
|
||||
argv[i] = bus_ids[i];
|
||||
|
@ -94,7 +94,7 @@ static DRIVER_ATTR(group, 0200, NULL, group_write);
|
|||
|
||||
/* Register-unregister for ctc&lcs */
|
||||
int
|
||||
register_cu3088_discipline(struct ccwgroup_driver *dcp)
|
||||
register_cu3088_discipline(struct ccwgroup_driver *dcp)
|
||||
{
|
||||
int rc;
|
||||
|
||||
|
@ -109,7 +109,7 @@ register_cu3088_discipline(struct ccwgroup_driver *dcp)
|
|||
rc = driver_create_file(&dcp->driver, &driver_attr_group);
|
||||
if (rc)
|
||||
ccwgroup_driver_unregister(dcp);
|
||||
|
||||
|
||||
return rc;
|
||||
|
||||
}
|
||||
|
@ -137,7 +137,7 @@ static int __init
|
|||
cu3088_init (void)
|
||||
{
|
||||
int rc;
|
||||
|
||||
|
||||
cu3088_root_dev = s390_root_dev_register("cu3088");
|
||||
if (IS_ERR(cu3088_root_dev))
|
||||
return PTR_ERR(cu3088_root_dev);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/*
|
||||
/*
|
||||
* IUCV network driver
|
||||
*
|
||||
* Copyright (C) 2001 IBM Deutschland Entwicklung GmbH, IBM Corporation
|
||||
|
@ -28,7 +28,7 @@
|
|||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* #define DEBUG */
|
||||
|
||||
#include <linux/module.h>
|
||||
|
@ -81,7 +81,7 @@ iucv_bus_match (struct device *dev, struct device_driver *drv)
|
|||
struct bus_type iucv_bus = {
|
||||
.name = "iucv",
|
||||
.match = iucv_bus_match,
|
||||
};
|
||||
};
|
||||
|
||||
struct device *iucv_root;
|
||||
|
||||
|
@ -297,7 +297,7 @@ MODULE_LICENSE("GPL");
|
|||
/*
|
||||
* Debugging stuff
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
static int debuglevel = 0;
|
||||
|
@ -344,7 +344,7 @@ do { \
|
|||
/*
|
||||
* Internal functions
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
/**
|
||||
* print start banner
|
||||
*/
|
||||
|
@ -810,7 +810,7 @@ iucv_register_program (__u8 pgmname[16],
|
|||
sizeof (new_handler->id.userid));
|
||||
EBC_TOUPPER (new_handler->id.userid,
|
||||
sizeof (new_handler->id.userid));
|
||||
|
||||
|
||||
if (pgmmask) {
|
||||
memcpy (new_handler->id.mask, pgmmask,
|
||||
sizeof (new_handler->id.mask));
|
||||
|
@ -1229,7 +1229,7 @@ iucv_purge (__u16 pathid, __u32 msgid, __u32 srccls, __u32 *audit)
|
|||
/* parm->ipaudit has only 3 bytes */
|
||||
*audit >>= 8;
|
||||
}
|
||||
|
||||
|
||||
release_param(parm);
|
||||
|
||||
iucv_debug(1, "b2f0_result = %ld", b2f0_result);
|
||||
|
@ -2330,14 +2330,14 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
|
|||
temp_buff1[j] &= (h->id.mask)[j];
|
||||
temp_buff2[j] &= (h->id.mask)[j];
|
||||
}
|
||||
|
||||
|
||||
iucv_dumpit("temp_buff1:",
|
||||
temp_buff1, sizeof(temp_buff1));
|
||||
iucv_dumpit("temp_buff2",
|
||||
temp_buff2, sizeof(temp_buff2));
|
||||
|
||||
|
||||
if (!memcmp (temp_buff1, temp_buff2, 24)) {
|
||||
|
||||
|
||||
iucv_debug(2,
|
||||
"found a matching handler");
|
||||
break;
|
||||
|
@ -2368,7 +2368,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
|
|||
} else
|
||||
iucv_sever(int_buf->ippathid, no_listener);
|
||||
break;
|
||||
|
||||
|
||||
case 0x02: /*connection complete */
|
||||
if (messagesDisabled) {
|
||||
iucv_setmask(~0);
|
||||
|
@ -2387,7 +2387,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
|
|||
} else
|
||||
iucv_sever(int_buf->ippathid, no_listener);
|
||||
break;
|
||||
|
||||
|
||||
case 0x03: /* connection severed */
|
||||
if (messagesDisabled) {
|
||||
iucv_setmask(~0);
|
||||
|
@ -2398,13 +2398,13 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
|
|||
interrupt->ConnectionSevered(
|
||||
(iucv_ConnectionSevered *)int_buf,
|
||||
h->pgm_data);
|
||||
|
||||
|
||||
else
|
||||
iucv_sever (int_buf->ippathid, no_listener);
|
||||
} else
|
||||
iucv_sever(int_buf->ippathid, no_listener);
|
||||
break;
|
||||
|
||||
|
||||
case 0x04: /* connection quiesced */
|
||||
if (messagesDisabled) {
|
||||
iucv_setmask(~0);
|
||||
|
@ -2420,7 +2420,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
|
|||
"ConnectionQuiesced not called");
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 0x05: /* connection resumed */
|
||||
if (messagesDisabled) {
|
||||
iucv_setmask(~0);
|
||||
|
@ -2436,7 +2436,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
|
|||
"ConnectionResumed not called");
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 0x06: /* priority message complete */
|
||||
case 0x07: /* nonpriority message complete */
|
||||
if (h) {
|
||||
|
@ -2449,7 +2449,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
|
|||
"MessageComplete not called");
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 0x08: /* priority message pending */
|
||||
case 0x09: /* nonpriority message pending */
|
||||
if (h) {
|
||||
|
@ -2467,7 +2467,7 @@ iucv_do_int(iucv_GeneralInterrupt * int_buf)
|
|||
__FUNCTION__);
|
||||
break;
|
||||
} /* end switch */
|
||||
|
||||
|
||||
iucv_debug(2, "exiting pathid %d, type %02X",
|
||||
int_buf->ippathid, int_buf->iptype);
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
*
|
||||
* S390 version
|
||||
* Copyright (C) 2000 IBM Corporation
|
||||
* Author(s):Alan Altmark (Alan_Altmark@us.ibm.com)
|
||||
* Author(s):Alan Altmark (Alan_Altmark@us.ibm.com)
|
||||
* Xenia Tkatschow (xenia@us.ibm.com)
|
||||
*
|
||||
*
|
||||
|
@ -16,17 +16,17 @@
|
|||
* CP Programming Services book, also available on the web
|
||||
* thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
|
||||
*
|
||||
* Definition of Return Codes
|
||||
* -All positive return codes including zero are reflected back
|
||||
* from CP except for iucv_register_program. The definition of each
|
||||
* return code can be found in CP Programming Services book.
|
||||
* Also available on the web thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
|
||||
* - Return Code of:
|
||||
* (-EINVAL) Invalid value
|
||||
* (-ENOMEM) storage allocation failed
|
||||
* Definition of Return Codes
|
||||
* -All positive return codes including zero are reflected back
|
||||
* from CP except for iucv_register_program. The definition of each
|
||||
* return code can be found in CP Programming Services book.
|
||||
* Also available on the web thru www.ibm.com/s390/vm/pubs, manual # SC24-5760
|
||||
* - Return Code of:
|
||||
* (-EINVAL) Invalid value
|
||||
* (-ENOMEM) storage allocation failed
|
||||
* pgmask defined in iucv_register_program will be set depending on input
|
||||
* paramters.
|
||||
*
|
||||
* paramters.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
|
@ -124,13 +124,13 @@ iucv_hex_dump(unsigned char *buf, size_t len)
|
|||
#define iucv_handle_t void *
|
||||
|
||||
/* flags1:
|
||||
* All flags are defined in the field IPFLAGS1 of each function
|
||||
* and can be found in CP Programming Services.
|
||||
* IPLOCAL - Indicates the connect can only be satisfied on the
|
||||
* local system
|
||||
* IPPRTY - Indicates a priority message
|
||||
* IPQUSCE - Indicates you do not want to receive messages on a
|
||||
* path until an iucv_resume is issued
|
||||
* All flags are defined in the field IPFLAGS1 of each function
|
||||
* and can be found in CP Programming Services.
|
||||
* IPLOCAL - Indicates the connect can only be satisfied on the
|
||||
* local system
|
||||
* IPPRTY - Indicates a priority message
|
||||
* IPQUSCE - Indicates you do not want to receive messages on a
|
||||
* path until an iucv_resume is issued
|
||||
* IPRMDATA - Indicates that the message is in the parameter list
|
||||
*/
|
||||
#define IPLOCAL 0x01
|
||||
|
@ -154,14 +154,14 @@ iucv_hex_dump(unsigned char *buf, size_t len)
|
|||
#define AllInterrupts 0xf8
|
||||
/*
|
||||
* Mapping of external interrupt buffers should be used with the corresponding
|
||||
* interrupt types.
|
||||
* Names: iucv_ConnectionPending -> connection pending
|
||||
* interrupt types.
|
||||
* Names: iucv_ConnectionPending -> connection pending
|
||||
* iucv_ConnectionComplete -> connection complete
|
||||
* iucv_ConnectionSevered -> connection severed
|
||||
* iucv_ConnectionQuiesced -> connection quiesced
|
||||
* iucv_ConnectionResumed -> connection resumed
|
||||
* iucv_MessagePending -> message pending
|
||||
* iucv_MessageComplete -> message complete
|
||||
* iucv_ConnectionSevered -> connection severed
|
||||
* iucv_ConnectionQuiesced -> connection quiesced
|
||||
* iucv_ConnectionResumed -> connection resumed
|
||||
* iucv_MessagePending -> message pending
|
||||
* iucv_MessageComplete -> message complete
|
||||
*/
|
||||
typedef struct {
|
||||
u16 ippathid;
|
||||
|
@ -260,16 +260,16 @@ typedef struct {
|
|||
uchar res2[3];
|
||||
} iucv_MessageComplete;
|
||||
|
||||
/*
|
||||
* iucv_interrupt_ops_t: Is a vector of functions that handle
|
||||
* IUCV interrupts.
|
||||
* Parameter list:
|
||||
* eib - is a pointer to a 40-byte area described
|
||||
* with one of the structures above.
|
||||
* pgm_data - this data is strictly for the
|
||||
* interrupt handler that is passed by
|
||||
* the application. This may be an address
|
||||
* or token.
|
||||
/*
|
||||
* iucv_interrupt_ops_t: Is a vector of functions that handle
|
||||
* IUCV interrupts.
|
||||
* Parameter list:
|
||||
* eib - is a pointer to a 40-byte area described
|
||||
* with one of the structures above.
|
||||
* pgm_data - this data is strictly for the
|
||||
* interrupt handler that is passed by
|
||||
* the application. This may be an address
|
||||
* or token.
|
||||
*/
|
||||
typedef struct {
|
||||
void (*ConnectionPending) (iucv_ConnectionPending * eib,
|
||||
|
@ -287,8 +287,8 @@ typedef struct {
|
|||
} iucv_interrupt_ops_t;
|
||||
|
||||
/*
|
||||
*iucv_array_t : Defines buffer array.
|
||||
* Inside the array may be 31- bit addresses and 31-bit lengths.
|
||||
*iucv_array_t : Defines buffer array.
|
||||
* Inside the array may be 31- bit addresses and 31-bit lengths.
|
||||
*/
|
||||
typedef struct {
|
||||
u32 address;
|
||||
|
@ -299,19 +299,19 @@ extern struct bus_type iucv_bus;
|
|||
extern struct device *iucv_root;
|
||||
|
||||
/* -prototypes- */
|
||||
/*
|
||||
* Name: iucv_register_program
|
||||
* Purpose: Registers an application with IUCV
|
||||
* Input: prmname - user identification
|
||||
/*
|
||||
* Name: iucv_register_program
|
||||
* Purpose: Registers an application with IUCV
|
||||
* Input: prmname - user identification
|
||||
* userid - machine identification
|
||||
* pgmmask - indicates which bits in the prmname and userid combined will be
|
||||
* used to determine who is given control
|
||||
* ops - address of vector of interrupt handlers
|
||||
* pgm_data- application data passed to interrupt handlers
|
||||
* Output: NA
|
||||
* Return: address of handler
|
||||
* ops - address of vector of interrupt handlers
|
||||
* pgm_data- application data passed to interrupt handlers
|
||||
* Output: NA
|
||||
* Return: address of handler
|
||||
* (0) - Error occurred, registration not completed.
|
||||
* NOTE: Exact cause of failure will be recorded in syslog.
|
||||
* NOTE: Exact cause of failure will be recorded in syslog.
|
||||
*/
|
||||
iucv_handle_t iucv_register_program (uchar pgmname[16],
|
||||
uchar userid[8],
|
||||
|
@ -319,13 +319,13 @@ iucv_handle_t iucv_register_program (uchar pgmname[16],
|
|||
iucv_interrupt_ops_t * ops,
|
||||
void *pgm_data);
|
||||
|
||||
/*
|
||||
* Name: iucv_unregister_program
|
||||
* Purpose: Unregister application with IUCV
|
||||
* Input: address of handler
|
||||
* Output: NA
|
||||
* Return: (0) - Normal return
|
||||
* (-EINVAL) - Internal error, wild pointer
|
||||
/*
|
||||
* Name: iucv_unregister_program
|
||||
* Purpose: Unregister application with IUCV
|
||||
* Input: address of handler
|
||||
* Output: NA
|
||||
* Return: (0) - Normal return
|
||||
* (-EINVAL) - Internal error, wild pointer
|
||||
*/
|
||||
int iucv_unregister_program (iucv_handle_t handle);
|
||||
|
||||
|
@ -333,7 +333,7 @@ int iucv_unregister_program (iucv_handle_t handle);
|
|||
* Name: iucv_accept
|
||||
* Purpose: This function is issued after the user receives a Connection Pending external
|
||||
* interrupt and now wishes to complete the IUCV communication path.
|
||||
* Input: pathid - u16 , Path identification number
|
||||
* Input: pathid - u16 , Path identification number
|
||||
* msglim_reqstd - u16, The number of outstanding messages requested.
|
||||
* user_data - uchar[16], Data specified by the iucv_connect function.
|
||||
* flags1 - int, Contains options for this path.
|
||||
|
@ -358,34 +358,34 @@ int iucv_accept (u16 pathid,
|
|||
void *pgm_data, int *flags1_out, u16 * msglim);
|
||||
|
||||
/*
|
||||
* Name: iucv_connect
|
||||
* Name: iucv_connect
|
||||
* Purpose: This function establishes an IUCV path. Although the connect may complete
|
||||
* successfully, you are not able to use the path until you receive an IUCV
|
||||
* Connection Complete external interrupt.
|
||||
* Input: pathid - u16 *, Path identification number
|
||||
* msglim_reqstd - u16, Number of outstanding messages requested
|
||||
* user_data - uchar[16], 16-byte user data
|
||||
* successfully, you are not able to use the path until you receive an IUCV
|
||||
* Connection Complete external interrupt.
|
||||
* Input: pathid - u16 *, Path identification number
|
||||
* msglim_reqstd - u16, Number of outstanding messages requested
|
||||
* user_data - uchar[16], 16-byte user data
|
||||
* userid - uchar[8], User identification
|
||||
* system_name - uchar[8], 8-byte identifying the system name
|
||||
* system_name - uchar[8], 8-byte identifying the system name
|
||||
* flags1 - int, Contains options for this path.
|
||||
* -IPPRTY - 0x20, Specifies if you want to send priority message.
|
||||
* -IPRMDATA - 0x80, Specifies whether your program can handle a message
|
||||
* in the parameter list.
|
||||
* -IPQUSCE - 0x40, Specifies whether you want to quiesce the path being
|
||||
* -IPQUSCE - 0x40, Specifies whether you want to quiesce the path being
|
||||
* established.
|
||||
* -IPLOCAL - 0X01, Allows an application to force the partner to be on
|
||||
* -IPLOCAL - 0X01, Allows an application to force the partner to be on
|
||||
* the local system. If local is specified then target class cannot be
|
||||
* specified.
|
||||
* specified.
|
||||
* flags1_out - int * Contains information about the path
|
||||
* - IPPRTY - 0x20, Indicates you may send priority messages.
|
||||
* msglim - * u16, Number of outstanding messages
|
||||
* handle - iucv_handle_t, Address of handler
|
||||
* pgm_data - void *, Application data passed to interrupt handlers
|
||||
* handle - iucv_handle_t, Address of handler
|
||||
* pgm_data - void *, Application data passed to interrupt handlers
|
||||
* Output: return code from CP IUCV call
|
||||
* rc - return code from iucv_declare_buffer
|
||||
* -EINVAL - Invalid handle passed by application
|
||||
* -EINVAL - Pathid address is NULL
|
||||
* add_pathid_result - Return code from internal function add_pathid
|
||||
* -EINVAL - Invalid handle passed by application
|
||||
* -EINVAL - Pathid address is NULL
|
||||
* add_pathid_result - Return code from internal function add_pathid
|
||||
*/
|
||||
int
|
||||
iucv_connect (u16 * pathid,
|
||||
|
@ -397,16 +397,16 @@ int
|
|||
int *flags1_out,
|
||||
u16 * msglim, iucv_handle_t handle, void *pgm_data);
|
||||
|
||||
/*
|
||||
* Name: iucv_purge
|
||||
* Purpose: This function cancels a message that you have sent.
|
||||
* Input: pathid - Path identification number.
|
||||
/*
|
||||
* Name: iucv_purge
|
||||
* Purpose: This function cancels a message that you have sent.
|
||||
* Input: pathid - Path identification number.
|
||||
* msgid - Specifies the message ID of the message to be purged.
|
||||
* srccls - Specifies the source message class.
|
||||
* Output: audit - Contains information about asynchronous error
|
||||
* that may have affected the normal completion
|
||||
* of this message.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* srccls - Specifies the source message class.
|
||||
* Output: audit - Contains information about asynchronous error
|
||||
* that may have affected the normal completion
|
||||
* of this message.
|
||||
* Return: Return code from CP IUCV call.
|
||||
*/
|
||||
int iucv_purge (u16 pathid, u32 msgid, u32 srccls, __u32 *audit);
|
||||
/*
|
||||
|
@ -426,38 +426,38 @@ ulong iucv_query_maxconn (void);
|
|||
*/
|
||||
ulong iucv_query_bufsize (void);
|
||||
|
||||
/*
|
||||
* Name: iucv_quiesce
|
||||
* Purpose: This function temporarily suspends incoming messages on an
|
||||
* IUCV path. You can later reactivate the path by invoking
|
||||
* the iucv_resume function.
|
||||
* Input: pathid - Path identification number
|
||||
* user_data - 16-bytes of user data
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
/*
|
||||
* Name: iucv_quiesce
|
||||
* Purpose: This function temporarily suspends incoming messages on an
|
||||
* IUCV path. You can later reactivate the path by invoking
|
||||
* the iucv_resume function.
|
||||
* Input: pathid - Path identification number
|
||||
* user_data - 16-bytes of user data
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
*/
|
||||
int iucv_quiesce (u16 pathid, uchar user_data[16]);
|
||||
|
||||
/*
|
||||
* Name: iucv_receive
|
||||
* Purpose: This function receives messages that are being sent to you
|
||||
/*
|
||||
* Name: iucv_receive
|
||||
* Purpose: This function receives messages that are being sent to you
|
||||
* over established paths. Data will be returned in buffer for length of
|
||||
* buflen.
|
||||
* Input:
|
||||
* pathid - Path identification number.
|
||||
* buffer - Address of buffer to receive.
|
||||
* buflen - Length of buffer to receive.
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
* Output:
|
||||
* Input:
|
||||
* pathid - Path identification number.
|
||||
* buffer - Address of buffer to receive.
|
||||
* buflen - Length of buffer to receive.
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
* Output:
|
||||
* flags1_out: int *, Contains information about this path.
|
||||
* IPNORPY - 0x10 Specifies this is a one-way message and no reply is
|
||||
* expected.
|
||||
* IPPRTY - 0x20 Specifies if you want to send priority message.
|
||||
* expected.
|
||||
* IPPRTY - 0x20 Specifies if you want to send priority message.
|
||||
* IPRMDATA - 0x80 specifies the data is contained in the parameter list
|
||||
* residual_buffer - address of buffer updated by the number
|
||||
* of bytes you have received.
|
||||
* residual_length -
|
||||
* residual_length -
|
||||
* Contains one of the following values, if the receive buffer is:
|
||||
* The same length as the message, this field is zero.
|
||||
* Longer than the message, this field contains the number of
|
||||
|
@ -466,8 +466,8 @@ int iucv_quiesce (u16 pathid, uchar user_data[16]);
|
|||
* count (that is, the number of bytes remaining in the
|
||||
* message that does not fit into the buffer. In this
|
||||
* case b2f0_result = 5.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - buffer address is pointing to NULL
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - buffer address is pointing to NULL
|
||||
*/
|
||||
int iucv_receive (u16 pathid,
|
||||
u32 msgid,
|
||||
|
@ -477,16 +477,16 @@ int iucv_receive (u16 pathid,
|
|||
int *flags1_out,
|
||||
ulong * residual_buffer, ulong * residual_length);
|
||||
|
||||
/*
|
||||
* Name: iucv_receive_array
|
||||
* Purpose: This function receives messages that are being sent to you
|
||||
/*
|
||||
* Name: iucv_receive_array
|
||||
* Purpose: This function receives messages that are being sent to you
|
||||
* over established paths. Data will be returned in first buffer for
|
||||
* length of first buffer.
|
||||
* Input: pathid - Path identification number.
|
||||
* Input: pathid - Path identification number.
|
||||
* msgid - specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
* buffer - Address of array of buffers.
|
||||
* buflen - Total length of buffers.
|
||||
* buffer - Address of array of buffers.
|
||||
* buflen - Total length of buffers.
|
||||
* Output:
|
||||
* flags1_out: int *, Contains information about this path.
|
||||
* IPNORPY - 0x10 Specifies this is a one-way message and no reply is
|
||||
|
@ -504,8 +504,8 @@ int iucv_receive (u16 pathid,
|
|||
* count (that is, the number of bytes remaining in the
|
||||
* message that does not fit into the buffer. In this
|
||||
* case b2f0_result = 5.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
*/
|
||||
int iucv_receive_array (u16 pathid,
|
||||
u32 msgid,
|
||||
|
@ -515,44 +515,44 @@ int iucv_receive_array (u16 pathid,
|
|||
int *flags1_out,
|
||||
ulong * residual_buffer, ulong * residual_length);
|
||||
|
||||
/*
|
||||
* Name: iucv_reject
|
||||
* Purpose: The reject function refuses a specified message. Between the
|
||||
* time you are notified of a message and the time that you
|
||||
* complete the message, the message may be rejected.
|
||||
* Input: pathid - Path identification number.
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
/*
|
||||
* Name: iucv_reject
|
||||
* Purpose: The reject function refuses a specified message. Between the
|
||||
* time you are notified of a message and the time that you
|
||||
* complete the message, the message may be rejected.
|
||||
* Input: pathid - Path identification number.
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
*/
|
||||
int iucv_reject (u16 pathid, u32 msgid, u32 trgcls);
|
||||
|
||||
/*
|
||||
* Name: iucv_reply
|
||||
* Purpose: This function responds to the two-way messages that you
|
||||
* receive. You must identify completely the message to
|
||||
* which you wish to reply. ie, pathid, msgid, and trgcls.
|
||||
* Input: pathid - Path identification number.
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
/*
|
||||
* Name: iucv_reply
|
||||
* Purpose: This function responds to the two-way messages that you
|
||||
* receive. You must identify completely the message to
|
||||
* which you wish to reply. ie, pathid, msgid, and trgcls.
|
||||
* Input: pathid - Path identification number.
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- 0x20, Specifies if you want to send priority message.
|
||||
* buffer - Address of reply buffer.
|
||||
* buflen - Length of reply buffer.
|
||||
* Output: residual_buffer - Address of buffer updated by the number
|
||||
* of bytes you have moved.
|
||||
* IPPRTY- 0x20, Specifies if you want to send priority message.
|
||||
* buffer - Address of reply buffer.
|
||||
* buflen - Length of reply buffer.
|
||||
* Output: residual_buffer - Address of buffer updated by the number
|
||||
* of bytes you have moved.
|
||||
* residual_length - Contains one of the following values:
|
||||
* If the answer buffer is the same length as the reply, this field
|
||||
* contains zero.
|
||||
* If the answer buffer is longer than the reply, this field contains
|
||||
* the number of bytes remaining in the buffer.
|
||||
* the number of bytes remaining in the buffer.
|
||||
* If the answer buffer is shorter than the reply, this field contains
|
||||
* a residual count (that is, the number of bytes remianing in the
|
||||
* reply that does not fit into the buffer. In this
|
||||
* case b2f0_result = 5.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
*/
|
||||
int iucv_reply (u16 pathid,
|
||||
u32 msgid,
|
||||
|
@ -561,20 +561,20 @@ int iucv_reply (u16 pathid,
|
|||
void *buffer, ulong buflen, ulong * residual_buffer,
|
||||
ulong * residual_length);
|
||||
|
||||
/*
|
||||
* Name: iucv_reply_array
|
||||
* Purpose: This function responds to the two-way messages that you
|
||||
* receive. You must identify completely the message to
|
||||
* which you wish to reply. ie, pathid, msgid, and trgcls.
|
||||
* The array identifies a list of addresses and lengths of
|
||||
* discontiguous buffers that contains the reply data.
|
||||
* Input: pathid - Path identification number
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
/*
|
||||
* Name: iucv_reply_array
|
||||
* Purpose: This function responds to the two-way messages that you
|
||||
* receive. You must identify completely the message to
|
||||
* which you wish to reply. ie, pathid, msgid, and trgcls.
|
||||
* The array identifies a list of addresses and lengths of
|
||||
* discontiguous buffers that contains the reply data.
|
||||
* Input: pathid - Path identification number
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- 0x20, Specifies if you want to send priority message.
|
||||
* buffer - Address of array of reply buffers.
|
||||
* buflen - Total length of reply buffers.
|
||||
* buffer - Address of array of reply buffers.
|
||||
* buflen - Total length of reply buffers.
|
||||
* Output: residual_buffer - Address of buffer which IUCV is currently working on.
|
||||
* residual_length - Contains one of the following values:
|
||||
* If the answer buffer is the same length as the reply, this field
|
||||
|
@ -585,8 +585,8 @@ int iucv_reply (u16 pathid,
|
|||
* a residual count (that is, the number of bytes remianing in the
|
||||
* reply that does not fit into the buffer. In this
|
||||
* case b2f0_result = 5.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
*/
|
||||
int iucv_reply_array (u16 pathid,
|
||||
u32 msgid,
|
||||
|
@ -596,77 +596,77 @@ int iucv_reply_array (u16 pathid,
|
|||
ulong buflen, ulong * residual_address,
|
||||
ulong * residual_length);
|
||||
|
||||
/*
|
||||
* Name: iucv_reply_prmmsg
|
||||
* Purpose: This function responds to the two-way messages that you
|
||||
* receive. You must identify completely the message to
|
||||
* which you wish to reply. ie, pathid, msgid, and trgcls.
|
||||
* Prmmsg signifies the data is moved into the
|
||||
* parameter list.
|
||||
* Input: pathid - Path identification number.
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
/*
|
||||
* Name: iucv_reply_prmmsg
|
||||
* Purpose: This function responds to the two-way messages that you
|
||||
* receive. You must identify completely the message to
|
||||
* which you wish to reply. ie, pathid, msgid, and trgcls.
|
||||
* Prmmsg signifies the data is moved into the
|
||||
* parameter list.
|
||||
* Input: pathid - Path identification number.
|
||||
* msgid - Specifies the message ID.
|
||||
* trgcls - Specifies target class.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- 0x20 Specifies if you want to send priority message.
|
||||
* prmmsg - 8-bytes of data to be placed into the parameter.
|
||||
* list.
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
* prmmsg - 8-bytes of data to be placed into the parameter.
|
||||
* list.
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
*/
|
||||
int iucv_reply_prmmsg (u16 pathid,
|
||||
u32 msgid, u32 trgcls, int flags1, uchar prmmsg[8]);
|
||||
|
||||
/*
|
||||
* Name: iucv_resume
|
||||
* Purpose: This function restores communications over a quiesced path
|
||||
* Input: pathid - Path identification number.
|
||||
* user_data - 16-bytes of user data.
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
/*
|
||||
* Name: iucv_resume
|
||||
* Purpose: This function restores communications over a quiesced path
|
||||
* Input: pathid - Path identification number.
|
||||
* user_data - 16-bytes of user data.
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
*/
|
||||
int iucv_resume (u16 pathid, uchar user_data[16]);
|
||||
|
||||
/*
|
||||
* Name: iucv_send
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Data to be transmitted is in a buffer and this is a
|
||||
* one-way message and the receiver will not reply to the
|
||||
* message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
/*
|
||||
* Name: iucv_send
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Data to be transmitted is in a buffer and this is a
|
||||
* one-way message and the receiver will not reply to the
|
||||
* message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- 0x20 Specifies if you want to send priority message.
|
||||
* buffer - Address of send buffer.
|
||||
* buflen - Length of send buffer.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
* buffer - Address of send buffer.
|
||||
* buflen - Length of send buffer.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
*/
|
||||
int iucv_send (u16 pathid,
|
||||
u32 * msgid,
|
||||
u32 trgcls,
|
||||
u32 srccls, u32 msgtag, int flags1, void *buffer, ulong buflen);
|
||||
|
||||
/*
|
||||
* Name: iucv_send_array
|
||||
* Purpose: This function transmits data to another application.
|
||||
* The contents of buffer is the address of the array of
|
||||
* addresses and lengths of discontiguous buffers that hold
|
||||
* the message text. This is a one-way message and the
|
||||
* receiver will not reply to the message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
/*
|
||||
* Name: iucv_send_array
|
||||
* Purpose: This function transmits data to another application.
|
||||
* The contents of buffer is the address of the array of
|
||||
* addresses and lengths of discontiguous buffers that hold
|
||||
* the message text. This is a one-way message and the
|
||||
* receiver will not reply to the message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated witht the message.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- specifies if you want to send priority message.
|
||||
* buffer - Address of array of send buffers.
|
||||
* buflen - Total length of send buffers.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
* IPPRTY- specifies if you want to send priority message.
|
||||
* buffer - Address of array of send buffers.
|
||||
* buflen - Total length of send buffers.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
*/
|
||||
int iucv_send_array (u16 pathid,
|
||||
u32 * msgid,
|
||||
|
@ -675,48 +675,48 @@ int iucv_send_array (u16 pathid,
|
|||
u32 msgtag,
|
||||
int flags1, iucv_array_t * buffer, ulong buflen);
|
||||
|
||||
/*
|
||||
* Name: iucv_send_prmmsg
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Prmmsg specifies that the 8-bytes of data are to be moved
|
||||
* into the parameter list. This is a one-way message and the
|
||||
* receiver will not reply to the message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
/*
|
||||
* Name: iucv_send_prmmsg
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Prmmsg specifies that the 8-bytes of data are to be moved
|
||||
* into the parameter list. This is a one-way message and the
|
||||
* receiver will not reply to the message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- 0x20 specifies if you want to send priority message.
|
||||
* prmmsg - 8-bytes of data to be placed into parameter list.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* prmmsg - 8-bytes of data to be placed into parameter list.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
*/
|
||||
int iucv_send_prmmsg (u16 pathid,
|
||||
u32 * msgid,
|
||||
u32 trgcls,
|
||||
u32 srccls, u32 msgtag, int flags1, uchar prmmsg[8]);
|
||||
|
||||
/*
|
||||
* Name: iucv_send2way
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Data to be transmitted is in a buffer. The receiver
|
||||
* of the send is expected to reply to the message and
|
||||
* a buffer is provided into which IUCV moves the reply
|
||||
* to this message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag associated with the message.
|
||||
/*
|
||||
* Name: iucv_send2way
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Data to be transmitted is in a buffer. The receiver
|
||||
* of the send is expected to reply to the message and
|
||||
* a buffer is provided into which IUCV moves the reply
|
||||
* to this message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag associated with the message.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- 0x20 Specifies if you want to send priority message.
|
||||
* buffer - Address of send buffer.
|
||||
* buflen - Length of send buffer.
|
||||
* ansbuf - Address of buffer into which IUCV moves the reply of
|
||||
* this message.
|
||||
* anslen - Address of length of buffer.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer or ansbuf address is NULL.
|
||||
* buffer - Address of send buffer.
|
||||
* buflen - Length of send buffer.
|
||||
* ansbuf - Address of buffer into which IUCV moves the reply of
|
||||
* this message.
|
||||
* anslen - Address of length of buffer.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer or ansbuf address is NULL.
|
||||
*/
|
||||
int iucv_send2way (u16 pathid,
|
||||
u32 * msgid,
|
||||
|
@ -726,28 +726,28 @@ int iucv_send2way (u16 pathid,
|
|||
int flags1,
|
||||
void *buffer, ulong buflen, void *ansbuf, ulong anslen);
|
||||
|
||||
/*
|
||||
* Name: iucv_send2way_array
|
||||
* Purpose: This function transmits data to another application.
|
||||
* The contents of buffer is the address of the array of
|
||||
* addresses and lengths of discontiguous buffers that hold
|
||||
* the message text. The receiver of the send is expected to
|
||||
* reply to the message and a buffer is provided into which
|
||||
* IUCV moves the reply to this message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
/*
|
||||
* Name: iucv_send2way_array
|
||||
* Purpose: This function transmits data to another application.
|
||||
* The contents of buffer is the address of the array of
|
||||
* addresses and lengths of discontiguous buffers that hold
|
||||
* the message text. The receiver of the send is expected to
|
||||
* reply to the message and a buffer is provided into which
|
||||
* IUCV moves the reply to this message.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- 0x20 Specifies if you want to send priority message.
|
||||
* buffer - Sddress of array of send buffers.
|
||||
* buflen - Total length of send buffers.
|
||||
* ansbuf - Address of array of buffer into which IUCV moves the reply
|
||||
* of this message.
|
||||
* anslen - Address of length reply buffers.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
* buffer - Sddress of array of send buffers.
|
||||
* buflen - Total length of send buffers.
|
||||
* ansbuf - Address of array of buffer into which IUCV moves the reply
|
||||
* of this message.
|
||||
* anslen - Address of length reply buffers.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
*/
|
||||
int iucv_send2way_array (u16 pathid,
|
||||
u32 * msgid,
|
||||
|
@ -758,27 +758,27 @@ int iucv_send2way_array (u16 pathid,
|
|||
iucv_array_t * buffer,
|
||||
ulong buflen, iucv_array_t * ansbuf, ulong anslen);
|
||||
|
||||
/*
|
||||
* Name: iucv_send2way_prmmsg
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Prmmsg specifies that the 8-bytes of data are to be moved
|
||||
* into the parameter list. This is a two-way message and the
|
||||
* receiver of the message is expected to reply. A buffer
|
||||
* is provided into which IUCV moves the reply to this
|
||||
* message.
|
||||
* Input: pathid - Rath identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
/*
|
||||
* Name: iucv_send2way_prmmsg
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Prmmsg specifies that the 8-bytes of data are to be moved
|
||||
* into the parameter list. This is a two-way message and the
|
||||
* receiver of the message is expected to reply. A buffer
|
||||
* is provided into which IUCV moves the reply to this
|
||||
* message.
|
||||
* Input: pathid - Rath identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- 0x20 Specifies if you want to send priority message.
|
||||
* prmmsg - 8-bytes of data to be placed in parameter list.
|
||||
* ansbuf - Address of buffer into which IUCV moves the reply of
|
||||
* prmmsg - 8-bytes of data to be placed in parameter list.
|
||||
* ansbuf - Address of buffer into which IUCV moves the reply of
|
||||
* this message.
|
||||
* anslen - Address of length of buffer.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
* anslen - Address of length of buffer.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Buffer address is NULL.
|
||||
*/
|
||||
int iucv_send2way_prmmsg (u16 pathid,
|
||||
u32 * msgid,
|
||||
|
@ -788,29 +788,29 @@ int iucv_send2way_prmmsg (u16 pathid,
|
|||
ulong flags1,
|
||||
uchar prmmsg[8], void *ansbuf, ulong anslen);
|
||||
|
||||
/*
|
||||
* Name: iucv_send2way_prmmsg_array
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Prmmsg specifies that the 8-bytes of data are to be moved
|
||||
* into the parameter list. This is a two-way message and the
|
||||
* receiver of the message is expected to reply. A buffer
|
||||
* is provided into which IUCV moves the reply to this
|
||||
* message. The contents of ansbuf is the address of the
|
||||
* array of addresses and lengths of discontiguous buffers
|
||||
* that contain the reply.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
/*
|
||||
* Name: iucv_send2way_prmmsg_array
|
||||
* Purpose: This function transmits data to another application.
|
||||
* Prmmsg specifies that the 8-bytes of data are to be moved
|
||||
* into the parameter list. This is a two-way message and the
|
||||
* receiver of the message is expected to reply. A buffer
|
||||
* is provided into which IUCV moves the reply to this
|
||||
* message. The contents of ansbuf is the address of the
|
||||
* array of addresses and lengths of discontiguous buffers
|
||||
* that contain the reply.
|
||||
* Input: pathid - Path identification number.
|
||||
* trgcls - Specifies target class.
|
||||
* srccls - Specifies the source message class.
|
||||
* msgtag - Specifies a tag to be associated with the message.
|
||||
* flags1 - Option for path.
|
||||
* IPPRTY- 0x20 specifies if you want to send priority message.
|
||||
* prmmsg - 8-bytes of data to be placed into the parameter list.
|
||||
* prmmsg - 8-bytes of data to be placed into the parameter list.
|
||||
* ansbuf - Address of array of buffer into which IUCV moves the reply
|
||||
* of this message.
|
||||
* anslen - Address of length of reply buffers.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Ansbuf address is NULL.
|
||||
* of this message.
|
||||
* anslen - Address of length of reply buffers.
|
||||
* Output: msgid - Specifies the message ID.
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Ansbuf address is NULL.
|
||||
*/
|
||||
int iucv_send2way_prmmsg_array (u16 pathid,
|
||||
u32 * msgid,
|
||||
|
@ -821,29 +821,29 @@ int iucv_send2way_prmmsg_array (u16 pathid,
|
|||
uchar prmmsg[8],
|
||||
iucv_array_t * ansbuf, ulong anslen);
|
||||
|
||||
/*
|
||||
* Name: iucv_setmask
|
||||
* Purpose: This function enables or disables the following IUCV
|
||||
* external interruptions: Nonpriority and priority message
|
||||
* interrupts, nonpriority and priority reply interrupts.
|
||||
/*
|
||||
* Name: iucv_setmask
|
||||
* Purpose: This function enables or disables the following IUCV
|
||||
* external interruptions: Nonpriority and priority message
|
||||
* interrupts, nonpriority and priority reply interrupts.
|
||||
* Input: SetMaskFlag - options for interrupts
|
||||
* 0x80 - Nonpriority_MessagePendingInterruptsFlag
|
||||
* 0x40 - Priority_MessagePendingInterruptsFlag
|
||||
* 0x20 - Nonpriority_MessageCompletionInterruptsFlag
|
||||
* 0x10 - Priority_MessageCompletionInterruptsFlag
|
||||
* 0x80 - Nonpriority_MessagePendingInterruptsFlag
|
||||
* 0x40 - Priority_MessagePendingInterruptsFlag
|
||||
* 0x20 - Nonpriority_MessageCompletionInterruptsFlag
|
||||
* 0x10 - Priority_MessageCompletionInterruptsFlag
|
||||
* 0x08 - IUCVControlInterruptsFlag
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
*/
|
||||
int iucv_setmask (int SetMaskFlag);
|
||||
|
||||
/*
|
||||
* Name: iucv_sever
|
||||
* Purpose: This function terminates an IUCV path.
|
||||
* Input: pathid - Path identification number.
|
||||
* user_data - 16-bytes of user data.
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Interal error, wild pointer.
|
||||
/*
|
||||
* Name: iucv_sever
|
||||
* Purpose: This function terminates an IUCV path.
|
||||
* Input: pathid - Path identification number.
|
||||
* user_data - 16-bytes of user data.
|
||||
* Output: NA
|
||||
* Return: Return code from CP IUCV call.
|
||||
* (-EINVAL) - Interal error, wild pointer.
|
||||
*/
|
||||
int iucv_sever (u16 pathid, uchar user_data[16]);
|
||||
|
|
|
@ -68,6 +68,7 @@ static void lcs_tasklet(unsigned long);
|
|||
static void lcs_start_kernel_thread(struct lcs_card *card);
|
||||
static void lcs_get_frames_cb(struct lcs_channel *, struct lcs_buffer *);
|
||||
static int lcs_send_delipm(struct lcs_card *, struct lcs_ipm_list *);
|
||||
static int lcs_recovery(void *ptr);
|
||||
|
||||
/**
|
||||
* Debug Facility Stuff
|
||||
|
@ -429,12 +430,6 @@ lcs_setup_card(struct lcs_card *card)
|
|||
card->tx_buffer = NULL;
|
||||
card->tx_emitted = 0;
|
||||
|
||||
/* Initialize kernel thread task used for LGW commands. */
|
||||
INIT_WORK(&card->kernel_thread_starter,
|
||||
(void *)lcs_start_kernel_thread,card);
|
||||
card->thread_start_mask = 0;
|
||||
card->thread_allowed_mask = 0;
|
||||
card->thread_running_mask = 0;
|
||||
init_waitqueue_head(&card->wait_q);
|
||||
spin_lock_init(&card->lock);
|
||||
spin_lock_init(&card->ipm_lock);
|
||||
|
@ -675,8 +670,9 @@ lcs_ready_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
|
|||
int index, rc;
|
||||
|
||||
LCS_DBF_TEXT(5, trace, "rdybuff");
|
||||
BUG_ON(buffer->state != BUF_STATE_LOCKED &&
|
||||
buffer->state != BUF_STATE_PROCESSED);
|
||||
if (buffer->state != BUF_STATE_LOCKED &&
|
||||
buffer->state != BUF_STATE_PROCESSED)
|
||||
BUG();
|
||||
spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
|
||||
buffer->state = BUF_STATE_READY;
|
||||
index = buffer - channel->iob;
|
||||
|
@ -700,7 +696,8 @@ __lcs_processed_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
|
|||
int index, prev, next;
|
||||
|
||||
LCS_DBF_TEXT(5, trace, "prcsbuff");
|
||||
BUG_ON(buffer->state != BUF_STATE_READY);
|
||||
if (buffer->state != BUF_STATE_READY)
|
||||
BUG();
|
||||
buffer->state = BUF_STATE_PROCESSED;
|
||||
index = buffer - channel->iob;
|
||||
prev = (index - 1) & (LCS_NUM_BUFFS - 1);
|
||||
|
@ -732,8 +729,9 @@ lcs_release_buffer(struct lcs_channel *channel, struct lcs_buffer *buffer)
|
|||
unsigned long flags;
|
||||
|
||||
LCS_DBF_TEXT(5, trace, "relbuff");
|
||||
BUG_ON(buffer->state != BUF_STATE_LOCKED &&
|
||||
buffer->state != BUF_STATE_PROCESSED);
|
||||
if (buffer->state != BUF_STATE_LOCKED &&
|
||||
buffer->state != BUF_STATE_PROCESSED)
|
||||
BUG();
|
||||
spin_lock_irqsave(get_ccwdev_lock(channel->ccwdev), flags);
|
||||
buffer->state = BUF_STATE_EMPTY;
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(channel->ccwdev), flags);
|
||||
|
@ -1147,8 +1145,6 @@ list_modified:
|
|||
list_add_tail(&ipm->list, &card->ipm_list);
|
||||
}
|
||||
spin_unlock_irqrestore(&card->ipm_lock, flags);
|
||||
if (card->state == DEV_STATE_UP)
|
||||
netif_wake_queue(card->dev);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1231,17 +1227,17 @@ lcs_set_mc_addresses(struct lcs_card *card, struct in_device *in4_dev)
|
|||
if (ipm != NULL)
|
||||
continue; /* Address already in list. */
|
||||
ipm = (struct lcs_ipm_list *)
|
||||
kmalloc(sizeof(struct lcs_ipm_list), GFP_ATOMIC);
|
||||
kzalloc(sizeof(struct lcs_ipm_list), GFP_ATOMIC);
|
||||
if (ipm == NULL) {
|
||||
PRINT_INFO("Not enough memory to add "
|
||||
"new multicast entry!\n");
|
||||
break;
|
||||
}
|
||||
memset(ipm, 0, sizeof(struct lcs_ipm_list));
|
||||
memcpy(&ipm->ipm.mac_addr, buf, LCS_MAC_LENGTH);
|
||||
ipm->ipm.ip_addr = im4->multiaddr;
|
||||
ipm->ipm_state = LCS_IPM_STATE_SET_REQUIRED;
|
||||
spin_lock_irqsave(&card->ipm_lock, flags);
|
||||
LCS_DBF_HEX(2,trace,&ipm->ipm.ip_addr,4);
|
||||
list_add(&ipm->list, &card->ipm_list);
|
||||
spin_unlock_irqrestore(&card->ipm_lock, flags);
|
||||
}
|
||||
|
@ -1269,7 +1265,15 @@ lcs_register_mc_addresses(void *data)
|
|||
read_unlock(&in4_dev->mc_list_lock);
|
||||
in_dev_put(in4_dev);
|
||||
|
||||
netif_carrier_off(card->dev);
|
||||
netif_tx_disable(card->dev);
|
||||
wait_event(card->write.wait_q,
|
||||
(card->write.state != CH_STATE_RUNNING));
|
||||
lcs_fix_multicast_list(card);
|
||||
if (card->state == DEV_STATE_UP) {
|
||||
netif_carrier_on(card->dev);
|
||||
netif_wake_queue(card->dev);
|
||||
}
|
||||
out:
|
||||
lcs_clear_thread_running_bit(card, LCS_SET_MC_THREAD);
|
||||
return 0;
|
||||
|
@ -1286,7 +1290,7 @@ lcs_set_multicast_list(struct net_device *dev)
|
|||
LCS_DBF_TEXT(4, trace, "setmulti");
|
||||
card = (struct lcs_card *) dev->priv;
|
||||
|
||||
if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD))
|
||||
if (!lcs_set_thread_start_bit(card, LCS_SET_MC_THREAD))
|
||||
schedule_work(&card->kernel_thread_starter);
|
||||
}
|
||||
|
||||
|
@ -1318,6 +1322,53 @@ lcs_check_irb_error(struct ccw_device *cdev, struct irb *irb)
|
|||
return PTR_ERR(irb);
|
||||
}
|
||||
|
||||
static int
|
||||
lcs_get_problem(struct ccw_device *cdev, struct irb *irb)
|
||||
{
|
||||
int dstat, cstat;
|
||||
char *sense;
|
||||
|
||||
sense = (char *) irb->ecw;
|
||||
cstat = irb->scsw.cstat;
|
||||
dstat = irb->scsw.dstat;
|
||||
|
||||
if (cstat & (SCHN_STAT_CHN_CTRL_CHK | SCHN_STAT_INTF_CTRL_CHK |
|
||||
SCHN_STAT_CHN_DATA_CHK | SCHN_STAT_CHAIN_CHECK |
|
||||
SCHN_STAT_PROT_CHECK | SCHN_STAT_PROG_CHECK)) {
|
||||
LCS_DBF_TEXT(2, trace, "CGENCHK");
|
||||
return 1;
|
||||
}
|
||||
if (dstat & DEV_STAT_UNIT_CHECK) {
|
||||
if (sense[LCS_SENSE_BYTE_1] &
|
||||
LCS_SENSE_RESETTING_EVENT) {
|
||||
LCS_DBF_TEXT(2, trace, "REVIND");
|
||||
return 1;
|
||||
}
|
||||
if (sense[LCS_SENSE_BYTE_0] &
|
||||
LCS_SENSE_CMD_REJECT) {
|
||||
LCS_DBF_TEXT(2, trace, "CMDREJ");
|
||||
return 0;
|
||||
}
|
||||
if ((!sense[LCS_SENSE_BYTE_0]) &&
|
||||
(!sense[LCS_SENSE_BYTE_1]) &&
|
||||
(!sense[LCS_SENSE_BYTE_2]) &&
|
||||
(!sense[LCS_SENSE_BYTE_3])) {
|
||||
LCS_DBF_TEXT(2, trace, "ZEROSEN");
|
||||
return 0;
|
||||
}
|
||||
LCS_DBF_TEXT(2, trace, "DGENCHK");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
lcs_schedule_recovery(struct lcs_card *card)
|
||||
{
|
||||
LCS_DBF_TEXT(2, trace, "startrec");
|
||||
if (!lcs_set_thread_start_bit(card, LCS_RECOVERY_THREAD))
|
||||
schedule_work(&card->kernel_thread_starter);
|
||||
}
|
||||
|
||||
/**
|
||||
* IRQ Handler for LCS channels
|
||||
|
@ -1327,7 +1378,8 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
|
|||
{
|
||||
struct lcs_card *card;
|
||||
struct lcs_channel *channel;
|
||||
int index;
|
||||
int rc, index;
|
||||
int cstat, dstat;
|
||||
|
||||
if (lcs_check_irb_error(cdev, irb))
|
||||
return;
|
||||
|
@ -1338,14 +1390,27 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
|
|||
else
|
||||
channel = &card->write;
|
||||
|
||||
cstat = irb->scsw.cstat;
|
||||
dstat = irb->scsw.dstat;
|
||||
LCS_DBF_TEXT_(5, trace, "Rint%s",cdev->dev.bus_id);
|
||||
LCS_DBF_TEXT_(5, trace, "%4x%4x",irb->scsw.cstat, irb->scsw.dstat);
|
||||
LCS_DBF_TEXT_(5, trace, "%4x%4x",irb->scsw.fctl, irb->scsw.actl);
|
||||
|
||||
/* Check for channel and device errors presented */
|
||||
rc = lcs_get_problem(cdev, irb);
|
||||
if (rc || (dstat & DEV_STAT_UNIT_EXCEP)) {
|
||||
PRINT_WARN("check on device %s, dstat=0x%X, cstat=0x%X \n",
|
||||
cdev->dev.bus_id, dstat, cstat);
|
||||
if (rc) {
|
||||
lcs_schedule_recovery(card);
|
||||
wake_up(&card->wait_q);
|
||||
return;
|
||||
}
|
||||
}
|
||||
/* How far in the ccw chain have we processed? */
|
||||
if ((channel->state != CH_STATE_INIT) &&
|
||||
(irb->scsw.fctl & SCSW_FCTL_START_FUNC)) {
|
||||
index = (struct ccw1 *) __va((addr_t) irb->scsw.cpa)
|
||||
index = (struct ccw1 *) __va((addr_t) irb->scsw.cpa)
|
||||
- channel->ccws;
|
||||
if ((irb->scsw.actl & SCSW_ACTL_SUSPENDED) ||
|
||||
(irb->scsw.cstat & SCHN_STAT_PCI))
|
||||
|
@ -1367,7 +1432,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
|
|||
else if (irb->scsw.actl & SCSW_ACTL_SUSPENDED)
|
||||
/* CCW execution stopped on a suspend bit. */
|
||||
channel->state = CH_STATE_SUSPENDED;
|
||||
|
||||
if (irb->scsw.fctl & SCSW_FCTL_HALT_FUNC) {
|
||||
if (irb->scsw.cc != 0) {
|
||||
ccw_device_halt(channel->ccwdev, (addr_t) channel);
|
||||
|
@ -1376,7 +1440,6 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
|
|||
/* The channel has been stopped by halt_IO. */
|
||||
channel->state = CH_STATE_HALTED;
|
||||
}
|
||||
|
||||
if (irb->scsw.fctl & SCSW_FCTL_CLEAR_FUNC) {
|
||||
channel->state = CH_STATE_CLEARED;
|
||||
}
|
||||
|
@ -1452,7 +1515,7 @@ lcs_txbuffer_cb(struct lcs_channel *channel, struct lcs_buffer *buffer)
|
|||
lcs_release_buffer(channel, buffer);
|
||||
card = (struct lcs_card *)
|
||||
((char *) channel - offsetof(struct lcs_card, write));
|
||||
if (netif_queue_stopped(card->dev))
|
||||
if (netif_queue_stopped(card->dev) && netif_carrier_ok(card->dev))
|
||||
netif_wake_queue(card->dev);
|
||||
spin_lock(&card->lock);
|
||||
card->tx_emitted--;
|
||||
|
@ -1488,6 +1551,10 @@ __lcs_start_xmit(struct lcs_card *card, struct sk_buff *skb,
|
|||
card->stats.tx_carrier_errors++;
|
||||
return 0;
|
||||
}
|
||||
if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
dev_kfree_skb(skb);
|
||||
return 0;
|
||||
}
|
||||
netif_stop_queue(card->dev);
|
||||
spin_lock(&card->lock);
|
||||
if (card->tx_buffer != NULL &&
|
||||
|
@ -1632,30 +1699,6 @@ lcs_detect(struct lcs_card *card)
|
|||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* reset card
|
||||
*/
|
||||
static int
|
||||
lcs_resetcard(struct lcs_card *card)
|
||||
{
|
||||
int retries;
|
||||
|
||||
LCS_DBF_TEXT(2, trace, "rescard");
|
||||
for (retries = 0; retries < 10; retries++) {
|
||||
if (lcs_detect(card) == 0) {
|
||||
netif_wake_queue(card->dev);
|
||||
card->state = DEV_STATE_UP;
|
||||
PRINT_INFO("LCS device %s successfully restarted!\n",
|
||||
card->dev->name);
|
||||
return 0;
|
||||
}
|
||||
msleep(3000);
|
||||
}
|
||||
PRINT_ERR("Error in Reseting LCS card!\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* LCS Stop card
|
||||
*/
|
||||
|
@ -1679,111 +1722,6 @@ lcs_stopcard(struct lcs_card *card)
|
|||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* LGW initiated commands
|
||||
*/
|
||||
static int
|
||||
lcs_lgw_startlan_thread(void *data)
|
||||
{
|
||||
struct lcs_card *card;
|
||||
|
||||
card = (struct lcs_card *) data;
|
||||
daemonize("lgwstpln");
|
||||
|
||||
if (!lcs_do_run_thread(card, LCS_STARTLAN_THREAD))
|
||||
return 0;
|
||||
LCS_DBF_TEXT(4, trace, "lgwstpln");
|
||||
if (card->dev)
|
||||
netif_stop_queue(card->dev);
|
||||
if (lcs_startlan(card) == 0) {
|
||||
netif_wake_queue(card->dev);
|
||||
card->state = DEV_STATE_UP;
|
||||
PRINT_INFO("LCS Startlan for device %s succeeded!\n",
|
||||
card->dev->name);
|
||||
|
||||
} else
|
||||
PRINT_ERR("LCS Startlan for device %s failed!\n",
|
||||
card->dev->name);
|
||||
lcs_clear_thread_running_bit(card, LCS_STARTLAN_THREAD);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send startup command initiated by Lan Gateway
|
||||
*/
|
||||
static int
|
||||
lcs_lgw_startup_thread(void *data)
|
||||
{
|
||||
int rc;
|
||||
|
||||
struct lcs_card *card;
|
||||
|
||||
card = (struct lcs_card *) data;
|
||||
daemonize("lgwstaln");
|
||||
|
||||
if (!lcs_do_run_thread(card, LCS_STARTUP_THREAD))
|
||||
return 0;
|
||||
LCS_DBF_TEXT(4, trace, "lgwstaln");
|
||||
if (card->dev)
|
||||
netif_stop_queue(card->dev);
|
||||
rc = lcs_send_startup(card, LCS_INITIATOR_LGW);
|
||||
if (rc != 0) {
|
||||
PRINT_ERR("Startup for LCS device %s initiated " \
|
||||
"by LGW failed!\nReseting card ...\n",
|
||||
card->dev->name);
|
||||
/* do a card reset */
|
||||
rc = lcs_resetcard(card);
|
||||
if (rc == 0)
|
||||
goto Done;
|
||||
}
|
||||
rc = lcs_startlan(card);
|
||||
if (rc == 0) {
|
||||
netif_wake_queue(card->dev);
|
||||
card->state = DEV_STATE_UP;
|
||||
}
|
||||
Done:
|
||||
if (rc == 0)
|
||||
PRINT_INFO("LCS Startup for device %s succeeded!\n",
|
||||
card->dev->name);
|
||||
else
|
||||
PRINT_ERR("LCS Startup for device %s failed!\n",
|
||||
card->dev->name);
|
||||
lcs_clear_thread_running_bit(card, LCS_STARTUP_THREAD);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* send stoplan command initiated by Lan Gateway
|
||||
*/
|
||||
static int
|
||||
lcs_lgw_stoplan_thread(void *data)
|
||||
{
|
||||
struct lcs_card *card;
|
||||
int rc;
|
||||
|
||||
card = (struct lcs_card *) data;
|
||||
daemonize("lgwstop");
|
||||
|
||||
if (!lcs_do_run_thread(card, LCS_STOPLAN_THREAD))
|
||||
return 0;
|
||||
LCS_DBF_TEXT(4, trace, "lgwstop");
|
||||
if (card->dev)
|
||||
netif_stop_queue(card->dev);
|
||||
if (lcs_send_stoplan(card, LCS_INITIATOR_LGW) == 0)
|
||||
PRINT_INFO("Stoplan for %s initiated by LGW succeeded!\n",
|
||||
card->dev->name);
|
||||
else
|
||||
PRINT_ERR("Stoplan %s initiated by LGW failed!\n",
|
||||
card->dev->name);
|
||||
/*Try to reset the card, stop it on failure */
|
||||
rc = lcs_resetcard(card);
|
||||
if (rc != 0)
|
||||
rc = lcs_stopcard(card);
|
||||
lcs_clear_thread_running_bit(card, LCS_STOPLAN_THREAD);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Kernel Thread helper functions for LGW initiated commands
|
||||
*/
|
||||
|
@ -1791,15 +1729,12 @@ static void
|
|||
lcs_start_kernel_thread(struct lcs_card *card)
|
||||
{
|
||||
LCS_DBF_TEXT(5, trace, "krnthrd");
|
||||
if (lcs_do_start_thread(card, LCS_STARTUP_THREAD))
|
||||
kernel_thread(lcs_lgw_startup_thread, (void *) card, SIGCHLD);
|
||||
if (lcs_do_start_thread(card, LCS_STARTLAN_THREAD))
|
||||
kernel_thread(lcs_lgw_startlan_thread, (void *) card, SIGCHLD);
|
||||
if (lcs_do_start_thread(card, LCS_STOPLAN_THREAD))
|
||||
kernel_thread(lcs_lgw_stoplan_thread, (void *) card, SIGCHLD);
|
||||
if (lcs_do_start_thread(card, LCS_RECOVERY_THREAD))
|
||||
kernel_thread(lcs_recovery, (void *) card, SIGCHLD);
|
||||
#ifdef CONFIG_IP_MULTICAST
|
||||
if (lcs_do_start_thread(card, LCS_SET_MC_THREAD))
|
||||
kernel_thread(lcs_register_mc_addresses, (void *) card, SIGCHLD);
|
||||
kernel_thread(lcs_register_mc_addresses,
|
||||
(void *) card, SIGCHLD);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -1813,19 +1748,14 @@ lcs_get_control(struct lcs_card *card, struct lcs_cmd *cmd)
|
|||
if (cmd->initiator == LCS_INITIATOR_LGW) {
|
||||
switch(cmd->cmd_code) {
|
||||
case LCS_CMD_STARTUP:
|
||||
if (!lcs_set_thread_start_bit(card,
|
||||
LCS_STARTUP_THREAD))
|
||||
schedule_work(&card->kernel_thread_starter);
|
||||
break;
|
||||
case LCS_CMD_STARTLAN:
|
||||
if (!lcs_set_thread_start_bit(card,
|
||||
LCS_STARTLAN_THREAD))
|
||||
schedule_work(&card->kernel_thread_starter);
|
||||
lcs_schedule_recovery(card);
|
||||
break;
|
||||
case LCS_CMD_STOPLAN:
|
||||
if (!lcs_set_thread_start_bit(card,
|
||||
LCS_STOPLAN_THREAD))
|
||||
schedule_work(&card->kernel_thread_starter);
|
||||
PRINT_WARN("Stoplan for %s initiated by LGW.\n",
|
||||
card->dev->name);
|
||||
if (card->dev)
|
||||
netif_carrier_off(card->dev);
|
||||
break;
|
||||
default:
|
||||
PRINT_INFO("UNRECOGNIZED LGW COMMAND\n");
|
||||
|
@ -1941,8 +1871,11 @@ lcs_stop_device(struct net_device *dev)
|
|||
|
||||
LCS_DBF_TEXT(2, trace, "stopdev");
|
||||
card = (struct lcs_card *) dev->priv;
|
||||
netif_stop_queue(dev);
|
||||
netif_carrier_off(dev);
|
||||
netif_tx_disable(dev);
|
||||
dev->flags &= ~IFF_UP;
|
||||
wait_event(card->write.wait_q,
|
||||
(card->write.state != CH_STATE_RUNNING));
|
||||
rc = lcs_stopcard(card);
|
||||
if (rc)
|
||||
PRINT_ERR("Try it again!\n ");
|
||||
|
@ -1968,6 +1901,7 @@ lcs_open_device(struct net_device *dev)
|
|||
|
||||
} else {
|
||||
dev->flags |= IFF_UP;
|
||||
netif_carrier_on(dev);
|
||||
netif_wake_queue(dev);
|
||||
card->state = DEV_STATE_UP;
|
||||
}
|
||||
|
@ -2059,10 +1993,31 @@ lcs_timeout_store (struct device *dev, struct device_attribute *attr, const char
|
|||
|
||||
DEVICE_ATTR(lancmd_timeout, 0644, lcs_timeout_show, lcs_timeout_store);
|
||||
|
||||
static ssize_t
|
||||
lcs_dev_recover_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct lcs_card *card = dev->driver_data;
|
||||
char *tmp;
|
||||
int i;
|
||||
|
||||
if (!card)
|
||||
return -EINVAL;
|
||||
if (card->state != DEV_STATE_UP)
|
||||
return -EPERM;
|
||||
i = simple_strtoul(buf, &tmp, 16);
|
||||
if (i == 1)
|
||||
lcs_schedule_recovery(card);
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(recover, 0200, NULL, lcs_dev_recover_store);
|
||||
|
||||
static struct attribute * lcs_attrs[] = {
|
||||
&dev_attr_portno.attr,
|
||||
&dev_attr_type.attr,
|
||||
&dev_attr_lancmd_timeout.attr,
|
||||
&dev_attr_recover.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
@ -2099,6 +2054,12 @@ lcs_probe_device(struct ccwgroup_device *ccwgdev)
|
|||
ccwgdev->dev.driver_data = card;
|
||||
ccwgdev->cdev[0]->handler = lcs_irq;
|
||||
ccwgdev->cdev[1]->handler = lcs_irq;
|
||||
card->gdev = ccwgdev;
|
||||
INIT_WORK(&card->kernel_thread_starter,
|
||||
(void *) lcs_start_kernel_thread, card);
|
||||
card->thread_start_mask = 0;
|
||||
card->thread_allowed_mask = 0;
|
||||
card->thread_running_mask = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2200,6 +2161,7 @@ netdev_out:
|
|||
if (recover_state == DEV_STATE_RECOVER) {
|
||||
lcs_set_multicast_list(card->dev);
|
||||
card->dev->flags |= IFF_UP;
|
||||
netif_carrier_on(card->dev);
|
||||
netif_wake_queue(card->dev);
|
||||
card->state = DEV_STATE_UP;
|
||||
} else {
|
||||
|
@ -2229,7 +2191,7 @@ out:
|
|||
* lcs_shutdown_device, called when setting the group device offline.
|
||||
*/
|
||||
static int
|
||||
lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
|
||||
__lcs_shutdown_device(struct ccwgroup_device *ccwgdev, int recovery_mode)
|
||||
{
|
||||
struct lcs_card *card;
|
||||
enum lcs_dev_states recover_state;
|
||||
|
@ -2239,9 +2201,11 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
|
|||
card = (struct lcs_card *)ccwgdev->dev.driver_data;
|
||||
if (!card)
|
||||
return -ENODEV;
|
||||
lcs_set_allowed_threads(card, 0);
|
||||
if (lcs_wait_for_threads(card, LCS_SET_MC_THREAD))
|
||||
return -ERESTARTSYS;
|
||||
if (recovery_mode == 0) {
|
||||
lcs_set_allowed_threads(card, 0);
|
||||
if (lcs_wait_for_threads(card, LCS_SET_MC_THREAD))
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
LCS_DBF_HEX(3, setup, &card, sizeof(void*));
|
||||
recover_state = card->state;
|
||||
|
||||
|
@ -2256,6 +2220,43 @@ lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
lcs_shutdown_device(struct ccwgroup_device *ccwgdev)
|
||||
{
|
||||
return __lcs_shutdown_device(ccwgdev, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* drive lcs recovery after startup and startlan initiated by Lan Gateway
|
||||
*/
|
||||
static int
|
||||
lcs_recovery(void *ptr)
|
||||
{
|
||||
struct lcs_card *card;
|
||||
struct ccwgroup_device *gdev;
|
||||
int rc;
|
||||
|
||||
card = (struct lcs_card *) ptr;
|
||||
daemonize("lcs_recover");
|
||||
|
||||
LCS_DBF_TEXT(4, trace, "recover1");
|
||||
if (!lcs_do_run_thread(card, LCS_RECOVERY_THREAD))
|
||||
return 0;
|
||||
LCS_DBF_TEXT(4, trace, "recover2");
|
||||
gdev = card->gdev;
|
||||
PRINT_WARN("Recovery of device %s started...\n", gdev->dev.bus_id);
|
||||
rc = __lcs_shutdown_device(gdev, 1);
|
||||
rc = lcs_new_device(gdev);
|
||||
if (!rc)
|
||||
PRINT_INFO("Device %s successfully recovered!\n",
|
||||
card->dev->name);
|
||||
else
|
||||
PRINT_INFO("Device %s could not be recovered!\n",
|
||||
card->dev->name);
|
||||
lcs_clear_thread_running_bit(card, LCS_RECOVERY_THREAD);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* lcs_remove_device, free buffers and card
|
||||
*/
|
||||
|
|
|
@ -73,13 +73,17 @@ do { \
|
|||
/**
|
||||
* LCS sense byte definitions
|
||||
*/
|
||||
#define LCS_SENSE_BYTE_0 0
|
||||
#define LCS_SENSE_BYTE_1 1
|
||||
#define LCS_SENSE_BYTE_2 2
|
||||
#define LCS_SENSE_BYTE_3 3
|
||||
#define LCS_SENSE_INTERFACE_DISCONNECT 0x01
|
||||
#define LCS_SENSE_EQUIPMENT_CHECK 0x10
|
||||
#define LCS_SENSE_BUS_OUT_CHECK 0x20
|
||||
#define LCS_SENSE_INTERVENTION_REQUIRED 0x40
|
||||
#define LCS_SENSE_CMD_REJECT 0x80
|
||||
#define LCS_SENSE_RESETTING_EVENT 0x0080
|
||||
#define LCS_SENSE_DEVICE_ONLINE 0x0020
|
||||
#define LCS_SENSE_RESETTING_EVENT 0x80
|
||||
#define LCS_SENSE_DEVICE_ONLINE 0x20
|
||||
|
||||
/**
|
||||
* LCS packet type definitions
|
||||
|
@ -152,10 +156,9 @@ enum lcs_dev_states {
|
|||
|
||||
enum lcs_threads {
|
||||
LCS_SET_MC_THREAD = 1,
|
||||
LCS_STARTLAN_THREAD = 2,
|
||||
LCS_STOPLAN_THREAD = 4,
|
||||
LCS_STARTUP_THREAD = 8,
|
||||
LCS_RECOVERY_THREAD = 2,
|
||||
};
|
||||
|
||||
/**
|
||||
* LCS struct declarations
|
||||
*/
|
||||
|
@ -286,6 +289,7 @@ struct lcs_card {
|
|||
struct net_device_stats stats;
|
||||
unsigned short (*lan_type_trans)(struct sk_buff *skb,
|
||||
struct net_device *dev);
|
||||
struct ccwgroup_device *gdev;
|
||||
struct lcs_channel read;
|
||||
struct lcs_channel write;
|
||||
struct lcs_buffer *tx_buffer;
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/module.h>
|
||||
|
@ -65,7 +65,7 @@ MODULE_AUTHOR
|
|||
("(C) 2001 IBM Corporation by Fritz Elfert (felfert@millenux.com)");
|
||||
MODULE_DESCRIPTION ("Linux for S/390 IUCV network driver");
|
||||
|
||||
|
||||
|
||||
#define PRINTK_HEADER " iucv: " /* for debugging */
|
||||
|
||||
static struct device_driver netiucv_driver = {
|
||||
|
@ -202,7 +202,7 @@ netiucv_printname(char *name)
|
|||
*p = '\0';
|
||||
return tmp;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* States of the interface statemachine.
|
||||
*/
|
||||
|
@ -244,7 +244,7 @@ static const char *dev_event_names[] = {
|
|||
"Connection up",
|
||||
"Connection down",
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Events of the connection statemachine
|
||||
*/
|
||||
|
@ -364,7 +364,7 @@ static const char *conn_state_names[] = {
|
|||
"Connect error",
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Debug Facility Stuff
|
||||
*/
|
||||
|
@ -516,7 +516,7 @@ static void
|
|||
fsm_action_nop(fsm_instance *fi, int event, void *arg)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Actions of the connection statemachine
|
||||
*****************************************************************************/
|
||||
|
@ -993,7 +993,7 @@ static const fsm_node conn_fsm[] = {
|
|||
|
||||
static const int CONN_FSM_LEN = sizeof(conn_fsm) / sizeof(fsm_node);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Actions for interface - statemachine.
|
||||
*****************************************************************************/
|
||||
|
@ -1182,7 +1182,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
|
|||
|
||||
fsm_newstate(conn->fsm, CONN_STATE_TX);
|
||||
conn->prof.send_stamp = xtime;
|
||||
|
||||
|
||||
rc = iucv_send(conn->pathid, NULL, 0, 0, 1 /* single_flag */,
|
||||
0, nskb->data, nskb->len);
|
||||
/* Shut up, gcc! nskb is always below 2G. */
|
||||
|
@ -1220,7 +1220,7 @@ netiucv_transmit_skb(struct iucv_connection *conn, struct sk_buff *skb) {
|
|||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Interface API for upper network layers
|
||||
*****************************************************************************/
|
||||
|
@ -1291,7 +1291,7 @@ static int netiucv_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
/**
|
||||
* If connection is not running, try to restart it
|
||||
* and throw away packet.
|
||||
* and throw away packet.
|
||||
*/
|
||||
if (fsm_getstate(privptr->fsm) != DEV_STATE_RUNNING) {
|
||||
fsm_event(privptr->fsm, DEV_EVENT_START, dev);
|
||||
|
@ -1538,7 +1538,7 @@ static ssize_t
|
|||
maxcq_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
struct netiucv_priv *priv = dev->driver_data;
|
||||
|
||||
|
||||
IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
|
||||
priv->conn->prof.maxcqueue = 0;
|
||||
return count;
|
||||
|
@ -1559,7 +1559,7 @@ static ssize_t
|
|||
sdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
struct netiucv_priv *priv = dev->driver_data;
|
||||
|
||||
|
||||
IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
|
||||
priv->conn->prof.doios_single = 0;
|
||||
return count;
|
||||
|
@ -1580,7 +1580,7 @@ static ssize_t
|
|||
mdoio_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
struct netiucv_priv *priv = dev->driver_data;
|
||||
|
||||
|
||||
IUCV_DBF_TEXT(trace, 5, __FUNCTION__);
|
||||
priv->conn->prof.doios_multi = 0;
|
||||
return count;
|
||||
|
@ -1601,7 +1601,7 @@ static ssize_t
|
|||
txlen_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
struct netiucv_priv *priv = dev->driver_data;
|
||||
|
||||
|
||||
IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
|
||||
priv->conn->prof.txlen = 0;
|
||||
return count;
|
||||
|
@ -1622,7 +1622,7 @@ static ssize_t
|
|||
txtime_write (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
struct netiucv_priv *priv = dev->driver_data;
|
||||
|
||||
|
||||
IUCV_DBF_TEXT(trace, 4, __FUNCTION__);
|
||||
priv->conn->prof.tx_time = 0;
|
||||
return count;
|
||||
|
@ -2000,7 +2000,7 @@ conn_write(struct device_driver *drv, const char *buf, size_t count)
|
|||
}
|
||||
|
||||
PRINT_INFO("%s: '%s'\n", dev->name, netiucv_printname(username));
|
||||
|
||||
|
||||
return count;
|
||||
|
||||
out_free_ndev:
|
||||
|
@ -2099,7 +2099,7 @@ static int __init
|
|||
netiucv_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
||||
ret = iucv_register_dbf_views();
|
||||
if (ret) {
|
||||
PRINT_WARN("netiucv_init failed, "
|
||||
|
@ -2128,7 +2128,7 @@ netiucv_init(void)
|
|||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
module_init(netiucv_init);
|
||||
module_exit(netiucv_exit);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -376,7 +376,7 @@ struct qeth_hdr_osn {
|
|||
__u8 reserved3[18];
|
||||
__u32 ccid;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
struct qeth_hdr {
|
||||
union {
|
||||
struct qeth_hdr_layer2 l2;
|
||||
|
@ -825,7 +825,7 @@ struct qeth_card {
|
|||
int use_hard_stop;
|
||||
int (*orig_hard_header)(struct sk_buff *,struct net_device *,
|
||||
unsigned short,void *,void *,unsigned);
|
||||
struct qeth_osn_info osn_info;
|
||||
struct qeth_osn_info osn_info;
|
||||
};
|
||||
|
||||
struct qeth_card_list_struct {
|
||||
|
@ -944,7 +944,7 @@ qeth_get_netdev_flags(struct qeth_card *card)
|
|||
return 0;
|
||||
switch (card->info.type) {
|
||||
case QETH_CARD_TYPE_IQD:
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
return IFF_NOARP;
|
||||
#ifdef CONFIG_QETH_IPV6
|
||||
default:
|
||||
|
@ -981,7 +981,7 @@ static inline int
|
|||
qeth_get_max_mtu_for_card(int cardtype)
|
||||
{
|
||||
switch (cardtype) {
|
||||
|
||||
|
||||
case QETH_CARD_TYPE_UNKNOWN:
|
||||
case QETH_CARD_TYPE_OSAE:
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
|
@ -1097,9 +1097,9 @@ qeth_string_to_ipaddr4(const char *buf, __u8 *addr)
|
|||
int count = 0, rc = 0;
|
||||
int in[4];
|
||||
|
||||
rc = sscanf(buf, "%d.%d.%d.%d%n",
|
||||
rc = sscanf(buf, "%d.%d.%d.%d%n",
|
||||
&in[0], &in[1], &in[2], &in[3], &count);
|
||||
if (rc != 4 || count)
|
||||
if (rc != 4 || count<=0)
|
||||
return -EINVAL;
|
||||
for (count = 0; count < 4; count++) {
|
||||
if (in[count] > 255)
|
||||
|
@ -1131,7 +1131,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
|
|||
|
||||
cnt = out = found = save_cnt = num2 = 0;
|
||||
end = start = (char *) buf;
|
||||
in = (__u16 *) addr;
|
||||
in = (__u16 *) addr;
|
||||
memset(in, 0, 16);
|
||||
while (end) {
|
||||
end = strchr(end,':');
|
||||
|
@ -1139,7 +1139,7 @@ qeth_string_to_ipaddr6(const char *buf, __u8 *addr)
|
|||
end = (char *)buf + (strlen(buf));
|
||||
out = 1;
|
||||
}
|
||||
if ((end - start)) {
|
||||
if ((end - start)) {
|
||||
memset(num, 0, 5);
|
||||
memcpy(num, start, end - start);
|
||||
if (!qeth_isxdigit(num))
|
||||
|
@ -1241,5 +1241,5 @@ qeth_osn_register(unsigned char *read_dev_no,
|
|||
|
||||
extern void
|
||||
qeth_osn_deregister(struct net_device *);
|
||||
|
||||
|
||||
#endif /* __QETH_H__ */
|
||||
|
|
|
@ -81,7 +81,7 @@ void
|
|||
qeth_eddp_buf_release_contexts(struct qeth_qdio_out_buffer *buf)
|
||||
{
|
||||
struct qeth_eddp_context_reference *ref;
|
||||
|
||||
|
||||
QETH_DBF_TEXT(trace, 6, "eddprctx");
|
||||
while (!list_empty(&buf->ctx_list)){
|
||||
ref = list_entry(buf->ctx_list.next,
|
||||
|
@ -135,7 +135,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
|
|||
"buffer!\n");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* check if the whole next skb fits into current buffer */
|
||||
if ((QETH_MAX_BUFFER_ELEMENTS(queue->card) -
|
||||
buf->next_element_to_fill)
|
||||
|
@ -148,7 +148,7 @@ qeth_eddp_fill_buffer(struct qeth_qdio_out_q *queue,
|
|||
* and increment ctx's refcnt */
|
||||
must_refcnt = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (must_refcnt){
|
||||
must_refcnt = 0;
|
||||
if (qeth_eddp_buf_ref_context(buf, ctx)){
|
||||
|
@ -266,7 +266,7 @@ qeth_eddp_copy_data_tcp(char *dst, struct qeth_eddp_data *eddp, int len,
|
|||
int left_in_frag;
|
||||
int copy_len;
|
||||
u8 *src;
|
||||
|
||||
|
||||
QETH_DBF_TEXT(trace, 5, "eddpcdtc");
|
||||
if (skb_shinfo(eddp->skb)->nr_frags == 0) {
|
||||
memcpy(dst, eddp->skb->data + eddp->skb_offset, len);
|
||||
|
@ -408,7 +408,7 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
|
|||
struct tcphdr *tcph;
|
||||
int data_len;
|
||||
u32 hcsum;
|
||||
|
||||
|
||||
QETH_DBF_TEXT(trace, 5, "eddpftcp");
|
||||
eddp->skb_offset = sizeof(struct qeth_hdr) + eddp->nhl + eddp->thl;
|
||||
if (eddp->qh.hdr.l2.id == QETH_HEADER_TYPE_LAYER2) {
|
||||
|
@ -465,13 +465,13 @@ __qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
|
|||
eddp->th.tcp.h.seq += data_len;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static inline int
|
||||
qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
|
||||
struct sk_buff *skb, struct qeth_hdr *qhdr)
|
||||
{
|
||||
struct qeth_eddp_data *eddp = NULL;
|
||||
|
||||
|
||||
QETH_DBF_TEXT(trace, 5, "eddpficx");
|
||||
/* create our segmentation headers and copy original headers */
|
||||
if (skb->protocol == ETH_P_IP)
|
||||
|
@ -512,7 +512,7 @@ qeth_eddp_calc_num_pages(struct qeth_eddp_context *ctx, struct sk_buff *skb,
|
|||
int hdr_len)
|
||||
{
|
||||
int skbs_per_page;
|
||||
|
||||
|
||||
QETH_DBF_TEXT(trace, 5, "eddpcanp");
|
||||
/* can we put multiple skbs in one page? */
|
||||
skbs_per_page = PAGE_SIZE / (skb_shinfo(skb)->tso_size + hdr_len);
|
||||
|
@ -588,7 +588,7 @@ qeth_eddp_create_context_tcp(struct qeth_card *card, struct sk_buff *skb,
|
|||
struct qeth_hdr *qhdr)
|
||||
{
|
||||
struct qeth_eddp_context *ctx = NULL;
|
||||
|
||||
|
||||
QETH_DBF_TEXT(trace, 5, "creddpct");
|
||||
if (skb->protocol == ETH_P_IP)
|
||||
ctx = qeth_eddp_create_context_generic(card, skb,
|
||||
|
|
|
@ -42,7 +42,7 @@ qeth_create_device_attributes_osn(struct device *dev);
|
|||
|
||||
extern void
|
||||
qeth_remove_device_attributes_osn(struct device *dev);
|
||||
|
||||
|
||||
extern int
|
||||
qeth_create_driver_attributes(void);
|
||||
|
||||
|
|
|
@ -513,7 +513,7 @@ __qeth_set_offline(struct ccwgroup_device *cgdev, int recovery_mode)
|
|||
|
||||
QETH_DBF_TEXT(setup, 3, "setoffl");
|
||||
QETH_DBF_HEX(setup, 3, &card, sizeof(void *));
|
||||
|
||||
|
||||
if (card->dev && netif_carrier_ok(card->dev))
|
||||
netif_carrier_off(card->dev);
|
||||
recover_flag = card->state;
|
||||
|
@ -604,13 +604,13 @@ __qeth_ref_ip_on_card(struct qeth_card *card, struct qeth_ipaddr *todo,
|
|||
list_for_each_entry(addr, &card->ip_list, entry) {
|
||||
if (card->options.layer2) {
|
||||
if ((addr->type == todo->type) &&
|
||||
(memcmp(&addr->mac, &todo->mac,
|
||||
(memcmp(&addr->mac, &todo->mac,
|
||||
OSA_ADDR_LEN) == 0)) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ((addr->proto == QETH_PROT_IPV4) &&
|
||||
(todo->proto == QETH_PROT_IPV4) &&
|
||||
(addr->type == todo->type) &&
|
||||
|
@ -694,13 +694,13 @@ __qeth_insert_ip_todo(struct qeth_card *card, struct qeth_ipaddr *addr, int add)
|
|||
if (card->options.layer2) {
|
||||
if ((tmp->type == addr->type) &&
|
||||
(tmp->is_multicast == addr->is_multicast) &&
|
||||
(memcmp(&tmp->mac, &addr->mac,
|
||||
(memcmp(&tmp->mac, &addr->mac,
|
||||
OSA_ADDR_LEN) == 0)) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ((tmp->proto == QETH_PROT_IPV4) &&
|
||||
(addr->proto == QETH_PROT_IPV4) &&
|
||||
(tmp->type == addr->type) &&
|
||||
|
@ -1173,7 +1173,7 @@ qeth_determine_card_type(struct qeth_card *card)
|
|||
"due to hardware limitations!\n");
|
||||
card->qdio.no_out_queues = 1;
|
||||
card->qdio.default_out_queue = 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
i++;
|
||||
|
@ -1198,7 +1198,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
|
|||
return -ENODEV;
|
||||
|
||||
QETH_DBF_TEXT_(setup, 2, "%s", gdev->dev.bus_id);
|
||||
|
||||
|
||||
card = qeth_alloc_card();
|
||||
if (!card) {
|
||||
put_device(dev);
|
||||
|
@ -1220,7 +1220,7 @@ qeth_probe_device(struct ccwgroup_device *gdev)
|
|||
put_device(dev);
|
||||
qeth_free_card(card);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
if ((rc = qeth_setup_card(card))){
|
||||
QETH_DBF_TEXT_(setup, 2, "2err%d", rc);
|
||||
put_device(dev);
|
||||
|
@ -1843,7 +1843,7 @@ struct qeth_cmd_buffer *iob)
|
|||
&card->seqno.pdu_hdr_ack, QETH_SEQ_NO_LENGTH);
|
||||
QETH_DBF_HEX(control, 2, iob->data, QETH_DBF_CONTROL_LEN);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qeth_send_control_data(struct qeth_card *card, int len,
|
||||
struct qeth_cmd_buffer *iob,
|
||||
|
@ -1937,7 +1937,7 @@ qeth_osn_send_control_data(struct qeth_card *card, int len,
|
|||
wake_up(&card->wait_q);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
||||
|
@ -1966,7 +1966,7 @@ qeth_osn_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
|||
memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &s2, 2);
|
||||
return qeth_osn_send_control_data(card, s1, iob);
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qeth_send_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
||||
int (*reply_cb)
|
||||
|
@ -2579,7 +2579,7 @@ qeth_process_inbound_buffer(struct qeth_card *card,
|
|||
skb->dev = card->dev;
|
||||
if (hdr->hdr.l2.id == QETH_HEADER_TYPE_LAYER2)
|
||||
vlan_tag = qeth_layer2_rebuild_skb(card, skb, hdr);
|
||||
else if (hdr->hdr.l3.id == QETH_HEADER_TYPE_LAYER3)
|
||||
else if (hdr->hdr.l3.id == QETH_HEADER_TYPE_LAYER3)
|
||||
qeth_rebuild_skb(card, skb, hdr);
|
||||
else { /*in case of OSN*/
|
||||
skb_push(skb, sizeof(struct qeth_hdr));
|
||||
|
@ -2763,7 +2763,7 @@ qeth_qdio_input_handler(struct ccw_device * ccwdev, unsigned int status,
|
|||
index = i % QDIO_MAX_BUFFERS_PER_Q;
|
||||
buffer = &card->qdio.in_q->bufs[index];
|
||||
if (!((status & QDIO_STATUS_LOOK_FOR_ERROR) &&
|
||||
qeth_check_qdio_errors(buffer->buffer,
|
||||
qeth_check_qdio_errors(buffer->buffer,
|
||||
qdio_err, siga_err,"qinerr")))
|
||||
qeth_process_inbound_buffer(card, buffer, index);
|
||||
/* clear buffer and give back to hardware */
|
||||
|
@ -3187,7 +3187,7 @@ qeth_alloc_qdio_buffers(struct qeth_card *card)
|
|||
if (card->qdio.state == QETH_QDIO_ALLOCATED)
|
||||
return 0;
|
||||
|
||||
card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q),
|
||||
card->qdio.in_q = kmalloc(sizeof(struct qeth_qdio_q),
|
||||
GFP_KERNEL|GFP_DMA);
|
||||
if (!card->qdio.in_q)
|
||||
return - ENOMEM;
|
||||
|
@ -3476,7 +3476,7 @@ qeth_halt_channels(struct qeth_card *card)
|
|||
rc3 = qeth_halt_channel(&card->data);
|
||||
if (rc1)
|
||||
return rc1;
|
||||
if (rc2)
|
||||
if (rc2)
|
||||
return rc2;
|
||||
return rc3;
|
||||
}
|
||||
|
@ -3491,7 +3491,7 @@ qeth_clear_channels(struct qeth_card *card)
|
|||
rc3 = qeth_clear_channel(&card->data);
|
||||
if (rc1)
|
||||
return rc1;
|
||||
if (rc2)
|
||||
if (rc2)
|
||||
return rc2;
|
||||
return rc3;
|
||||
}
|
||||
|
@ -3798,10 +3798,10 @@ qeth_open(struct net_device *dev)
|
|||
QETH_DBF_TEXT(trace,4,"nomacadr");
|
||||
return -EPERM;
|
||||
}
|
||||
card->dev->flags |= IFF_UP;
|
||||
netif_start_queue(dev);
|
||||
card->data.state = CH_STATE_UP;
|
||||
card->state = CARD_STATE_UP;
|
||||
card->dev->flags |= IFF_UP;
|
||||
netif_start_queue(dev);
|
||||
|
||||
if (!card->lan_online && netif_carrier_ok(dev))
|
||||
netif_carrier_off(dev);
|
||||
|
@ -3817,7 +3817,7 @@ qeth_stop(struct net_device *dev)
|
|||
|
||||
card = (struct qeth_card *) dev->priv;
|
||||
|
||||
netif_stop_queue(dev);
|
||||
netif_tx_disable(dev);
|
||||
card->dev->flags &= ~IFF_UP;
|
||||
if (card->state == CARD_STATE_UP)
|
||||
card->state = CARD_STATE_SOFTSETUP;
|
||||
|
@ -3958,7 +3958,7 @@ qeth_prepare_skb(struct qeth_card *card, struct sk_buff **skb,
|
|||
#endif
|
||||
*hdr = (struct qeth_hdr *)
|
||||
qeth_push_skb(card, skb, sizeof(struct qeth_hdr));
|
||||
if (hdr == NULL)
|
||||
if (*hdr == NULL)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
@ -4098,7 +4098,7 @@ qeth_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
|
|||
}
|
||||
} else { /* passthrough */
|
||||
if((skb->dev->type == ARPHRD_IEEE802_TR) &&
|
||||
!memcmp(skb->data + sizeof(struct qeth_hdr) +
|
||||
!memcmp(skb->data + sizeof(struct qeth_hdr) +
|
||||
sizeof(__u16), skb->dev->broadcast, 6)) {
|
||||
hdr->hdr.l3.flags = QETH_CAST_BROADCAST |
|
||||
QETH_HDR_PASSTHRU;
|
||||
|
@ -4385,7 +4385,7 @@ out:
|
|||
}
|
||||
|
||||
static inline int
|
||||
qeth_get_elements_no(struct qeth_card *card, void *hdr,
|
||||
qeth_get_elements_no(struct qeth_card *card, void *hdr,
|
||||
struct sk_buff *skb, int elems)
|
||||
{
|
||||
int elements_needed = 0;
|
||||
|
@ -4416,6 +4416,8 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
|
|||
enum qeth_large_send_types large_send = QETH_LARGE_SEND_NO;
|
||||
struct qeth_eddp_context *ctx = NULL;
|
||||
int tx_bytes = skb->len;
|
||||
unsigned short nr_frags = skb_shinfo(skb)->nr_frags;
|
||||
unsigned short tso_size = skb_shinfo(skb)->tso_size;
|
||||
int rc;
|
||||
|
||||
QETH_DBF_TEXT(trace, 6, "sendpkt");
|
||||
|
@ -4441,7 +4443,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
|
|||
return 0;
|
||||
}
|
||||
cast_type = qeth_get_cast_type(card, skb);
|
||||
if ((cast_type == RTN_BROADCAST) &&
|
||||
if ((cast_type == RTN_BROADCAST) &&
|
||||
(card->info.broadcast_capable == 0)){
|
||||
card->stats.tx_dropped++;
|
||||
card->stats.tx_errors++;
|
||||
|
@ -4463,7 +4465,7 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
|
|||
card->stats.tx_errors++;
|
||||
dev_kfree_skb_any(skb);
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
}
|
||||
elements_needed++;
|
||||
} else {
|
||||
if ((rc = qeth_prepare_skb(card, &skb, &hdr, ipv))) {
|
||||
|
@ -4498,16 +4500,16 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb)
|
|||
card->stats.tx_packets++;
|
||||
card->stats.tx_bytes += tx_bytes;
|
||||
#ifdef CONFIG_QETH_PERF_STATS
|
||||
if (skb_shinfo(skb)->tso_size &&
|
||||
if (tso_size &&
|
||||
!(large_send == QETH_LARGE_SEND_NO)) {
|
||||
card->perf_stats.large_send_bytes += skb->len;
|
||||
card->perf_stats.large_send_bytes += tx_bytes;
|
||||
card->perf_stats.large_send_cnt++;
|
||||
}
|
||||
if (skb_shinfo(skb)->nr_frags > 0){
|
||||
if (nr_frags > 0){
|
||||
card->perf_stats.sg_skbs_sent++;
|
||||
/* nr_frags + skb->data */
|
||||
card->perf_stats.sg_frags_sent +=
|
||||
skb_shinfo(skb)->nr_frags + 1;
|
||||
nr_frags + 1;
|
||||
}
|
||||
#endif /* CONFIG_QETH_PERF_STATS */
|
||||
}
|
||||
|
@ -5373,7 +5375,7 @@ qeth_layer2_send_setdelvlan_cb(struct qeth_card *card,
|
|||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (cmd->hdr.return_code) {
|
||||
PRINT_ERR("Error in processing VLAN %i on %s: 0x%x. "
|
||||
"Continuing\n",cmd->data.setdelvlan.vlan_id,
|
||||
"Continuing\n",cmd->data.setdelvlan.vlan_id,
|
||||
QETH_CARD_IFNAME(card), cmd->hdr.return_code);
|
||||
QETH_DBF_TEXT_(trace, 2, "L2VL%4x", cmd->hdr.command);
|
||||
QETH_DBF_TEXT_(trace, 2, "L2%s", CARD_BUS_ID(card));
|
||||
|
@ -5393,7 +5395,7 @@ qeth_layer2_send_setdelvlan(struct qeth_card *card, __u16 i,
|
|||
iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);
|
||||
cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
|
||||
cmd->data.setdelvlan.vlan_id = i;
|
||||
return qeth_send_ipa_cmd(card, iob,
|
||||
return qeth_send_ipa_cmd(card, iob,
|
||||
qeth_layer2_send_setdelvlan_cb, NULL);
|
||||
}
|
||||
|
||||
|
@ -5457,7 +5459,7 @@ qeth_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)
|
|||
* Examine hardware response to SET_PROMISC_MODE
|
||||
*/
|
||||
static int
|
||||
qeth_setadp_promisc_mode_cb(struct qeth_card *card,
|
||||
qeth_setadp_promisc_mode_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply,
|
||||
unsigned long data)
|
||||
{
|
||||
|
@ -5468,10 +5470,10 @@ qeth_setadp_promisc_mode_cb(struct qeth_card *card,
|
|||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
setparms = &(cmd->data.setadapterparms);
|
||||
|
||||
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
|
||||
if (cmd->hdr.return_code) {
|
||||
QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code);
|
||||
if (cmd->hdr.return_code) {
|
||||
QETH_DBF_TEXT_(trace,4,"prmrc%2.2x",cmd->hdr.return_code);
|
||||
setparms->data.mode = SET_PROMISC_MODE_OFF;
|
||||
}
|
||||
card->info.promisc_mode = setparms->data.mode;
|
||||
|
@ -5517,7 +5519,7 @@ qeth_set_multicast_list(struct net_device *dev)
|
|||
|
||||
if (card->info.type == QETH_CARD_TYPE_OSN)
|
||||
return ;
|
||||
|
||||
|
||||
QETH_DBF_TEXT(trace, 3, "setmulti");
|
||||
qeth_delete_mc_addresses(card);
|
||||
if (card->options.layer2) {
|
||||
|
@ -5575,7 +5577,7 @@ qeth_osn_assist(struct net_device *dev,
|
|||
struct qeth_cmd_buffer *iob;
|
||||
struct qeth_card *card;
|
||||
int rc;
|
||||
|
||||
|
||||
QETH_DBF_TEXT(trace, 2, "osnsdmc");
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
|
@ -5654,7 +5656,7 @@ qeth_osn_deregister(struct net_device * dev)
|
|||
card->osn_info.data_cb = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
qeth_delete_mc_addresses(struct qeth_card *card)
|
||||
{
|
||||
|
@ -5818,7 +5820,7 @@ qeth_add_multicast_ipv6(struct qeth_card *card)
|
|||
struct inet6_dev *in6_dev;
|
||||
|
||||
QETH_DBF_TEXT(trace,4,"chkmcv6");
|
||||
if (!qeth_is_supported(card, IPA_IPV6))
|
||||
if (!qeth_is_supported(card, IPA_IPV6))
|
||||
return ;
|
||||
in6_dev = in6_dev_get(card->dev);
|
||||
if (in6_dev == NULL)
|
||||
|
@ -6359,12 +6361,9 @@ qeth_netdev_init(struct net_device *dev)
|
|||
dev->vlan_rx_kill_vid = qeth_vlan_rx_kill_vid;
|
||||
dev->vlan_rx_add_vid = qeth_vlan_rx_add_vid;
|
||||
#endif
|
||||
dev->hard_header = card->orig_hard_header;
|
||||
if (qeth_get_netdev_flags(card) & IFF_NOARP) {
|
||||
dev->rebuild_header = NULL;
|
||||
dev->hard_header = NULL;
|
||||
if (card->options.fake_ll)
|
||||
dev->hard_header = qeth_fake_header;
|
||||
dev->header_cache_update = NULL;
|
||||
dev->hard_header_cache = NULL;
|
||||
}
|
||||
|
@ -6373,6 +6372,9 @@ qeth_netdev_init(struct net_device *dev)
|
|||
if (!(card->info.unique_id & UNIQUE_ID_NOT_BY_CARD))
|
||||
card->dev->dev_id = card->info.unique_id & 0xffff;
|
||||
#endif
|
||||
if (card->options.fake_ll &&
|
||||
(qeth_get_netdev_flags(card) & IFF_NOARP))
|
||||
dev->hard_header = qeth_fake_header;
|
||||
dev->hard_header_parse = NULL;
|
||||
dev->set_mac_address = qeth_layer2_set_mac_address;
|
||||
dev->flags |= qeth_get_netdev_flags(card);
|
||||
|
@ -6477,6 +6479,9 @@ retry:
|
|||
/*network device will be recovered*/
|
||||
if (card->dev) {
|
||||
card->dev->hard_header = card->orig_hard_header;
|
||||
if (card->options.fake_ll &&
|
||||
(qeth_get_netdev_flags(card) & IFF_NOARP))
|
||||
card->dev->hard_header = qeth_fake_header;
|
||||
return 0;
|
||||
}
|
||||
/* at first set_online allocate netdev */
|
||||
|
@ -6584,7 +6589,7 @@ qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
|
|||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (!card->options.layer2 || card->info.guestlan ||
|
||||
!(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
|
||||
!(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
|
||||
memcpy(card->dev->dev_addr,
|
||||
&cmd->data.setadapterparms.data.change_addr.addr,
|
||||
OSA_ADDR_LEN);
|
||||
|
@ -7031,14 +7036,12 @@ qeth_softsetup_ipv6(struct qeth_card *card)
|
|||
|
||||
QETH_DBF_TEXT(trace,3,"softipv6");
|
||||
|
||||
netif_stop_queue(card->dev);
|
||||
rc = qeth_send_startlan(card, QETH_PROT_IPV6);
|
||||
if (rc) {
|
||||
PRINT_ERR("IPv6 startlan failed on %s\n",
|
||||
QETH_CARD_IFNAME(card));
|
||||
return rc;
|
||||
}
|
||||
netif_wake_queue(card->dev);
|
||||
rc = qeth_query_ipassists(card,QETH_PROT_IPV6);
|
||||
if (rc) {
|
||||
PRINT_ERR("IPv6 query ipassist failed on %s\n",
|
||||
|
@ -7352,7 +7355,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type)
|
|||
card->options.large_send = type;
|
||||
return 0;
|
||||
}
|
||||
netif_stop_queue(card->dev);
|
||||
if (card->state == CARD_STATE_UP)
|
||||
netif_tx_disable(card->dev);
|
||||
card->options.large_send = type;
|
||||
switch (card->options.large_send) {
|
||||
case QETH_LARGE_SEND_EDDP:
|
||||
|
@ -7374,7 +7378,8 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type)
|
|||
card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG);
|
||||
break;
|
||||
}
|
||||
netif_wake_queue(card->dev);
|
||||
if (card->state == CARD_STATE_UP)
|
||||
netif_wake_queue(card->dev);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -7427,7 +7432,7 @@ qeth_softsetup_card(struct qeth_card *card)
|
|||
if ((rc = qeth_setrouting_v6(card)))
|
||||
QETH_DBF_TEXT_(setup, 2, "5err%d", rc);
|
||||
out:
|
||||
netif_stop_queue(card->dev);
|
||||
netif_tx_disable(card->dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -7567,7 +7572,7 @@ qeth_stop_card(struct qeth_card *card, int recovery_mode)
|
|||
if (card->read.state == CH_STATE_UP &&
|
||||
card->write.state == CH_STATE_UP &&
|
||||
(card->state == CARD_STATE_UP)) {
|
||||
if (recovery_mode &&
|
||||
if (recovery_mode &&
|
||||
card->info.type != QETH_CARD_TYPE_OSN) {
|
||||
qeth_stop(card->dev);
|
||||
} else {
|
||||
|
@ -7736,10 +7741,8 @@ static int
|
|||
qeth_register_netdev(struct qeth_card *card)
|
||||
{
|
||||
QETH_DBF_TEXT(setup, 3, "regnetd");
|
||||
if (card->dev->reg_state != NETREG_UNINITIALIZED) {
|
||||
qeth_netdev_init(card->dev);
|
||||
if (card->dev->reg_state != NETREG_UNINITIALIZED)
|
||||
return 0;
|
||||
}
|
||||
/* sysfs magic */
|
||||
SET_NETDEV_DEV(card->dev, &card->gdev->dev);
|
||||
return register_netdev(card->dev);
|
||||
|
@ -7750,7 +7753,7 @@ qeth_start_again(struct qeth_card *card, int recovery_mode)
|
|||
{
|
||||
QETH_DBF_TEXT(setup ,2, "startag");
|
||||
|
||||
if (recovery_mode &&
|
||||
if (recovery_mode &&
|
||||
card->info.type != QETH_CARD_TYPE_OSN) {
|
||||
qeth_open(card->dev);
|
||||
} else {
|
||||
|
|
|
@ -445,7 +445,7 @@ enum qeth_ipa_arp_return_codes {
|
|||
/* Helper functions */
|
||||
#define IS_IPA_REPLY(cmd) ((cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST) || \
|
||||
(cmd->hdr.initiator == IPA_CMD_INITIATOR_OSA_REPLY))
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
/* END OF IP Assist related definitions */
|
||||
/*****************************************************************************/
|
||||
|
@ -490,7 +490,7 @@ extern unsigned char ULP_ENABLE[];
|
|||
/* Layer 2 defintions */
|
||||
#define QETH_PROT_LAYER2 0x08
|
||||
#define QETH_PROT_TCPIP 0x03
|
||||
#define QETH_PROT_OSN2 0x0a
|
||||
#define QETH_PROT_OSN2 0x0a
|
||||
#define QETH_ULP_ENABLE_PROT_TYPE(buffer) (buffer+0x50)
|
||||
#define QETH_IPA_CMD_PROT_TYPE(buffer) (buffer+0x19)
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ qeth_procfile_seq_start(struct seq_file *s, loff_t *offset)
|
|||
{
|
||||
struct device *dev = NULL;
|
||||
loff_t nr = 0;
|
||||
|
||||
|
||||
down_read(&qeth_ccwgroup_driver.driver.bus->subsys.rwsem);
|
||||
if (*offset == 0)
|
||||
return SEQ_START_TOKEN;
|
||||
|
@ -60,8 +60,8 @@ static void *
|
|||
qeth_procfile_seq_next(struct seq_file *s, void *it, loff_t *offset)
|
||||
{
|
||||
struct device *prev, *next;
|
||||
|
||||
if (it == SEQ_START_TOKEN)
|
||||
|
||||
if (it == SEQ_START_TOKEN)
|
||||
prev = NULL;
|
||||
else
|
||||
prev = (struct device *) it;
|
||||
|
@ -180,7 +180,7 @@ qeth_perf_procfile_seq_show(struct seq_file *s, void *it)
|
|||
struct device *device;
|
||||
struct qeth_card *card;
|
||||
|
||||
|
||||
|
||||
if (it == SEQ_START_TOKEN)
|
||||
return 0;
|
||||
|
||||
|
|
|
@ -785,7 +785,7 @@ qeth_dev_large_send_store(struct device *dev, struct device_attribute *attr, con
|
|||
}
|
||||
if (card->options.large_send == type)
|
||||
return count;
|
||||
if ((rc = qeth_set_large_send(card, type)))
|
||||
if ((rc = qeth_set_large_send(card, type)))
|
||||
return rc;
|
||||
return count;
|
||||
}
|
||||
|
@ -1682,7 +1682,7 @@ qeth_create_device_attributes(struct device *dev)
|
|||
if (card->info.type == QETH_CARD_TYPE_OSN)
|
||||
return sysfs_create_group(&dev->kobj,
|
||||
&qeth_osn_device_attr_group);
|
||||
|
||||
|
||||
if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_attr_group)))
|
||||
return ret;
|
||||
if ((ret = sysfs_create_group(&dev->kobj, &qeth_device_ipato_group))){
|
||||
|
@ -1713,7 +1713,7 @@ qeth_remove_device_attributes(struct device *dev)
|
|||
if (card->info.type == QETH_CARD_TYPE_OSN)
|
||||
return sysfs_remove_group(&dev->kobj,
|
||||
&qeth_osn_device_attr_group);
|
||||
|
||||
|
||||
sysfs_remove_group(&dev->kobj, &qeth_device_attr_group);
|
||||
sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group);
|
||||
sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group);
|
||||
|
|
|
@ -117,11 +117,11 @@ __qeth_fill_buffer_frag(struct sk_buff *skb, struct qdio_buffer *buffer,
|
|||
int fragno;
|
||||
unsigned long addr;
|
||||
int element, cnt, dlen;
|
||||
|
||||
|
||||
fragno = skb_shinfo(skb)->nr_frags;
|
||||
element = *next_element_to_fill;
|
||||
dlen = 0;
|
||||
|
||||
|
||||
if (is_tso)
|
||||
buffer->element[element].flags =
|
||||
SBAL_FLAGS_MIDDLE_FRAG;
|
||||
|
|
|
@ -4297,6 +4297,7 @@ static int ata_start_drive(struct ata_port *ap, struct ata_device *dev)
|
|||
int ata_device_resume(struct ata_port *ap, struct ata_device *dev)
|
||||
{
|
||||
if (ap->flags & ATA_FLAG_SUSPENDED) {
|
||||
ata_busy_wait(ap, ATA_BUSY | ATA_DRQ, 200000);
|
||||
ap->flags &= ~ATA_FLAG_SUSPENDED;
|
||||
ata_set_mode(ap);
|
||||
}
|
||||
|
|
|
@ -982,6 +982,12 @@ static int device_check(ppa_struct *dev)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int ppa_adjust_queue(struct scsi_device *device)
|
||||
{
|
||||
blk_queue_bounce_limit(device->request_queue, BLK_BOUNCE_HIGH);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct scsi_host_template ppa_template = {
|
||||
.module = THIS_MODULE,
|
||||
.proc_name = "ppa",
|
||||
|
@ -997,6 +1003,7 @@ static struct scsi_host_template ppa_template = {
|
|||
.cmd_per_lun = 1,
|
||||
.use_clustering = ENABLE_CLUSTERING,
|
||||
.can_queue = 1,
|
||||
.slave_alloc = ppa_adjust_queue,
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
|
|
|
@ -165,6 +165,7 @@ static struct {
|
|||
{"HP", "HSV100", NULL, BLIST_REPORTLUN2 | BLIST_NOSTARTONADD},
|
||||
{"HP", "C1557A", NULL, BLIST_FORCELUN},
|
||||
{"HP", "C3323-300", "4269", BLIST_NOTQ},
|
||||
{"HP", "C5713A", NULL, BLIST_NOREPORTLUN},
|
||||
{"IBM", "AuSaV1S2", NULL, BLIST_FORCELUN},
|
||||
{"IBM", "ProFibre 4000R", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
|
||||
{"IBM", "2105", NULL, BLIST_RETRY_HWERROR},
|
||||
|
|
|
@ -367,7 +367,7 @@ static int scsi_req_map_sg(struct request *rq, struct scatterlist *sgl,
|
|||
int nsegs, unsigned bufflen, gfp_t gfp)
|
||||
{
|
||||
struct request_queue *q = rq->q;
|
||||
int nr_pages = (bufflen + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
int nr_pages = (bufflen + sgl[0].offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
unsigned int data_len = 0, len, bytes, off;
|
||||
struct page *page;
|
||||
struct bio *bio = NULL;
|
||||
|
|
|
@ -955,7 +955,8 @@ static int sas_user_scan(struct Scsi_Host *shost, uint channel,
|
|||
list_for_each_entry(rphy, &sas_host->rphy_list, list) {
|
||||
struct sas_phy *parent = dev_to_phy(rphy->dev.parent);
|
||||
|
||||
if (rphy->scsi_target_id == -1)
|
||||
if (rphy->identify.device_type != SAS_END_DEVICE ||
|
||||
rphy->scsi_target_id == -1)
|
||||
continue;
|
||||
|
||||
if ((channel == SCAN_WILD_CARD || channel == parent->port_identifier) &&
|
||||
|
@ -977,7 +978,6 @@ static int sas_user_scan(struct Scsi_Host *shost, uint channel,
|
|||
#define SETUP_TEMPLATE(attrb, field, perm, test) \
|
||||
i->private_##attrb[count] = class_device_attr_##field; \
|
||||
i->private_##attrb[count].attr.mode = perm; \
|
||||
i->private_##attrb[count].store = NULL; \
|
||||
i->attrb[count] = &i->private_##attrb[count]; \
|
||||
if (test) \
|
||||
count++
|
||||
|
|
|
@ -1164,14 +1164,16 @@ static int __init cpm_uart_console_setup(struct console *co, char *options)
|
|||
struct fs_uart_platform_info *pdata;
|
||||
struct platform_device* pdev = early_uart_get_pdev(co->index);
|
||||
|
||||
port =
|
||||
(struct uart_port *)&cpm_uart_ports[cpm_uart_port_map[co->index]];
|
||||
pinfo = (struct uart_cpm_port *)port;
|
||||
if (!pdev) {
|
||||
pr_info("cpm_uart: console: compat mode\n");
|
||||
/* compatibility - will be cleaned up */
|
||||
cpm_uart_init_portdesc();
|
||||
}
|
||||
|
||||
port =
|
||||
(struct uart_port *)&cpm_uart_ports[cpm_uart_port_map[co->index]];
|
||||
pinfo = (struct uart_cpm_port *)port;
|
||||
if (!pdev) {
|
||||
if (pinfo->set_lineif)
|
||||
pinfo->set_lineif(pinfo);
|
||||
} else {
|
||||
|
|
|
@ -213,7 +213,7 @@ int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con)
|
|||
L1_CACHE_ALIGN(pinfo->tx_nrfifos * pinfo->tx_fifosize);
|
||||
if (is_con) {
|
||||
mem_addr = alloc_bootmem(memsz);
|
||||
dma_addr = mem_addr;
|
||||
dma_addr = virt_to_bus(mem_addr);
|
||||
}
|
||||
else
|
||||
mem_addr = dma_alloc_coherent(NULL, memsz, &dma_addr,
|
||||
|
|
|
@ -405,7 +405,7 @@ static int s3c24xx_spi_remove(struct platform_device *dev)
|
|||
|
||||
static int s3c24xx_spi_suspend(struct platform_device *pdev, pm_message_t msg)
|
||||
{
|
||||
struct s3c24xx_spi *hw = platform_get_drvdata(dev);
|
||||
struct s3c24xx_spi *hw = platform_get_drvdata(pdev);
|
||||
|
||||
clk_disable(hw->clk);
|
||||
return 0;
|
||||
|
@ -413,7 +413,7 @@ static int s3c24xx_spi_suspend(struct platform_device *pdev, pm_message_t msg)
|
|||
|
||||
static int s3c24xx_spi_resume(struct platform_device *pdev)
|
||||
{
|
||||
struct s3c24xx_spi *hw = platform_get_drvdata(dev);
|
||||
struct s3c24xx_spi *hw = platform_get_drvdata(pdev);
|
||||
|
||||
clk_enable(hw->clk);
|
||||
return 0;
|
||||
|
|
|
@ -214,10 +214,13 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
|
|||
*/
|
||||
int au1100fb_fb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue, unsigned transp, struct fb_info *fbi)
|
||||
{
|
||||
struct au1100fb_device *fbdev = to_au1100fb_device(fbi);
|
||||
u32 *palette = fbdev->regs->lcd_pallettebase;
|
||||
struct au1100fb_device *fbdev;
|
||||
u32 *palette;
|
||||
u32 value;
|
||||
|
||||
fbdev = to_au1100fb_device(fbi);
|
||||
palette = fbdev->regs->lcd_pallettebase;
|
||||
|
||||
if (regno > (AU1100_LCD_NBR_PALETTE_ENTRIES - 1))
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -316,9 +319,11 @@ int au1100fb_fb_blank(int blank_mode, struct fb_info *fbi)
|
|||
*/
|
||||
int au1100fb_fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *fbi)
|
||||
{
|
||||
struct au1100fb_device *fbdev = to_au1100fb_device(fbi);
|
||||
struct au1100fb_device *fbdev;
|
||||
int dy;
|
||||
|
||||
fbdev = to_au1100fb_device(fbi);
|
||||
|
||||
print_dbg("fb_pan_display %p %p", var, fbi);
|
||||
|
||||
if (!var || !fbdev) {
|
||||
|
@ -382,10 +387,12 @@ void au1100fb_fb_rotate(struct fb_info *fbi, int angle)
|
|||
*/
|
||||
int au1100fb_fb_mmap(struct fb_info *fbi, struct vm_area_struct *vma)
|
||||
{
|
||||
struct au1100fb_device *fbdev = to_au1100fb_device(fbi);
|
||||
struct au1100fb_device *fbdev;
|
||||
unsigned int len;
|
||||
unsigned long start=0, off;
|
||||
|
||||
fbdev = to_au1100fb_device(fbi);
|
||||
|
||||
if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -467,7 +474,7 @@ int au1100fb_drv_probe(struct device *dev)
|
|||
|
||||
if (!request_mem_region(au1100fb_fix.mmio_start, au1100fb_fix.mmio_len,
|
||||
DRIVER_NAME)) {
|
||||
print_err("fail to lock memory region at 0x%08x",
|
||||
print_err("fail to lock memory region at 0x%08lx",
|
||||
au1100fb_fix.mmio_start);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
@ -595,13 +602,13 @@ int au1100fb_drv_remove(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int au1100fb_drv_suspend(struct device *dev, u32 state, u32 level)
|
||||
int au1100fb_drv_suspend(struct device *dev, pm_message_t state)
|
||||
{
|
||||
/* TODO */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int au1100fb_drv_resume(struct device *dev, u32 level)
|
||||
int au1100fb_drv_resume(struct device *dev)
|
||||
{
|
||||
/* TODO */
|
||||
return 0;
|
||||
|
|
|
@ -2631,7 +2631,7 @@ static int fbcon_scrolldelta(struct vc_data *vc, int lines)
|
|||
scr_memcpyw((u16 *) q, (u16 *) p,
|
||||
vc->vc_size_row);
|
||||
}
|
||||
softback_in = p;
|
||||
softback_in = softback_curr = p;
|
||||
update_region(vc, vc->vc_origin,
|
||||
logo_lines * vc->vc_cols);
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ static struct fb_var_screeninfo maxinefb_defined = {
|
|||
};
|
||||
|
||||
static struct fb_fix_screeninfo maxinefb_fix = {
|
||||
.id = "Maxine onboard graphics 1024x768x8",
|
||||
.id = "Maxine",
|
||||
.smem_len = (1024*768),
|
||||
.type = FB_TYPE_PACKED_PIXELS,
|
||||
.visual = FB_VISUAL_PSEUDOCOLOR,
|
||||
|
@ -107,8 +107,6 @@ static int maxinefb_setcolreg(unsigned regno, unsigned red, unsigned green,
|
|||
|
||||
static struct fb_ops maxinefb_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.fb_get_fix = gen_get_fix,
|
||||
.fb_get_var = gen_get_var,
|
||||
.fb_setcolreg = maxinefb_setcolreg,
|
||||
.fb_fillrect = cfb_fillrect,
|
||||
.fb_copyarea = cfb_copyarea,
|
||||
|
|
|
@ -416,10 +416,9 @@ affs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|||
return retval;
|
||||
}
|
||||
|
||||
retval = -EIO;
|
||||
bh = affs_bread(sb, old_dentry->d_inode->i_ino);
|
||||
if (!bh)
|
||||
goto done;
|
||||
return -EIO;
|
||||
|
||||
/* Remove header from its parent directory. */
|
||||
affs_lock_dir(old_dir);
|
||||
|
|
|
@ -1,3 +1,10 @@
|
|||
Version 1.43
|
||||
------------
|
||||
POSIX locking to servers which support CIFS POSIX Extensions
|
||||
(disabled by default controlled by proc/fs/cifs/Experimental).
|
||||
Handle conversion of long share names (especially Asian languages)
|
||||
to Unicode during mount.
|
||||
|
||||
Version 1.42
|
||||
------------
|
||||
Fix slow oplock break when mounted to different servers at the same time and
|
||||
|
|
|
@ -99,5 +99,5 @@ extern ssize_t cifs_getxattr(struct dentry *, const char *, void *, size_t);
|
|||
extern ssize_t cifs_listxattr(struct dentry *, char *, size_t);
|
||||
extern int cifs_ioctl (struct inode * inode, struct file * filep,
|
||||
unsigned int command, unsigned long arg);
|
||||
#define CIFS_VERSION "1.42"
|
||||
#define CIFS_VERSION "1.43"
|
||||
#endif /* _CIFSFS_H */
|
||||
|
|
|
@ -267,7 +267,7 @@ extern int CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
|
|||
const int waitFlag);
|
||||
extern int CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
||||
const __u16 smb_file_id, const int get_flag,
|
||||
const __u64 len, const __u64 offset,
|
||||
const __u64 len, struct file_lock *,
|
||||
const __u16 lock_type, const int waitFlag);
|
||||
extern int CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon);
|
||||
extern int CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses);
|
||||
|
|
|
@ -1355,7 +1355,8 @@ CIFSSMBLock(const int xid, struct cifsTconInfo *tcon,
|
|||
int
|
||||
CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
||||
const __u16 smb_file_id, const int get_flag, const __u64 len,
|
||||
const __u64 lkoffset, const __u16 lock_type, const int waitFlag)
|
||||
struct file_lock *pLockData, const __u16 lock_type,
|
||||
const int waitFlag)
|
||||
{
|
||||
struct smb_com_transaction2_sfi_req *pSMB = NULL;
|
||||
struct smb_com_transaction2_sfi_rsp *pSMBr = NULL;
|
||||
|
@ -1366,6 +1367,10 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
|||
__u16 params, param_offset, offset, byte_count, count;
|
||||
|
||||
cFYI(1, ("Posix Lock"));
|
||||
|
||||
if(pLockData == NULL)
|
||||
return EINVAL;
|
||||
|
||||
rc = small_smb_init(SMB_COM_TRANSACTION2, 15, tcon, (void **) &pSMB);
|
||||
|
||||
if (rc)
|
||||
|
@ -1404,10 +1409,10 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
|||
|
||||
parm_data->lock_type = cpu_to_le16(lock_type);
|
||||
if(waitFlag)
|
||||
parm_data->lock_flags = 1;
|
||||
parm_data->lock_flags = cpu_to_le16(1);
|
||||
parm_data->pid = cpu_to_le32(current->tgid);
|
||||
parm_data->start = lkoffset;
|
||||
parm_data->length = len; /* normalize negative numbers */
|
||||
parm_data->start = cpu_to_le64(pLockData->fl_start);
|
||||
parm_data->length = cpu_to_le64(len); /* normalize negative numbers */
|
||||
|
||||
pSMB->DataOffset = cpu_to_le16(offset);
|
||||
pSMB->Fid = smb_file_id;
|
||||
|
@ -1419,8 +1424,33 @@ CIFSSMBPosixLock(const int xid, struct cifsTconInfo *tcon,
|
|||
(struct smb_hdr *) pSMBr, &bytes_returned, 0);
|
||||
if (rc) {
|
||||
cFYI(1, ("Send error in Posix Lock = %d", rc));
|
||||
}
|
||||
} else if (get_flag) {
|
||||
/* lock structure can be returned on get */
|
||||
__u16 data_offset;
|
||||
__u16 data_count;
|
||||
rc = validate_t2((struct smb_t2_rsp *)pSMBr);
|
||||
|
||||
if (rc || (pSMBr->ByteCount < sizeof(struct cifs_posix_lock))) {
|
||||
rc = -EIO; /* bad smb */
|
||||
goto plk_err_exit;
|
||||
}
|
||||
if(pLockData == NULL) {
|
||||
rc = -EINVAL;
|
||||
goto plk_err_exit;
|
||||
}
|
||||
data_offset = le16_to_cpu(pSMBr->t2.DataOffset);
|
||||
data_count = le16_to_cpu(pSMBr->t2.DataCount);
|
||||
if(data_count < sizeof(struct cifs_posix_lock)) {
|
||||
rc = -EIO;
|
||||
goto plk_err_exit;
|
||||
}
|
||||
parm_data = (struct cifs_posix_lock *)
|
||||
((char *)&pSMBr->hdr.Protocol + data_offset);
|
||||
if(parm_data->lock_type == cpu_to_le16(CIFS_UNLCK))
|
||||
pLockData->fl_type = F_UNLCK;
|
||||
}
|
||||
|
||||
plk_err_exit:
|
||||
if (pSMB)
|
||||
cifs_small_buf_release(pSMB);
|
||||
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче