Merge branch 'x86/debug' into x86/irq
We merge this branch because x86/debug touches code that we started cleaning up in x86/irq. The two branches started out independent, but as unexpected amount of activity went into x86/irq, they became dependent. Resolve that by this cross-merge.
This commit is contained in:
commit
3bdae4f464
|
@ -294,7 +294,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
Possible values are:
|
||||
isolate - enable device isolation (each device, as far
|
||||
as possible, will get its own protection
|
||||
domain)
|
||||
domain) [default]
|
||||
share - put every device behind one IOMMU into the
|
||||
same protection domain
|
||||
fullflush - enable flushing of IO/TLB entries when
|
||||
they are unmapped. Otherwise they are
|
||||
flushed before they will be reused, which
|
||||
|
@ -1193,8 +1195,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
it is equivalent to "nosmp", which also disables
|
||||
the IO APIC.
|
||||
|
||||
max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or
|
||||
equal to this physical address is ignored.
|
||||
max_addr=nn[KMG] [KNL,BOOT,ia64] All physical memory greater than
|
||||
or equal to this physical address is ignored.
|
||||
|
||||
max_luns= [SCSI] Maximum number of LUNs to probe.
|
||||
Should be between 1 and 2^32-1.
|
||||
|
@ -1294,6 +1296,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
mga= [HW,DRM]
|
||||
|
||||
min_addr=nn[KMG] [KNL,BOOT,ia64] All physical memory below this
|
||||
physical address is ignored.
|
||||
|
||||
mminit_loglevel=
|
||||
[KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this
|
||||
parameter allows control of the logging verbosity for
|
||||
|
|
|
@ -96,7 +96,7 @@ Letting the PHY Abstraction Layer do Everything
|
|||
static void adjust_link(struct net_device *dev);
|
||||
|
||||
Next, you need to know the device name of the PHY connected to this device.
|
||||
The name will look something like, "phy0:0", where the first number is the
|
||||
The name will look something like, "0:00", where the first number is the
|
||||
bus id, and the second is the PHY's address on that bus. Typically,
|
||||
the bus is responsible for making its ID unique.
|
||||
|
||||
|
|
|
@ -1809,7 +1809,7 @@ S: Maintained
|
|||
|
||||
FTRACE
|
||||
P: Steven Rostedt
|
||||
M: srostedt@redhat.com
|
||||
M: rostedt@goodmis.org
|
||||
S: Maintained
|
||||
|
||||
FUJITSU FR-V (FRV) PORT
|
||||
|
@ -3928,8 +3928,6 @@ M: bootc@bootc.net
|
|||
S: Maintained
|
||||
|
||||
SOFTWARE RAID (Multiple Disks) SUPPORT
|
||||
P: Ingo Molnar
|
||||
M: mingo@redhat.com
|
||||
P: Neil Brown
|
||||
M: neilb@suse.de
|
||||
L: linux-raid@vger.kernel.org
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 28
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Killer Bat of Doom
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -101,7 +101,7 @@ extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */
|
|||
extern unsigned long _ramstart, _ramend, _rambase;
|
||||
extern unsigned long memory_start, memory_end, physical_mem_end;
|
||||
extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[],
|
||||
_ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _ebss_b_l1[],
|
||||
_ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _sbss_b_l1[], _ebss_b_l1[],
|
||||
_stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[],
|
||||
_ebss_l2[], _l2_lma_start[];
|
||||
|
||||
|
|
|
@ -15,7 +15,11 @@ void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
|
|||
#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
|
||||
#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
|
||||
|
||||
#define dma_mapping_error
|
||||
static inline
|
||||
int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Map a single buffer of the indicated size for DMA in streaming mode.
|
||||
|
|
|
@ -218,7 +218,7 @@ inline int check_gpio(unsigned gpio)
|
|||
if (gpio == GPIO_PB15 || gpio == GPIO_PC14 || gpio == GPIO_PC15
|
||||
|| gpio == GPIO_PH14 || gpio == GPIO_PH15
|
||||
|| gpio == GPIO_PJ14 || gpio == GPIO_PJ15
|
||||
|| gpio > MAX_BLACKFIN_GPIOS)
|
||||
|| gpio >= MAX_BLACKFIN_GPIOS)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -188,10 +188,11 @@ static struct cplb_desc cplb_data[] = {
|
|||
|
||||
static u16 __init lock_kernel_check(u32 start, u32 end)
|
||||
{
|
||||
if ((end <= (u32) _end && end >= (u32)_stext) ||
|
||||
(start <= (u32) _end && start >= (u32)_stext))
|
||||
return IN_KERNEL;
|
||||
return 0;
|
||||
if (start >= (u32)_end || end <= (u32)_stext)
|
||||
return 0;
|
||||
|
||||
/* This cplb block overlapped with kernel area. */
|
||||
return IN_KERNEL;
|
||||
}
|
||||
|
||||
static unsigned short __init
|
||||
|
|
|
@ -351,9 +351,14 @@ int _access_ok(unsigned long addr, unsigned long size)
|
|||
return 1;
|
||||
#endif
|
||||
#if L1_DATA_B_LENGTH != 0
|
||||
if (addr >= L1_DATA_B_START
|
||||
if (addr >= L1_DATA_B_START + (_ebss_b_l1 - _sdata_b_l1)
|
||||
&& addr + size <= L1_DATA_B_START + L1_DATA_B_LENGTH)
|
||||
return 1;
|
||||
#endif
|
||||
#if L2_LENGTH != 0
|
||||
if (addr >= L2_START + (_ebss_l2 - _stext_l2)
|
||||
&& addr + size <= L2_START + L2_LENGTH)
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -119,23 +119,23 @@ void __init bfin_relocate_l1_mem(void)
|
|||
/* Copy _stext_l1 to _etext_l1 to L1 instruction SRAM */
|
||||
dma_memcpy(_stext_l1, _l1_lma_start, l1_code_length);
|
||||
|
||||
l1_data_a_length = _ebss_l1 - _sdata_l1;
|
||||
l1_data_a_length = _sbss_l1 - _sdata_l1;
|
||||
if (l1_data_a_length > L1_DATA_A_LENGTH)
|
||||
panic("L1 Data SRAM Bank A Overflow\n");
|
||||
|
||||
/* Copy _sdata_l1 to _ebss_l1 to L1 data bank A SRAM */
|
||||
/* Copy _sdata_l1 to _sbss_l1 to L1 data bank A SRAM */
|
||||
dma_memcpy(_sdata_l1, _l1_lma_start + l1_code_length, l1_data_a_length);
|
||||
|
||||
l1_data_b_length = _ebss_b_l1 - _sdata_b_l1;
|
||||
l1_data_b_length = _sbss_b_l1 - _sdata_b_l1;
|
||||
if (l1_data_b_length > L1_DATA_B_LENGTH)
|
||||
panic("L1 Data SRAM Bank B Overflow\n");
|
||||
|
||||
/* Copy _sdata_b_l1 to _ebss_b_l1 to L1 data bank B SRAM */
|
||||
/* Copy _sdata_b_l1 to _sbss_b_l1 to L1 data bank B SRAM */
|
||||
dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length +
|
||||
l1_data_a_length, l1_data_b_length);
|
||||
|
||||
if (L2_LENGTH != 0) {
|
||||
l2_length = _ebss_l2 - _stext_l2;
|
||||
l2_length = _sbss_l2 - _stext_l2;
|
||||
if (l2_length > L2_LENGTH)
|
||||
panic("L2 SRAM Overflow\n");
|
||||
|
||||
|
@ -827,7 +827,7 @@ void __init setup_arch(char **cmdline_p)
|
|||
printk(KERN_ERR "Warning: Compiled for Rev %d, but running on Rev %d\n",
|
||||
bfin_compiled_revid(), bfin_revid());
|
||||
}
|
||||
if (bfin_revid() <= CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX)
|
||||
if (bfin_revid() < CONFIG_BF_REV_MIN || bfin_revid() > CONFIG_BF_REV_MAX)
|
||||
printk(KERN_ERR "Warning: Unsupported Chip Revision ADSP-%s Rev 0.%d detected\n",
|
||||
CPU, bfin_revid());
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_VERBOSE_DEBUG
|
||||
#ifdef CONFIG_DEBUG_VERBOSE
|
||||
#define verbose_printk(fmt, arg...) \
|
||||
printk(fmt, ##arg)
|
||||
#else
|
||||
|
@ -147,9 +147,12 @@ static void decode_address(char *buf, unsigned long address)
|
|||
char *name = p->comm;
|
||||
struct file *file = vma->vm_file;
|
||||
|
||||
if (file)
|
||||
name = d_path(&file->f_path, _tmpbuf,
|
||||
if (file) {
|
||||
char *d_name = d_path(&file->f_path, _tmpbuf,
|
||||
sizeof(_tmpbuf));
|
||||
if (!IS_ERR(d_name))
|
||||
name = d_name;
|
||||
}
|
||||
|
||||
/* FLAT does not have its text aligned to the start of
|
||||
* the map while FDPIC ELF does ...
|
||||
|
@ -571,7 +574,7 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
|||
#endif
|
||||
panic("Kernel exception");
|
||||
} else {
|
||||
#ifdef CONFIG_VERBOSE_DEBUG
|
||||
#ifdef CONFIG_DEBUG_VERBOSE
|
||||
unsigned long *stack;
|
||||
/* Dump the user space stack */
|
||||
stack = (unsigned long *)rdusp();
|
||||
|
|
|
@ -25,9 +25,13 @@
|
|||
*/
|
||||
.macro do_flush flushins:req optflushins optnopins label
|
||||
|
||||
R2 = -L1_CACHE_BYTES;
|
||||
|
||||
/* start = (start & -L1_CACHE_BYTES) */
|
||||
R0 = R0 & R2;
|
||||
|
||||
/* end = ((end - 1) & -L1_CACHE_BYTES) + L1_CACHE_BYTES; */
|
||||
R1 += -1;
|
||||
R2 = -L1_CACHE_BYTES;
|
||||
R1 = R1 & R2;
|
||||
R1 += L1_CACHE_BYTES;
|
||||
|
||||
|
@ -63,7 +67,7 @@ ENDPROC(_blackfin_icache_flush_range)
|
|||
|
||||
/* Flush all cache lines assocoiated with this area of memory. */
|
||||
ENTRY(_blackfin_icache_dcache_flush_range)
|
||||
do_flush IFLUSH, FLUSH
|
||||
do_flush FLUSH, IFLUSH
|
||||
ENDPROC(_blackfin_icache_dcache_flush_range)
|
||||
|
||||
/* Throw away all D-cached data in specified region without any obligation to
|
||||
|
|
|
@ -72,13 +72,13 @@ unsigned int __bfin_cycles_mod;
|
|||
|
||||
/**************************************************************************/
|
||||
|
||||
static unsigned int bfin_getfreq(unsigned int cpu)
|
||||
static unsigned int bfin_getfreq_khz(unsigned int cpu)
|
||||
{
|
||||
/* The driver only support single cpu */
|
||||
if (cpu != 0)
|
||||
return -1;
|
||||
|
||||
return get_cclk();
|
||||
return get_cclk() / 1000;
|
||||
}
|
||||
|
||||
|
||||
|
@ -96,7 +96,7 @@ static int bfin_target(struct cpufreq_policy *policy,
|
|||
|
||||
cclk_hz = bfin_freq_table[index].frequency;
|
||||
|
||||
freqs.old = bfin_getfreq(0);
|
||||
freqs.old = bfin_getfreq_khz(0);
|
||||
freqs.new = cclk_hz;
|
||||
freqs.cpu = 0;
|
||||
|
||||
|
@ -137,8 +137,8 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy)
|
|||
if (policy->cpu != 0)
|
||||
return -EINVAL;
|
||||
|
||||
cclk = get_cclk();
|
||||
sclk = get_sclk();
|
||||
cclk = get_cclk() / 1000;
|
||||
sclk = get_sclk() / 1000;
|
||||
|
||||
#if ANOMALY_05000273 || (!defined(CONFIG_BF54x) && defined(CONFIG_BFIN_DCACHE))
|
||||
min_cclk = sclk * 2;
|
||||
|
@ -152,7 +152,7 @@ static int __init __bfin_cpu_init(struct cpufreq_policy *policy)
|
|||
dpm_state_table[index].csel = csel << 4; /* Shift now into PLL_DIV bitpos */
|
||||
dpm_state_table[index].tscale = (TIME_SCALE / (1 << csel)) - 1;
|
||||
|
||||
pr_debug("cpufreq: freq:%d csel:%d tscale:%d\n",
|
||||
pr_debug("cpufreq: freq:%d csel:0x%x tscale:%d\n",
|
||||
bfin_freq_table[index].frequency,
|
||||
dpm_state_table[index].csel,
|
||||
dpm_state_table[index].tscale);
|
||||
|
@ -173,7 +173,7 @@ static struct freq_attr *bfin_freq_attr[] = {
|
|||
static struct cpufreq_driver bfin_driver = {
|
||||
.verify = bfin_verify_speed,
|
||||
.target = bfin_target,
|
||||
.get = bfin_getfreq,
|
||||
.get = bfin_getfreq_khz,
|
||||
.init = __bfin_cpu_init,
|
||||
.name = "bfin cpufreq",
|
||||
.owner = THIS_MODULE,
|
||||
|
|
|
@ -277,7 +277,7 @@ ENTRY(_bfin_return_from_exception)
|
|||
p5.h = hi(ILAT);
|
||||
r6 = [p5];
|
||||
r7 = 0x20; /* Did I just cause anther HW error? */
|
||||
r7 = r7 & r1;
|
||||
r6 = r7 & r6;
|
||||
CC = R7 == R6;
|
||||
if CC JUMP _double_fault;
|
||||
#endif
|
||||
|
|
|
@ -183,10 +183,10 @@ static void __init l2_sram_init(void)
|
|||
return;
|
||||
}
|
||||
|
||||
free_l2_sram_head.next->paddr = (void *)L2_START +
|
||||
(_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2);
|
||||
free_l2_sram_head.next->size = L2_LENGTH -
|
||||
(_etext_l2 - _stext_l2) + (_edata_l2 - _sdata_l2);
|
||||
free_l2_sram_head.next->paddr =
|
||||
(void *)L2_START + (_ebss_l2 - _stext_l2);
|
||||
free_l2_sram_head.next->size =
|
||||
L2_LENGTH - (_ebss_l2 - _stext_l2);
|
||||
free_l2_sram_head.next->pid = 0;
|
||||
free_l2_sram_head.next->next = NULL;
|
||||
|
||||
|
|
|
@ -226,7 +226,7 @@ extern long ia64_cmpxchg_called_with_bad_pointer (void);
|
|||
/************************************************/
|
||||
#define ia64_ssm IA64_INTRINSIC_MACRO(ssm)
|
||||
#define ia64_rsm IA64_INTRINSIC_MACRO(rsm)
|
||||
#define ia64_getreg IA64_INTRINSIC_API(getreg)
|
||||
#define ia64_getreg IA64_INTRINSIC_MACRO(getreg)
|
||||
#define ia64_setreg IA64_INTRINSIC_API(setreg)
|
||||
#define ia64_set_rr IA64_INTRINSIC_API(set_rr)
|
||||
#define ia64_get_rr IA64_INTRINSIC_API(get_rr)
|
||||
|
|
|
@ -78,6 +78,19 @@ extern unsigned long ia64_native_getreg_func(int regnum);
|
|||
ia64_native_rsm(mask); \
|
||||
} while (0)
|
||||
|
||||
/* returned ip value should be the one in the caller,
|
||||
* not in __paravirt_getreg() */
|
||||
#define paravirt_getreg(reg) \
|
||||
({ \
|
||||
unsigned long res; \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(reg)); \
|
||||
if ((reg) == _IA64_REG_IP) \
|
||||
res = ia64_native_getreg(_IA64_REG_IP); \
|
||||
else \
|
||||
res = pv_cpu_ops.getreg(reg); \
|
||||
res; \
|
||||
})
|
||||
|
||||
/******************************************************************************
|
||||
* replacement of hand written assembly codes.
|
||||
*/
|
||||
|
|
|
@ -499,6 +499,7 @@ GLOBAL_ENTRY(prefetch_stack)
|
|||
END(prefetch_stack)
|
||||
|
||||
GLOBAL_ENTRY(kernel_execve)
|
||||
rum psr.ac
|
||||
mov r15=__NR_execve // put syscall number in place
|
||||
break __BREAK_SYSCALL
|
||||
br.ret.sptk.many rp
|
||||
|
|
|
@ -260,7 +260,7 @@ start_ap:
|
|||
* Switch into virtual mode:
|
||||
*/
|
||||
movl r16=(IA64_PSR_IT|IA64_PSR_IC|IA64_PSR_DT|IA64_PSR_RT|IA64_PSR_DFH|IA64_PSR_BN \
|
||||
|IA64_PSR_DI)
|
||||
|IA64_PSR_DI|IA64_PSR_AC)
|
||||
;;
|
||||
mov cr.ipsr=r16
|
||||
movl r17=1f
|
||||
|
|
|
@ -1139,7 +1139,7 @@ ia64_mca_modify_original_stack(struct pt_regs *regs,
|
|||
return previous_current;
|
||||
|
||||
no_mod:
|
||||
printk(KERN_INFO "cpu %d, %s %s, original stack not modified\n",
|
||||
mprintk(KERN_INFO "cpu %d, %s %s, original stack not modified\n",
|
||||
smp_processor_id(), type, msg);
|
||||
return previous_current;
|
||||
}
|
||||
|
|
|
@ -130,7 +130,7 @@ ia64_native_getreg_func(int regnum)
|
|||
unsigned long res = -1;
|
||||
switch (regnum) {
|
||||
CASE_GET_REG(GP);
|
||||
CASE_GET_REG(IP);
|
||||
/*CASE_GET_REG(IP);*/ /* returned ip value shouldn't be constant */
|
||||
CASE_GET_REG(PSR);
|
||||
CASE_GET_REG(TP);
|
||||
CASE_GET_REG(SP);
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/page.h>
|
||||
#include <asm/iommu.h>
|
||||
|
||||
dma_addr_t bad_dma_address __read_mostly;
|
||||
EXPORT_SYMBOL(bad_dma_address);
|
||||
|
|
|
@ -58,7 +58,7 @@ __HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR)
|
|||
__HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR)
|
||||
|
||||
#ifdef CONFIG_IA32_SUPPORT
|
||||
__HCALL1(xen_get_eflag, HYPERPRIVOP_GET_EFLAG)
|
||||
__HCALL0(xen_get_eflag, HYPERPRIVOP_GET_EFLAG)
|
||||
__HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8
|
||||
#endif /* CONFIG_IA32_SUPPORT */
|
||||
|
||||
|
|
|
@ -84,5 +84,7 @@ extern void set_434_reg(unsigned reg_offs, unsigned bit, unsigned len, unsigned
|
|||
extern unsigned get_434_reg(unsigned reg_offs);
|
||||
extern void set_latch_u5(unsigned char or_mask, unsigned char nand_mask);
|
||||
extern unsigned char get_latch_u5(void);
|
||||
extern void rb532_gpio_set_ilevel(int bit, unsigned gpio);
|
||||
extern void rb532_gpio_set_istat(int bit, unsigned gpio);
|
||||
|
||||
#endif /* _RC32434_GPIO_H_ */
|
||||
|
|
|
@ -40,12 +40,14 @@
|
|||
#define BTCS 0x010040
|
||||
#define BTCOMPARE 0x010044
|
||||
#define GPIOBASE 0x050000
|
||||
#define GPIOCFG 0x050004
|
||||
#define GPIOD 0x050008
|
||||
#define GPIOILEVEL 0x05000C
|
||||
#define GPIOISTAT 0x050010
|
||||
#define GPIONMIEN 0x050014
|
||||
#define IMASK6 0x038038
|
||||
/* Offsets relative to GPIOBASE */
|
||||
#define GPIOFUNC 0x00
|
||||
#define GPIOCFG 0x04
|
||||
#define GPIOD 0x08
|
||||
#define GPIOILEVEL 0x0C
|
||||
#define GPIOISTAT 0x10
|
||||
#define GPIONMIEN 0x14
|
||||
#define IMASK6 0x38
|
||||
#define LO_WPX (1 << 0)
|
||||
#define LO_ALE (1 << 1)
|
||||
#define LO_CLE (1 << 2)
|
||||
|
|
|
@ -63,7 +63,7 @@ static inline int mips_clockevent_init(void)
|
|||
/*
|
||||
* Initialize the count register as a clocksource
|
||||
*/
|
||||
#ifdef CONFIG_CEVT_R4K
|
||||
#ifdef CONFIG_CSRC_R4K
|
||||
extern int init_mips_clocksource(void);
|
||||
#else
|
||||
static inline int init_mips_clocksource(void)
|
||||
|
|
|
@ -27,7 +27,7 @@ int __init init_mips_clocksource(void)
|
|||
if (!cpu_has_counter || !mips_hpt_frequency)
|
||||
return -ENXIO;
|
||||
|
||||
/* Calclate a somewhat reasonable rating value */
|
||||
/* Calculate a somewhat reasonable rating value */
|
||||
clocksource_mips.rating = 200 + mips_hpt_frequency / 10000000;
|
||||
|
||||
clocksource_set_clock(&clocksource_mips, mips_hpt_frequency);
|
||||
|
|
|
@ -161,7 +161,7 @@ static inline int __init indy_sc_probe(void)
|
|||
|
||||
/* XXX Check with wje if the Indy caches can differenciate between
|
||||
writeback + invalidate and just invalidate. */
|
||||
struct bcache_ops indy_sc_ops = {
|
||||
static struct bcache_ops indy_sc_ops = {
|
||||
.bc_enable = indy_sc_enable,
|
||||
.bc_disable = indy_sc_disable,
|
||||
.bc_wback_inv = indy_sc_wback_invalidate,
|
||||
|
|
|
@ -22,9 +22,9 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
#include <asm-mips/addrspace.h>
|
||||
#include <asm-mips/mips-boards/launch.h>
|
||||
#include <asm-mips/mipsmtregs.h>
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/mips-boards/launch.h>
|
||||
#include <asm/mipsmtregs.h>
|
||||
|
||||
int amon_cpu_avail(int cpu)
|
||||
{
|
||||
|
|
|
@ -118,7 +118,7 @@ static struct platform_device cf_slot0 = {
|
|||
/* Resources and device for NAND */
|
||||
static int rb532_dev_ready(struct mtd_info *mtd)
|
||||
{
|
||||
return readl(IDT434_REG_BASE + GPIOD) & GPIO_RDY;
|
||||
return gpio_get_value(GPIO_RDY);
|
||||
}
|
||||
|
||||
static void rb532_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
|
||||
|
|
|
@ -39,10 +39,6 @@
|
|||
struct rb532_gpio_chip {
|
||||
struct gpio_chip chip;
|
||||
void __iomem *regbase;
|
||||
void (*set_int_level)(struct gpio_chip *chip, unsigned offset, int value);
|
||||
int (*get_int_level)(struct gpio_chip *chip, unsigned offset);
|
||||
void (*set_int_status)(struct gpio_chip *chip, unsigned offset, int value);
|
||||
int (*get_int_status)(struct gpio_chip *chip, unsigned offset);
|
||||
};
|
||||
|
||||
struct mpmc_device dev3;
|
||||
|
@ -111,15 +107,47 @@ unsigned char get_latch_u5(void)
|
|||
}
|
||||
EXPORT_SYMBOL(get_latch_u5);
|
||||
|
||||
/* rb532_set_bit - sanely set a bit
|
||||
*
|
||||
* bitval: new value for the bit
|
||||
* offset: bit index in the 4 byte address range
|
||||
* ioaddr: 4 byte aligned address being altered
|
||||
*/
|
||||
static inline void rb532_set_bit(unsigned bitval,
|
||||
unsigned offset, void __iomem *ioaddr)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
bitval = !!bitval; /* map parameter to {0,1} */
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
val = readl(ioaddr);
|
||||
val &= ~( ~bitval << offset ); /* unset bit if bitval == 0 */
|
||||
val |= ( bitval << offset ); /* set bit if bitval == 1 */
|
||||
writel(val, ioaddr);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
/* rb532_get_bit - read a bit
|
||||
*
|
||||
* returns the boolean state of the bit, which may be > 1
|
||||
*/
|
||||
static inline int rb532_get_bit(unsigned offset, void __iomem *ioaddr)
|
||||
{
|
||||
return (readl(ioaddr) & (1 << offset));
|
||||
}
|
||||
|
||||
/*
|
||||
* Return GPIO level */
|
||||
static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
struct rb532_gpio_chip *gpch;
|
||||
|
||||
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
||||
return readl(gpch->regbase + GPIOD) & mask;
|
||||
return rb532_get_bit(offset, gpch->regbase + GPIOD);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -128,23 +156,10 @@ static int rb532_gpio_get(struct gpio_chip *chip, unsigned offset)
|
|||
static void rb532_gpio_set(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 mask = 1 << offset;
|
||||
u32 tmp;
|
||||
struct rb532_gpio_chip *gpch;
|
||||
void __iomem *gpvr;
|
||||
|
||||
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
||||
gpvr = gpch->regbase + GPIOD;
|
||||
|
||||
local_irq_save(flags);
|
||||
tmp = readl(gpvr);
|
||||
if (value)
|
||||
tmp |= mask;
|
||||
else
|
||||
tmp &= ~mask;
|
||||
writel(tmp, gpvr);
|
||||
local_irq_restore(flags);
|
||||
rb532_set_bit(value, offset, gpch->regbase + GPIOD);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -152,21 +167,14 @@ static void rb532_gpio_set(struct gpio_chip *chip,
|
|||
*/
|
||||
static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 mask = 1 << offset;
|
||||
u32 value;
|
||||
struct rb532_gpio_chip *gpch;
|
||||
void __iomem *gpdr;
|
||||
|
||||
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
||||
gpdr = gpch->regbase + GPIOCFG;
|
||||
|
||||
local_irq_save(flags);
|
||||
value = readl(gpdr);
|
||||
value &= ~mask;
|
||||
writel(value, gpdr);
|
||||
local_irq_restore(flags);
|
||||
if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC))
|
||||
return 1; /* alternate function, GPIOCFG is ignored */
|
||||
|
||||
rb532_set_bit(0, offset, gpch->regbase + GPIOCFG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -176,99 +184,20 @@ static int rb532_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
|
|||
static int rb532_gpio_direction_output(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 mask = 1 << offset;
|
||||
u32 tmp;
|
||||
struct rb532_gpio_chip *gpch;
|
||||
void __iomem *gpdr;
|
||||
|
||||
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
||||
writel(mask, gpch->regbase + GPIOD);
|
||||
gpdr = gpch->regbase + GPIOCFG;
|
||||
|
||||
local_irq_save(flags);
|
||||
tmp = readl(gpdr);
|
||||
tmp |= mask;
|
||||
writel(tmp, gpdr);
|
||||
local_irq_restore(flags);
|
||||
if (rb532_get_bit(offset, gpch->regbase + GPIOFUNC))
|
||||
return 1; /* alternate function, GPIOCFG is ignored */
|
||||
|
||||
/* set the initial output value */
|
||||
rb532_set_bit(value, offset, gpch->regbase + GPIOD);
|
||||
|
||||
rb532_set_bit(1, offset, gpch->regbase + GPIOCFG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the GPIO interrupt level
|
||||
*/
|
||||
static void rb532_gpio_set_int_level(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 mask = 1 << offset;
|
||||
u32 tmp;
|
||||
struct rb532_gpio_chip *gpch;
|
||||
void __iomem *gpil;
|
||||
|
||||
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
||||
gpil = gpch->regbase + GPIOILEVEL;
|
||||
|
||||
local_irq_save(flags);
|
||||
tmp = readl(gpil);
|
||||
if (value)
|
||||
tmp |= mask;
|
||||
else
|
||||
tmp &= ~mask;
|
||||
writel(tmp, gpil);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the GPIO interrupt level
|
||||
*/
|
||||
static int rb532_gpio_get_int_level(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
struct rb532_gpio_chip *gpch;
|
||||
|
||||
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
||||
return readl(gpch->regbase + GPIOILEVEL) & mask;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the GPIO interrupt status
|
||||
*/
|
||||
static void rb532_gpio_set_int_status(struct gpio_chip *chip,
|
||||
unsigned offset, int value)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 mask = 1 << offset;
|
||||
u32 tmp;
|
||||
struct rb532_gpio_chip *gpch;
|
||||
void __iomem *gpis;
|
||||
|
||||
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
||||
gpis = gpch->regbase + GPIOISTAT;
|
||||
|
||||
local_irq_save(flags);
|
||||
tmp = readl(gpis);
|
||||
if (value)
|
||||
tmp |= mask;
|
||||
else
|
||||
tmp &= ~mask;
|
||||
writel(tmp, gpis);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the GPIO interrupt status
|
||||
*/
|
||||
static int rb532_gpio_get_int_status(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
u32 mask = 1 << offset;
|
||||
struct rb532_gpio_chip *gpch;
|
||||
|
||||
gpch = container_of(chip, struct rb532_gpio_chip, chip);
|
||||
return readl(gpch->regbase + GPIOISTAT) & mask;
|
||||
}
|
||||
|
||||
static struct rb532_gpio_chip rb532_gpio_chip[] = {
|
||||
[0] = {
|
||||
.chip = {
|
||||
|
@ -280,13 +209,35 @@ static struct rb532_gpio_chip rb532_gpio_chip[] = {
|
|||
.base = 0,
|
||||
.ngpio = 32,
|
||||
},
|
||||
.get_int_level = rb532_gpio_get_int_level,
|
||||
.set_int_level = rb532_gpio_set_int_level,
|
||||
.get_int_status = rb532_gpio_get_int_status,
|
||||
.set_int_status = rb532_gpio_set_int_status,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* Set GPIO interrupt level
|
||||
*/
|
||||
void rb532_gpio_set_ilevel(int bit, unsigned gpio)
|
||||
{
|
||||
rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOILEVEL);
|
||||
}
|
||||
EXPORT_SYMBOL(rb532_gpio_set_ilevel);
|
||||
|
||||
/*
|
||||
* Set GPIO interrupt status
|
||||
*/
|
||||
void rb532_gpio_set_istat(int bit, unsigned gpio)
|
||||
{
|
||||
rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOISTAT);
|
||||
}
|
||||
EXPORT_SYMBOL(rb532_gpio_set_istat);
|
||||
|
||||
/*
|
||||
* Configure GPIO alternate function
|
||||
*/
|
||||
static void rb532_gpio_set_func(int bit, unsigned gpio)
|
||||
{
|
||||
rb532_set_bit(bit, gpio, rb532_gpio_chip->regbase + GPIOFUNC);
|
||||
}
|
||||
|
||||
int __init rb532_gpio_init(void)
|
||||
{
|
||||
struct resource *r;
|
||||
|
@ -310,9 +261,11 @@ int __init rb532_gpio_init(void)
|
|||
return -ENXIO;
|
||||
}
|
||||
|
||||
/* Set the interrupt status and level for the CF pin */
|
||||
rb532_gpio_set_int_level(&rb532_gpio_chip->chip, CF_GPIO_NUM, 1);
|
||||
rb532_gpio_set_int_status(&rb532_gpio_chip->chip, CF_GPIO_NUM, 0);
|
||||
/* configure CF_GPIO_NUM as CFRDY IRQ source */
|
||||
rb532_gpio_set_func(0, CF_GPIO_NUM);
|
||||
rb532_gpio_direction_input(&rb532_gpio_chip->chip, CF_GPIO_NUM);
|
||||
rb532_gpio_set_ilevel(1, CF_GPIO_NUM);
|
||||
rb532_gpio_set_istat(0, CF_GPIO_NUM);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -183,10 +183,10 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||
* being 64 bit in both cases.
|
||||
*/
|
||||
|
||||
static long translate_usr_offset(long offset)
|
||||
static compat_ulong_t translate_usr_offset(compat_ulong_t offset)
|
||||
{
|
||||
if (offset < 0)
|
||||
return -1;
|
||||
return sizeof(struct pt_regs);
|
||||
else if (offset <= 32*4) /* gr[0..31] */
|
||||
return offset * 2 + 4;
|
||||
else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */
|
||||
|
@ -194,7 +194,7 @@ static long translate_usr_offset(long offset)
|
|||
else if (offset < sizeof(struct pt_regs)/2 + 32*4)
|
||||
return offset * 2 + 4 - 32*8;
|
||||
else
|
||||
return -1;
|
||||
return sizeof(struct pt_regs);
|
||||
}
|
||||
|
||||
long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
||||
|
@ -209,7 +209,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
|||
if (addr & (sizeof(compat_uint_t)-1))
|
||||
break;
|
||||
addr = translate_usr_offset(addr);
|
||||
if (addr < 0)
|
||||
if (addr >= sizeof(struct pt_regs))
|
||||
break;
|
||||
|
||||
tmp = *(compat_uint_t *) ((char *) task_regs(child) + addr);
|
||||
|
@ -236,7 +236,7 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
|||
if (addr & (sizeof(compat_uint_t)-1))
|
||||
break;
|
||||
addr = translate_usr_offset(addr);
|
||||
if (addr < 0)
|
||||
if (addr >= sizeof(struct pt_regs))
|
||||
break;
|
||||
if (addr >= PT_FR0 && addr <= PT_FR31 + 4) {
|
||||
/* Special case, fp regs are 64 bits anyway */
|
||||
|
|
|
@ -29,10 +29,11 @@ struct termios {
|
|||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_line; /* line discipline */
|
||||
#ifndef __KERNEL__
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
#ifdef __KERNEL__
|
||||
#else
|
||||
cc_t c_cc[NCCS+2]; /* kernel needs 2 more to hold vmin/vtime */
|
||||
#define SIZEOF_USER_TERMIOS sizeof (struct termios) - (2*sizeof (cc_t))
|
||||
cc_t _x_cc[2]; /* We need them to hold vmin/vtime */
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -42,8 +43,7 @@ struct termios2 {
|
|||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_line; /* line discipline */
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
cc_t _x_cc[2]; /* padding to match ktermios */
|
||||
cc_t c_cc[NCCS+2]; /* control characters */
|
||||
speed_t c_ispeed; /* input speed */
|
||||
speed_t c_ospeed; /* output speed */
|
||||
};
|
||||
|
@ -54,8 +54,7 @@ struct ktermios {
|
|||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_line; /* line discipline */
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
cc_t _x_cc[2]; /* We need them to hold vmin/vtime */
|
||||
cc_t c_cc[NCCS+2]; /* control characters */
|
||||
speed_t c_ispeed; /* input speed */
|
||||
speed_t c_ospeed; /* output speed */
|
||||
};
|
||||
|
|
|
@ -338,8 +338,9 @@
|
|||
#define __NR_dup3 320
|
||||
#define __NR_pipe2 321
|
||||
#define __NR_inotify_init1 322
|
||||
#define __NR_accept4 323
|
||||
|
||||
#define NR_SYSCALLS 323
|
||||
#define NR_SYSCALLS 324
|
||||
|
||||
/* Sparc 32-bit only has the "setresuid32", "getresuid32" variants,
|
||||
* it never had the plain ones and there is no value to adding those
|
||||
|
|
|
@ -340,8 +340,9 @@
|
|||
#define __NR_dup3 320
|
||||
#define __NR_pipe2 321
|
||||
#define __NR_inotify_init1 322
|
||||
#define __NR_accept4 323
|
||||
|
||||
#define NR_SYSCALLS 323
|
||||
#define NR_SYSCALLS 324
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
|
|
|
@ -563,9 +563,9 @@ build_resources:
|
|||
op->dev.parent = parent;
|
||||
op->dev.bus = &of_platform_bus_type;
|
||||
if (!parent)
|
||||
strcpy(op->dev.bus_id, "root");
|
||||
dev_set_name(&op->dev, "root");
|
||||
else
|
||||
sprintf(op->dev.bus_id, "%08x", dp->node);
|
||||
dev_set_name(&op->dev, "%08x", dp->node);
|
||||
|
||||
if (of_device_register(op)) {
|
||||
printk("%s: Could not register of device.\n",
|
||||
|
|
|
@ -81,4 +81,4 @@ sys_call_table:
|
|||
/*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait
|
||||
/*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate
|
||||
/*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1
|
||||
/*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1
|
||||
/*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4
|
||||
|
|
|
@ -150,7 +150,7 @@ sys32_mmap2:
|
|||
sys32_socketcall: /* %o0=call, %o1=args */
|
||||
cmp %o0, 1
|
||||
bl,pn %xcc, do_einval
|
||||
cmp %o0, 17
|
||||
cmp %o0, 18
|
||||
bg,pn %xcc, do_einval
|
||||
sub %o0, 1, %o0
|
||||
sllx %o0, 5, %o0
|
||||
|
@ -319,6 +319,15 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int)
|
|||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */
|
||||
63: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_accept4), %g1
|
||||
64: lduwa [%o1 + 0x8] %asi, %o2
|
||||
65: ldswa [%o1 + 0xc] %asi, %o3
|
||||
jmpl %g1 + %lo(sys_accept4), %g0
|
||||
66: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
|
||||
.section __ex_table,"a"
|
||||
.align 4
|
||||
|
@ -353,4 +362,6 @@ do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int)
|
|||
.word 57b, __retl_efault, 58b, __retl_efault
|
||||
.word 59b, __retl_efault, 60b, __retl_efault
|
||||
.word 61b, __retl_efault, 62b, __retl_efault
|
||||
.word 63b, __retl_efault, 64b, __retl_efault
|
||||
.word 65b, __retl_efault, 66b, __retl_efault
|
||||
.previous
|
||||
|
|
|
@ -82,7 +82,7 @@ sys_call_table32:
|
|||
.word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait
|
||||
/*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate
|
||||
.word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1
|
||||
/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1
|
||||
/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4
|
||||
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
|
@ -156,4 +156,4 @@ sys_call_table:
|
|||
.word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait
|
||||
/*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate
|
||||
.word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1
|
||||
/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1
|
||||
/*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4
|
||||
|
|
|
@ -952,7 +952,7 @@ config ARCH_PHYS_ADDR_T_64BIT
|
|||
config NUMA
|
||||
bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)"
|
||||
depends on SMP
|
||||
depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && BROKEN)
|
||||
depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL)
|
||||
default n if X86_PC
|
||||
default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP)
|
||||
help
|
||||
|
|
|
@ -34,10 +34,14 @@ static inline void get_memcfg_numa(void)
|
|||
|
||||
extern int early_pfn_to_nid(unsigned long pfn);
|
||||
|
||||
extern void resume_map_numa_kva(pgd_t *pgd);
|
||||
|
||||
#else /* !CONFIG_NUMA */
|
||||
|
||||
#define get_memcfg_numa get_memcfg_numa_flat
|
||||
|
||||
static inline void resume_map_numa_kva(pgd_t *pgd) {}
|
||||
|
||||
#endif /* CONFIG_NUMA */
|
||||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
|
|
|
@ -46,7 +46,7 @@ int __copy_from_user(void *dst, const void __user *src, unsigned size)
|
|||
return ret;
|
||||
case 10:
|
||||
__get_user_asm(*(u64 *)dst, (u64 __user *)src,
|
||||
ret, "q", "", "=r", 16);
|
||||
ret, "q", "", "=r", 10);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
__get_user_asm(*(u16 *)(8 + (char *)dst),
|
||||
|
|
|
@ -639,8 +639,8 @@ __SYSCALL(__NR_fallocate, sys_fallocate)
|
|||
__SYSCALL(__NR_timerfd_settime, sys_timerfd_settime)
|
||||
#define __NR_timerfd_gettime 287
|
||||
__SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime)
|
||||
#define __NR_paccept 288
|
||||
__SYSCALL(__NR_paccept, sys_paccept)
|
||||
#define __NR_accept4 288
|
||||
__SYSCALL(__NR_accept4, sys_accept4)
|
||||
#define __NR_signalfd4 289
|
||||
__SYSCALL(__NR_signalfd4, sys_signalfd4)
|
||||
#define __NR_eventfd2 290
|
||||
|
|
|
@ -12,6 +12,7 @@ CFLAGS_REMOVE_tsc.o = -pg
|
|||
CFLAGS_REMOVE_rtc.o = -pg
|
||||
CFLAGS_REMOVE_paravirt-spinlocks.o = -pg
|
||||
CFLAGS_REMOVE_ftrace.o = -pg
|
||||
CFLAGS_REMOVE_early_printk.o = -pg
|
||||
endif
|
||||
|
||||
#
|
||||
|
|
|
@ -537,7 +537,7 @@ static void dma_ops_free_addresses(struct dma_ops_domain *dom,
|
|||
address >>= PAGE_SHIFT;
|
||||
iommu_area_free(dom->bitmap, address, pages);
|
||||
|
||||
if (address + pages >= dom->next_bit)
|
||||
if (address >= dom->next_bit)
|
||||
dom->need_flush = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -121,7 +121,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have
|
|||
LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings
|
||||
we find in ACPI */
|
||||
unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */
|
||||
int amd_iommu_isolate; /* if 1, device isolation is enabled */
|
||||
int amd_iommu_isolate = 1; /* if 1, device isolation is enabled */
|
||||
bool amd_iommu_unmap_flush; /* if true, flush on every unmap */
|
||||
|
||||
LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the
|
||||
|
@ -1213,7 +1213,9 @@ static int __init parse_amd_iommu_options(char *str)
|
|||
for (; *str; ++str) {
|
||||
if (strncmp(str, "isolate", 7) == 0)
|
||||
amd_iommu_isolate = 1;
|
||||
if (strncmp(str, "fullflush", 11) == 0)
|
||||
if (strncmp(str, "share", 5) == 0)
|
||||
amd_iommu_isolate = 0;
|
||||
if (strncmp(str, "fullflush", 9) == 0)
|
||||
amd_iommu_unmap_flush = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -847,6 +847,7 @@ ENTRY(kernel_thread_helper)
|
|||
push %eax
|
||||
CFI_ADJUST_CFA_OFFSET 4
|
||||
call do_exit
|
||||
ud2 # padding for call trace
|
||||
CFI_ENDPROC
|
||||
ENDPROC(kernel_thread_helper)
|
||||
|
||||
|
|
|
@ -373,6 +373,7 @@ ENTRY(ret_from_fork)
|
|||
call schedule_tail
|
||||
GET_THREAD_INFO(%rcx)
|
||||
testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),TI_flags(%rcx)
|
||||
CFI_REMEMBER_STATE
|
||||
jnz rff_trace
|
||||
rff_action:
|
||||
RESTORE_REST
|
||||
|
@ -382,6 +383,7 @@ rff_action:
|
|||
jnz int_ret_from_sys_call
|
||||
RESTORE_TOP_OF_STACK %rdi, -ARGOFFSET
|
||||
jmp ret_from_sys_call
|
||||
CFI_RESTORE_STATE
|
||||
rff_trace:
|
||||
movq %rsp,%rdi
|
||||
call syscall_trace_leave
|
||||
|
@ -1173,6 +1175,7 @@ ENTRY(child_rip)
|
|||
# exit
|
||||
mov %eax, %edi
|
||||
call do_exit
|
||||
ud2 # padding for call trace
|
||||
CFI_ENDPROC
|
||||
END(child_rip)
|
||||
|
||||
|
|
|
@ -1140,6 +1140,20 @@ static void __clear_irq_vector(int irq)
|
|||
|
||||
cfg->vector = 0;
|
||||
cpus_clear(cfg->domain);
|
||||
|
||||
if (likely(!cfg->move_in_progress))
|
||||
return;
|
||||
cpus_and(mask, cfg->old_domain, cpu_online_map);
|
||||
for_each_cpu_mask_nr(cpu, mask) {
|
||||
for (vector = FIRST_EXTERNAL_VECTOR; vector < NR_VECTORS;
|
||||
vector++) {
|
||||
if (per_cpu(vector_irq, cpu)[vector] != irq)
|
||||
continue;
|
||||
per_cpu(vector_irq, cpu)[vector] = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
cfg->move_in_progress = 0;
|
||||
}
|
||||
|
||||
void __setup_vector_irq(int cpu)
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
#include <asm/idle.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
||||
/*
|
||||
* Probabilistic stack overflow check:
|
||||
*
|
||||
|
@ -28,19 +27,18 @@
|
|||
*/
|
||||
static inline void stack_overflow_check(struct pt_regs *regs)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
||||
u64 curbase = (u64)task_stack_page(current);
|
||||
static unsigned long warned = -60*HZ;
|
||||
|
||||
if (regs->sp >= curbase && regs->sp <= curbase + THREAD_SIZE &&
|
||||
regs->sp < curbase + sizeof(struct thread_info) + 128 &&
|
||||
time_after(jiffies, warned + 60*HZ)) {
|
||||
printk("do_IRQ: %s near stack overflow (cur:%Lx,sp:%lx)\n",
|
||||
current->comm, curbase, regs->sp);
|
||||
show_stack(NULL,NULL);
|
||||
warned = jiffies;
|
||||
}
|
||||
}
|
||||
WARN_ONCE(regs->sp >= curbase &&
|
||||
regs->sp <= curbase + THREAD_SIZE &&
|
||||
regs->sp < curbase + sizeof(struct thread_info) +
|
||||
sizeof(struct pt_regs) + 128,
|
||||
|
||||
"do_IRQ: %s near stack overflow (cur:%Lx,sp:%lx)\n",
|
||||
current->comm, curbase, regs->sp);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* do_IRQ handles all normal device IRQ's (the special
|
||||
|
@ -60,9 +58,7 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
|
|||
irq_enter();
|
||||
irq = __get_cpu_var(vector_irq)[vector];
|
||||
|
||||
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
||||
stack_overflow_check(regs);
|
||||
#endif
|
||||
|
||||
desc = irq_to_desc(irq);
|
||||
if (likely(desc))
|
||||
|
|
|
@ -169,6 +169,15 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
|||
DMI_MATCH(DMI_BOARD_NAME, "0KW626"),
|
||||
},
|
||||
},
|
||||
{ /* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */
|
||||
.callback = set_bios_reboot,
|
||||
.ident = "Dell OptiPlex 330",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "0KP561"),
|
||||
},
|
||||
},
|
||||
{ /* Handle problems with rebooting on Dell 2400's */
|
||||
.callback = set_bios_reboot,
|
||||
.ident = "Dell PowerEdge 2400",
|
||||
|
|
|
@ -764,7 +764,7 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
|
|||
.callback = dmi_low_memory_corruption,
|
||||
.ident = "Phoenix BIOS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
|
||||
},
|
||||
},
|
||||
#endif
|
||||
|
|
|
@ -80,6 +80,8 @@ unsigned long __init calibrate_cpu(void)
|
|||
break;
|
||||
no_ctr_free = (i == 4);
|
||||
if (no_ctr_free) {
|
||||
WARN(1, KERN_WARNING "Warning: AMD perfctrs busy ... "
|
||||
"cpu_khz value may be incorrect.\n");
|
||||
i = 3;
|
||||
rdmsrl(MSR_K7_EVNTSEL3, evntsel3);
|
||||
wrmsrl(MSR_K7_EVNTSEL3, 0);
|
||||
|
|
|
@ -222,6 +222,41 @@ static void __init remap_numa_kva(void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HIBERNATION
|
||||
/**
|
||||
* resume_map_numa_kva - add KVA mapping to the temporary page tables created
|
||||
* during resume from hibernation
|
||||
* @pgd_base - temporary resume page directory
|
||||
*/
|
||||
void resume_map_numa_kva(pgd_t *pgd_base)
|
||||
{
|
||||
int node;
|
||||
|
||||
for_each_online_node(node) {
|
||||
unsigned long start_va, start_pfn, size, pfn;
|
||||
|
||||
start_va = (unsigned long)node_remap_start_vaddr[node];
|
||||
start_pfn = node_remap_start_pfn[node];
|
||||
size = node_remap_size[node];
|
||||
|
||||
printk(KERN_DEBUG "%s: node %d\n", __FUNCTION__, node);
|
||||
|
||||
for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) {
|
||||
unsigned long vaddr = start_va + (pfn << PAGE_SHIFT);
|
||||
pgd_t *pgd = pgd_base + pgd_index(vaddr);
|
||||
pud_t *pud = pud_offset(pgd, vaddr);
|
||||
pmd_t *pmd = pmd_offset(pud, vaddr);
|
||||
|
||||
set_pmd(pmd, pfn_pmd(start_pfn + pfn,
|
||||
PAGE_KERNEL_LARGE_EXEC));
|
||||
|
||||
printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n",
|
||||
__FUNCTION__, vaddr, start_pfn + pfn);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static unsigned long calculate_numa_remap_pages(void)
|
||||
{
|
||||
int nid;
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mmzone.h>
|
||||
|
||||
/* Defined in hibernate_asm_32.S */
|
||||
extern int restore_image(void);
|
||||
|
@ -127,6 +128,9 @@ static int resume_physical_mapping_init(pgd_t *pgd_base)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
resume_map_numa_kva(pgd_base);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -217,6 +217,12 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
|
|||
return PTR_ERR(bio);
|
||||
|
||||
if (bio->bi_size != len) {
|
||||
/*
|
||||
* Grab an extra reference to this bio, as bio_unmap_user()
|
||||
* expects to be able to drop it twice as it happens on the
|
||||
* normal IO completion path
|
||||
*/
|
||||
bio_get(bio);
|
||||
bio_endio(bio, 0);
|
||||
bio_unmap_user(bio);
|
||||
return -EINVAL;
|
||||
|
|
|
@ -768,6 +768,8 @@ static int __init genhd_device_init(void)
|
|||
bdev_map = kobj_map_init(base_probe, &block_class_lock);
|
||||
blk_dev_init();
|
||||
|
||||
register_blkdev(BLOCK_EXT_MAJOR, "blkext");
|
||||
|
||||
#ifndef CONFIG_SYSFS_DEPRECATED
|
||||
/* create top-level block dir */
|
||||
block_depr = kobject_create_and_add("block", NULL);
|
||||
|
|
|
@ -18,7 +18,6 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
|
|||
struct disk_part_iter piter;
|
||||
long long start, length;
|
||||
int partno;
|
||||
int err;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EACCES;
|
||||
|
@ -61,10 +60,10 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user
|
|||
disk_part_iter_exit(&piter);
|
||||
|
||||
/* all seems OK */
|
||||
err = add_partition(disk, partno, start, length,
|
||||
ADDPART_FLAG_NONE);
|
||||
part = add_partition(disk, partno, start, length,
|
||||
ADDPART_FLAG_NONE);
|
||||
mutex_unlock(&bdev->bd_mutex);
|
||||
return err;
|
||||
return IS_ERR(part) ? PTR_ERR(part) : 0;
|
||||
case BLKPG_DEL_PARTITION:
|
||||
part = disk_get_part(disk, partno);
|
||||
if (!part)
|
||||
|
|
|
@ -366,7 +366,7 @@ acpi_system_wakeup_device_seq_show(struct seq_file *seq, void *offset)
|
|||
dev->wakeup.state.enabled ? "enabled" : "disabled");
|
||||
if (ldev)
|
||||
seq_printf(seq, "%s:%s",
|
||||
dev_name(ldev) ? ldev->bus->name : "no-bus",
|
||||
ldev->bus ? ldev->bus->name : "no-bus",
|
||||
dev_name(ldev));
|
||||
seq_printf(seq, "\n");
|
||||
put_device(ldev);
|
||||
|
|
|
@ -2847,7 +2847,7 @@ static void do_cciss_request(struct request_queue *q)
|
|||
h->maxSG = seg;
|
||||
|
||||
#ifdef CCISS_DEBUG
|
||||
printk(KERN_DEBUG "cciss: Submitting %d sectors in %d segments\n",
|
||||
printk(KERN_DEBUG "cciss: Submitting %lu sectors in %d segments\n",
|
||||
creq->nr_sectors, seg);
|
||||
#endif /* CCISS_DEBUG */
|
||||
|
||||
|
@ -3197,7 +3197,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
|||
|
||||
c->paddr = pci_resource_start(pdev, 0); /* addressing mode bits already removed */
|
||||
#ifdef CCISS_DEBUG
|
||||
printk("address 0 = %x\n", c->paddr);
|
||||
printk("address 0 = %lx\n", c->paddr);
|
||||
#endif /* CCISS_DEBUG */
|
||||
c->vaddr = remap_pci_mem(c->paddr, 0x250);
|
||||
|
||||
|
@ -3224,7 +3224,8 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
|||
#endif /* CCISS_DEBUG */
|
||||
cfg_base_addr_index = find_PCI_BAR_index(pdev, cfg_base_addr);
|
||||
#ifdef CCISS_DEBUG
|
||||
printk("cfg base address index = %x\n", cfg_base_addr_index);
|
||||
printk("cfg base address index = %llx\n",
|
||||
(unsigned long long)cfg_base_addr_index);
|
||||
#endif /* CCISS_DEBUG */
|
||||
if (cfg_base_addr_index == -1) {
|
||||
printk(KERN_WARNING "cciss: Cannot find cfg_base_addr_index\n");
|
||||
|
@ -3234,7 +3235,7 @@ static int __devinit cciss_pci_init(ctlr_info_t *c, struct pci_dev *pdev)
|
|||
|
||||
cfg_offset = readl(c->vaddr + SA5_CTMEM_OFFSET);
|
||||
#ifdef CCISS_DEBUG
|
||||
printk("cfg offset = %x\n", cfg_offset);
|
||||
printk("cfg offset = %llx\n", (unsigned long long)cfg_offset);
|
||||
#endif /* CCISS_DEBUG */
|
||||
c->cfgtable = remap_pci_mem(pci_resource_start(pdev,
|
||||
cfg_base_addr_index) +
|
||||
|
|
|
@ -338,12 +338,18 @@ wait:
|
|||
static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
|
||||
{
|
||||
struct request_queue *rq;
|
||||
elevator_t *old_e;
|
||||
|
||||
rq = blk_init_queue(do_blkif_request, &blkif_io_lock);
|
||||
if (rq == NULL)
|
||||
return -1;
|
||||
|
||||
elevator_init(rq, "noop");
|
||||
old_e = rq->elevator;
|
||||
if (IS_ERR_VALUE(elevator_init(rq, "noop")))
|
||||
printk(KERN_WARNING
|
||||
"blkfront: Switch elevator failed, use default\n");
|
||||
else
|
||||
elevator_exit(old_e);
|
||||
|
||||
/* Hard sector size and max sectors impersonate the equiv. hardware. */
|
||||
blk_queue_hardsect_size(rq, sector_size);
|
||||
|
|
|
@ -1134,7 +1134,7 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)
|
|||
continue;
|
||||
|
||||
is_out = test_bit(FLAG_IS_OUT, &gdesc->flags);
|
||||
seq_printf(s, " gpio-%-3d (%-12s) %s %s",
|
||||
seq_printf(s, " gpio-%-3d (%-20.20s) %s %s",
|
||||
gpio, gdesc->label,
|
||||
is_out ? "out" : "in ",
|
||||
chip->get
|
||||
|
|
|
@ -55,10 +55,11 @@ struct apple_key_translation {
|
|||
|
||||
static struct apple_key_translation apple_fn_keys[] = {
|
||||
{ KEY_BACKSPACE, KEY_DELETE },
|
||||
{ KEY_ENTER, KEY_INSERT },
|
||||
{ KEY_F1, KEY_BRIGHTNESSDOWN, APPLE_FLAG_FKEY },
|
||||
{ KEY_F2, KEY_BRIGHTNESSUP, APPLE_FLAG_FKEY },
|
||||
{ KEY_F3, KEY_FN_F5, APPLE_FLAG_FKEY }, /* Exposé */
|
||||
{ KEY_F4, KEY_FN_F4, APPLE_FLAG_FKEY }, /* Dashboard */
|
||||
{ KEY_F3, KEY_SCALE, APPLE_FLAG_FKEY },
|
||||
{ KEY_F4, KEY_DASHBOARD, APPLE_FLAG_FKEY },
|
||||
{ KEY_F5, KEY_KBDILLUMDOWN, APPLE_FLAG_FKEY },
|
||||
{ KEY_F6, KEY_KBDILLUMUP, APPLE_FLAG_FKEY },
|
||||
{ KEY_F7, KEY_PREVIOUSSONG, APPLE_FLAG_FKEY },
|
||||
|
@ -418,6 +419,12 @@ static const struct hid_device_id apple_devices[] = {
|
|||
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI),
|
||||
.driver_data = APPLE_HAS_FN },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_ISO_KEYBOARD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS),
|
||||
.driver_data = APPLE_HAS_FN | APPLE_RDESC_JIS },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY),
|
||||
.driver_data = APPLE_NUMLOCK_EMULATION | APPLE_HAS_FN },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY),
|
||||
|
|
|
@ -1250,9 +1250,11 @@ static const struct hid_device_id hid_blacklist[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_BRIGHT, USB_DEVICE_ID_BRIGHT_ABNT2) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) },
|
||||
|
@ -1265,7 +1267,6 @@ static const struct hid_device_id hid_blacklist[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) },
|
||||
|
@ -1409,6 +1410,7 @@ static const struct hid_device_id hid_ignore_list[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM)},
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM2)},
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AVERMEDIA, USB_DEVICE_ID_AVER_FM_MR800) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CIDC, 0x0103) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_RADIO_SI470X) },
|
||||
|
@ -1486,6 +1488,7 @@ static const struct hid_device_id hid_ignore_list[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_GPEN_560) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY) },
|
||||
|
@ -1573,6 +1576,9 @@ static const struct hid_device_id hid_mouse_ignore_list[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_ISO) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING3_JIS) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY) },
|
||||
{ }
|
||||
|
@ -1730,7 +1736,7 @@ static int __init hid_init(void)
|
|||
goto err_bus;
|
||||
|
||||
#ifdef CONFIG_HID_COMPAT
|
||||
hid_compat_wq = create_workqueue("hid_compat");
|
||||
hid_compat_wq = create_singlethread_workqueue("hid_compat");
|
||||
if (!hid_compat_wq) {
|
||||
hidraw_exit();
|
||||
goto err;
|
||||
|
|
|
@ -82,6 +82,9 @@
|
|||
#define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ANSI 0x0236
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_ISO 0x0237
|
||||
#define USB_DEVICE_ID_APPLE_WELLSPRING3_JIS 0x0238
|
||||
#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a
|
||||
#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b
|
||||
#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL 0x8241
|
||||
|
|
|
@ -38,7 +38,7 @@ static int hidraw_major;
|
|||
static struct cdev hidraw_cdev;
|
||||
static struct class *hidraw_class;
|
||||
static struct hidraw *hidraw_table[HIDRAW_MAX_DEVICES];
|
||||
static DEFINE_SPINLOCK(minors_lock);
|
||||
static DEFINE_MUTEX(minors_lock);
|
||||
|
||||
static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
|
||||
{
|
||||
|
@ -159,13 +159,13 @@ static int hidraw_open(struct inode *inode, struct file *file)
|
|||
struct hidraw_list *list;
|
||||
int err = 0;
|
||||
|
||||
lock_kernel();
|
||||
if (!(list = kzalloc(sizeof(struct hidraw_list), GFP_KERNEL))) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
spin_lock(&minors_lock);
|
||||
lock_kernel();
|
||||
mutex_lock(&minors_lock);
|
||||
if (!hidraw_table[minor]) {
|
||||
printk(KERN_EMERG "hidraw device with minor %d doesn't exist\n",
|
||||
minor);
|
||||
|
@ -180,13 +180,16 @@ static int hidraw_open(struct inode *inode, struct file *file)
|
|||
file->private_data = list;
|
||||
|
||||
dev = hidraw_table[minor];
|
||||
if (!dev->open++)
|
||||
dev->hid->ll_driver->open(dev->hid);
|
||||
if (!dev->open++) {
|
||||
err = dev->hid->ll_driver->open(dev->hid);
|
||||
if (err < 0)
|
||||
dev->open--;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
spin_unlock(&minors_lock);
|
||||
out:
|
||||
mutex_unlock(&minors_lock);
|
||||
unlock_kernel();
|
||||
out:
|
||||
return err;
|
||||
|
||||
}
|
||||
|
@ -310,7 +313,7 @@ int hidraw_connect(struct hid_device *hid)
|
|||
|
||||
result = -EINVAL;
|
||||
|
||||
spin_lock(&minors_lock);
|
||||
mutex_lock(&minors_lock);
|
||||
|
||||
for (minor = 0; minor < HIDRAW_MAX_DEVICES; minor++) {
|
||||
if (hidraw_table[minor])
|
||||
|
@ -320,9 +323,8 @@ int hidraw_connect(struct hid_device *hid)
|
|||
break;
|
||||
}
|
||||
|
||||
spin_unlock(&minors_lock);
|
||||
|
||||
if (result) {
|
||||
mutex_unlock(&minors_lock);
|
||||
kfree(dev);
|
||||
goto out;
|
||||
}
|
||||
|
@ -331,14 +333,14 @@ int hidraw_connect(struct hid_device *hid)
|
|||
NULL, "%s%d", "hidraw", minor);
|
||||
|
||||
if (IS_ERR(dev->dev)) {
|
||||
spin_lock(&minors_lock);
|
||||
hidraw_table[minor] = NULL;
|
||||
spin_unlock(&minors_lock);
|
||||
mutex_unlock(&minors_lock);
|
||||
result = PTR_ERR(dev->dev);
|
||||
kfree(dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
mutex_unlock(&minors_lock);
|
||||
init_waitqueue_head(&dev->wait);
|
||||
INIT_LIST_HEAD(&dev->list);
|
||||
|
||||
|
@ -360,9 +362,9 @@ void hidraw_disconnect(struct hid_device *hid)
|
|||
|
||||
hidraw->exist = 0;
|
||||
|
||||
spin_lock(&minors_lock);
|
||||
mutex_lock(&minors_lock);
|
||||
hidraw_table[hidraw->minor] = NULL;
|
||||
spin_unlock(&minors_lock);
|
||||
mutex_unlock(&minors_lock);
|
||||
|
||||
device_destroy(hidraw_class, MKDEV(hidraw_major, hidraw->minor));
|
||||
|
||||
|
|
|
@ -781,6 +781,8 @@ static int usbhid_start(struct hid_device *hid)
|
|||
unsigned int n, insize = 0;
|
||||
int ret;
|
||||
|
||||
clear_bit(HID_DISCONNECTED, &usbhid->iofl);
|
||||
|
||||
usbhid->bufsize = HID_MIN_BUFFER_SIZE;
|
||||
hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize);
|
||||
hid_find_max_report(hid, HID_OUTPUT_REPORT, &usbhid->bufsize);
|
||||
|
@ -847,12 +849,6 @@ static int usbhid_start(struct hid_device *hid)
|
|||
}
|
||||
}
|
||||
|
||||
if (!usbhid->urbin) {
|
||||
err_hid("couldn't find an input interrupt endpoint");
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
init_waitqueue_head(&usbhid->wait);
|
||||
INIT_WORK(&usbhid->reset_work, hid_reset);
|
||||
setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid);
|
||||
|
@ -888,6 +884,9 @@ fail:
|
|||
usb_free_urb(usbhid->urbin);
|
||||
usb_free_urb(usbhid->urbout);
|
||||
usb_free_urb(usbhid->urbctrl);
|
||||
usbhid->urbin = NULL;
|
||||
usbhid->urbout = NULL;
|
||||
usbhid->urbctrl = NULL;
|
||||
hid_free_buffers(dev, hid);
|
||||
mutex_unlock(&usbhid->setup);
|
||||
return ret;
|
||||
|
@ -924,6 +923,9 @@ static void usbhid_stop(struct hid_device *hid)
|
|||
usb_free_urb(usbhid->urbin);
|
||||
usb_free_urb(usbhid->urbctrl);
|
||||
usb_free_urb(usbhid->urbout);
|
||||
usbhid->urbin = NULL; /* don't mess up next start */
|
||||
usbhid->urbctrl = NULL;
|
||||
usbhid->urbout = NULL;
|
||||
|
||||
hid_free_buffers(hid_to_usb_dev(hid), hid);
|
||||
mutex_unlock(&usbhid->setup);
|
||||
|
@ -940,15 +942,26 @@ static struct hid_ll_driver usb_hid_driver = {
|
|||
|
||||
static int hid_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct usb_host_interface *interface = intf->cur_altsetting;
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
struct usbhid_device *usbhid;
|
||||
struct hid_device *hid;
|
||||
unsigned int n, has_in = 0;
|
||||
size_t len;
|
||||
int ret;
|
||||
|
||||
dbg_hid("HID probe called for ifnum %d\n",
|
||||
intf->altsetting->desc.bInterfaceNumber);
|
||||
|
||||
for (n = 0; n < interface->desc.bNumEndpoints; n++)
|
||||
if (usb_endpoint_is_int_in(&interface->endpoint[n].desc))
|
||||
has_in++;
|
||||
if (!has_in) {
|
||||
dev_err(&intf->dev, "couldn't find an input interrupt "
|
||||
"endpoint\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
hid = hid_allocate_device();
|
||||
if (IS_ERR(hid))
|
||||
return PTR_ERR(hid);
|
||||
|
|
|
@ -128,6 +128,9 @@ static const char* temperature_sensors_sets[][36] = {
|
|||
/* Set 13: iMac 8,1 */
|
||||
{ "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P",
|
||||
"TL0P", "TO0P", "TW0P", "Tm0P", "Tp0P", NULL },
|
||||
/* Set 14: iMac 6,1 */
|
||||
{ "TA0P", "TC0D", "TC0H", "TC0P", "TG0D", "TG0H", "TG0P", "TH0P",
|
||||
"TO0P", "Tp0P", NULL },
|
||||
};
|
||||
|
||||
/* List of keys used to read/write fan speeds */
|
||||
|
@ -1296,6 +1299,8 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = {
|
|||
{ .accelerometer = 1, .light = 1, .temperature_set = 12 },
|
||||
/* iMac 8: light sensor only, temperature set 13 */
|
||||
{ .accelerometer = 0, .light = 0, .temperature_set = 13 },
|
||||
/* iMac 6: light sensor only, temperature set 14 */
|
||||
{ .accelerometer = 0, .light = 0, .temperature_set = 14 },
|
||||
};
|
||||
|
||||
/* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
|
||||
|
@ -1349,10 +1354,18 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = {
|
|||
DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") },
|
||||
&applesmc_dmi_data[4]},
|
||||
{ applesmc_dmi_match, "Apple MacPro", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "MacPro") },
|
||||
&applesmc_dmi_data[4]},
|
||||
{ applesmc_dmi_match, "Apple iMac 8", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac8") },
|
||||
&applesmc_dmi_data[13]},
|
||||
{ applesmc_dmi_match, "Apple iMac 6", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac6") },
|
||||
&applesmc_dmi_data[14]},
|
||||
{ applesmc_dmi_match, "Apple iMac 5", {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Apple"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "iMac5") },
|
||||
|
|
|
@ -444,6 +444,7 @@ static struct pcmcia_device_id ide_ids[] = {
|
|||
PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
|
||||
PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
|
||||
PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
|
||||
PCMCIA_DEVICE_PROD_ID2("Flash Card", 0x5a362506),
|
||||
PCMCIA_DEVICE_NULL,
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pcmcia, ide_ids);
|
||||
|
|
|
@ -1641,8 +1641,10 @@ isdn_net_ciscohdlck_slarp_send_reply(isdn_net_local *lp)
|
|||
/* slarp reply, send own ip/netmask; if values are nonsense remote
|
||||
* should think we are unable to provide it with an address via SLARP */
|
||||
p += put_u32(p, CISCO_SLARP_REPLY);
|
||||
p += put_u32(p, addr); // address
|
||||
p += put_u32(p, mask); // netmask
|
||||
*(__be32 *)p = addr; // address
|
||||
p += 4;
|
||||
*(__be32 *)p = mask; // netmask
|
||||
p += 4;
|
||||
p += put_u16(p, 0); // unused
|
||||
|
||||
isdn_net_write_super(lp, skb);
|
||||
|
|
|
@ -267,7 +267,7 @@ static int da9030_mask_events(struct da903x_chip *chip, unsigned int events)
|
|||
{
|
||||
uint8_t v[3];
|
||||
|
||||
chip->events_mask &= ~events;
|
||||
chip->events_mask |= events;
|
||||
|
||||
v[0] = (chip->events_mask & 0xff);
|
||||
v[1] = (chip->events_mask >> 8) & 0xff;
|
||||
|
|
|
@ -30,7 +30,12 @@ static int wm8350_i2c_read_device(struct wm8350 *wm8350, char reg,
|
|||
ret = i2c_master_send(wm8350->i2c_client, ®, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
return i2c_master_recv(wm8350->i2c_client, dest, bytes);
|
||||
ret = i2c_master_recv(wm8350->i2c_client, dest, bytes);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret != bytes)
|
||||
return -EIO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wm8350_i2c_write_device(struct wm8350 *wm8350, char reg,
|
||||
|
@ -38,13 +43,19 @@ static int wm8350_i2c_write_device(struct wm8350 *wm8350, char reg,
|
|||
{
|
||||
/* we add 1 byte for device register */
|
||||
u8 msg[(WM8350_MAX_REGISTER << 1) + 1];
|
||||
int ret;
|
||||
|
||||
if (bytes > ((WM8350_MAX_REGISTER << 1) + 1))
|
||||
return -EINVAL;
|
||||
|
||||
msg[0] = reg;
|
||||
memcpy(&msg[1], src, bytes);
|
||||
return i2c_master_send(wm8350->i2c_client, msg, bytes + 1);
|
||||
ret = i2c_master_send(wm8350->i2c_client, msg, bytes + 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret != bytes + 1)
|
||||
return -EIO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int wm8350_i2c_probe(struct i2c_client *i2c,
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
ifdef CONFIG_SGI_GRU_DEBUG
|
||||
EXTRA_CFLAGS += -DDEBUG
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_SGI_GRU) := gru.o
|
||||
gru-y := grufile.o grumain.o grufault.o grutlbpurge.o gruprocfs.o grukservices.o
|
||||
|
||||
|
|
|
@ -163,9 +163,6 @@ int atl1e_read_mac_addr(struct atl1e_hw *hw)
|
|||
* atl1e_hash_mc_addr
|
||||
* purpose
|
||||
* set hash value for a multicast address
|
||||
* hash calcu processing :
|
||||
* 1. calcu 32bit CRC for multicast address
|
||||
* 2. reverse crc with MSB to LSB
|
||||
*/
|
||||
u32 atl1e_hash_mc_addr(struct atl1e_hw *hw, u8 *mc_addr)
|
||||
{
|
||||
|
@ -174,7 +171,6 @@ u32 atl1e_hash_mc_addr(struct atl1e_hw *hw, u8 *mc_addr)
|
|||
int i;
|
||||
|
||||
crc32 = ether_crc_le(6, mc_addr);
|
||||
crc32 = ~crc32;
|
||||
for (i = 0; i < 32; i++)
|
||||
value |= (((crc32 >> i) & 1) << (31 - i));
|
||||
|
||||
|
|
|
@ -3404,14 +3404,8 @@ static void atl1_get_wol(struct net_device *netdev,
|
|||
{
|
||||
struct atl1_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
wol->supported = WAKE_UCAST | WAKE_MCAST | WAKE_BCAST | WAKE_MAGIC;
|
||||
wol->supported = WAKE_MAGIC;
|
||||
wol->wolopts = 0;
|
||||
if (adapter->wol & ATLX_WUFC_EX)
|
||||
wol->wolopts |= WAKE_UCAST;
|
||||
if (adapter->wol & ATLX_WUFC_MC)
|
||||
wol->wolopts |= WAKE_MCAST;
|
||||
if (adapter->wol & ATLX_WUFC_BC)
|
||||
wol->wolopts |= WAKE_BCAST;
|
||||
if (adapter->wol & ATLX_WUFC_MAG)
|
||||
wol->wolopts |= WAKE_MAGIC;
|
||||
return;
|
||||
|
@ -3422,15 +3416,10 @@ static int atl1_set_wol(struct net_device *netdev,
|
|||
{
|
||||
struct atl1_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE))
|
||||
if (wol->wolopts & (WAKE_PHY | WAKE_UCAST | WAKE_MCAST | WAKE_BCAST |
|
||||
WAKE_ARP | WAKE_MAGICSECURE))
|
||||
return -EOPNOTSUPP;
|
||||
adapter->wol = 0;
|
||||
if (wol->wolopts & WAKE_UCAST)
|
||||
adapter->wol |= ATLX_WUFC_EX;
|
||||
if (wol->wolopts & WAKE_MCAST)
|
||||
adapter->wol |= ATLX_WUFC_MC;
|
||||
if (wol->wolopts & WAKE_BCAST)
|
||||
adapter->wol |= ATLX_WUFC_BC;
|
||||
if (wol->wolopts & WAKE_MAGIC)
|
||||
adapter->wol |= ATLX_WUFC_MAG;
|
||||
return 0;
|
||||
|
|
|
@ -1690,9 +1690,11 @@ static int atl2_resume(struct pci_dev *pdev)
|
|||
|
||||
ATL2_WRITE_REG(&adapter->hw, REG_WOL_CTRL, 0);
|
||||
|
||||
err = atl2_request_irq(adapter);
|
||||
if (netif_running(netdev) && err)
|
||||
return err;
|
||||
if (netif_running(netdev)) {
|
||||
err = atl2_request_irq(adapter);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
atl2_reset_hw(&adapter->hw);
|
||||
|
||||
|
|
|
@ -166,7 +166,7 @@
|
|||
|
||||
#define DRV_NAME "e100"
|
||||
#define DRV_EXT "-NAPI"
|
||||
#define DRV_VERSION "3.5.23-k4"DRV_EXT
|
||||
#define DRV_VERSION "3.5.23-k6"DRV_EXT
|
||||
#define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver"
|
||||
#define DRV_COPYRIGHT "Copyright(c) 1999-2006 Intel Corporation"
|
||||
#define PFX DRV_NAME ": "
|
||||
|
@ -1804,7 +1804,7 @@ static int e100_rx_alloc_skb(struct nic *nic, struct rx *rx)
|
|||
struct rfd *prev_rfd = (struct rfd *)rx->prev->skb->data;
|
||||
put_unaligned_le32(rx->dma_addr, &prev_rfd->link);
|
||||
pci_dma_sync_single_for_device(nic->pdev, rx->prev->dma_addr,
|
||||
sizeof(struct rfd), PCI_DMA_TODEVICE);
|
||||
sizeof(struct rfd), PCI_DMA_BIDIRECTIONAL);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1823,7 +1823,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
|
|||
|
||||
/* Need to sync before taking a peek at cb_complete bit */
|
||||
pci_dma_sync_single_for_cpu(nic->pdev, rx->dma_addr,
|
||||
sizeof(struct rfd), PCI_DMA_FROMDEVICE);
|
||||
sizeof(struct rfd), PCI_DMA_BIDIRECTIONAL);
|
||||
rfd_status = le16_to_cpu(rfd->status);
|
||||
|
||||
DPRINTK(RX_STATUS, DEBUG, "status=0x%04X\n", rfd_status);
|
||||
|
@ -1850,7 +1850,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
|
|||
|
||||
/* Get data */
|
||||
pci_unmap_single(nic->pdev, rx->dma_addr,
|
||||
RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
|
||||
RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
|
||||
|
||||
/* If this buffer has the el bit, but we think the receiver
|
||||
* is still running, check to see if it really stopped while
|
||||
|
@ -1943,7 +1943,7 @@ static void e100_rx_clean(struct nic *nic, unsigned int *work_done,
|
|||
new_before_last_rfd->command |= cpu_to_le16(cb_el);
|
||||
pci_dma_sync_single_for_device(nic->pdev,
|
||||
new_before_last_rx->dma_addr, sizeof(struct rfd),
|
||||
PCI_DMA_TODEVICE);
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
|
||||
/* Now that we have a new stopping point, we can clear the old
|
||||
* stopping point. We must sync twice to get the proper
|
||||
|
@ -1951,11 +1951,11 @@ static void e100_rx_clean(struct nic *nic, unsigned int *work_done,
|
|||
old_before_last_rfd->command &= ~cpu_to_le16(cb_el);
|
||||
pci_dma_sync_single_for_device(nic->pdev,
|
||||
old_before_last_rx->dma_addr, sizeof(struct rfd),
|
||||
PCI_DMA_TODEVICE);
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
old_before_last_rfd->size = cpu_to_le16(VLAN_ETH_FRAME_LEN);
|
||||
pci_dma_sync_single_for_device(nic->pdev,
|
||||
old_before_last_rx->dma_addr, sizeof(struct rfd),
|
||||
PCI_DMA_TODEVICE);
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
}
|
||||
|
||||
if(restart_required) {
|
||||
|
@ -1978,7 +1978,7 @@ static void e100_rx_clean_list(struct nic *nic)
|
|||
for(rx = nic->rxs, i = 0; i < count; rx++, i++) {
|
||||
if(rx->skb) {
|
||||
pci_unmap_single(nic->pdev, rx->dma_addr,
|
||||
RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
|
||||
RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
|
||||
dev_kfree_skb(rx->skb);
|
||||
}
|
||||
}
|
||||
|
@ -2021,7 +2021,7 @@ static int e100_rx_alloc_list(struct nic *nic)
|
|||
before_last->command |= cpu_to_le16(cb_el);
|
||||
before_last->size = 0;
|
||||
pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
|
||||
sizeof(struct rfd), PCI_DMA_TODEVICE);
|
||||
sizeof(struct rfd), PCI_DMA_BIDIRECTIONAL);
|
||||
|
||||
nic->rx_to_use = nic->rx_to_clean = nic->rxs;
|
||||
nic->ru_running = RU_SUSPENDED;
|
||||
|
@ -2222,7 +2222,7 @@ static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)
|
|||
msleep(10);
|
||||
|
||||
pci_dma_sync_single_for_cpu(nic->pdev, nic->rx_to_clean->dma_addr,
|
||||
RFD_BUF_LEN, PCI_DMA_FROMDEVICE);
|
||||
RFD_BUF_LEN, PCI_DMA_BIDIRECTIONAL);
|
||||
|
||||
if(memcmp(nic->rx_to_clean->skb->data + sizeof(struct rfd),
|
||||
skb->data, ETH_DATA_LEN))
|
||||
|
|
|
@ -1774,7 +1774,8 @@ static void e1000_get_wol(struct net_device *netdev,
|
|||
|
||||
/* this function will set ->supported = 0 and return 1 if wol is not
|
||||
* supported by this hardware */
|
||||
if (e1000_wol_exclusion(adapter, wol))
|
||||
if (e1000_wol_exclusion(adapter, wol) ||
|
||||
!device_can_wakeup(&adapter->pdev->dev))
|
||||
return;
|
||||
|
||||
/* apply any specific unsupported masks here */
|
||||
|
@ -1811,7 +1812,8 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
|||
if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (e1000_wol_exclusion(adapter, wol))
|
||||
if (e1000_wol_exclusion(adapter, wol) ||
|
||||
!device_can_wakeup(&adapter->pdev->dev))
|
||||
return wol->wolopts ? -EOPNOTSUPP : 0;
|
||||
|
||||
switch (hw->device_id) {
|
||||
|
@ -1838,6 +1840,8 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
|||
if (wol->wolopts & WAKE_MAGIC)
|
||||
adapter->wol |= E1000_WUFC_MAG;
|
||||
|
||||
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1179,6 +1179,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
|||
|
||||
/* initialize the wol settings based on the eeprom settings */
|
||||
adapter->wol = adapter->eeprom_wol;
|
||||
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
||||
|
||||
/* print bus type/speed/width info */
|
||||
DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ",
|
||||
|
|
|
@ -299,6 +299,7 @@ struct e1000_adapter {
|
|||
unsigned long led_status;
|
||||
|
||||
unsigned int flags;
|
||||
unsigned int flags2;
|
||||
struct work_struct downshift_task;
|
||||
struct work_struct update_phy_task;
|
||||
};
|
||||
|
@ -306,6 +307,7 @@ struct e1000_adapter {
|
|||
struct e1000_info {
|
||||
enum e1000_mac_type mac;
|
||||
unsigned int flags;
|
||||
unsigned int flags2;
|
||||
u32 pba;
|
||||
s32 (*get_variants)(struct e1000_adapter *);
|
||||
struct e1000_mac_operations *mac_ops;
|
||||
|
@ -347,6 +349,9 @@ struct e1000_info {
|
|||
#define FLAG_RX_RESTART_NOW (1 << 30)
|
||||
#define FLAG_MSI_TEST_FAILED (1 << 31)
|
||||
|
||||
/* CRC Stripping defines */
|
||||
#define FLAG2_CRC_STRIPPING (1 << 0)
|
||||
|
||||
#define E1000_RX_DESC_PS(R, i) \
|
||||
(&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
|
||||
#define E1000_GET_DESC(R, i, type) (&(((struct type *)((R).desc))[i]))
|
||||
|
|
|
@ -1713,7 +1713,8 @@ static void e1000_get_wol(struct net_device *netdev,
|
|||
wol->supported = 0;
|
||||
wol->wolopts = 0;
|
||||
|
||||
if (!(adapter->flags & FLAG_HAS_WOL))
|
||||
if (!(adapter->flags & FLAG_HAS_WOL) ||
|
||||
!device_can_wakeup(&adapter->pdev->dev))
|
||||
return;
|
||||
|
||||
wol->supported = WAKE_UCAST | WAKE_MCAST |
|
||||
|
@ -1751,7 +1752,8 @@ static int e1000_set_wol(struct net_device *netdev,
|
|||
if (wol->wolopts & WAKE_MAGICSECURE)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!(adapter->flags & FLAG_HAS_WOL))
|
||||
if (!(adapter->flags & FLAG_HAS_WOL) ||
|
||||
!device_can_wakeup(&adapter->pdev->dev))
|
||||
return wol->wolopts ? -EOPNOTSUPP : 0;
|
||||
|
||||
/* these settings will always override what we currently have */
|
||||
|
@ -1770,6 +1772,8 @@ static int e1000_set_wol(struct net_device *netdev,
|
|||
if (wol->wolopts & WAKE_ARP)
|
||||
adapter->wol |= E1000_WUFC_ARP;
|
||||
|
||||
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -499,6 +499,10 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
|
|||
goto next_desc;
|
||||
}
|
||||
|
||||
/* adjust length to remove Ethernet CRC */
|
||||
if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
|
||||
length -= 4;
|
||||
|
||||
total_rx_bytes += length;
|
||||
total_rx_packets++;
|
||||
|
||||
|
@ -804,6 +808,10 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
|
|||
pci_dma_sync_single_for_device(pdev, ps_page->dma,
|
||||
PAGE_SIZE, PCI_DMA_FROMDEVICE);
|
||||
|
||||
/* remove the CRC */
|
||||
if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
|
||||
l1 -= 4;
|
||||
|
||||
skb_put(skb, l1);
|
||||
goto copydone;
|
||||
} /* if */
|
||||
|
@ -825,6 +833,12 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
|
|||
skb->truesize += length;
|
||||
}
|
||||
|
||||
/* strip the ethernet crc, problem is we're using pages now so
|
||||
* this whole operation can get a little cpu intensive
|
||||
*/
|
||||
if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
|
||||
pskb_trim(skb, skb->len - 4);
|
||||
|
||||
copydone:
|
||||
total_rx_bytes += skb->len;
|
||||
total_rx_packets++;
|
||||
|
@ -2301,8 +2315,12 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
|
|||
else
|
||||
rctl |= E1000_RCTL_LPE;
|
||||
|
||||
/* Enable hardware CRC frame stripping */
|
||||
rctl |= E1000_RCTL_SECRC;
|
||||
/* Some systems expect that the CRC is included in SMBUS traffic. The
|
||||
* hardware strips the CRC before sending to both SMBUS (BMC) and to
|
||||
* host memory when this is enabled
|
||||
*/
|
||||
if (adapter->flags2 & FLAG2_CRC_STRIPPING)
|
||||
rctl |= E1000_RCTL_SECRC;
|
||||
|
||||
/* Setup buffer sizes */
|
||||
rctl &= ~E1000_RCTL_SZ_4096;
|
||||
|
@ -4766,6 +4784,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
|||
adapter->ei = ei;
|
||||
adapter->pba = ei->pba;
|
||||
adapter->flags = ei->flags;
|
||||
adapter->flags2 = ei->flags2;
|
||||
adapter->hw.adapter = adapter;
|
||||
adapter->hw.mac.type = ei->mac;
|
||||
adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
|
||||
|
@ -4970,6 +4989,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
|
|||
|
||||
/* initialize the wol settings based on the eeprom settings */
|
||||
adapter->wol = adapter->eeprom_wol;
|
||||
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
||||
|
||||
/* reset the hardware with the new settings */
|
||||
e1000e_reset(adapter);
|
||||
|
@ -5008,6 +5028,7 @@ err_hw_init:
|
|||
err_sw_init:
|
||||
if (adapter->hw.flash_address)
|
||||
iounmap(adapter->hw.flash_address);
|
||||
e1000e_reset_interrupt_capability(adapter);
|
||||
err_flashmap:
|
||||
iounmap(adapter->hw.hw_addr);
|
||||
err_ioremap:
|
||||
|
|
|
@ -151,6 +151,16 @@ E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround");
|
|||
*/
|
||||
E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]");
|
||||
|
||||
/*
|
||||
* Enable CRC Stripping
|
||||
*
|
||||
* Valid Range: 0, 1
|
||||
*
|
||||
* Default Value: 1 (enabled)
|
||||
*/
|
||||
E1000_PARAM(CrcStripping, "Enable CRC Stripping, disable if your BMC needs " \
|
||||
"the CRC");
|
||||
|
||||
struct e1000_option {
|
||||
enum { enable_option, range_option, list_option } type;
|
||||
const char *name;
|
||||
|
@ -404,6 +414,21 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter)
|
|||
adapter->flags |= FLAG_SMART_POWER_DOWN;
|
||||
}
|
||||
}
|
||||
{ /* CRC Stripping */
|
||||
const struct e1000_option opt = {
|
||||
.type = enable_option,
|
||||
.name = "CRC Stripping",
|
||||
.err = "defaulting to enabled",
|
||||
.def = OPTION_ENABLED
|
||||
};
|
||||
|
||||
if (num_CrcStripping > bd) {
|
||||
unsigned int crc_stripping = CrcStripping[bd];
|
||||
e1000_validate_option(&crc_stripping, &opt, adapter);
|
||||
if (crc_stripping == OPTION_ENABLED)
|
||||
adapter->flags2 |= FLAG2_CRC_STRIPPING;
|
||||
}
|
||||
}
|
||||
{ /* Kumeran Lock Loss Workaround */
|
||||
const struct e1000_option opt = {
|
||||
.type = enable_option,
|
||||
|
|
|
@ -1407,6 +1407,10 @@ static int gfar_clean_tx_ring(struct net_device *dev)
|
|||
if (bdp->status & TXBD_DEF)
|
||||
dev->stats.collisions++;
|
||||
|
||||
/* Unmap the DMA memory */
|
||||
dma_unmap_single(&priv->dev->dev, bdp->bufPtr,
|
||||
bdp->length, DMA_TO_DEVICE);
|
||||
|
||||
/* Free the sk buffer associated with this TxBD */
|
||||
dev_kfree_skb_irq(priv->tx_skbuff[priv->skb_dirtytx]);
|
||||
|
||||
|
@ -1666,6 +1670,9 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
|
|||
|
||||
skb = priv->rx_skbuff[priv->skb_currx];
|
||||
|
||||
dma_unmap_single(&priv->dev->dev, bdp->bufPtr,
|
||||
priv->rx_buffer_size, DMA_FROM_DEVICE);
|
||||
|
||||
/* We drop the frame if we failed to allocate a new buffer */
|
||||
if (unlikely(!newskb || !(bdp->status & RXBD_LAST) ||
|
||||
bdp->status & RXBD_ERR)) {
|
||||
|
@ -1674,14 +1681,8 @@ int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit)
|
|||
if (unlikely(!newskb))
|
||||
newskb = skb;
|
||||
|
||||
if (skb) {
|
||||
dma_unmap_single(&priv->dev->dev,
|
||||
bdp->bufPtr,
|
||||
priv->rx_buffer_size,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
if (skb)
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
} else {
|
||||
/* Increment the number of packets */
|
||||
dev->stats.rx_packets++;
|
||||
|
|
|
@ -1776,7 +1776,8 @@ static void igb_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
|||
|
||||
/* this function will set ->supported = 0 and return 1 if wol is not
|
||||
* supported by this hardware */
|
||||
if (igb_wol_exclusion(adapter, wol))
|
||||
if (igb_wol_exclusion(adapter, wol) ||
|
||||
!device_can_wakeup(&adapter->pdev->dev))
|
||||
return;
|
||||
|
||||
/* apply any specific unsupported masks here */
|
||||
|
@ -1805,7 +1806,8 @@ static int igb_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
|||
if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (igb_wol_exclusion(adapter, wol))
|
||||
if (igb_wol_exclusion(adapter, wol) ||
|
||||
!device_can_wakeup(&adapter->pdev->dev))
|
||||
return wol->wolopts ? -EOPNOTSUPP : 0;
|
||||
|
||||
switch (hw->device_id) {
|
||||
|
@ -1825,6 +1827,8 @@ static int igb_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
|
|||
if (wol->wolopts & WAKE_MAGIC)
|
||||
adapter->wol |= E1000_WUFC_MAG;
|
||||
|
||||
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1019,10 +1019,9 @@ static int __devinit igb_probe(struct pci_dev *pdev,
|
|||
state &= ~PCIE_LINK_STATE_L0S;
|
||||
pci_write_config_word(us_dev, pos + PCI_EXP_LNKCTL,
|
||||
state);
|
||||
printk(KERN_INFO "Disabling ASPM L0s upstream switch "
|
||||
"port %x:%x.%x\n", us_dev->bus->number,
|
||||
PCI_SLOT(us_dev->devfn),
|
||||
PCI_FUNC(us_dev->devfn));
|
||||
dev_info(&pdev->dev,
|
||||
"Disabling ASPM L0s upstream switch port %s\n",
|
||||
pci_name(us_dev));
|
||||
}
|
||||
default:
|
||||
break;
|
||||
|
@ -1244,6 +1243,7 @@ static int __devinit igb_probe(struct pci_dev *pdev,
|
|||
|
||||
/* initialize the wol settings based on the eeprom settings */
|
||||
adapter->wol = adapter->eeprom_wol;
|
||||
device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
|
||||
|
||||
/* reset the hardware with the new settings */
|
||||
igb_reset(adapter);
|
||||
|
|
|
@ -1112,7 +1112,7 @@ static void ipg_nic_rx_free_skb(struct net_device *dev)
|
|||
struct ipg_rx *rxfd = sp->rxd + entry;
|
||||
|
||||
pci_unmap_single(sp->pdev,
|
||||
le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN),
|
||||
le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN,
|
||||
sp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
||||
dev_kfree_skb_irq(sp->rx_buff[entry]);
|
||||
sp->rx_buff[entry] = NULL;
|
||||
|
@ -1179,7 +1179,7 @@ static int ipg_nic_rx_check_error(struct net_device *dev)
|
|||
*/
|
||||
if (sp->rx_buff[entry]) {
|
||||
pci_unmap_single(sp->pdev,
|
||||
le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN),
|
||||
le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN,
|
||||
sp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
||||
|
||||
dev_kfree_skb_irq(sp->rx_buff[entry]);
|
||||
|
@ -1246,7 +1246,7 @@ static void ipg_nic_rx_with_start(struct net_device *dev,
|
|||
if (jumbo->found_start)
|
||||
dev_kfree_skb_irq(jumbo->skb);
|
||||
|
||||
pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info & ~IPG_RFI_FRAGLEN),
|
||||
pci_unmap_single(pdev, le64_to_cpu(rxfd->frag_info) & ~IPG_RFI_FRAGLEN,
|
||||
sp->rx_buf_sz, PCI_DMA_FROMDEVICE);
|
||||
|
||||
skb_put(skb, sp->rxfrag_size);
|
||||
|
@ -1349,7 +1349,7 @@ static int ipg_nic_rx_jumbo(struct net_device *dev)
|
|||
unsigned int entry = curr % IPG_RFDLIST_LENGTH;
|
||||
struct ipg_rx *rxfd = sp->rxd + entry;
|
||||
|
||||
if (!(rxfd->rfs & le64_to_cpu(IPG_RFS_RFDDONE)))
|
||||
if (!(rxfd->rfs & cpu_to_le64(IPG_RFS_RFDDONE)))
|
||||
break;
|
||||
|
||||
switch (ipg_nic_rx_check_frame_type(dev)) {
|
||||
|
|
|
@ -1287,7 +1287,34 @@ static void ixgbe_set_itr(struct ixgbe_adapter *adapter)
|
|||
return;
|
||||
}
|
||||
|
||||
static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter);
|
||||
/**
|
||||
* ixgbe_irq_disable - Mask off interrupt generation on the NIC
|
||||
* @adapter: board private structure
|
||||
**/
|
||||
static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
|
||||
int i;
|
||||
for (i = 0; i < adapter->num_msix_vectors; i++)
|
||||
synchronize_irq(adapter->msix_entries[i].vector);
|
||||
} else {
|
||||
synchronize_irq(adapter->pdev->irq);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_irq_enable - Enable default interrupt generation settings
|
||||
* @adapter: board private structure
|
||||
**/
|
||||
static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
u32 mask;
|
||||
mask = IXGBE_EIMS_ENABLE_MASK;
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask);
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_intr - legacy mode Interrupt Handler
|
||||
|
@ -1393,35 +1420,6 @@ static void ixgbe_free_irq(struct ixgbe_adapter *adapter)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_irq_disable - Mask off interrupt generation on the NIC
|
||||
* @adapter: board private structure
|
||||
**/
|
||||
static inline void ixgbe_irq_disable(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMC, ~0);
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
|
||||
int i;
|
||||
for (i = 0; i < adapter->num_msix_vectors; i++)
|
||||
synchronize_irq(adapter->msix_entries[i].vector);
|
||||
} else {
|
||||
synchronize_irq(adapter->pdev->irq);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_irq_enable - Enable default interrupt generation settings
|
||||
* @adapter: board private structure
|
||||
**/
|
||||
static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
u32 mask;
|
||||
mask = IXGBE_EIMS_ENABLE_MASK;
|
||||
IXGBE_WRITE_REG(&adapter->hw, IXGBE_EIMS, mask);
|
||||
IXGBE_WRITE_FLUSH(&adapter->hw);
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_configure_msi_and_legacy - Initialize PIN (INTA...) and MSI interrupts
|
||||
*
|
||||
|
|
|
@ -912,23 +912,23 @@ jme_alloc_and_feed_skb(struct jme_adapter *jme, int idx)
|
|||
skb_put(skb, framesize);
|
||||
skb->protocol = eth_type_trans(skb, jme->dev);
|
||||
|
||||
if (jme_rxsum_ok(jme, rxdesc->descwb.flags))
|
||||
if (jme_rxsum_ok(jme, le16_to_cpu(rxdesc->descwb.flags)))
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
else
|
||||
skb->ip_summed = CHECKSUM_NONE;
|
||||
|
||||
if (rxdesc->descwb.flags & RXWBFLAG_TAGON) {
|
||||
if (rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_TAGON)) {
|
||||
if (jme->vlgrp) {
|
||||
jme->jme_vlan_rx(skb, jme->vlgrp,
|
||||
le32_to_cpu(rxdesc->descwb.vlan));
|
||||
le16_to_cpu(rxdesc->descwb.vlan));
|
||||
NET_STAT(jme).rx_bytes += 4;
|
||||
}
|
||||
} else {
|
||||
jme->jme_rx(skb);
|
||||
}
|
||||
|
||||
if ((le16_to_cpu(rxdesc->descwb.flags) & RXWBFLAG_DEST) ==
|
||||
RXWBFLAG_DEST_MUL)
|
||||
if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_DEST)) ==
|
||||
cpu_to_le16(RXWBFLAG_DEST_MUL))
|
||||
++(NET_STAT(jme).multicast);
|
||||
|
||||
jme->dev->last_rx = jiffies;
|
||||
|
@ -961,7 +961,7 @@ jme_process_receive(struct jme_adapter *jme, int limit)
|
|||
rxdesc = rxring->desc;
|
||||
rxdesc += i;
|
||||
|
||||
if ((rxdesc->descwb.flags & RXWBFLAG_OWN) ||
|
||||
if ((rxdesc->descwb.flags & cpu_to_le16(RXWBFLAG_OWN)) ||
|
||||
!(rxdesc->descwb.desccnt & RXWBDCNT_WBCPL))
|
||||
goto out;
|
||||
|
||||
|
@ -1763,10 +1763,9 @@ jme_expand_header(struct jme_adapter *jme, struct sk_buff *skb)
|
|||
}
|
||||
|
||||
static int
|
||||
jme_tx_tso(struct sk_buff *skb,
|
||||
u16 *mss, u8 *flags)
|
||||
jme_tx_tso(struct sk_buff *skb, __le16 *mss, u8 *flags)
|
||||
{
|
||||
*mss = skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT;
|
||||
*mss = cpu_to_le16(skb_shinfo(skb)->gso_size << TXDESC_MSS_SHIFT);
|
||||
if (*mss) {
|
||||
*flags |= TXFLAG_LSEN;
|
||||
|
||||
|
@ -1826,11 +1825,11 @@ jme_tx_csum(struct jme_adapter *jme, struct sk_buff *skb, u8 *flags)
|
|||
}
|
||||
|
||||
static inline void
|
||||
jme_tx_vlan(struct sk_buff *skb, u16 *vlan, u8 *flags)
|
||||
jme_tx_vlan(struct sk_buff *skb, __le16 *vlan, u8 *flags)
|
||||
{
|
||||
if (vlan_tx_tag_present(skb)) {
|
||||
*flags |= TXFLAG_TAGON;
|
||||
*vlan = vlan_tx_tag_get(skb);
|
||||
*vlan = cpu_to_le16(vlan_tx_tag_get(skb));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -656,10 +656,10 @@ static int mlx4_en_start_port(struct net_device *dev)
|
|||
/* Configure port */
|
||||
err = mlx4_SET_PORT_general(mdev->dev, priv->port,
|
||||
priv->rx_skb_size + ETH_FCS_LEN,
|
||||
mdev->profile.tx_pause,
|
||||
mdev->profile.tx_ppp,
|
||||
mdev->profile.rx_pause,
|
||||
mdev->profile.rx_ppp);
|
||||
priv->prof->tx_pause,
|
||||
priv->prof->tx_ppp,
|
||||
priv->prof->rx_pause,
|
||||
priv->prof->rx_ppp);
|
||||
if (err) {
|
||||
mlx4_err(mdev, "Failed setting port general configurations"
|
||||
" for port %d, with error %d\n", priv->port, err);
|
||||
|
|
|
@ -90,6 +90,7 @@ MLX4_EN_PARM_INT(rx_ring_size2, MLX4_EN_AUTO_CONF, "Rx ring size for port 2");
|
|||
int mlx4_en_get_profile(struct mlx4_en_dev *mdev)
|
||||
{
|
||||
struct mlx4_en_profile *params = &mdev->profile;
|
||||
int i;
|
||||
|
||||
params->rx_moder_cnt = min_t(int, rx_moder_cnt, MLX4_EN_AUTO_CONF);
|
||||
params->rx_moder_time = min_t(int, rx_moder_time, MLX4_EN_AUTO_CONF);
|
||||
|
@ -97,11 +98,13 @@ int mlx4_en_get_profile(struct mlx4_en_dev *mdev)
|
|||
params->rss_xor = (rss_xor != 0);
|
||||
params->rss_mask = rss_mask & 0x1f;
|
||||
params->num_lro = min_t(int, num_lro , MLX4_EN_MAX_LRO_DESCRIPTORS);
|
||||
params->rx_pause = pprx;
|
||||
params->rx_ppp = pfcrx;
|
||||
params->tx_pause = pptx;
|
||||
params->tx_ppp = pfctx;
|
||||
if (params->rx_ppp || params->tx_ppp) {
|
||||
for (i = 1; i <= MLX4_MAX_PORTS; i++) {
|
||||
params->prof[i].rx_pause = pprx;
|
||||
params->prof[i].rx_ppp = pfcrx;
|
||||
params->prof[i].tx_pause = pptx;
|
||||
params->prof[i].tx_ppp = pfctx;
|
||||
}
|
||||
if (pfcrx || pfctx) {
|
||||
params->prof[1].tx_ring_num = MLX4_EN_TX_RING_NUM;
|
||||
params->prof[2].tx_ring_num = MLX4_EN_TX_RING_NUM;
|
||||
} else {
|
||||
|
@ -407,14 +410,14 @@ static int mlx4_en_set_pauseparam(struct net_device *dev,
|
|||
struct mlx4_en_dev *mdev = priv->mdev;
|
||||
int err;
|
||||
|
||||
mdev->profile.tx_pause = pause->tx_pause != 0;
|
||||
mdev->profile.rx_pause = pause->rx_pause != 0;
|
||||
priv->prof->tx_pause = pause->tx_pause != 0;
|
||||
priv->prof->rx_pause = pause->rx_pause != 0;
|
||||
err = mlx4_SET_PORT_general(mdev->dev, priv->port,
|
||||
priv->rx_skb_size + ETH_FCS_LEN,
|
||||
mdev->profile.tx_pause,
|
||||
mdev->profile.tx_ppp,
|
||||
mdev->profile.rx_pause,
|
||||
mdev->profile.rx_ppp);
|
||||
priv->prof->tx_pause,
|
||||
priv->prof->tx_ppp,
|
||||
priv->prof->rx_pause,
|
||||
priv->prof->rx_ppp);
|
||||
if (err)
|
||||
mlx4_err(mdev, "Failed setting pause params to\n");
|
||||
|
||||
|
@ -425,10 +428,9 @@ static void mlx4_en_get_pauseparam(struct net_device *dev,
|
|||
struct ethtool_pauseparam *pause)
|
||||
{
|
||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||
struct mlx4_en_dev *mdev = priv->mdev;
|
||||
|
||||
pause->tx_pause = mdev->profile.tx_pause;
|
||||
pause->rx_pause = mdev->profile.rx_pause;
|
||||
pause->tx_pause = priv->prof->tx_pause;
|
||||
pause->rx_pause = priv->prof->rx_pause;
|
||||
}
|
||||
|
||||
static void mlx4_en_get_ringparam(struct net_device *dev,
|
||||
|
|
|
@ -322,6 +322,10 @@ struct mlx4_en_port_profile {
|
|||
u32 rx_ring_num;
|
||||
u32 tx_ring_size;
|
||||
u32 rx_ring_size;
|
||||
u8 rx_pause;
|
||||
u8 rx_ppp;
|
||||
u8 tx_pause;
|
||||
u8 tx_ppp;
|
||||
};
|
||||
|
||||
struct mlx4_en_profile {
|
||||
|
@ -333,10 +337,6 @@ struct mlx4_en_profile {
|
|||
int rx_moder_cnt;
|
||||
int rx_moder_time;
|
||||
int auto_moder;
|
||||
u8 rx_pause;
|
||||
u8 rx_ppp;
|
||||
u8 tx_pause;
|
||||
u8 tx_ppp;
|
||||
u8 no_reset;
|
||||
struct mlx4_en_port_profile prof[MLX4_MAX_PORTS + 1];
|
||||
};
|
||||
|
|
|
@ -899,7 +899,8 @@ static int txq_reclaim(struct tx_queue *txq, int budget, int force)
|
|||
if (skb != NULL) {
|
||||
if (skb_queue_len(&mp->rx_recycle) <
|
||||
mp->default_rx_ring_size &&
|
||||
skb_recycle_check(skb, mp->skb_size))
|
||||
skb_recycle_check(skb, mp->skb_size +
|
||||
dma_get_cache_alignment() - 1))
|
||||
__skb_queue_head(&mp->rx_recycle, skb);
|
||||
else
|
||||
dev_kfree_skb(skb);
|
||||
|
@ -2435,8 +2436,8 @@ static int mv643xx_eth_shared_remove(struct platform_device *pdev)
|
|||
struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data;
|
||||
|
||||
if (pd == NULL || pd->shared_smi == NULL) {
|
||||
mdiobus_free(msp->smi_bus);
|
||||
mdiobus_unregister(msp->smi_bus);
|
||||
mdiobus_free(msp->smi_bus);
|
||||
}
|
||||
if (msp->err_interrupt != NO_IRQ)
|
||||
free_irq(msp->err_interrupt, msp);
|
||||
|
|
|
@ -33,8 +33,8 @@
|
|||
|
||||
#define DRV_MODULE_NAME "niu"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "0.9"
|
||||
#define DRV_MODULE_RELDATE "May 4, 2008"
|
||||
#define DRV_MODULE_VERSION "1.0"
|
||||
#define DRV_MODULE_RELDATE "Nov 14, 2008"
|
||||
|
||||
static char version[] __devinitdata =
|
||||
DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
|
||||
|
@ -406,7 +406,7 @@ static int esr2_set_rx_cfg(struct niu *np, unsigned long channel, u32 val)
|
|||
}
|
||||
|
||||
/* Mode is always 10G fiber. */
|
||||
static int serdes_init_niu(struct niu *np)
|
||||
static int serdes_init_niu_10g_fiber(struct niu *np)
|
||||
{
|
||||
struct niu_link_config *lp = &np->link_config;
|
||||
u32 tx_cfg, rx_cfg;
|
||||
|
@ -443,6 +443,223 @@ static int serdes_init_niu(struct niu *np)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int serdes_init_niu_1g_serdes(struct niu *np)
|
||||
{
|
||||
struct niu_link_config *lp = &np->link_config;
|
||||
u16 pll_cfg, pll_sts;
|
||||
int max_retry = 100;
|
||||
u64 sig, mask, val;
|
||||
u32 tx_cfg, rx_cfg;
|
||||
unsigned long i;
|
||||
int err;
|
||||
|
||||
tx_cfg = (PLL_TX_CFG_ENTX | PLL_TX_CFG_SWING_1375MV |
|
||||
PLL_TX_CFG_RATE_HALF);
|
||||
rx_cfg = (PLL_RX_CFG_ENRX | PLL_RX_CFG_TERM_0P8VDDT |
|
||||
PLL_RX_CFG_ALIGN_ENA | PLL_RX_CFG_LOS_LTHRESH |
|
||||
PLL_RX_CFG_RATE_HALF);
|
||||
|
||||
if (np->port == 0)
|
||||
rx_cfg |= PLL_RX_CFG_EQ_LP_ADAPTIVE;
|
||||
|
||||
if (lp->loopback_mode == LOOPBACK_PHY) {
|
||||
u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS;
|
||||
|
||||
mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
|
||||
ESR2_TI_PLL_TEST_CFG_L, test_cfg);
|
||||
|
||||
tx_cfg |= PLL_TX_CFG_ENTEST;
|
||||
rx_cfg |= PLL_RX_CFG_ENTEST;
|
||||
}
|
||||
|
||||
/* Initialize PLL for 1G */
|
||||
pll_cfg = (PLL_CFG_ENPLL | PLL_CFG_MPY_8X);
|
||||
|
||||
err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
|
||||
ESR2_TI_PLL_CFG_L, pll_cfg);
|
||||
if (err) {
|
||||
dev_err(np->device, PFX "NIU Port %d "
|
||||
"serdes_init_niu_1g_serdes: "
|
||||
"mdio write to ESR2_TI_PLL_CFG_L failed", np->port);
|
||||
return err;
|
||||
}
|
||||
|
||||
pll_sts = PLL_CFG_ENPLL;
|
||||
|
||||
err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
|
||||
ESR2_TI_PLL_STS_L, pll_sts);
|
||||
if (err) {
|
||||
dev_err(np->device, PFX "NIU Port %d "
|
||||
"serdes_init_niu_1g_serdes: "
|
||||
"mdio write to ESR2_TI_PLL_STS_L failed", np->port);
|
||||
return err;
|
||||
}
|
||||
|
||||
udelay(200);
|
||||
|
||||
/* Initialize all 4 lanes of the SERDES. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
err = esr2_set_tx_cfg(np, i, tx_cfg);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
err = esr2_set_rx_cfg(np, i, rx_cfg);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
switch (np->port) {
|
||||
case 0:
|
||||
val = (ESR_INT_SRDY0_P0 | ESR_INT_DET0_P0);
|
||||
mask = val;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
val = (ESR_INT_SRDY0_P1 | ESR_INT_DET0_P1);
|
||||
mask = val;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
while (max_retry--) {
|
||||
sig = nr64(ESR_INT_SIGNALS);
|
||||
if ((sig & mask) == val)
|
||||
break;
|
||||
|
||||
mdelay(500);
|
||||
}
|
||||
|
||||
if ((sig & mask) != val) {
|
||||
dev_err(np->device, PFX "Port %u signal bits [%08x] are not "
|
||||
"[%08x]\n", np->port, (int) (sig & mask), (int) val);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int serdes_init_niu_10g_serdes(struct niu *np)
|
||||
{
|
||||
struct niu_link_config *lp = &np->link_config;
|
||||
u32 tx_cfg, rx_cfg, pll_cfg, pll_sts;
|
||||
int max_retry = 100;
|
||||
u64 sig, mask, val;
|
||||
unsigned long i;
|
||||
int err;
|
||||
|
||||
tx_cfg = (PLL_TX_CFG_ENTX | PLL_TX_CFG_SWING_1375MV);
|
||||
rx_cfg = (PLL_RX_CFG_ENRX | PLL_RX_CFG_TERM_0P8VDDT |
|
||||
PLL_RX_CFG_ALIGN_ENA | PLL_RX_CFG_LOS_LTHRESH |
|
||||
PLL_RX_CFG_EQ_LP_ADAPTIVE);
|
||||
|
||||
if (lp->loopback_mode == LOOPBACK_PHY) {
|
||||
u16 test_cfg = PLL_TEST_CFG_LOOPBACK_CML_DIS;
|
||||
|
||||
mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
|
||||
ESR2_TI_PLL_TEST_CFG_L, test_cfg);
|
||||
|
||||
tx_cfg |= PLL_TX_CFG_ENTEST;
|
||||
rx_cfg |= PLL_RX_CFG_ENTEST;
|
||||
}
|
||||
|
||||
/* Initialize PLL for 10G */
|
||||
pll_cfg = (PLL_CFG_ENPLL | PLL_CFG_MPY_10X);
|
||||
|
||||
err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
|
||||
ESR2_TI_PLL_CFG_L, pll_cfg & 0xffff);
|
||||
if (err) {
|
||||
dev_err(np->device, PFX "NIU Port %d "
|
||||
"serdes_init_niu_10g_serdes: "
|
||||
"mdio write to ESR2_TI_PLL_CFG_L failed", np->port);
|
||||
return err;
|
||||
}
|
||||
|
||||
pll_sts = PLL_CFG_ENPLL;
|
||||
|
||||
err = mdio_write(np, np->port, NIU_ESR2_DEV_ADDR,
|
||||
ESR2_TI_PLL_STS_L, pll_sts & 0xffff);
|
||||
if (err) {
|
||||
dev_err(np->device, PFX "NIU Port %d "
|
||||
"serdes_init_niu_10g_serdes: "
|
||||
"mdio write to ESR2_TI_PLL_STS_L failed", np->port);
|
||||
return err;
|
||||
}
|
||||
|
||||
udelay(200);
|
||||
|
||||
/* Initialize all 4 lanes of the SERDES. */
|
||||
for (i = 0; i < 4; i++) {
|
||||
err = esr2_set_tx_cfg(np, i, tx_cfg);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
err = esr2_set_rx_cfg(np, i, rx_cfg);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* check if serdes is ready */
|
||||
|
||||
switch (np->port) {
|
||||
case 0:
|
||||
mask = ESR_INT_SIGNALS_P0_BITS;
|
||||
val = (ESR_INT_SRDY0_P0 |
|
||||
ESR_INT_DET0_P0 |
|
||||
ESR_INT_XSRDY_P0 |
|
||||
ESR_INT_XDP_P0_CH3 |
|
||||
ESR_INT_XDP_P0_CH2 |
|
||||
ESR_INT_XDP_P0_CH1 |
|
||||
ESR_INT_XDP_P0_CH0);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
mask = ESR_INT_SIGNALS_P1_BITS;
|
||||
val = (ESR_INT_SRDY0_P1 |
|
||||
ESR_INT_DET0_P1 |
|
||||
ESR_INT_XSRDY_P1 |
|
||||
ESR_INT_XDP_P1_CH3 |
|
||||
ESR_INT_XDP_P1_CH2 |
|
||||
ESR_INT_XDP_P1_CH1 |
|
||||
ESR_INT_XDP_P1_CH0);
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
while (max_retry--) {
|
||||
sig = nr64(ESR_INT_SIGNALS);
|
||||
if ((sig & mask) == val)
|
||||
break;
|
||||
|
||||
mdelay(500);
|
||||
}
|
||||
|
||||
if ((sig & mask) != val) {
|
||||
pr_info(PFX "NIU Port %u signal bits [%08x] are not "
|
||||
"[%08x] for 10G...trying 1G\n",
|
||||
np->port, (int) (sig & mask), (int) val);
|
||||
|
||||
/* 10G failed, try initializing at 1G */
|
||||
err = serdes_init_niu_1g_serdes(np);
|
||||
if (!err) {
|
||||
np->flags &= ~NIU_FLAGS_10G;
|
||||
np->mac_xcvr = MAC_XCVR_PCS;
|
||||
} else {
|
||||
dev_err(np->device, PFX "Port %u 10G/1G SERDES "
|
||||
"Link Failed \n", np->port);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int esr_read_rxtx_ctrl(struct niu *np, unsigned long chan, u32 *val)
|
||||
{
|
||||
int err;
|
||||
|
@ -1954,13 +2171,23 @@ static const struct niu_phy_ops phy_ops_10g_serdes = {
|
|||
.link_status = link_status_10g_serdes,
|
||||
};
|
||||
|
||||
static const struct niu_phy_ops phy_ops_10g_serdes_niu = {
|
||||
.serdes_init = serdes_init_niu_10g_serdes,
|
||||
.link_status = link_status_10g_serdes,
|
||||
};
|
||||
|
||||
static const struct niu_phy_ops phy_ops_1g_serdes_niu = {
|
||||
.serdes_init = serdes_init_niu_1g_serdes,
|
||||
.link_status = link_status_1g_serdes,
|
||||
};
|
||||
|
||||
static const struct niu_phy_ops phy_ops_1g_rgmii = {
|
||||
.xcvr_init = xcvr_init_1g_rgmii,
|
||||
.link_status = link_status_1g_rgmii,
|
||||
};
|
||||
|
||||
static const struct niu_phy_ops phy_ops_10g_fiber_niu = {
|
||||
.serdes_init = serdes_init_niu,
|
||||
.serdes_init = serdes_init_niu_10g_fiber,
|
||||
.xcvr_init = xcvr_init_10g,
|
||||
.link_status = link_status_10g,
|
||||
};
|
||||
|
@ -1998,11 +2225,21 @@ struct niu_phy_template {
|
|||
u32 phy_addr_base;
|
||||
};
|
||||
|
||||
static const struct niu_phy_template phy_template_niu = {
|
||||
static const struct niu_phy_template phy_template_niu_10g_fiber = {
|
||||
.ops = &phy_ops_10g_fiber_niu,
|
||||
.phy_addr_base = 16,
|
||||
};
|
||||
|
||||
static const struct niu_phy_template phy_template_niu_10g_serdes = {
|
||||
.ops = &phy_ops_10g_serdes_niu,
|
||||
.phy_addr_base = 0,
|
||||
};
|
||||
|
||||
static const struct niu_phy_template phy_template_niu_1g_serdes = {
|
||||
.ops = &phy_ops_1g_serdes_niu,
|
||||
.phy_addr_base = 0,
|
||||
};
|
||||
|
||||
static const struct niu_phy_template phy_template_10g_fiber = {
|
||||
.ops = &phy_ops_10g_fiber,
|
||||
.phy_addr_base = 8,
|
||||
|
@ -2182,8 +2419,25 @@ static int niu_determine_phy_disposition(struct niu *np)
|
|||
u32 phy_addr_off = 0;
|
||||
|
||||
if (plat_type == PLAT_TYPE_NIU) {
|
||||
tp = &phy_template_niu;
|
||||
phy_addr_off += np->port;
|
||||
switch (np->flags &
|
||||
(NIU_FLAGS_10G |
|
||||
NIU_FLAGS_FIBER |
|
||||
NIU_FLAGS_XCVR_SERDES)) {
|
||||
case NIU_FLAGS_10G | NIU_FLAGS_XCVR_SERDES:
|
||||
/* 10G Serdes */
|
||||
tp = &phy_template_niu_10g_serdes;
|
||||
break;
|
||||
case NIU_FLAGS_XCVR_SERDES:
|
||||
/* 1G Serdes */
|
||||
tp = &phy_template_niu_1g_serdes;
|
||||
break;
|
||||
case NIU_FLAGS_10G | NIU_FLAGS_FIBER:
|
||||
/* 10G Fiber */
|
||||
default:
|
||||
tp = &phy_template_niu_10g_fiber;
|
||||
phy_addr_off += np->port;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (np->flags &
|
||||
(NIU_FLAGS_10G |
|
||||
|
@ -7213,6 +7467,12 @@ static int __devinit niu_phy_type_prop_decode(struct niu *np,
|
|||
np->flags |= NIU_FLAGS_10G;
|
||||
np->flags &= ~NIU_FLAGS_FIBER;
|
||||
np->mac_xcvr = MAC_XCVR_XPCS;
|
||||
} else if (!strcmp(phy_prop, "xgsd") || !strcmp(phy_prop, "gsd")) {
|
||||
/* 10G Serdes or 1G Serdes, default to 10G */
|
||||
np->flags |= NIU_FLAGS_10G;
|
||||
np->flags &= ~NIU_FLAGS_FIBER;
|
||||
np->flags |= NIU_FLAGS_XCVR_SERDES;
|
||||
np->mac_xcvr = MAC_XCVR_XPCS;
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -7741,6 +8001,8 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent)
|
|||
u32 val;
|
||||
int err;
|
||||
|
||||
num_10g = num_1g = 0;
|
||||
|
||||
if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) ||
|
||||
!strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) {
|
||||
num_10g = 0;
|
||||
|
@ -7757,6 +8019,16 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent)
|
|||
parent->num_ports = 2;
|
||||
val = (phy_encode(PORT_TYPE_10G, 0) |
|
||||
phy_encode(PORT_TYPE_10G, 1));
|
||||
} else if ((np->flags & NIU_FLAGS_XCVR_SERDES) &&
|
||||
(parent->plat_type == PLAT_TYPE_NIU)) {
|
||||
/* this is the Monza case */
|
||||
if (np->flags & NIU_FLAGS_10G) {
|
||||
val = (phy_encode(PORT_TYPE_10G, 0) |
|
||||
phy_encode(PORT_TYPE_10G, 1));
|
||||
} else {
|
||||
val = (phy_encode(PORT_TYPE_1G, 0) |
|
||||
phy_encode(PORT_TYPE_1G, 1));
|
||||
}
|
||||
} else {
|
||||
err = fill_phy_probe_info(np, parent, info);
|
||||
if (err)
|
||||
|
@ -8656,7 +8928,9 @@ static void __devinit niu_device_announce(struct niu *np)
|
|||
dev->name,
|
||||
(np->flags & NIU_FLAGS_XMAC ? "XMAC" : "BMAC"),
|
||||
(np->flags & NIU_FLAGS_10G ? "10G" : "1G"),
|
||||
(np->flags & NIU_FLAGS_FIBER ? "FIBER" : "COPPER"),
|
||||
(np->flags & NIU_FLAGS_FIBER ? "FIBER" :
|
||||
(np->flags & NIU_FLAGS_XCVR_SERDES ? "SERDES" :
|
||||
"COPPER")),
|
||||
(np->mac_xcvr == MAC_XCVR_MII ? "MII" :
|
||||
(np->mac_xcvr == MAC_XCVR_PCS ? "PCS" : "XPCS")),
|
||||
np->vpd.phy_type);
|
||||
|
|
|
@ -1048,6 +1048,13 @@
|
|||
#define PLL_CFG_LD_SHIFT 8
|
||||
#define PLL_CFG_MPY 0x0000001e
|
||||
#define PLL_CFG_MPY_SHIFT 1
|
||||
#define PLL_CFG_MPY_4X 0x0
|
||||
#define PLL_CFG_MPY_5X 0x00000002
|
||||
#define PLL_CFG_MPY_6X 0x00000004
|
||||
#define PLL_CFG_MPY_8X 0x00000008
|
||||
#define PLL_CFG_MPY_10X 0x0000000a
|
||||
#define PLL_CFG_MPY_12X 0x0000000c
|
||||
#define PLL_CFG_MPY_12P5X 0x0000000e
|
||||
#define PLL_CFG_ENPLL 0x00000001
|
||||
|
||||
#define ESR2_TI_PLL_STS_L (ESR2_BASE + 0x002)
|
||||
|
@ -1093,6 +1100,9 @@
|
|||
#define PLL_TX_CFG_INVPAIR 0x00000080
|
||||
#define PLL_TX_CFG_RATE 0x00000060
|
||||
#define PLL_TX_CFG_RATE_SHIFT 5
|
||||
#define PLL_TX_CFG_RATE_FULL 0x0
|
||||
#define PLL_TX_CFG_RATE_HALF 0x20
|
||||
#define PLL_TX_CFG_RATE_QUAD 0x40
|
||||
#define PLL_TX_CFG_BUSWIDTH 0x0000001c
|
||||
#define PLL_TX_CFG_BUSWIDTH_SHIFT 2
|
||||
#define PLL_TX_CFG_ENTEST 0x00000002
|
||||
|
@ -1132,6 +1142,9 @@
|
|||
#define PLL_RX_CFG_INVPAIR 0x00000080
|
||||
#define PLL_RX_CFG_RATE 0x00000060
|
||||
#define PLL_RX_CFG_RATE_SHIFT 5
|
||||
#define PLL_RX_CFG_RATE_FULL 0x0
|
||||
#define PLL_RX_CFG_RATE_HALF 0x20
|
||||
#define PLL_RX_CFG_RATE_QUAD 0x40
|
||||
#define PLL_RX_CFG_BUSWIDTH 0x0000001c
|
||||
#define PLL_RX_CFG_BUSWIDTH_SHIFT 2
|
||||
#define PLL_RX_CFG_ENTEST 0x00000002
|
||||
|
|
|
@ -227,6 +227,59 @@ static int m88e1111_config_init(struct phy_device *phydev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int m88e1118_config_aneg(struct phy_device *phydev)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = phy_write(phydev, MII_BMCR, BMCR_RESET);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = phy_write(phydev, MII_M1011_PHY_SCR,
|
||||
MII_M1011_PHY_SCR_AUTO_CROSS);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = genphy_config_aneg(phydev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88e1118_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int err;
|
||||
|
||||
/* Change address */
|
||||
err = phy_write(phydev, 0x16, 0x0002);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Enable 1000 Mbit */
|
||||
err = phy_write(phydev, 0x15, 0x1070);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Change address */
|
||||
err = phy_write(phydev, 0x16, 0x0003);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Adjust LED Control */
|
||||
err = phy_write(phydev, 0x10, 0x021e);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* Reset address */
|
||||
err = phy_write(phydev, 0x16, 0x0);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = phy_write(phydev, MII_BMCR, BMCR_RESET);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int m88e1145_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int err;
|
||||
|
@ -415,6 +468,19 @@ static struct phy_driver marvell_drivers[] = {
|
|||
.config_intr = &marvell_config_intr,
|
||||
.driver = { .owner = THIS_MODULE },
|
||||
},
|
||||
{
|
||||
.phy_id = 0x01410e10,
|
||||
.phy_id_mask = 0xfffffff0,
|
||||
.name = "Marvell 88E1118",
|
||||
.features = PHY_GBIT_FEATURES,
|
||||
.flags = PHY_HAS_INTERRUPT,
|
||||
.config_init = &m88e1118_config_init,
|
||||
.config_aneg = &m88e1118_config_aneg,
|
||||
.read_status = &genphy_read_status,
|
||||
.ack_interrupt = &marvell_ack_interrupt,
|
||||
.config_intr = &marvell_config_intr,
|
||||
.driver = {.owner = THIS_MODULE,},
|
||||
},
|
||||
{
|
||||
.phy_id = 0x01410cd0,
|
||||
.phy_id_mask = 0xfffffff0,
|
||||
|
|
|
@ -136,7 +136,7 @@ void mdiobus_unregister(struct mii_bus *bus)
|
|||
BUG_ON(bus->state != MDIOBUS_REGISTERED);
|
||||
bus->state = MDIOBUS_UNREGISTERED;
|
||||
|
||||
device_unregister(&bus->dev);
|
||||
device_del(&bus->dev);
|
||||
for (i = 0; i < PHY_MAX_ADDR; i++) {
|
||||
if (bus->phy_map[i])
|
||||
device_unregister(&bus->phy_map[i]->dev);
|
||||
|
|
|
@ -227,8 +227,8 @@ struct phy_device * get_phy_device(struct mii_bus *bus, int addr)
|
|||
if (r)
|
||||
return ERR_PTR(r);
|
||||
|
||||
/* If the phy_id is all Fs, there is no device there */
|
||||
if (0xffffffff == phy_id)
|
||||
/* If the phy_id is all Fs or all 0s, there is no device there */
|
||||
if ((0xffff == phy_id) || (0x00 == phy_id))
|
||||
return NULL;
|
||||
|
||||
dev = phy_device_create(bus, addr, phy_id);
|
||||
|
@ -564,20 +564,32 @@ EXPORT_SYMBOL(genphy_restart_aneg);
|
|||
*/
|
||||
int genphy_config_aneg(struct phy_device *phydev)
|
||||
{
|
||||
int result = 0;
|
||||
int result;
|
||||
|
||||
if (AUTONEG_ENABLE == phydev->autoneg) {
|
||||
int result = genphy_config_advert(phydev);
|
||||
if (AUTONEG_ENABLE != phydev->autoneg)
|
||||
return genphy_setup_forced(phydev);
|
||||
|
||||
if (result < 0) /* error */
|
||||
return result;
|
||||
result = genphy_config_advert(phydev);
|
||||
|
||||
/* Only restart aneg if we are advertising something different
|
||||
* than we were before. */
|
||||
if (result > 0)
|
||||
result = genphy_restart_aneg(phydev);
|
||||
} else
|
||||
result = genphy_setup_forced(phydev);
|
||||
if (result < 0) /* error */
|
||||
return result;
|
||||
|
||||
if (result == 0) {
|
||||
/* Advertisment hasn't changed, but maybe aneg was never on to
|
||||
* begin with? Or maybe phy was isolated? */
|
||||
int ctl = phy_read(phydev, MII_BMCR);
|
||||
|
||||
if (ctl < 0)
|
||||
return ctl;
|
||||
|
||||
if (!(ctl & BMCR_ANENABLE) || (ctl & BMCR_ISOLATE))
|
||||
result = 1; /* do restart aneg */
|
||||
}
|
||||
|
||||
/* Only restart aneg if we are advertising something different
|
||||
* than we were before. */
|
||||
if (result > 0)
|
||||
result = genphy_restart_aneg(phydev);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -1515,9 +1515,6 @@ static u32 ql_get_link_state(struct ql3_adapter *qdev)
|
|||
linkState = LS_UP;
|
||||
} else {
|
||||
linkState = LS_DOWN;
|
||||
if (netif_msg_link(qdev))
|
||||
printk(KERN_WARNING PFX
|
||||
"%s: Link is down.\n", qdev->ndev->name);
|
||||
}
|
||||
return linkState;
|
||||
}
|
||||
|
@ -1581,10 +1578,6 @@ static int ql_finish_auto_neg(struct ql3_adapter *qdev)
|
|||
ql_mac_enable(qdev, 1);
|
||||
}
|
||||
|
||||
if (netif_msg_link(qdev))
|
||||
printk(KERN_DEBUG PFX
|
||||
"%s: Change port_link_state LS_DOWN to LS_UP.\n",
|
||||
qdev->ndev->name);
|
||||
qdev->port_link_state = LS_UP;
|
||||
netif_start_queue(qdev->ndev);
|
||||
netif_carrier_on(qdev->ndev);
|
||||
|
@ -1655,14 +1648,9 @@ static void ql_link_state_machine_work(struct work_struct *work)
|
|||
/* Fall Through */
|
||||
|
||||
case LS_DOWN:
|
||||
if (netif_msg_link(qdev))
|
||||
printk(KERN_DEBUG PFX
|
||||
"%s: port_link_state = LS_DOWN.\n",
|
||||
qdev->ndev->name);
|
||||
if (curr_link_state == LS_UP) {
|
||||
if (netif_msg_link(qdev))
|
||||
printk(KERN_DEBUG PFX
|
||||
"%s: curr_link_state = LS_UP.\n",
|
||||
printk(KERN_INFO PFX "%s: Link is up.\n",
|
||||
qdev->ndev->name);
|
||||
if (ql_is_auto_neg_complete(qdev))
|
||||
ql_finish_auto_neg(qdev);
|
||||
|
@ -1670,6 +1658,7 @@ static void ql_link_state_machine_work(struct work_struct *work)
|
|||
if (qdev->port_link_state == LS_UP)
|
||||
ql_link_down_detect_clear(qdev);
|
||||
|
||||
qdev->port_link_state = LS_UP;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -1678,12 +1667,14 @@ static void ql_link_state_machine_work(struct work_struct *work)
|
|||
* See if the link is currently down or went down and came
|
||||
* back up
|
||||
*/
|
||||
if ((curr_link_state == LS_DOWN) || ql_link_down_detect(qdev)) {
|
||||
if (curr_link_state == LS_DOWN) {
|
||||
if (netif_msg_link(qdev))
|
||||
printk(KERN_INFO PFX "%s: Link is down.\n",
|
||||
qdev->ndev->name);
|
||||
qdev->port_link_state = LS_DOWN;
|
||||
}
|
||||
if (ql_link_down_detect(qdev))
|
||||
qdev->port_link_state = LS_DOWN;
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&qdev->hw_lock, hw_flags);
|
||||
|
|
|
@ -927,7 +927,7 @@ static int sh_eth_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
|||
struct sh_eth_private *mdp = netdev_priv(ndev);
|
||||
struct sh_eth_txdesc *txdesc;
|
||||
u32 entry;
|
||||
int flags;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&mdp->lock, flags);
|
||||
if ((mdp->cur_tx - mdp->dirty_tx) >= (TX_RING_SIZE - 4)) {
|
||||
|
@ -1141,7 +1141,7 @@ static int sh_mdio_init(struct net_device *ndev, int id)
|
|||
/* Hook up MII support for ethtool */
|
||||
mdp->mii_bus->name = "sh_mii";
|
||||
mdp->mii_bus->parent = &ndev->dev;
|
||||
mdp->mii_bus->id[0] = id;
|
||||
snprintf(mdp->mii_bus->id, MII_BUS_ID_SIZE, "%x", id);
|
||||
|
||||
/* PHY IRQ */
|
||||
mdp->mii_bus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue