Merge branch 'x86/unify-pci' into x86/core
This commit is contained in:
commit
f87f38ec5a
@ -26,7 +26,7 @@
|
||||
static unsigned long icache_size, dcache_size; /* Size in bytes */
|
||||
static unsigned long icache_lsize, dcache_lsize; /* Size in bytes */
|
||||
|
||||
unsigned long __init r3k_cache_size(unsigned long ca_flags)
|
||||
unsigned long __cpuinit r3k_cache_size(unsigned long ca_flags)
|
||||
{
|
||||
unsigned long flags, status, dummy, size;
|
||||
volatile unsigned long *p;
|
||||
@ -61,7 +61,7 @@ unsigned long __init r3k_cache_size(unsigned long ca_flags)
|
||||
return size * sizeof(*p);
|
||||
}
|
||||
|
||||
unsigned long __init r3k_cache_lsize(unsigned long ca_flags)
|
||||
unsigned long __cpuinit r3k_cache_lsize(unsigned long ca_flags)
|
||||
{
|
||||
unsigned long flags, status, lsize, i;
|
||||
volatile unsigned long *p;
|
||||
@ -90,7 +90,7 @@ unsigned long __init r3k_cache_lsize(unsigned long ca_flags)
|
||||
return lsize * sizeof(*p);
|
||||
}
|
||||
|
||||
static void __init r3k_probe_cache(void)
|
||||
static void __cpuinit r3k_probe_cache(void)
|
||||
{
|
||||
dcache_size = r3k_cache_size(ST0_ISC);
|
||||
if (dcache_size)
|
||||
|
@ -235,13 +235,12 @@ static void __cpuinit set_prefetch_parameters(void)
|
||||
}
|
||||
/*
|
||||
* Too much unrolling will overflow the available space in
|
||||
* clear_space_array / copy_page_array. 8 words sounds generous,
|
||||
* but a R4000 with 128 byte L2 line length can exceed even that.
|
||||
* clear_space_array / copy_page_array.
|
||||
*/
|
||||
half_clear_loop_size = min(8 * clear_word_size,
|
||||
half_clear_loop_size = min(16 * clear_word_size,
|
||||
max(cache_line_size >> 1,
|
||||
4 * clear_word_size));
|
||||
half_copy_loop_size = min(8 * copy_word_size,
|
||||
half_copy_loop_size = min(16 * copy_word_size,
|
||||
max(cache_line_size >> 1,
|
||||
4 * copy_word_size));
|
||||
}
|
||||
@ -263,21 +262,23 @@ static inline void __cpuinit build_clear_pref(u32 **buf, int off)
|
||||
if (pref_bias_clear_store) {
|
||||
uasm_i_pref(buf, pref_dst_mode, pref_bias_clear_store + off,
|
||||
A0);
|
||||
} else if (cpu_has_cache_cdex_s) {
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0);
|
||||
} else if (cpu_has_cache_cdex_p) {
|
||||
if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) {
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
} else if (cache_line_size == (half_clear_loop_size << 1)) {
|
||||
if (cpu_has_cache_cdex_s) {
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0);
|
||||
} else if (cpu_has_cache_cdex_p) {
|
||||
if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) {
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
}
|
||||
|
||||
if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x())
|
||||
uasm_i_lw(buf, ZERO, ZERO, AT);
|
||||
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0);
|
||||
}
|
||||
}
|
||||
|
||||
if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x())
|
||||
uasm_i_lw(buf, ZERO, ZERO, AT);
|
||||
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0);
|
||||
}
|
||||
}
|
||||
|
||||
void __cpuinit build_clear_page(void)
|
||||
@ -403,20 +404,22 @@ static inline void build_copy_store_pref(u32 **buf, int off)
|
||||
if (pref_bias_copy_store) {
|
||||
uasm_i_pref(buf, pref_dst_mode, pref_bias_copy_store + off,
|
||||
A0);
|
||||
} else if (cpu_has_cache_cdex_s) {
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0);
|
||||
} else if (cpu_has_cache_cdex_p) {
|
||||
if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) {
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
} else if (cache_line_size == (half_copy_loop_size << 1)) {
|
||||
if (cpu_has_cache_cdex_s) {
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_SD, off, A0);
|
||||
} else if (cpu_has_cache_cdex_p) {
|
||||
if (R4600_V1_HIT_CACHEOP_WAR && cpu_is_r4600_v1_x()) {
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
uasm_i_nop(buf);
|
||||
}
|
||||
|
||||
if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x())
|
||||
uasm_i_lw(buf, ZERO, ZERO, AT);
|
||||
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0);
|
||||
}
|
||||
|
||||
if (R4600_V2_HIT_CACHEOP_WAR && cpu_is_r4600_v2_x())
|
||||
uasm_i_lw(buf, ZERO, ZERO, AT);
|
||||
|
||||
uasm_i_cache(buf, Create_Dirty_Excl_D, off, A0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,7 @@ static void rm7k_sc_inv(unsigned long addr, unsigned long size)
|
||||
/*
|
||||
* This function is executed in uncached address space.
|
||||
*/
|
||||
static __init void __rm7k_sc_enable(void)
|
||||
static __cpuinit void __rm7k_sc_enable(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -107,7 +107,7 @@ static __init void __rm7k_sc_enable(void)
|
||||
}
|
||||
}
|
||||
|
||||
static __init void rm7k_sc_enable(void)
|
||||
static __cpuinit void rm7k_sc_enable(void)
|
||||
{
|
||||
if (read_c0_config() & RM7K_CONF_SE)
|
||||
return;
|
||||
|
@ -33,13 +33,14 @@ static struct legacy_serial_info {
|
||||
phys_addr_t taddr;
|
||||
} legacy_serial_infos[MAX_LEGACY_SERIAL_PORTS];
|
||||
|
||||
static struct __initdata of_device_id parents[] = {
|
||||
static struct __initdata of_device_id legacy_serial_parents[] = {
|
||||
{.type = "soc",},
|
||||
{.type = "tsi-bridge",},
|
||||
{.type = "opb", },
|
||||
{.compatible = "ibm,opb",},
|
||||
{.compatible = "simple-bus",},
|
||||
{.compatible = "wrs,epld-localbus",},
|
||||
{},
|
||||
};
|
||||
|
||||
static unsigned int legacy_serial_count;
|
||||
@ -327,7 +328,7 @@ void __init find_legacy_serial_ports(void)
|
||||
struct device_node *parent = of_get_parent(np);
|
||||
if (!parent)
|
||||
continue;
|
||||
if (of_match_node(parents, parent) != NULL) {
|
||||
if (of_match_node(legacy_serial_parents, parent) != NULL) {
|
||||
index = add_legacy_soc_port(np, np);
|
||||
if (index >= 0 && np == stdout)
|
||||
legacy_serial_console = index;
|
||||
|
@ -77,7 +77,6 @@ include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS)
|
||||
KERNEL_DEFINES = $(strip -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask \
|
||||
-Dmktime=kernel_mktime $(ARCH_KERNEL_DEFINES))
|
||||
KBUILD_CFLAGS += $(KERNEL_DEFINES)
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-unit-at-a-time,)
|
||||
|
||||
PHONY += linux
|
||||
|
||||
|
@ -32,4 +32,11 @@ cflags-y += $(call cc-option,-mpreferred-stack-boundary=2)
|
||||
# an unresolved reference.
|
||||
cflags-y += -ffreestanding
|
||||
|
||||
# Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use
|
||||
# a lot more stack due to the lack of sharing of stacklots. Also, gcc
|
||||
# 4.3.0 needs -funit-at-a-time for extern inline functions.
|
||||
KBUILD_CFLAGS += $(shell if [ $(call cc-version) -lt 0400 ] ; then \
|
||||
echo $(call cc-option,-fno-unit-at-a-time); \
|
||||
else echo $(call cc-option,-funit-at-a-time); fi ;)
|
||||
|
||||
KBUILD_CFLAGS += $(cflags-y)
|
||||
|
@ -21,3 +21,6 @@ HEADER_ARCH := x86
|
||||
|
||||
LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib64
|
||||
LINK-y += -m64
|
||||
|
||||
# Do unit-at-a-time unconditionally on x86_64, following the host
|
||||
KBUILD_CFLAGS += $(call cc-option,-funit-at-a-time)
|
||||
|
@ -1,5 +1,19 @@
|
||||
ifeq ($(CONFIG_X86_32),y)
|
||||
include ${srctree}/arch/x86/pci/Makefile_32
|
||||
else
|
||||
include ${srctree}/arch/x86/pci/Makefile_64
|
||||
endif
|
||||
obj-y := i386.o init.o
|
||||
|
||||
obj-$(CONFIG_PCI_BIOS) += pcbios.o
|
||||
obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_$(BITS).o direct.o mmconfig-shared.o
|
||||
obj-$(CONFIG_PCI_DIRECT) += direct.o
|
||||
obj-$(CONFIG_PCI_OLPC) += olpc.o
|
||||
|
||||
pci-y := fixup.o
|
||||
pci-$(CONFIG_ACPI) += acpi.o
|
||||
pci-y += legacy.o irq.o
|
||||
|
||||
# Careful: VISWS overrule the pci-y above. The colons are
|
||||
# therefor correct. This needs a proper fix by distangling the code.
|
||||
pci-$(CONFIG_X86_VISWS) := visws.o fixup.o
|
||||
|
||||
pci-$(CONFIG_X86_NUMAQ) += numa.o
|
||||
|
||||
obj-y += $(pci-y) common.o early.o
|
||||
obj-y += amd_bus.o
|
||||
|
@ -1,26 +0,0 @@
|
||||
obj-y := i386.o init.o
|
||||
|
||||
obj-$(CONFIG_PCI_BIOS) += pcbios.o
|
||||
obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_32.o direct.o mmconfig-shared.o
|
||||
obj-$(CONFIG_PCI_DIRECT) += direct.o
|
||||
obj-$(CONFIG_PCI_OLPC) += olpc.o
|
||||
|
||||
pci-y := fixup.o
|
||||
|
||||
# Do not change the ordering here. There is a nasty init function
|
||||
# ordering dependency which breaks when you move acpi.o below
|
||||
# legacy/irq.o
|
||||
pci-$(CONFIG_ACPI) += acpi.o
|
||||
pci-y += legacy.o irq.o
|
||||
|
||||
# Careful: VISWS overrule the pci-y above. The colons are
|
||||
# therefor correct. This needs a proper fix by distangling the code.
|
||||
pci-$(CONFIG_X86_VISWS) := visws.o fixup.o
|
||||
|
||||
pci-$(CONFIG_X86_NUMAQ) += numa.o
|
||||
|
||||
# Necessary for NUMAQ as well
|
||||
pci-$(CONFIG_NUMA) += mp_bus_to_node.o
|
||||
|
||||
obj-y += $(pci-y) common.o early.o
|
||||
obj-y += amd_bus.o
|
@ -1,17 +0,0 @@
|
||||
#
|
||||
# Makefile for X86_64 specific PCI routines
|
||||
#
|
||||
# Reuse the i386 PCI subsystem
|
||||
#
|
||||
EXTRA_CFLAGS += -Iarch/x86/pci
|
||||
|
||||
obj-y := i386.o
|
||||
obj-$(CONFIG_PCI_DIRECT)+= direct.o
|
||||
obj-y += fixup.o init.o
|
||||
obj-$(CONFIG_ACPI) += acpi.o
|
||||
obj-y += legacy.o irq.o common.o early.o
|
||||
# mmconfig has a 64bit special
|
||||
obj-$(CONFIG_PCI_MMCONFIG) += mmconfig_64.o direct.o mmconfig-shared.o
|
||||
|
||||
obj-y += amd_bus.o
|
||||
|
@ -223,7 +223,7 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do
|
||||
return bus;
|
||||
}
|
||||
|
||||
static int __init pci_acpi_init(void)
|
||||
int __init pci_acpi_init(void)
|
||||
{
|
||||
struct pci_dev *dev = NULL;
|
||||
|
||||
@ -257,4 +257,3 @@ static int __init pci_acpi_init(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(pci_acpi_init);
|
||||
|
@ -1,44 +1,25 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/topology.h>
|
||||
#include "pci.h"
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
#include <asm/pci-direct.h>
|
||||
#include <asm/mpspec.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/topology.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This discovers the pcibus <-> node mapping on AMD K8.
|
||||
* also get peer root bus resource for io,mmio
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* sub bus (transparent) will use entres from 3 to store extra from root,
|
||||
* so need to make sure have enought slot there, increase PCI_BUS_NUM_RESOURCES?
|
||||
*/
|
||||
#define RES_NUM 16
|
||||
struct pci_root_info {
|
||||
char name[12];
|
||||
unsigned int res_num;
|
||||
struct resource res[RES_NUM];
|
||||
int bus_min;
|
||||
int bus_max;
|
||||
int node;
|
||||
int link;
|
||||
};
|
||||
|
||||
/* 4 at this time, it may become to 32 */
|
||||
#define PCI_ROOT_NR 4
|
||||
static int pci_root_num;
|
||||
static struct pci_root_info pci_root_info[PCI_ROOT_NR];
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
|
||||
#define BUS_NR 256
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
static int mp_bus_to_node[BUS_NR];
|
||||
|
||||
void set_mp_bus_to_node(int busnum, int node)
|
||||
@ -65,7 +46,52 @@ int get_mp_bus_to_node(int busnum)
|
||||
|
||||
return node;
|
||||
}
|
||||
#endif
|
||||
|
||||
#else /* CONFIG_X86_32 */
|
||||
|
||||
static unsigned char mp_bus_to_node[BUS_NR];
|
||||
|
||||
void set_mp_bus_to_node(int busnum, int node)
|
||||
{
|
||||
if (busnum >= 0 && busnum < BUS_NR)
|
||||
mp_bus_to_node[busnum] = (unsigned char) node;
|
||||
}
|
||||
|
||||
int get_mp_bus_to_node(int busnum)
|
||||
{
|
||||
int node;
|
||||
|
||||
if (busnum < 0 || busnum > (BUS_NR - 1))
|
||||
return 0;
|
||||
node = mp_bus_to_node[busnum];
|
||||
return node;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_X86_32 */
|
||||
|
||||
#endif /* CONFIG_NUMA */
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
|
||||
/*
|
||||
* sub bus (transparent) will use entres from 3 to store extra from root,
|
||||
* so need to make sure have enought slot there, increase PCI_BUS_NUM_RESOURCES?
|
||||
*/
|
||||
#define RES_NUM 16
|
||||
struct pci_root_info {
|
||||
char name[12];
|
||||
unsigned int res_num;
|
||||
struct resource res[RES_NUM];
|
||||
int bus_min;
|
||||
int bus_max;
|
||||
int node;
|
||||
int link;
|
||||
};
|
||||
|
||||
/* 4 at this time, it may become to 32 */
|
||||
#define PCI_ROOT_NR 4
|
||||
static int pci_root_num;
|
||||
static struct pci_root_info pci_root_info[PCI_ROOT_NR];
|
||||
|
||||
void set_pci_bus_resources_arch_default(struct pci_bus *b)
|
||||
{
|
||||
|
@ -328,18 +328,18 @@ static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = {
|
||||
#endif
|
||||
{
|
||||
.callback = set_bf_sort,
|
||||
.ident = "HP ProLiant DL360",
|
||||
.ident = "HP ProLiant DL385 G2",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL360"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL385 G2"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = set_bf_sort,
|
||||
.ident = "HP ProLiant DL380",
|
||||
.ident = "HP ProLiant DL585 G2",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "HP"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL380"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL585 G2"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
@ -384,7 +384,7 @@ struct pci_bus * __devinit pcibios_scan_root(int busnum)
|
||||
|
||||
extern u8 pci_cache_line_size;
|
||||
|
||||
static int __init pcibios_init(void)
|
||||
int __init pcibios_init(void)
|
||||
{
|
||||
struct cpuinfo_x86 *c = &boot_cpu_data;
|
||||
|
||||
@ -411,8 +411,6 @@ static int __init pcibios_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(pcibios_init);
|
||||
|
||||
char * __devinit pcibios_setup(char *str)
|
||||
{
|
||||
if (!strcmp(str, "off")) {
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
/* arch_initcall has too random ordering, so call the initializers
|
||||
in the right sequence from here. */
|
||||
static __init int pci_access_init(void)
|
||||
static __init int pci_arch_init(void)
|
||||
{
|
||||
#ifdef CONFIG_PCI_DIRECT
|
||||
int type = 0;
|
||||
@ -40,4 +40,4 @@ static __init int pci_access_init(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(pci_access_init);
|
||||
arch_initcall(pci_arch_init);
|
||||
|
@ -1107,7 +1107,7 @@ static struct dmi_system_id __initdata pciirq_dmi_table[] = {
|
||||
{ }
|
||||
};
|
||||
|
||||
static int __init pcibios_irq_init(void)
|
||||
int __init pcibios_irq_init(void)
|
||||
{
|
||||
DBG(KERN_DEBUG "PCI: IRQ init\n");
|
||||
|
||||
@ -1142,9 +1142,6 @@ static int __init pcibios_irq_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(pcibios_irq_init);
|
||||
|
||||
|
||||
static void pirq_penalize_isa_irq(int irq, int active)
|
||||
{
|
||||
/*
|
||||
|
@ -55,4 +55,13 @@ static int __init pci_legacy_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(pci_legacy_init);
|
||||
int __init pci_subsys_init(void)
|
||||
{
|
||||
#ifdef CONFIG_ACPI
|
||||
pci_acpi_init();
|
||||
#endif
|
||||
pci_legacy_init();
|
||||
pcibios_irq_init();
|
||||
pcibios_init();
|
||||
}
|
||||
subsys_initcall(pci_subsys_init);
|
||||
|
@ -1,23 +0,0 @@
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/topology.h>
|
||||
|
||||
#define BUS_NR 256
|
||||
|
||||
static unsigned char mp_bus_to_node[BUS_NR];
|
||||
|
||||
void set_mp_bus_to_node(int busnum, int node)
|
||||
{
|
||||
if (busnum >= 0 && busnum < BUS_NR)
|
||||
mp_bus_to_node[busnum] = (unsigned char) node;
|
||||
}
|
||||
|
||||
int get_mp_bus_to_node(int busnum)
|
||||
{
|
||||
int node;
|
||||
|
||||
if (busnum < 0 || busnum > (BUS_NR - 1))
|
||||
return 0;
|
||||
node = mp_bus_to_node[busnum];
|
||||
return node;
|
||||
}
|
@ -177,4 +177,10 @@ static int __init pci_numa_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(pci_numa_init);
|
||||
static __init int pci_subsys_init(void)
|
||||
{
|
||||
pci_numa_init();
|
||||
pcibios_irq_init();
|
||||
pcibios_init();
|
||||
}
|
||||
subsys_initcall(pci_subsys_init);
|
||||
|
@ -39,9 +39,6 @@ enum pci_bf_sort_state {
|
||||
pci_dmi_bf,
|
||||
};
|
||||
|
||||
extern void __init dmi_check_pciprobe(void);
|
||||
extern void __init dmi_check_skip_isa_align(void);
|
||||
|
||||
/* pci-i386.c */
|
||||
|
||||
extern unsigned int pcibios_max_latency;
|
||||
@ -99,10 +96,18 @@ extern struct pci_raw_ops *raw_pci_ext_ops;
|
||||
|
||||
extern struct pci_raw_ops pci_direct_conf1;
|
||||
|
||||
/* arch_initcall level */
|
||||
extern int pci_direct_probe(void);
|
||||
extern void pci_direct_init(int type);
|
||||
extern void pci_pcbios_init(void);
|
||||
extern int pci_olpc_init(void);
|
||||
extern void __init dmi_check_pciprobe(void);
|
||||
extern void __init dmi_check_skip_isa_align(void);
|
||||
|
||||
/* some common used subsys_initcalls */
|
||||
extern int __init pci_acpi_init(void);
|
||||
extern int __init pcibios_irq_init(void);
|
||||
extern int __init pcibios_init(void);
|
||||
|
||||
/* pci-mmconfig.c */
|
||||
|
||||
|
@ -85,7 +85,7 @@ void __init pcibios_update_irq(struct pci_dev *dev, int irq)
|
||||
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq);
|
||||
}
|
||||
|
||||
static int __init pcibios_init(void)
|
||||
static int __init pci_visws_init(void)
|
||||
{
|
||||
/* The VISWS supports configuration access type 1 only */
|
||||
pci_probe = (pci_probe | PCI_PROBE_CONF1) &
|
||||
@ -105,4 +105,9 @@ static int __init pcibios_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(pcibios_init);
|
||||
static __init int pci_subsys_init(void)
|
||||
{
|
||||
pci_visws_init();
|
||||
pcibios_init();
|
||||
}
|
||||
subsys_initcall(pci_subsys_init);
|
||||
|
@ -76,7 +76,7 @@ struct palm_bk3710_udmatiming {
|
||||
|
||||
#include "../ide-timing.h"
|
||||
|
||||
static long ide_palm_clk;
|
||||
static unsigned ideclk_period; /* in nanoseconds */
|
||||
|
||||
static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = {
|
||||
{160, 240}, /* UDMA Mode 0 */
|
||||
@ -86,8 +86,6 @@ static const struct palm_bk3710_udmatiming palm_bk3710_udmatimings[6] = {
|
||||
{85, 60}, /* UDMA Mode 4 */
|
||||
};
|
||||
|
||||
static struct clk *ideclkp;
|
||||
|
||||
static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev,
|
||||
unsigned int mode)
|
||||
{
|
||||
@ -97,10 +95,10 @@ static void palm_bk3710_setudmamode(void __iomem *base, unsigned int dev,
|
||||
|
||||
/* DMA Data Setup */
|
||||
t0 = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].cycletime,
|
||||
ide_palm_clk) - 1;
|
||||
tenv = DIV_ROUND_UP(20, ide_palm_clk) - 1;
|
||||
ideclk_period) - 1;
|
||||
tenv = DIV_ROUND_UP(20, ideclk_period) - 1;
|
||||
trp = DIV_ROUND_UP(palm_bk3710_udmatimings[mode].rptime,
|
||||
ide_palm_clk) - 1;
|
||||
ideclk_period) - 1;
|
||||
|
||||
/* udmatim Register */
|
||||
val16 = readw(base + BK3710_UDMATIM) & (dev ? 0xFF0F : 0xFFF0);
|
||||
@ -141,8 +139,8 @@ static void palm_bk3710_setdmamode(void __iomem *base, unsigned int dev,
|
||||
cycletime = max_t(int, t->cycle, min_cycle);
|
||||
|
||||
/* DMA Data Setup */
|
||||
t0 = DIV_ROUND_UP(cycletime, ide_palm_clk);
|
||||
td = DIV_ROUND_UP(t->active, ide_palm_clk);
|
||||
t0 = DIV_ROUND_UP(cycletime, ideclk_period);
|
||||
td = DIV_ROUND_UP(t->active, ideclk_period);
|
||||
tkw = t0 - td - 1;
|
||||
td -= 1;
|
||||
|
||||
@ -168,9 +166,9 @@ static void palm_bk3710_setpiomode(void __iomem *base, ide_drive_t *mate,
|
||||
struct ide_timing *t;
|
||||
|
||||
/* PIO Data Setup */
|
||||
t0 = DIV_ROUND_UP(cycletime, ide_palm_clk);
|
||||
t0 = DIV_ROUND_UP(cycletime, ideclk_period);
|
||||
t2 = DIV_ROUND_UP(ide_timing_find_mode(XFER_PIO_0 + mode)->active,
|
||||
ide_palm_clk);
|
||||
ideclk_period);
|
||||
|
||||
t2i = t0 - t2 - 1;
|
||||
t2 -= 1;
|
||||
@ -192,8 +190,8 @@ static void palm_bk3710_setpiomode(void __iomem *base, ide_drive_t *mate,
|
||||
|
||||
/* TASKFILE Setup */
|
||||
t = ide_timing_find_mode(XFER_PIO_0 + mode);
|
||||
t0 = DIV_ROUND_UP(t->cyc8b, ide_palm_clk);
|
||||
t2 = DIV_ROUND_UP(t->act8b, ide_palm_clk);
|
||||
t0 = DIV_ROUND_UP(t->cyc8b, ideclk_period);
|
||||
t2 = DIV_ROUND_UP(t->act8b, ideclk_period);
|
||||
|
||||
t2i = t0 - t2 - 1;
|
||||
t2 -= 1;
|
||||
@ -350,22 +348,22 @@ static const struct ide_port_info __devinitdata palm_bk3710_port_info = {
|
||||
|
||||
static int __devinit palm_bk3710_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct clk *clkp;
|
||||
struct clk *clk;
|
||||
struct resource *mem, *irq;
|
||||
ide_hwif_t *hwif;
|
||||
unsigned long base;
|
||||
unsigned long base, rate;
|
||||
int i;
|
||||
hw_regs_t hw;
|
||||
u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
|
||||
|
||||
clkp = clk_get(NULL, "IDECLK");
|
||||
if (IS_ERR(clkp))
|
||||
clk = clk_get(NULL, "IDECLK");
|
||||
if (IS_ERR(clk))
|
||||
return -ENODEV;
|
||||
|
||||
ideclkp = clkp;
|
||||
clk_enable(ideclkp);
|
||||
ide_palm_clk = clk_get_rate(ideclkp)/100000;
|
||||
ide_palm_clk = (10000/ide_palm_clk) + 1;
|
||||
clk_enable(clk);
|
||||
rate = clk_get_rate(clk);
|
||||
ideclk_period = 1000000000UL / rate;
|
||||
|
||||
/* Register the IDE interface with Linux ATA Interface */
|
||||
memset(&hw, 0, sizeof(hw));
|
||||
|
||||
|
@ -1218,16 +1218,12 @@ static void drive_release_dev (struct device *dev)
|
||||
complete(&drive->gendev_rel_comp);
|
||||
}
|
||||
|
||||
#ifndef ide_default_irq
|
||||
#define ide_default_irq(irq) 0
|
||||
#endif
|
||||
|
||||
static int hwif_init(ide_hwif_t *hwif)
|
||||
{
|
||||
int old_irq;
|
||||
|
||||
if (!hwif->irq) {
|
||||
hwif->irq = ide_default_irq(hwif->io_ports.data_addr);
|
||||
hwif->irq = __ide_default_irq(hwif->io_ports.data_addr);
|
||||
if (!hwif->irq) {
|
||||
printk("%s: DISABLED, NO IRQ\n", hwif->name);
|
||||
return 0;
|
||||
@ -1257,7 +1253,7 @@ static int hwif_init(ide_hwif_t *hwif)
|
||||
* It failed to initialise. Find the default IRQ for
|
||||
* this port and try that.
|
||||
*/
|
||||
hwif->irq = ide_default_irq(hwif->io_ports.data_addr);
|
||||
hwif->irq = __ide_default_irq(hwif->io_ports.data_addr);
|
||||
if (!hwif->irq) {
|
||||
printk("%s: Disabled unable to get IRQ %d.\n",
|
||||
hwif->name, old_irq);
|
||||
|
@ -184,8 +184,7 @@ static const struct ide_port_info it8213_chipsets[] __devinitdata = {
|
||||
|
||||
static int __devinit it8213_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
ide_setup_pci_device(dev, &it8213_chipsets[id->driver_data]);
|
||||
return 0;
|
||||
return ide_setup_pci_device(dev, &it8213_chipsets[id->driver_data]);
|
||||
}
|
||||
|
||||
static const struct pci_device_id it8213_pci_tbl[] = {
|
||||
|
@ -225,10 +225,6 @@ static int ns87415_dma_setup(ide_drive_t *drive)
|
||||
return 1;
|
||||
}
|
||||
|
||||
#ifndef ide_default_irq
|
||||
#define ide_default_irq(irq) 0
|
||||
#endif
|
||||
|
||||
static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
|
||||
{
|
||||
struct pci_dev *dev = to_pci_dev(hwif->dev);
|
||||
@ -288,7 +284,7 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif)
|
||||
}
|
||||
|
||||
if (!using_inta)
|
||||
hwif->irq = ide_default_irq(hwif->io_ports.data_addr);
|
||||
hwif->irq = __ide_default_irq(hwif->io_ports.data_addr);
|
||||
else if (!hwif->irq && hwif->mate && hwif->mate->irq)
|
||||
hwif->irq = hwif->mate->irq; /* share IRQ with mate */
|
||||
|
||||
|
@ -40,7 +40,7 @@
|
||||
#include <asm/io.h>
|
||||
|
||||
#define DRV_NAME "ehea"
|
||||
#define DRV_VERSION "EHEA_0091"
|
||||
#define DRV_VERSION "EHEA_0092"
|
||||
|
||||
/* eHEA capability flags */
|
||||
#define DLPAR_PORT_ADD_REM 1
|
||||
@ -452,7 +452,7 @@ struct ehea_bcmc_reg_entry {
|
||||
struct ehea_bcmc_reg_array {
|
||||
struct ehea_bcmc_reg_entry *arr;
|
||||
int num_entries;
|
||||
struct mutex lock;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
#define EHEA_PORT_UP 1
|
||||
@ -478,6 +478,7 @@ struct ehea_port {
|
||||
int num_add_tx_qps;
|
||||
int num_mcs;
|
||||
int resets;
|
||||
u64 flags;
|
||||
u64 mac_addr;
|
||||
u32 logical_port_id;
|
||||
u32 port_speed;
|
||||
@ -501,7 +502,8 @@ struct port_res_cfg {
|
||||
};
|
||||
|
||||
enum ehea_flag_bits {
|
||||
__EHEA_STOP_XFER
|
||||
__EHEA_STOP_XFER,
|
||||
__EHEA_DISABLE_PORT_RESET
|
||||
};
|
||||
|
||||
void ehea_set_ethtool_ops(struct net_device *netdev);
|
||||
|
@ -118,6 +118,7 @@ static struct of_device_id ehea_device_table[] = {
|
||||
},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ehea_device_table);
|
||||
|
||||
static struct of_platform_driver ehea_driver = {
|
||||
.name = "ehea",
|
||||
@ -137,6 +138,12 @@ void ehea_dump(void *adr, int len, char *msg)
|
||||
}
|
||||
}
|
||||
|
||||
void ehea_schedule_port_reset(struct ehea_port *port)
|
||||
{
|
||||
if (!test_bit(__EHEA_DISABLE_PORT_RESET, &port->flags))
|
||||
schedule_work(&port->reset_task);
|
||||
}
|
||||
|
||||
static void ehea_update_firmware_handles(void)
|
||||
{
|
||||
struct ehea_fw_handle_entry *arr = NULL;
|
||||
@ -241,7 +248,7 @@ static void ehea_update_bcmc_registrations(void)
|
||||
}
|
||||
|
||||
if (num_registrations) {
|
||||
arr = kzalloc(num_registrations * sizeof(*arr), GFP_KERNEL);
|
||||
arr = kzalloc(num_registrations * sizeof(*arr), GFP_ATOMIC);
|
||||
if (!arr)
|
||||
return; /* Keep the existing array */
|
||||
} else
|
||||
@ -301,7 +308,7 @@ static struct net_device_stats *ehea_get_stats(struct net_device *dev)
|
||||
|
||||
memset(stats, 0, sizeof(*stats));
|
||||
|
||||
cb2 = kzalloc(PAGE_SIZE, GFP_KERNEL);
|
||||
cb2 = kzalloc(PAGE_SIZE, GFP_ATOMIC);
|
||||
if (!cb2) {
|
||||
ehea_error("no mem for cb2");
|
||||
goto out;
|
||||
@ -587,7 +594,7 @@ static int ehea_treat_poll_error(struct ehea_port_res *pr, int rq,
|
||||
"Resetting port.", pr->qp->init_attr.qp_nr);
|
||||
ehea_dump(cqe, sizeof(*cqe), "CQE");
|
||||
}
|
||||
schedule_work(&pr->port->reset_task);
|
||||
ehea_schedule_port_reset(pr->port);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -616,7 +623,7 @@ static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
|
||||
*tcph = tcp_hdr(skb);
|
||||
|
||||
/* check if ip header and tcp header are complete */
|
||||
if (iph->tot_len < ip_len + tcp_hdrlen(skb))
|
||||
if (ntohs(iph->tot_len) < ip_len + tcp_hdrlen(skb))
|
||||
return -1;
|
||||
|
||||
*hdr_flags = LRO_IPV4 | LRO_TCP;
|
||||
@ -765,7 +772,7 @@ static struct ehea_cqe *ehea_proc_cqes(struct ehea_port_res *pr, int my_quota)
|
||||
ehea_error("Send Completion Error: Resetting port");
|
||||
if (netif_msg_tx_err(pr->port))
|
||||
ehea_dump(cqe, sizeof(*cqe), "Send CQE");
|
||||
schedule_work(&pr->port->reset_task);
|
||||
ehea_schedule_port_reset(pr->port);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -885,7 +892,7 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param)
|
||||
eqe = ehea_poll_eq(port->qp_eq);
|
||||
}
|
||||
|
||||
schedule_work(&port->reset_task);
|
||||
ehea_schedule_port_reset(port);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
@ -1763,7 +1770,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa)
|
||||
|
||||
memcpy(dev->dev_addr, mac_addr->sa_data, dev->addr_len);
|
||||
|
||||
mutex_lock(&ehea_bcmc_regs.lock);
|
||||
spin_lock(&ehea_bcmc_regs.lock);
|
||||
|
||||
/* Deregister old MAC in pHYP */
|
||||
if (port->state == EHEA_PORT_UP) {
|
||||
@ -1785,7 +1792,7 @@ static int ehea_set_mac_addr(struct net_device *dev, void *sa)
|
||||
|
||||
out_upregs:
|
||||
ehea_update_bcmc_registrations();
|
||||
mutex_unlock(&ehea_bcmc_regs.lock);
|
||||
spin_unlock(&ehea_bcmc_regs.lock);
|
||||
out_free:
|
||||
kfree(cb0);
|
||||
out:
|
||||
@ -1947,7 +1954,7 @@ static void ehea_set_multicast_list(struct net_device *dev)
|
||||
}
|
||||
ehea_promiscuous(dev, 0);
|
||||
|
||||
mutex_lock(&ehea_bcmc_regs.lock);
|
||||
spin_lock(&ehea_bcmc_regs.lock);
|
||||
|
||||
if (dev->flags & IFF_ALLMULTI) {
|
||||
ehea_allmulti(dev, 1);
|
||||
@ -1978,7 +1985,7 @@ static void ehea_set_multicast_list(struct net_device *dev)
|
||||
}
|
||||
out:
|
||||
ehea_update_bcmc_registrations();
|
||||
mutex_unlock(&ehea_bcmc_regs.lock);
|
||||
spin_unlock(&ehea_bcmc_regs.lock);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2497,7 +2504,7 @@ static int ehea_up(struct net_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
mutex_lock(&ehea_bcmc_regs.lock);
|
||||
spin_lock(&ehea_bcmc_regs.lock);
|
||||
|
||||
ret = ehea_broadcast_reg_helper(port, H_REG_BCMC);
|
||||
if (ret) {
|
||||
@ -2520,7 +2527,7 @@ out:
|
||||
ehea_info("Failed starting %s. ret=%i", dev->name, ret);
|
||||
|
||||
ehea_update_bcmc_registrations();
|
||||
mutex_unlock(&ehea_bcmc_regs.lock);
|
||||
spin_unlock(&ehea_bcmc_regs.lock);
|
||||
|
||||
ehea_update_firmware_handles();
|
||||
mutex_unlock(&ehea_fw_handles.lock);
|
||||
@ -2575,7 +2582,7 @@ static int ehea_down(struct net_device *dev)
|
||||
|
||||
mutex_lock(&ehea_fw_handles.lock);
|
||||
|
||||
mutex_lock(&ehea_bcmc_regs.lock);
|
||||
spin_lock(&ehea_bcmc_regs.lock);
|
||||
ehea_drop_multicast_list(dev);
|
||||
ehea_broadcast_reg_helper(port, H_DEREG_BCMC);
|
||||
|
||||
@ -2584,7 +2591,7 @@ static int ehea_down(struct net_device *dev)
|
||||
port->state = EHEA_PORT_DOWN;
|
||||
|
||||
ehea_update_bcmc_registrations();
|
||||
mutex_unlock(&ehea_bcmc_regs.lock);
|
||||
spin_unlock(&ehea_bcmc_regs.lock);
|
||||
|
||||
ret = ehea_clean_all_portres(port);
|
||||
if (ret)
|
||||
@ -2605,13 +2612,14 @@ static int ehea_stop(struct net_device *dev)
|
||||
if (netif_msg_ifdown(port))
|
||||
ehea_info("disabling port %s", dev->name);
|
||||
|
||||
set_bit(__EHEA_DISABLE_PORT_RESET, &port->flags);
|
||||
cancel_work_sync(&port->reset_task);
|
||||
|
||||
mutex_lock(&port->port_lock);
|
||||
netif_stop_queue(dev);
|
||||
port_napi_disable(port);
|
||||
ret = ehea_down(dev);
|
||||
mutex_unlock(&port->port_lock);
|
||||
clear_bit(__EHEA_DISABLE_PORT_RESET, &port->flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -2941,7 +2949,7 @@ static void ehea_tx_watchdog(struct net_device *dev)
|
||||
|
||||
if (netif_carrier_ok(dev) &&
|
||||
!test_bit(__EHEA_STOP_XFER, &ehea_driver_flags))
|
||||
schedule_work(&port->reset_task);
|
||||
ehea_schedule_port_reset(port);
|
||||
}
|
||||
|
||||
int ehea_sense_adapter_attr(struct ehea_adapter *adapter)
|
||||
@ -3590,7 +3598,7 @@ int __init ehea_module_init(void)
|
||||
memset(&ehea_bcmc_regs, 0, sizeof(ehea_bcmc_regs));
|
||||
|
||||
mutex_init(&ehea_fw_handles.lock);
|
||||
mutex_init(&ehea_bcmc_regs.lock);
|
||||
spin_lock_init(&ehea_bcmc_regs.lock);
|
||||
|
||||
ret = check_module_parm();
|
||||
if (ret)
|
||||
|
@ -4194,12 +4194,23 @@ static int nv_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
|
||||
|
||||
netif_carrier_off(dev);
|
||||
if (netif_running(dev)) {
|
||||
unsigned long flags;
|
||||
|
||||
nv_disable_irq(dev);
|
||||
netif_tx_lock_bh(dev);
|
||||
spin_lock(&np->lock);
|
||||
/* with plain spinlock lockdep complains */
|
||||
spin_lock_irqsave(&np->lock, flags);
|
||||
/* stop engines */
|
||||
/* FIXME:
|
||||
* this can take some time, and interrupts are disabled
|
||||
* due to spin_lock_irqsave, but let's hope no daemon
|
||||
* is going to change the settings very often...
|
||||
* Worst case:
|
||||
* NV_RXSTOP_DELAY1MAX + NV_TXSTOP_DELAY1MAX
|
||||
* + some minor delays, which is up to a second approximately
|
||||
*/
|
||||
nv_stop_rxtx(dev);
|
||||
spin_unlock(&np->lock);
|
||||
spin_unlock_irqrestore(&np->lock, flags);
|
||||
netif_tx_unlock_bh(dev);
|
||||
}
|
||||
|
||||
|
@ -463,6 +463,9 @@ static void restart(struct net_device *dev)
|
||||
else
|
||||
C32(fccp, fcc_fpsmr, FCC_PSMR_FDE | FCC_PSMR_LPB);
|
||||
|
||||
/* Restore multicast and promiscuous settings */
|
||||
set_multicast_list(dev);
|
||||
|
||||
S32(fccp, fcc_gfmr, FCC_GFMR_ENR | FCC_GFMR_ENT);
|
||||
}
|
||||
|
||||
|
@ -1636,6 +1636,12 @@ static int emac_poll_rx(void *param, int budget)
|
||||
goto next;
|
||||
}
|
||||
|
||||
if (len < ETH_HLEN) {
|
||||
++dev->estats.rx_dropped_stack;
|
||||
emac_recycle_rx_skb(dev, slot, len);
|
||||
goto next;
|
||||
}
|
||||
|
||||
if (len && len < EMAC_RX_COPY_THRESH) {
|
||||
struct sk_buff *copy_skb =
|
||||
alloc_skb(len + EMAC_RX_SKB_HEADROOM + 2, GFP_ATOMIC);
|
||||
@ -2719,6 +2725,8 @@ static int __devinit emac_probe(struct of_device *ofdev,
|
||||
/* Clean rings */
|
||||
memset(dev->tx_desc, 0, NUM_TX_BUFF * sizeof(struct mal_descriptor));
|
||||
memset(dev->rx_desc, 0, NUM_RX_BUFF * sizeof(struct mal_descriptor));
|
||||
memset(dev->tx_skb, 0, NUM_TX_BUFF * sizeof(struct sk_buff *));
|
||||
memset(dev->rx_skb, 0, NUM_RX_BUFF * sizeof(struct sk_buff *));
|
||||
|
||||
/* Attach to ZMII, if needed */
|
||||
if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII) &&
|
||||
|
@ -277,7 +277,7 @@ static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
|
||||
*tcph = tcp_hdr(skb);
|
||||
|
||||
/* check if ip header and tcp header are complete */
|
||||
if (iph->tot_len < ip_len + tcp_hdrlen(skb))
|
||||
if (ntohs(iph->tot_len) < ip_len + tcp_hdrlen(skb))
|
||||
return -1;
|
||||
|
||||
*hdr_flags = LRO_IPV4 | LRO_TCP;
|
||||
|
@ -1008,6 +1008,7 @@ static int fr_rx(struct sk_buff *skb)
|
||||
stats->rx_bytes += skb->len;
|
||||
if (pvc->state.becn)
|
||||
stats->rx_compressed++;
|
||||
skb->dev = dev;
|
||||
netif_rx(skb);
|
||||
return NET_RX_SUCCESS;
|
||||
} else {
|
||||
|
@ -588,8 +588,12 @@ static void iwl3945_add_radiotap(struct iwl3945_priv *priv,
|
||||
|
||||
if (rate == -1)
|
||||
iwl3945_rt->rt_rate = 0;
|
||||
else
|
||||
else {
|
||||
if (stats->band == IEEE80211_BAND_5GHZ)
|
||||
rate += IWL_FIRST_OFDM_RATE;
|
||||
|
||||
iwl3945_rt->rt_rate = iwl3945_rates[rate].ieee;
|
||||
}
|
||||
|
||||
/* antenna number */
|
||||
antenna = phy_flags_hw & RX_RES_PHY_FLAGS_ANTENNA_MSK;
|
||||
|
@ -3528,8 +3528,12 @@ static void iwl4965_add_radiotap(struct iwl_priv *priv,
|
||||
|
||||
if (rate == -1)
|
||||
iwl4965_rt->rt_rate = 0;
|
||||
else
|
||||
else {
|
||||
if (stats->band == IEEE80211_BAND_5GHZ)
|
||||
rate += IWL_FIRST_OFDM_RATE;
|
||||
|
||||
iwl4965_rt->rt_rate = iwl4965_rates[rate].ieee;
|
||||
}
|
||||
|
||||
/*
|
||||
* "antenna number"
|
||||
|
@ -6687,7 +6687,8 @@ static int iwl3945_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
|
||||
if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) {
|
||||
IWL_DEBUG_MAC80211("leave - monitor\n");
|
||||
return -1;
|
||||
dev_kfree_skb_any(skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len,
|
||||
|
@ -6237,7 +6237,8 @@ static int iwl4965_mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
|
||||
if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) {
|
||||
IWL_DEBUG_MAC80211("leave - monitor\n");
|
||||
return -1;
|
||||
dev_kfree_skb_any(skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
IWL_DEBUG_TX("dev->xmit(%d bytes) at rate 0x%02x\n", skb->len,
|
||||
|
@ -925,6 +925,7 @@ static struct usb_driver if_usb_driver = {
|
||||
.id_table = if_usb_table,
|
||||
.suspend = if_usb_suspend,
|
||||
.resume = if_usb_resume,
|
||||
.reset_resume = if_usb_resume,
|
||||
};
|
||||
|
||||
static int __init if_usb_init_module(void)
|
||||
|
@ -204,7 +204,7 @@ int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page)
|
||||
* Note: assumes we have exclusive access to this mapping either
|
||||
* through inode->i_mutex or some other mechanism.
|
||||
*/
|
||||
if (page->index == 0 && invalidate_inode_pages2_range(inode->i_mapping, PAGE_CACHE_SIZE, -1) < 0) {
|
||||
if (invalidate_inode_pages2_range(inode->i_mapping, page->index + 1, -1) < 0) {
|
||||
/* Should never happen */
|
||||
nfs_zap_mapping(inode, inode->i_mapping);
|
||||
}
|
||||
|
@ -45,6 +45,8 @@ void reiserfs_delete_inode(struct inode *inode)
|
||||
goto out;
|
||||
reiserfs_update_inode_transaction(inode);
|
||||
|
||||
reiserfs_discard_prealloc(&th, inode);
|
||||
|
||||
err = reiserfs_delete_object(&th, inode);
|
||||
|
||||
/* Do quota update inside a transaction for journaled quotas. We must do that
|
||||
|
@ -49,12 +49,6 @@ static inline pte_t huge_pte_wrprotect(pte_t pte)
|
||||
return pte_wrprotect(pte);
|
||||
}
|
||||
|
||||
static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
|
||||
unsigned long addr, pte_t *ptep)
|
||||
{
|
||||
ptep_set_wrprotect(mm, addr, ptep);
|
||||
}
|
||||
|
||||
static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
|
||||
unsigned long addr, pte_t *ptep,
|
||||
pte_t pte, int dirty)
|
||||
|
@ -314,6 +314,16 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
|
||||
old = pte_update(mm, addr, ptep, _PAGE_RW, 0);
|
||||
}
|
||||
|
||||
static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
|
||||
unsigned long addr, pte_t *ptep)
|
||||
{
|
||||
unsigned long old;
|
||||
|
||||
if ((pte_val(*ptep) & _PAGE_RW) == 0)
|
||||
return;
|
||||
old = pte_update(mm, addr, ptep, _PAGE_RW, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* We currently remove entries from the hashtable regardless of whether
|
||||
* the entry was young or dirty. The generic routines only flush if the
|
||||
|
@ -223,6 +223,9 @@ extern char empty_zero_page[PAGE_SIZE];
|
||||
#define _PAGE_SPECIAL 0x004 /* SW associated with special page */
|
||||
#define __HAVE_ARCH_PTE_SPECIAL
|
||||
|
||||
/* Set of bits not changed in pte_modify */
|
||||
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_SPECIAL)
|
||||
|
||||
/* Six different types of pages. */
|
||||
#define _PAGE_TYPE_EMPTY 0x400
|
||||
#define _PAGE_TYPE_NONE 0x401
|
||||
@ -681,7 +684,7 @@ static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *pt
|
||||
*/
|
||||
static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
||||
{
|
||||
pte_val(pte) &= PAGE_MASK;
|
||||
pte_val(pte) &= _PAGE_CHG_MASK;
|
||||
pte_val(pte) |= pgprot_val(newprot);
|
||||
return pte;
|
||||
}
|
||||
|
@ -189,6 +189,21 @@ static inline void ide_std_init_ports(hw_regs_t *hw,
|
||||
hw->io_ports.ctl_addr = ctl_addr;
|
||||
}
|
||||
|
||||
/* for IDE PCI controllers in legacy mode, temporary */
|
||||
static inline int __ide_default_irq(unsigned long base)
|
||||
{
|
||||
switch (base) {
|
||||
#ifdef CONFIG_IA64
|
||||
case 0x1f0: return isa_irq_to_vector(14);
|
||||
case 0x170: return isa_irq_to_vector(15);
|
||||
#else
|
||||
case 0x1f0: return 14;
|
||||
case 0x170: return 15;
|
||||
#endif
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include <asm/ide.h>
|
||||
|
||||
#if !defined(MAX_HWIFS) || defined(CONFIG_EMBEDDED)
|
||||
|
128
lib/vsprintf.c
128
lib/vsprintf.c
@ -22,6 +22,8 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
#include <asm/page.h> /* for PAGE_SIZE */
|
||||
#include <asm/div64.h>
|
||||
@ -482,6 +484,89 @@ static char *number(char *buf, char *end, unsigned long long num, int base, int
|
||||
return buf;
|
||||
}
|
||||
|
||||
static char *string(char *buf, char *end, char *s, int field_width, int precision, int flags)
|
||||
{
|
||||
int len, i;
|
||||
|
||||
if ((unsigned long)s < PAGE_SIZE)
|
||||
s = "<NULL>";
|
||||
|
||||
len = strnlen(s, precision);
|
||||
|
||||
if (!(flags & LEFT)) {
|
||||
while (len < field_width--) {
|
||||
if (buf < end)
|
||||
*buf = ' ';
|
||||
++buf;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < len; ++i) {
|
||||
if (buf < end)
|
||||
*buf = *s;
|
||||
++buf; ++s;
|
||||
}
|
||||
while (len < field_width--) {
|
||||
if (buf < end)
|
||||
*buf = ' ';
|
||||
++buf;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
static inline void *dereference_function_descriptor(void *ptr)
|
||||
{
|
||||
#if defined(CONFIG_IA64) || defined(CONFIG_PPC64)
|
||||
void *p;
|
||||
if (!probe_kernel_address(ptr, p))
|
||||
ptr = p;
|
||||
#endif
|
||||
return ptr;
|
||||
}
|
||||
|
||||
static char *symbol_string(char *buf, char *end, void *ptr, int field_width, int precision, int flags)
|
||||
{
|
||||
unsigned long value = (unsigned long) ptr;
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
char sym[KSYM_SYMBOL_LEN];
|
||||
sprint_symbol(sym, value);
|
||||
return string(buf, end, sym, field_width, precision, flags);
|
||||
#else
|
||||
field_width = 2*sizeof(void *);
|
||||
flags |= SPECIAL | SMALL | ZEROPAD;
|
||||
return number(buf, end, value, 16, field_width, precision, flags);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Show a '%p' thing. A kernel extension is that the '%p' is followed
|
||||
* by an extra set of alphanumeric characters that are extended format
|
||||
* specifiers.
|
||||
*
|
||||
* Right now we just handle 'F' (for symbolic Function descriptor pointers)
|
||||
* and 'S' (for Symbolic direct pointers), but this can easily be
|
||||
* extended in the future (network address types etc).
|
||||
*
|
||||
* The difference between 'S' and 'F' is that on ia64 and ppc64 function
|
||||
* pointers are really function descriptors, which contain a pointer the
|
||||
* real address.
|
||||
*/
|
||||
static char *pointer(const char *fmt, char *buf, char *end, void *ptr, int field_width, int precision, int flags)
|
||||
{
|
||||
switch (*fmt) {
|
||||
case 'F':
|
||||
ptr = dereference_function_descriptor(ptr);
|
||||
/* Fallthrough */
|
||||
case 'S':
|
||||
return symbol_string(buf, end, ptr, field_width, precision, flags);
|
||||
}
|
||||
flags |= SMALL;
|
||||
if (field_width == -1) {
|
||||
field_width = 2*sizeof(void *);
|
||||
flags |= ZEROPAD;
|
||||
}
|
||||
return number(buf, end, (unsigned long) ptr, 16, field_width, precision, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* vsnprintf - Format a string and place it in a buffer
|
||||
* @buf: The buffer to place the result into
|
||||
@ -502,11 +587,9 @@ static char *number(char *buf, char *end, unsigned long long num, int base, int
|
||||
*/
|
||||
int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||
{
|
||||
int len;
|
||||
unsigned long long num;
|
||||
int i, base;
|
||||
int base;
|
||||
char *str, *end, c;
|
||||
const char *s;
|
||||
|
||||
int flags; /* flags to number() */
|
||||
|
||||
@ -622,43 +705,18 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
|
||||
continue;
|
||||
|
||||
case 's':
|
||||
s = va_arg(args, char *);
|
||||
if ((unsigned long)s < PAGE_SIZE)
|
||||
s = "<NULL>";
|
||||
|
||||
len = strnlen(s, precision);
|
||||
|
||||
if (!(flags & LEFT)) {
|
||||
while (len < field_width--) {
|
||||
if (str < end)
|
||||
*str = ' ';
|
||||
++str;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < len; ++i) {
|
||||
if (str < end)
|
||||
*str = *s;
|
||||
++str; ++s;
|
||||
}
|
||||
while (len < field_width--) {
|
||||
if (str < end)
|
||||
*str = ' ';
|
||||
++str;
|
||||
}
|
||||
str = string(str, end, va_arg(args, char *), field_width, precision, flags);
|
||||
continue;
|
||||
|
||||
case 'p':
|
||||
flags |= SMALL;
|
||||
if (field_width == -1) {
|
||||
field_width = 2*sizeof(void *);
|
||||
flags |= ZEROPAD;
|
||||
}
|
||||
str = number(str, end,
|
||||
(unsigned long) va_arg(args, void *),
|
||||
16, field_width, precision, flags);
|
||||
str = pointer(fmt+1, str, end,
|
||||
va_arg(args, void *),
|
||||
field_width, precision, flags);
|
||||
/* Skip all alphanumeric pointer suffixes */
|
||||
while (isalnum(fmt[1]))
|
||||
fmt++;
|
||||
continue;
|
||||
|
||||
|
||||
case 'n':
|
||||
/* FIXME:
|
||||
* What does C99 say about the overflow case here? */
|
||||
|
@ -442,12 +442,16 @@ int br_del_if(struct net_bridge *br, struct net_device *dev)
|
||||
|
||||
void __exit br_cleanup_bridges(void)
|
||||
{
|
||||
struct net_device *dev, *nxt;
|
||||
struct net_device *dev;
|
||||
|
||||
rtnl_lock();
|
||||
for_each_netdev_safe(&init_net, dev, nxt)
|
||||
if (dev->priv_flags & IFF_EBRIDGE)
|
||||
restart:
|
||||
for_each_netdev(&init_net, dev) {
|
||||
if (dev->priv_flags & IFF_EBRIDGE) {
|
||||
del_br(dev->priv);
|
||||
goto restart;
|
||||
}
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
}
|
||||
|
@ -205,12 +205,19 @@ static int can_create(struct net *net, struct socket *sock, int protocol)
|
||||
* -ENOBUFS on full driver queue (see net_xmit_errno())
|
||||
* -ENOMEM when local loopback failed at calling skb_clone()
|
||||
* -EPERM when trying to send on a non-CAN interface
|
||||
* -EINVAL when the skb->data does not contain a valid CAN frame
|
||||
*/
|
||||
int can_send(struct sk_buff *skb, int loop)
|
||||
{
|
||||
struct sk_buff *newskb = NULL;
|
||||
struct can_frame *cf = (struct can_frame *)skb->data;
|
||||
int err;
|
||||
|
||||
if (skb->len != sizeof(struct can_frame) || cf->can_dlc > 8) {
|
||||
kfree_skb(skb);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (skb->dev->type != ARPHRD_CAN) {
|
||||
kfree_skb(skb);
|
||||
return -EPERM;
|
||||
@ -605,6 +612,7 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
struct packet_type *pt, struct net_device *orig_dev)
|
||||
{
|
||||
struct dev_rcv_lists *d;
|
||||
struct can_frame *cf = (struct can_frame *)skb->data;
|
||||
int matches;
|
||||
|
||||
if (dev->type != ARPHRD_CAN || dev_net(dev) != &init_net) {
|
||||
@ -612,6 +620,8 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
BUG_ON(skb->len != sizeof(struct can_frame) || cf->can_dlc > 8);
|
||||
|
||||
/* update statistics */
|
||||
can_stats.rx_frames++;
|
||||
can_stats.rx_frames_delta++;
|
||||
|
@ -298,7 +298,7 @@ static void bcm_send_to_user(struct bcm_op *op, struct bcm_msg_head *head,
|
||||
|
||||
if (head->nframes) {
|
||||
/* can_frames starting here */
|
||||
firstframe = (struct can_frame *) skb_tail_pointer(skb);
|
||||
firstframe = (struct can_frame *)skb_tail_pointer(skb);
|
||||
|
||||
memcpy(skb_put(skb, datalen), frames, datalen);
|
||||
|
||||
@ -826,6 +826,10 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
|
||||
for (i = 0; i < msg_head->nframes; i++) {
|
||||
err = memcpy_fromiovec((u8 *)&op->frames[i],
|
||||
msg->msg_iov, CFSIZ);
|
||||
|
||||
if (op->frames[i].can_dlc > 8)
|
||||
err = -EINVAL;
|
||||
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
@ -858,6 +862,10 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
|
||||
for (i = 0; i < msg_head->nframes; i++) {
|
||||
err = memcpy_fromiovec((u8 *)&op->frames[i],
|
||||
msg->msg_iov, CFSIZ);
|
||||
|
||||
if (op->frames[i].can_dlc > 8)
|
||||
err = -EINVAL;
|
||||
|
||||
if (err < 0) {
|
||||
if (op->frames != &op->sframe)
|
||||
kfree(op->frames);
|
||||
@ -1164,9 +1172,12 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk)
|
||||
|
||||
skb->dev = dev;
|
||||
skb->sk = sk;
|
||||
can_send(skb, 1); /* send with loopback */
|
||||
err = can_send(skb, 1); /* send with loopback */
|
||||
dev_put(dev);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return CFSIZ + MHSIZ;
|
||||
}
|
||||
|
||||
@ -1185,6 +1196,10 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock,
|
||||
if (!bo->bound)
|
||||
return -ENOTCONN;
|
||||
|
||||
/* check for valid message length from userspace */
|
||||
if (size < MHSIZ || (size - MHSIZ) % CFSIZ)
|
||||
return -EINVAL;
|
||||
|
||||
/* check for alternative ifindex for this bcm_op */
|
||||
|
||||
if (!ifindex && msg->msg_name) {
|
||||
@ -1259,8 +1274,8 @@ static int bcm_sendmsg(struct kiocb *iocb, struct socket *sock,
|
||||
break;
|
||||
|
||||
case TX_SEND:
|
||||
/* we need at least one can_frame */
|
||||
if (msg_head.nframes < 1)
|
||||
/* we need exactly one can_frame behind the msg head */
|
||||
if ((msg_head.nframes != 1) || (size != CFSIZ + MHSIZ))
|
||||
ret = -EINVAL;
|
||||
else
|
||||
ret = bcm_tx_send(msg, ifindex, sk);
|
||||
|
@ -632,6 +632,9 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
|
||||
} else
|
||||
ifindex = ro->ifindex;
|
||||
|
||||
if (size != sizeof(struct can_frame))
|
||||
return -EINVAL;
|
||||
|
||||
dev = dev_get_by_index(&init_net, ifindex);
|
||||
if (!dev)
|
||||
return -ENXIO;
|
||||
|
@ -255,6 +255,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/splice.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/socket.h>
|
||||
@ -1208,7 +1209,8 @@ int tcp_read_sock(struct sock *sk, read_descriptor_t *desc,
|
||||
return -ENOTCONN;
|
||||
while ((skb = tcp_recv_skb(sk, seq, &offset)) != NULL) {
|
||||
if (offset < skb->len) {
|
||||
size_t used, len;
|
||||
int used;
|
||||
size_t len;
|
||||
|
||||
len = skb->len - offset;
|
||||
/* Stop reading if we hit a patch of urgent data */
|
||||
|
@ -243,10 +243,10 @@ int rpcb_getport_sync(struct sockaddr_in *sin, u32 prog, u32 vers, int prot)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpcb_getport_sync);
|
||||
|
||||
static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbind_args *map, int version)
|
||||
static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbind_args *map, struct rpc_procinfo *proc)
|
||||
{
|
||||
struct rpc_message msg = {
|
||||
.rpc_proc = rpcb_next_version[version].rpc_proc,
|
||||
.rpc_proc = proc,
|
||||
.rpc_argp = map,
|
||||
.rpc_resp = &map->r_port,
|
||||
};
|
||||
@ -271,6 +271,7 @@ static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbi
|
||||
void rpcb_getport_async(struct rpc_task *task)
|
||||
{
|
||||
struct rpc_clnt *clnt = task->tk_client;
|
||||
struct rpc_procinfo *proc;
|
||||
u32 bind_version;
|
||||
struct rpc_xprt *xprt = task->tk_xprt;
|
||||
struct rpc_clnt *rpcb_clnt;
|
||||
@ -280,7 +281,6 @@ void rpcb_getport_async(struct rpc_task *task)
|
||||
struct sockaddr *sap = (struct sockaddr *)&addr;
|
||||
size_t salen;
|
||||
int status;
|
||||
struct rpcb_info *info;
|
||||
|
||||
dprintk("RPC: %5u %s(%s, %u, %u, %d)\n",
|
||||
task->tk_pid, __func__,
|
||||
@ -313,10 +313,12 @@ void rpcb_getport_async(struct rpc_task *task)
|
||||
/* Don't ever use rpcbind v2 for AF_INET6 requests */
|
||||
switch (sap->sa_family) {
|
||||
case AF_INET:
|
||||
info = rpcb_next_version;
|
||||
proc = rpcb_next_version[xprt->bind_index].rpc_proc;
|
||||
bind_version = rpcb_next_version[xprt->bind_index].rpc_vers;
|
||||
break;
|
||||
case AF_INET6:
|
||||
info = rpcb_next_version6;
|
||||
proc = rpcb_next_version6[xprt->bind_index].rpc_proc;
|
||||
bind_version = rpcb_next_version6[xprt->bind_index].rpc_vers;
|
||||
break;
|
||||
default:
|
||||
status = -EAFNOSUPPORT;
|
||||
@ -324,14 +326,13 @@ void rpcb_getport_async(struct rpc_task *task)
|
||||
task->tk_pid, __func__);
|
||||
goto bailout_nofree;
|
||||
}
|
||||
if (info[xprt->bind_index].rpc_proc == NULL) {
|
||||
if (proc == NULL) {
|
||||
xprt->bind_index = 0;
|
||||
status = -EPFNOSUPPORT;
|
||||
dprintk("RPC: %5u %s: no more getport versions available\n",
|
||||
task->tk_pid, __func__);
|
||||
goto bailout_nofree;
|
||||
}
|
||||
bind_version = info[xprt->bind_index].rpc_vers;
|
||||
|
||||
dprintk("RPC: %5u %s: trying rpcbind version %u\n",
|
||||
task->tk_pid, __func__, bind_version);
|
||||
@ -361,22 +362,20 @@ void rpcb_getport_async(struct rpc_task *task)
|
||||
map->r_addr = rpc_peeraddr2str(rpcb_clnt, RPC_DISPLAY_UNIVERSAL_ADDR);
|
||||
map->r_owner = RPCB_OWNER_STRING; /* ignored for GETADDR */
|
||||
|
||||
child = rpcb_call_async(rpcb_clnt, map, xprt->bind_index);
|
||||
child = rpcb_call_async(rpcb_clnt, map, proc);
|
||||
rpc_release_client(rpcb_clnt);
|
||||
if (IS_ERR(child)) {
|
||||
status = -EIO;
|
||||
/* rpcb_map_release() has freed the arguments */
|
||||
dprintk("RPC: %5u %s: rpc_run_task failed\n",
|
||||
task->tk_pid, __func__);
|
||||
goto bailout;
|
||||
goto bailout_nofree;
|
||||
}
|
||||
rpc_put_task(child);
|
||||
|
||||
task->tk_xprt->stat.bind_count++;
|
||||
return;
|
||||
|
||||
bailout:
|
||||
kfree(map);
|
||||
xprt_put(xprt);
|
||||
bailout_nofree:
|
||||
rpcb_wake_rpcbind_waiters(xprt, status);
|
||||
bailout_nowake:
|
||||
|
Loading…
x
Reference in New Issue
Block a user