mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 22:52:35 +02:00
Merge remote-tracking branch 'stable/linux-3.0.y' into develop-3.0-jb
Conflicts: drivers/net/usb/asix.c drivers/net/wireless/iwlwifi/iwl-agn-rs.c drivers/usb/serial/option.c
This commit is contained in:
commit
a2ad9f9801
|
|
@ -218,16 +218,16 @@ The development process
|
|||
Linux kernel development process currently consists of a few different
|
||||
main kernel "branches" and lots of different subsystem-specific kernel
|
||||
branches. These different branches are:
|
||||
- main 2.6.x kernel tree
|
||||
- 2.6.x.y -stable kernel tree
|
||||
- 2.6.x -git kernel patches
|
||||
- main 3.x kernel tree
|
||||
- 3.x.y -stable kernel tree
|
||||
- 3.x -git kernel patches
|
||||
- subsystem specific kernel trees and patches
|
||||
- the 2.6.x -next kernel tree for integration tests
|
||||
- the 3.x -next kernel tree for integration tests
|
||||
|
||||
2.6.x kernel tree
|
||||
3.x kernel tree
|
||||
-----------------
|
||||
2.6.x kernels are maintained by Linus Torvalds, and can be found on
|
||||
kernel.org in the pub/linux/kernel/v2.6/ directory. Its development
|
||||
3.x kernels are maintained by Linus Torvalds, and can be found on
|
||||
kernel.org in the pub/linux/kernel/v3.x/ directory. Its development
|
||||
process is as follows:
|
||||
- As soon as a new kernel is released a two weeks window is open,
|
||||
during this period of time maintainers can submit big diffs to
|
||||
|
|
@ -262,20 +262,20 @@ mailing list about kernel releases:
|
|||
released according to perceived bug status, not according to a
|
||||
preconceived timeline."
|
||||
|
||||
2.6.x.y -stable kernel tree
|
||||
3.x.y -stable kernel tree
|
||||
---------------------------
|
||||
Kernels with 4-part versions are -stable kernels. They contain
|
||||
Kernels with 3-part versions are -stable kernels. They contain
|
||||
relatively small and critical fixes for security problems or significant
|
||||
regressions discovered in a given 2.6.x kernel.
|
||||
regressions discovered in a given 3.x kernel.
|
||||
|
||||
This is the recommended branch for users who want the most recent stable
|
||||
kernel and are not interested in helping test development/experimental
|
||||
versions.
|
||||
|
||||
If no 2.6.x.y kernel is available, then the highest numbered 2.6.x
|
||||
If no 3.x.y kernel is available, then the highest numbered 3.x
|
||||
kernel is the current stable kernel.
|
||||
|
||||
2.6.x.y are maintained by the "stable" team <stable@vger.kernel.org>, and
|
||||
3.x.y are maintained by the "stable" team <stable@vger.kernel.org>, and
|
||||
are released as needs dictate. The normal release period is approximately
|
||||
two weeks, but it can be longer if there are no pressing problems. A
|
||||
security-related problem, instead, can cause a release to happen almost
|
||||
|
|
@ -285,7 +285,7 @@ The file Documentation/stable_kernel_rules.txt in the kernel tree
|
|||
documents what kinds of changes are acceptable for the -stable tree, and
|
||||
how the release process works.
|
||||
|
||||
2.6.x -git patches
|
||||
3.x -git patches
|
||||
------------------
|
||||
These are daily snapshots of Linus' kernel tree which are managed in a
|
||||
git repository (hence the name.) These patches are usually released
|
||||
|
|
@ -317,13 +317,13 @@ revisions to it, and maintainers can mark patches as under review,
|
|||
accepted, or rejected. Most of these patchwork sites are listed at
|
||||
http://patchwork.kernel.org/.
|
||||
|
||||
2.6.x -next kernel tree for integration tests
|
||||
3.x -next kernel tree for integration tests
|
||||
---------------------------------------------
|
||||
Before updates from subsystem trees are merged into the mainline 2.6.x
|
||||
Before updates from subsystem trees are merged into the mainline 3.x
|
||||
tree, they need to be integration-tested. For this purpose, a special
|
||||
testing repository exists into which virtually all subsystem trees are
|
||||
pulled on an almost daily basis:
|
||||
http://git.kernel.org/?p=linux/kernel/git/sfr/linux-next.git
|
||||
http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git
|
||||
http://linux.f-seidel.de/linux-next/pmwiki/
|
||||
|
||||
This way, the -next kernel gives a summary outlook onto what will be
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ tcp_adv_win_scale - INTEGER
|
|||
(if tcp_adv_win_scale > 0) or bytes-bytes/2^(-tcp_adv_win_scale),
|
||||
if it is <= 0.
|
||||
Possible values are [-31, 31], inclusive.
|
||||
Default: 2
|
||||
Default: 1
|
||||
|
||||
tcp_allowed_congestion_control - STRING
|
||||
Show/set the congestion control choices available to non-privileged
|
||||
|
|
@ -407,7 +407,7 @@ tcp_rmem - vector of 3 INTEGERs: min, default, max
|
|||
net.core.rmem_max. Calling setsockopt() with SO_RCVBUF disables
|
||||
automatic tuning of that socket's receive buffer size, in which
|
||||
case this value is ignored.
|
||||
Default: between 87380B and 4MB, depending on RAM size.
|
||||
Default: between 87380B and 6MB, depending on RAM size.
|
||||
|
||||
tcp_sack - BOOLEAN
|
||||
Enable select acknowledgments (SACKS).
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 0
|
||||
SUBLEVEL = 31
|
||||
SUBLEVEL = 36
|
||||
EXTRAVERSION =
|
||||
NAME = Sneaky Weasel
|
||||
|
||||
|
|
|
|||
|
|
@ -280,8 +280,6 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
|||
struct mm_struct *mm = &init_mm;
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
printk("CPU%u: Booted secondary processor\n", cpu);
|
||||
|
||||
/*
|
||||
* All kernel threads share the same mm context; grab a
|
||||
* reference and switch to it.
|
||||
|
|
@ -293,6 +291,8 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
|||
enter_lazy_tlb(mm, current);
|
||||
local_flush_tlb_all();
|
||||
|
||||
printk("CPU%u: Booted secondary processor\n", cpu);
|
||||
|
||||
cpu_init();
|
||||
preempt_disable();
|
||||
trace_hardirqs_off();
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
* Memory-mapped I/O on MX21ADS base board
|
||||
*/
|
||||
#define MX21ADS_MMIO_BASE_ADDR 0xf5000000
|
||||
#define MX21ADS_MMIO_SIZE SZ_16M
|
||||
#define MX21ADS_MMIO_SIZE 0xc00000
|
||||
|
||||
#define MX21ADS_REG_ADDR(offset) (void __force __iomem *) \
|
||||
(MX21ADS_MMIO_BASE_ADDR + (offset))
|
||||
|
|
|
|||
|
|
@ -65,8 +65,8 @@
|
|||
#define MPP8_GIGE MPP(8, 0x1, 0, 0, 1, 1, 1)
|
||||
|
||||
#define MPP9_UNUSED MPP(9, 0x0, 0, 0, 1, 1, 1)
|
||||
#define MPP9_GPIO MPP(9, 0x0, 0, 0, 1, 1, 1)
|
||||
#define MPP9_GIGE MPP(9, 0x1, 1, 1, 1, 1, 1)
|
||||
#define MPP9_GPIO MPP(9, 0x0, 1, 1, 1, 1, 1)
|
||||
#define MPP9_GIGE MPP(9, 0x1, 0, 0, 1, 1, 1)
|
||||
|
||||
#define MPP10_UNUSED MPP(10, 0x0, 0, 0, 1, 1, 1)
|
||||
#define MPP10_GPIO MPP(10, 0x0, 1, 1, 1, 1, 1)
|
||||
|
|
|
|||
|
|
@ -321,11 +321,12 @@
|
|||
#define __NR_syncfs 1329
|
||||
#define __NR_setns 1330
|
||||
#define __NR_sendmmsg 1331
|
||||
#define __NR_accept4 1334
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
||||
#define NR_syscalls 308 /* length of syscall table */
|
||||
#define NR_syscalls 311 /* length of syscall table */
|
||||
|
||||
/*
|
||||
* The following defines stop scripts/checksyscalls.sh from complaining about
|
||||
|
|
|
|||
|
|
@ -1777,6 +1777,9 @@ sys_call_table:
|
|||
data8 sys_syncfs
|
||||
data8 sys_setns // 1330
|
||||
data8 sys_sendmmsg
|
||||
data8 sys_ni_syscall /* process_vm_readv */
|
||||
data8 sys_ni_syscall /* process_vm_writev */
|
||||
data8 sys_accept4
|
||||
|
||||
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
|
||||
#endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
|
||||
|
|
|
|||
|
|
@ -21,7 +21,12 @@
|
|||
#define ARCH_HAS_PREFETCH
|
||||
static inline void prefetch(const void *addr)
|
||||
{
|
||||
__asm__("ldw 0(%0), %%r0" : : "r" (addr));
|
||||
__asm__(
|
||||
#ifndef CONFIG_PA20
|
||||
/* Need to avoid prefetch of NULL on PA7300LC */
|
||||
" extrw,u,= %0,31,32,%%r0\n"
|
||||
#endif
|
||||
" ldw 0(%0), %%r0" : : "r" (addr));
|
||||
}
|
||||
|
||||
/* LDD is a PA2.0 addition. */
|
||||
|
|
|
|||
|
|
@ -552,7 +552,7 @@
|
|||
* entry (identifying the physical page) and %r23 up with
|
||||
* the from tlb entry (or nothing if only a to entry---for
|
||||
* clear_user_page_asm) */
|
||||
.macro do_alias spc,tmp,tmp1,va,pte,prot,fault
|
||||
.macro do_alias spc,tmp,tmp1,va,pte,prot,fault,patype
|
||||
cmpib,COND(<>),n 0,\spc,\fault
|
||||
ldil L%(TMPALIAS_MAP_START),\tmp
|
||||
#if defined(CONFIG_64BIT) && (TMPALIAS_MAP_START >= 0x80000000)
|
||||
|
|
@ -581,7 +581,15 @@
|
|||
*/
|
||||
cmpiclr,= 0x01,\tmp,%r0
|
||||
ldi (_PAGE_DIRTY|_PAGE_READ|_PAGE_WRITE),\prot
|
||||
.ifc \patype,20
|
||||
depd,z \prot,8,7,\prot
|
||||
.else
|
||||
.ifc \patype,11
|
||||
depw,z \prot,8,7,\prot
|
||||
.else
|
||||
.error "undefined PA type to do_alias"
|
||||
.endif
|
||||
.endif
|
||||
/*
|
||||
* OK, it is in the temp alias region, check whether "from" or "to".
|
||||
* Check "subtle" note in pacache.S re: r23/r26.
|
||||
|
|
@ -1185,7 +1193,7 @@ dtlb_miss_20w:
|
|||
nop
|
||||
|
||||
dtlb_check_alias_20w:
|
||||
do_alias spc,t0,t1,va,pte,prot,dtlb_fault
|
||||
do_alias spc,t0,t1,va,pte,prot,dtlb_fault,20
|
||||
|
||||
idtlbt pte,prot
|
||||
|
||||
|
|
@ -1209,7 +1217,7 @@ nadtlb_miss_20w:
|
|||
nop
|
||||
|
||||
nadtlb_check_alias_20w:
|
||||
do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate
|
||||
do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,20
|
||||
|
||||
idtlbt pte,prot
|
||||
|
||||
|
|
@ -1241,7 +1249,7 @@ dtlb_miss_11:
|
|||
nop
|
||||
|
||||
dtlb_check_alias_11:
|
||||
do_alias spc,t0,t1,va,pte,prot,dtlb_fault
|
||||
do_alias spc,t0,t1,va,pte,prot,dtlb_fault,11
|
||||
|
||||
idtlba pte,(va)
|
||||
idtlbp prot,(va)
|
||||
|
|
@ -1273,7 +1281,7 @@ nadtlb_miss_11:
|
|||
nop
|
||||
|
||||
nadtlb_check_alias_11:
|
||||
do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate
|
||||
do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,11
|
||||
|
||||
idtlba pte,(va)
|
||||
idtlbp prot,(va)
|
||||
|
|
@ -1300,7 +1308,7 @@ dtlb_miss_20:
|
|||
nop
|
||||
|
||||
dtlb_check_alias_20:
|
||||
do_alias spc,t0,t1,va,pte,prot,dtlb_fault
|
||||
do_alias spc,t0,t1,va,pte,prot,dtlb_fault,20
|
||||
|
||||
idtlbt pte,prot
|
||||
|
||||
|
|
@ -1326,7 +1334,7 @@ nadtlb_miss_20:
|
|||
nop
|
||||
|
||||
nadtlb_check_alias_20:
|
||||
do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate
|
||||
do_alias spc,t0,t1,va,pte,prot,nadtlb_emulate,20
|
||||
|
||||
idtlbt pte,prot
|
||||
|
||||
|
|
@ -1453,7 +1461,7 @@ naitlb_miss_20w:
|
|||
nop
|
||||
|
||||
naitlb_check_alias_20w:
|
||||
do_alias spc,t0,t1,va,pte,prot,naitlb_fault
|
||||
do_alias spc,t0,t1,va,pte,prot,naitlb_fault,20
|
||||
|
||||
iitlbt pte,prot
|
||||
|
||||
|
|
@ -1507,7 +1515,7 @@ naitlb_miss_11:
|
|||
nop
|
||||
|
||||
naitlb_check_alias_11:
|
||||
do_alias spc,t0,t1,va,pte,prot,itlb_fault
|
||||
do_alias spc,t0,t1,va,pte,prot,itlb_fault,11
|
||||
|
||||
iitlba pte,(%sr0, va)
|
||||
iitlbp prot,(%sr0, va)
|
||||
|
|
@ -1553,7 +1561,7 @@ naitlb_miss_20:
|
|||
nop
|
||||
|
||||
naitlb_check_alias_20:
|
||||
do_alias spc,t0,t1,va,pte,prot,naitlb_fault
|
||||
do_alias spc,t0,t1,va,pte,prot,naitlb_fault,20
|
||||
|
||||
iitlbt pte,prot
|
||||
|
||||
|
|
|
|||
|
|
@ -692,7 +692,7 @@ ENTRY(flush_icache_page_asm)
|
|||
|
||||
/* Purge any old translation */
|
||||
|
||||
pitlb (%sr0,%r28)
|
||||
pitlb (%sr4,%r28)
|
||||
|
||||
ldil L%icache_stride, %r1
|
||||
ldw R%icache_stride(%r1), %r1
|
||||
|
|
@ -706,27 +706,29 @@ ENTRY(flush_icache_page_asm)
|
|||
sub %r25, %r1, %r25
|
||||
|
||||
|
||||
1: fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%r28)
|
||||
/* fic only has the type 26 form on PA1.1, requiring an
|
||||
* explicit space specification, so use %sr4 */
|
||||
1: fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
cmpb,COND(<<) %r28, %r25,1b
|
||||
fic,m %r1(%r28)
|
||||
fic,m %r1(%sr4,%r28)
|
||||
|
||||
sync
|
||||
bv %r0(%r2)
|
||||
pitlb (%sr0,%r25)
|
||||
pitlb (%sr4,%r25)
|
||||
.exit
|
||||
|
||||
.procend
|
||||
|
|
|
|||
|
|
@ -50,8 +50,10 @@ SECTIONS
|
|||
. = KERNEL_BINARY_TEXT_START;
|
||||
|
||||
_text = .; /* Text and read-only data */
|
||||
.text ALIGN(16) : {
|
||||
.head ALIGN(16) : {
|
||||
HEAD_TEXT
|
||||
} = 0
|
||||
.text ALIGN(16) : {
|
||||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
|
|
@ -65,7 +67,7 @@ SECTIONS
|
|||
*(.fixup)
|
||||
*(.lock.text) /* out-of-line lock text */
|
||||
*(.gnu.warning)
|
||||
} = 0
|
||||
}
|
||||
/* End of text section */
|
||||
_etext = .;
|
||||
|
||||
|
|
|
|||
|
|
@ -187,8 +187,8 @@ int apply_relocate(Elf32_Shdr *sechdrs,
|
|||
|
||||
static inline int entry_matches(struct ppc_plt_entry *entry, Elf32_Addr val)
|
||||
{
|
||||
if (entry->jump[0] == 0x3d600000 + ((val + 0x8000) >> 16)
|
||||
&& entry->jump[1] == 0x396b0000 + (val & 0xffff))
|
||||
if (entry->jump[0] == 0x3d800000 + ((val + 0x8000) >> 16)
|
||||
&& entry->jump[1] == 0x398c0000 + (val & 0xffff))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -215,10 +215,9 @@ static uint32_t do_plt_call(void *location,
|
|||
entry++;
|
||||
}
|
||||
|
||||
/* Stolen from Paul Mackerras as well... */
|
||||
entry->jump[0] = 0x3d600000+((val+0x8000)>>16); /* lis r11,sym@ha */
|
||||
entry->jump[1] = 0x396b0000 + (val&0xffff); /* addi r11,r11,sym@l*/
|
||||
entry->jump[2] = 0x7d6903a6; /* mtctr r11 */
|
||||
entry->jump[0] = 0x3d800000+((val+0x8000)>>16); /* lis r12,sym@ha */
|
||||
entry->jump[1] = 0x398c0000 + (val&0xffff); /* addi r12,r12,sym@l*/
|
||||
entry->jump[2] = 0x7d8903a6; /* mtctr r12 */
|
||||
entry->jump[3] = 0x4e800420; /* bctr */
|
||||
|
||||
DEBUGP("Initialized plt for 0x%x at %p\n", val, entry);
|
||||
|
|
|
|||
|
|
@ -567,6 +567,7 @@ static void pfault_interrupt(unsigned int ext_int_code,
|
|||
tsk->thread.pfault_wait = 0;
|
||||
list_del(&tsk->thread.list);
|
||||
wake_up_process(tsk);
|
||||
put_task_struct(tsk);
|
||||
} else {
|
||||
/* Completion interrupt was faster than initial
|
||||
* interrupt. Set pfault_wait to -1 so the initial
|
||||
|
|
@ -576,14 +577,22 @@ static void pfault_interrupt(unsigned int ext_int_code,
|
|||
put_task_struct(tsk);
|
||||
} else {
|
||||
/* signal bit not set -> a real page is missing. */
|
||||
if (tsk->thread.pfault_wait == -1) {
|
||||
if (tsk->thread.pfault_wait == 1) {
|
||||
/* Already on the list with a reference: put to sleep */
|
||||
set_task_state(tsk, TASK_UNINTERRUPTIBLE);
|
||||
set_tsk_need_resched(tsk);
|
||||
} else if (tsk->thread.pfault_wait == -1) {
|
||||
/* Completion interrupt was faster than the initial
|
||||
* interrupt (pfault_wait == -1). Set pfault_wait
|
||||
* back to zero and exit. */
|
||||
tsk->thread.pfault_wait = 0;
|
||||
} else {
|
||||
/* Initial interrupt arrived before completion
|
||||
* interrupt. Let the task sleep. */
|
||||
* interrupt. Let the task sleep.
|
||||
* An extra task reference is needed since a different
|
||||
* cpu may set the task state to TASK_RUNNING again
|
||||
* before the scheduler is reached. */
|
||||
get_task_struct(tsk);
|
||||
tsk->thread.pfault_wait = 1;
|
||||
list_add(&tsk->thread.list, &pfault_list);
|
||||
set_task_state(tsk, TASK_UNINTERRUPTIBLE);
|
||||
|
|
@ -608,6 +617,7 @@ static int __cpuinit pfault_cpu_notify(struct notifier_block *self,
|
|||
list_del(&thread->list);
|
||||
tsk = container_of(thread, struct task_struct, thread);
|
||||
wake_up_process(tsk);
|
||||
put_task_struct(tsk);
|
||||
}
|
||||
spin_unlock_irq(&pfault_lock);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -590,6 +590,9 @@ config SYSVIPC_COMPAT
|
|||
depends on COMPAT && SYSVIPC
|
||||
default y
|
||||
|
||||
config KEYS_COMPAT
|
||||
def_bool y if COMPAT && KEYS
|
||||
|
||||
endmenu
|
||||
|
||||
source "net/Kconfig"
|
||||
|
|
|
|||
|
|
@ -268,4 +268,4 @@ static int __init sunfire_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(sunfire_init);
|
||||
fs_initcall(sunfire_init);
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ sys_call_table32:
|
|||
.word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy
|
||||
/*270*/ .word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink
|
||||
.word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid
|
||||
/*280*/ .word sys32_tee, sys_add_key, sys_request_key, sys_keyctl, compat_sys_openat
|
||||
/*280*/ .word sys32_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat
|
||||
.word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64
|
||||
/*290*/ .word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat
|
||||
.word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare
|
||||
|
|
|
|||
|
|
@ -495,11 +495,11 @@ xcall_fetch_glob_regs:
|
|||
stx %o7, [%g1 + GR_SNAP_O7]
|
||||
stx %i7, [%g1 + GR_SNAP_I7]
|
||||
/* Don't try this at home kids... */
|
||||
rdpr %cwp, %g2
|
||||
sub %g2, 1, %g7
|
||||
rdpr %cwp, %g3
|
||||
sub %g3, 1, %g7
|
||||
wrpr %g7, %cwp
|
||||
mov %i7, %g7
|
||||
wrpr %g2, %cwp
|
||||
wrpr %g3, %cwp
|
||||
stx %g7, [%g1 + GR_SNAP_RPC]
|
||||
sethi %hi(trap_block), %g7
|
||||
or %g7, %lo(trap_block), %g7
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ config TILE
|
|||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_PENDING_IRQ if SMP
|
||||
select GENERIC_IRQ_SHOW
|
||||
select HAVE_SYSCALL_WRAPPERS if TILEGX
|
||||
select SYS_HYPERVISOR
|
||||
|
||||
# FIXME: investigate whether we need/want these options.
|
||||
|
|
|
|||
|
|
@ -77,6 +77,11 @@ static inline int ffs(int x)
|
|||
return __builtin_ffs(x);
|
||||
}
|
||||
|
||||
static inline int fls64(__u64 w)
|
||||
{
|
||||
return (sizeof(__u64) * 8) - __builtin_clzll(w);
|
||||
}
|
||||
|
||||
/**
|
||||
* fls - find last set bit in word
|
||||
* @x: the word to search
|
||||
|
|
@ -90,12 +95,7 @@ static inline int ffs(int x)
|
|||
*/
|
||||
static inline int fls(int x)
|
||||
{
|
||||
return (sizeof(int) * 8) - __builtin_clz(x);
|
||||
}
|
||||
|
||||
static inline int fls64(__u64 w)
|
||||
{
|
||||
return (sizeof(__u64) * 8) - __builtin_clzll(w);
|
||||
return fls64((unsigned int) x);
|
||||
}
|
||||
|
||||
static inline unsigned int __arch_hweight32(unsigned int w)
|
||||
|
|
|
|||
|
|
@ -406,19 +406,17 @@ int compat_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
* Set up registers for signal handler.
|
||||
* Registers that we don't modify keep the value they had from
|
||||
* user-space at the time we took the signal.
|
||||
* We always pass siginfo and mcontext, regardless of SA_SIGINFO,
|
||||
* since some things rely on this (e.g. glibc's debug/segfault.c).
|
||||
*/
|
||||
regs->pc = ptr_to_compat_reg(ka->sa.sa_handler);
|
||||
regs->ex1 = PL_ICS_EX1(USER_PL, 1); /* set crit sec in handler */
|
||||
regs->sp = ptr_to_compat_reg(frame);
|
||||
regs->lr = restorer;
|
||||
regs->regs[0] = (unsigned long) usig;
|
||||
|
||||
if (ka->sa.sa_flags & SA_SIGINFO) {
|
||||
/* Need extra arguments, so mark to restore caller-saves. */
|
||||
regs->regs[1] = ptr_to_compat_reg(&frame->info);
|
||||
regs->regs[2] = ptr_to_compat_reg(&frame->uc);
|
||||
regs->flags |= PT_FLAGS_CALLER_SAVES;
|
||||
}
|
||||
regs->regs[1] = ptr_to_compat_reg(&frame->info);
|
||||
regs->regs[2] = ptr_to_compat_reg(&frame->uc);
|
||||
regs->flags |= PT_FLAGS_CALLER_SAVES;
|
||||
|
||||
/*
|
||||
* Notify any tracer that was single-stepping it.
|
||||
|
|
|
|||
|
|
@ -271,6 +271,12 @@ static inline void set_pte(pte_t *pteptr, pte_t pteval)
|
|||
}
|
||||
#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
|
||||
|
||||
#define __HAVE_ARCH_PTE_SAME
|
||||
static inline int pte_same(pte_t pte_a, pte_t pte_b)
|
||||
{
|
||||
return !((pte_val(pte_a) ^ pte_val(pte_b)) & ~_PAGE_NEWPAGE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Conversion functions: convert a page and protection to a page entry,
|
||||
* and a page entry and page directory to the page they refer to.
|
||||
|
|
@ -346,11 +352,11 @@ extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);
|
|||
#define update_mmu_cache(vma,address,ptep) do ; while (0)
|
||||
|
||||
/* Encode and de-code a swap entry */
|
||||
#define __swp_type(x) (((x).val >> 4) & 0x3f)
|
||||
#define __swp_type(x) (((x).val >> 5) & 0x1f)
|
||||
#define __swp_offset(x) ((x).val >> 11)
|
||||
|
||||
#define __swp_entry(type, offset) \
|
||||
((swp_entry_t) { ((type) << 4) | ((offset) << 11) })
|
||||
((swp_entry_t) { ((type) << 5) | ((offset) << 11) })
|
||||
#define __pte_to_swp_entry(pte) \
|
||||
((swp_entry_t) { pte_val(pte_mkuptodate(pte)) })
|
||||
#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
|
||||
|
|
|
|||
|
|
@ -2460,10 +2460,12 @@ ENTRY(aesni_cbc_dec)
|
|||
pxor IN3, STATE4
|
||||
movaps IN4, IV
|
||||
#else
|
||||
pxor (INP), STATE2
|
||||
pxor 0x10(INP), STATE3
|
||||
pxor IN1, STATE4
|
||||
movaps IN2, IV
|
||||
movups (INP), IN1
|
||||
pxor IN1, STATE2
|
||||
movups 0x10(INP), IN2
|
||||
pxor IN2, STATE3
|
||||
#endif
|
||||
movups STATE1, (OUTP)
|
||||
movups STATE2, 0x10(OUTP)
|
||||
|
|
|
|||
|
|
@ -31,6 +31,56 @@ static inline void native_set_pte(pte_t *ptep, pte_t pte)
|
|||
ptep->pte_low = pte.pte_low;
|
||||
}
|
||||
|
||||
#define pmd_read_atomic pmd_read_atomic
|
||||
/*
|
||||
* pte_offset_map_lock on 32bit PAE kernels was reading the pmd_t with
|
||||
* a "*pmdp" dereference done by gcc. Problem is, in certain places
|
||||
* where pte_offset_map_lock is called, concurrent page faults are
|
||||
* allowed, if the mmap_sem is hold for reading. An example is mincore
|
||||
* vs page faults vs MADV_DONTNEED. On the page fault side
|
||||
* pmd_populate rightfully does a set_64bit, but if we're reading the
|
||||
* pmd_t with a "*pmdp" on the mincore side, a SMP race can happen
|
||||
* because gcc will not read the 64bit of the pmd atomically. To fix
|
||||
* this all places running pmd_offset_map_lock() while holding the
|
||||
* mmap_sem in read mode, shall read the pmdp pointer using this
|
||||
* function to know if the pmd is null nor not, and in turn to know if
|
||||
* they can run pmd_offset_map_lock or pmd_trans_huge or other pmd
|
||||
* operations.
|
||||
*
|
||||
* Without THP if the mmap_sem is hold for reading, the
|
||||
* pmd can only transition from null to not null while pmd_read_atomic runs.
|
||||
* So there's no need of literally reading it atomically.
|
||||
*
|
||||
* With THP if the mmap_sem is hold for reading, the pmd can become
|
||||
* THP or null or point to a pte (and in turn become "stable") at any
|
||||
* time under pmd_read_atomic, so it's mandatory to read it atomically
|
||||
* with cmpxchg8b.
|
||||
*/
|
||||
#ifndef CONFIG_TRANSPARENT_HUGEPAGE
|
||||
static inline pmd_t pmd_read_atomic(pmd_t *pmdp)
|
||||
{
|
||||
pmdval_t ret;
|
||||
u32 *tmp = (u32 *)pmdp;
|
||||
|
||||
ret = (pmdval_t) (*tmp);
|
||||
if (ret) {
|
||||
/*
|
||||
* If the low part is null, we must not read the high part
|
||||
* or we can end up with a partial pmd.
|
||||
*/
|
||||
smp_rmb();
|
||||
ret |= ((pmdval_t)*(tmp + 1)) << 32;
|
||||
}
|
||||
|
||||
return (pmd_t) { ret };
|
||||
}
|
||||
#else /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||
static inline pmd_t pmd_read_atomic(pmd_t *pmdp)
|
||||
{
|
||||
return (pmd_t) { atomic64_read((atomic64_t *)pmdp) };
|
||||
}
|
||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
|
||||
|
||||
static inline void native_set_pte_atomic(pte_t *ptep, pte_t pte)
|
||||
{
|
||||
set_64bit((unsigned long long *)(ptep), native_pte_val(pte));
|
||||
|
|
|
|||
|
|
@ -101,15 +101,19 @@ static struct severity {
|
|||
};
|
||||
|
||||
/*
|
||||
* If the EIPV bit is set, it means the saved IP is the
|
||||
* instruction which caused the MCE.
|
||||
* If mcgstatus indicated that ip/cs on the stack were
|
||||
* no good, then "m->cs" will be zero and we will have
|
||||
* to assume the worst case (IN_KERNEL) as we actually
|
||||
* have no idea what we were executing when the machine
|
||||
* check hit.
|
||||
* If we do have a good "m->cs" (or a faked one in the
|
||||
* case we were executing in VM86 mode) we can use it to
|
||||
* distinguish an exception taken in user from from one
|
||||
* taken in the kernel.
|
||||
*/
|
||||
static int error_context(struct mce *m)
|
||||
{
|
||||
if (m->mcgstatus & MCG_STATUS_EIPV)
|
||||
return (m->ip && (m->cs & 3) == 3) ? IN_USER : IN_KERNEL;
|
||||
/* Unknown, assume kernel */
|
||||
return IN_KERNEL;
|
||||
return ((m->cs & 3) == 3) ? IN_USER : IN_KERNEL;
|
||||
}
|
||||
|
||||
int mce_severity(struct mce *a, int tolerant, char **msg)
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ struct threshold_block {
|
|||
unsigned int cpu;
|
||||
u32 address;
|
||||
u16 interrupt_enable;
|
||||
bool interrupt_capable;
|
||||
u16 threshold_limit;
|
||||
struct kobject kobj;
|
||||
struct list_head miscj;
|
||||
|
|
@ -86,6 +87,21 @@ struct thresh_restart {
|
|||
u16 old_limit;
|
||||
};
|
||||
|
||||
static bool lvt_interrupt_supported(unsigned int bank, u32 msr_high_bits)
|
||||
{
|
||||
/*
|
||||
* bank 4 supports APIC LVT interrupts implicitly since forever.
|
||||
*/
|
||||
if (bank == 4)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* IntP: interrupt present; if this bit is set, the thresholding
|
||||
* bank can generate APIC LVT interrupts
|
||||
*/
|
||||
return msr_high_bits & BIT(28);
|
||||
}
|
||||
|
||||
static int lvt_off_valid(struct threshold_block *b, int apic, u32 lo, u32 hi)
|
||||
{
|
||||
int msr = (hi & MASK_LVTOFF_HI) >> 20;
|
||||
|
|
@ -107,8 +123,10 @@ static int lvt_off_valid(struct threshold_block *b, int apic, u32 lo, u32 hi)
|
|||
return 1;
|
||||
};
|
||||
|
||||
/* must be called with correct cpu affinity */
|
||||
/* Called via smp_call_function_single() */
|
||||
/*
|
||||
* Called via smp_call_function_single(), must be called with correct
|
||||
* cpu affinity.
|
||||
*/
|
||||
static void threshold_restart_bank(void *_tr)
|
||||
{
|
||||
struct thresh_restart *tr = _tr;
|
||||
|
|
@ -131,6 +149,12 @@ static void threshold_restart_bank(void *_tr)
|
|||
(new_count & THRESHOLD_MAX);
|
||||
}
|
||||
|
||||
/* clear IntType */
|
||||
hi &= ~MASK_INT_TYPE_HI;
|
||||
|
||||
if (!tr->b->interrupt_capable)
|
||||
goto done;
|
||||
|
||||
if (tr->set_lvt_off) {
|
||||
if (lvt_off_valid(tr->b, tr->lvt_off, lo, hi)) {
|
||||
/* set new lvt offset */
|
||||
|
|
@ -139,9 +163,10 @@ static void threshold_restart_bank(void *_tr)
|
|||
}
|
||||
}
|
||||
|
||||
tr->b->interrupt_enable ?
|
||||
(hi = (hi & ~MASK_INT_TYPE_HI) | INT_TYPE_APIC) :
|
||||
(hi &= ~MASK_INT_TYPE_HI);
|
||||
if (tr->b->interrupt_enable)
|
||||
hi |= INT_TYPE_APIC;
|
||||
|
||||
done:
|
||||
|
||||
hi |= MASK_COUNT_EN_HI;
|
||||
wrmsr(tr->b->address, lo, hi);
|
||||
|
|
@ -206,14 +231,18 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
|
|||
if (shared_bank[bank] && c->cpu_core_id)
|
||||
break;
|
||||
#endif
|
||||
offset = setup_APIC_mce(offset,
|
||||
(high & MASK_LVTOFF_HI) >> 20);
|
||||
|
||||
memset(&b, 0, sizeof(b));
|
||||
b.cpu = cpu;
|
||||
b.bank = bank;
|
||||
b.block = block;
|
||||
b.address = address;
|
||||
b.cpu = cpu;
|
||||
b.bank = bank;
|
||||
b.block = block;
|
||||
b.address = address;
|
||||
b.interrupt_capable = lvt_interrupt_supported(bank, high);
|
||||
|
||||
if (b.interrupt_capable) {
|
||||
int new = (high & MASK_LVTOFF_HI) >> 20;
|
||||
offset = setup_APIC_mce(offset, new);
|
||||
}
|
||||
|
||||
mce_threshold_block_init(&b, offset);
|
||||
mce_threshold_vector = amd_threshold_interrupt;
|
||||
|
|
@ -313,6 +342,9 @@ store_interrupt_enable(struct threshold_block *b, const char *buf, size_t size)
|
|||
struct thresh_restart tr;
|
||||
unsigned long new;
|
||||
|
||||
if (!b->interrupt_capable)
|
||||
return -EINVAL;
|
||||
|
||||
if (strict_strtoul(buf, 0, &new) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -471,6 +503,7 @@ static __cpuinit int allocate_threshold_blocks(unsigned int cpu,
|
|||
b->cpu = cpu;
|
||||
b->address = address;
|
||||
b->interrupt_enable = 0;
|
||||
b->interrupt_capable = lvt_interrupt_supported(bank, high);
|
||||
b->threshold_limit = THRESHOLD_MAX;
|
||||
|
||||
INIT_LIST_HEAD(&b->miscj);
|
||||
|
|
|
|||
|
|
@ -437,6 +437,7 @@ static __initconst const struct x86_pmu amd_pmu = {
|
|||
* 0x023 DE PERF_CTL[2:0]
|
||||
* 0x02D LS PERF_CTL[3]
|
||||
* 0x02E LS PERF_CTL[3,0]
|
||||
* 0x031 LS PERF_CTL[2:0] (**)
|
||||
* 0x043 CU PERF_CTL[2:0]
|
||||
* 0x045 CU PERF_CTL[2:0]
|
||||
* 0x046 CU PERF_CTL[2:0]
|
||||
|
|
@ -450,10 +451,12 @@ static __initconst const struct x86_pmu amd_pmu = {
|
|||
* 0x0DD LS PERF_CTL[5:0]
|
||||
* 0x0DE LS PERF_CTL[5:0]
|
||||
* 0x0DF LS PERF_CTL[5:0]
|
||||
* 0x1C0 EX PERF_CTL[5:3]
|
||||
* 0x1D6 EX PERF_CTL[5:0]
|
||||
* 0x1D8 EX PERF_CTL[5:0]
|
||||
*
|
||||
* (*) depending on the umask all FPU counters may be used
|
||||
* (*) depending on the umask all FPU counters may be used
|
||||
* (**) only one unitmask enabled at a time
|
||||
*/
|
||||
|
||||
static struct event_constraint amd_f15_PMC0 = EVENT_CONSTRAINT(0, 0x01, 0);
|
||||
|
|
@ -503,6 +506,12 @@ amd_get_event_constraints_f15h(struct cpu_hw_events *cpuc, struct perf_event *ev
|
|||
return &amd_f15_PMC3;
|
||||
case 0x02E:
|
||||
return &amd_f15_PMC30;
|
||||
case 0x031:
|
||||
if (hweight_long(hwc->config & ARCH_PERFMON_EVENTSEL_UMASK) <= 1)
|
||||
return &amd_f15_PMC20;
|
||||
return &emptyconstraint;
|
||||
case 0x1C0:
|
||||
return &amd_f15_PMC53;
|
||||
default:
|
||||
return &amd_f15_PMC50;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -185,10 +185,22 @@ void __init setup_per_cpu_areas(void)
|
|||
#endif
|
||||
rc = -EINVAL;
|
||||
if (pcpu_chosen_fc != PCPU_FC_PAGE) {
|
||||
const size_t atom_size = cpu_has_pse ? PMD_SIZE : PAGE_SIZE;
|
||||
const size_t dyn_size = PERCPU_MODULE_RESERVE +
|
||||
PERCPU_DYNAMIC_RESERVE - PERCPU_FIRST_CHUNK_RESERVE;
|
||||
size_t atom_size;
|
||||
|
||||
/*
|
||||
* On 64bit, use PMD_SIZE for atom_size so that embedded
|
||||
* percpu areas are aligned to PMD. This, in the future,
|
||||
* can also allow using PMD mappings in vmalloc area. Use
|
||||
* PAGE_SIZE on 32bit as vmalloc space is highly contended
|
||||
* and large vmalloc area allocs can easily fail.
|
||||
*/
|
||||
#ifdef CONFIG_X86_64
|
||||
atom_size = PMD_SIZE;
|
||||
#else
|
||||
atom_size = PAGE_SIZE;
|
||||
#endif
|
||||
rc = pcpu_embed_first_chunk(PERCPU_FIRST_CHUNK_RESERVE,
|
||||
dyn_size, atom_size,
|
||||
pcpu_cpu_distance,
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@
|
|||
#include <asm/reboot.h>
|
||||
#include <asm/stackprotector.h>
|
||||
#include <asm/hypervisor.h>
|
||||
#include <asm/pci_x86.h>
|
||||
|
||||
#include "xen-ops.h"
|
||||
#include "mmu.h"
|
||||
|
|
@ -197,6 +198,9 @@ static void __init xen_banner(void)
|
|||
xen_feature(XENFEAT_mmu_pt_update_preserve_ad) ? " (preserve-AD)" : "");
|
||||
}
|
||||
|
||||
#define CPUID_THERM_POWER_LEAF 6
|
||||
#define APERFMPERF_PRESENT 0
|
||||
|
||||
static __read_mostly unsigned int cpuid_leaf1_edx_mask = ~0;
|
||||
static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0;
|
||||
|
||||
|
|
@ -217,6 +221,11 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx,
|
|||
maskedx = cpuid_leaf1_edx_mask;
|
||||
break;
|
||||
|
||||
case CPUID_THERM_POWER_LEAF:
|
||||
/* Disabling APERFMPERF for kernel usage */
|
||||
maskecx = ~(1 << APERFMPERF_PRESENT);
|
||||
break;
|
||||
|
||||
case 0xb:
|
||||
/* Suppress extended topology stuff */
|
||||
maskebx = 0;
|
||||
|
|
@ -1259,8 +1268,10 @@ asmlinkage void __init xen_start_kernel(void)
|
|||
/* Make sure ACS will be enabled */
|
||||
pci_request_acs();
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
/* PCI BIOS service won't work from a PV guest. */
|
||||
pci_probe &= ~PCI_PROBE_BIOS;
|
||||
#endif
|
||||
xen_raw_console_write("about to get started...\n");
|
||||
|
||||
xen_setup_runstate_info(0);
|
||||
|
|
|
|||
|
|
@ -320,8 +320,13 @@ static pteval_t pte_mfn_to_pfn(pteval_t val)
|
|||
{
|
||||
if (val & _PAGE_PRESENT) {
|
||||
unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT;
|
||||
unsigned long pfn = mfn_to_pfn(mfn);
|
||||
|
||||
pteval_t flags = val & PTE_FLAGS_MASK;
|
||||
val = ((pteval_t)mfn_to_pfn(mfn) << PAGE_SHIFT) | flags;
|
||||
if (unlikely(pfn == ~0))
|
||||
val = flags & ~_PAGE_PRESENT;
|
||||
else
|
||||
val = ((pteval_t)pfn << PAGE_SHIFT) | flags;
|
||||
}
|
||||
|
||||
return val;
|
||||
|
|
|
|||
|
|
@ -744,7 +744,7 @@ void __init printk_all_partitions(void)
|
|||
struct hd_struct *part;
|
||||
char name_buf[BDEVNAME_SIZE];
|
||||
char devt_buf[BDEVT_SIZE];
|
||||
u8 uuid[PARTITION_META_INFO_UUIDLTH * 2 + 1];
|
||||
char uuid_buf[PARTITION_META_INFO_UUIDLTH * 2 + 5];
|
||||
|
||||
/*
|
||||
* Don't show empty devices or things that have been
|
||||
|
|
@ -763,14 +763,16 @@ void __init printk_all_partitions(void)
|
|||
while ((part = disk_part_iter_next(&piter))) {
|
||||
bool is_part0 = part == &disk->part0;
|
||||
|
||||
uuid[0] = 0;
|
||||
uuid_buf[0] = '\0';
|
||||
if (part->info)
|
||||
part_unpack_uuid(part->info->uuid, uuid);
|
||||
snprintf(uuid_buf, sizeof(uuid_buf), "%pU",
|
||||
part->info->uuid);
|
||||
|
||||
printk("%s%s %10llu %s %s", is_part0 ? "" : " ",
|
||||
bdevt_str(part_devt(part), devt_buf),
|
||||
(unsigned long long)part->nr_sects >> 1,
|
||||
disk_name(disk, part->partno, name_buf), uuid);
|
||||
disk_name(disk, part->partno, name_buf),
|
||||
uuid_buf);
|
||||
if (is_part0) {
|
||||
if (disk->driverfs_dev != NULL &&
|
||||
disk->driverfs_dev->driver != NULL)
|
||||
|
|
|
|||
|
|
@ -635,11 +635,19 @@ static int acpi_battery_update(struct acpi_battery *battery)
|
|||
|
||||
static void acpi_battery_refresh(struct acpi_battery *battery)
|
||||
{
|
||||
int power_unit;
|
||||
|
||||
if (!battery->bat.dev)
|
||||
return;
|
||||
|
||||
power_unit = battery->power_unit;
|
||||
|
||||
acpi_battery_get_info(battery);
|
||||
/* The battery may have changed its reporting units. */
|
||||
|
||||
if (power_unit == battery->power_unit)
|
||||
return;
|
||||
|
||||
/* The battery has changed its reporting units. */
|
||||
sysfs_remove_battery(battery);
|
||||
sysfs_add_battery(battery);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -422,6 +422,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
|
|||
},
|
||||
{
|
||||
.callback = init_nvs_nosave,
|
||||
.ident = "Sony Vaio VPCCW29FX",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "VPCCW29FX"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = init_nvs_nosave,
|
||||
.ident = "Averatec AV1020-ED2",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "AVERATEC"),
|
||||
|
|
|
|||
|
|
@ -1732,6 +1732,7 @@ static int acpi_video_bus_remove(struct acpi_device *device, int type)
|
|||
|
||||
static int __init intel_opregion_present(void)
|
||||
{
|
||||
int i915 = 0;
|
||||
#if defined(CONFIG_DRM_I915) || defined(CONFIG_DRM_I915_MODULE)
|
||||
struct pci_dev *dev = NULL;
|
||||
u32 address;
|
||||
|
|
@ -1744,10 +1745,10 @@ static int __init intel_opregion_present(void)
|
|||
pci_read_config_dword(dev, 0xfc, &address);
|
||||
if (!address)
|
||||
continue;
|
||||
return 1;
|
||||
i915 = 1;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
return i915;
|
||||
}
|
||||
|
||||
int acpi_video_register(void)
|
||||
|
|
|
|||
|
|
@ -392,6 +392,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||
.driver_data = board_ahci_yes_fbs }, /* 88se9128 */
|
||||
{ PCI_DEVICE(0x1b4b, 0x9125),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9125 */
|
||||
{ PCI_DEVICE(0x1b4b, 0x917a),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 */
|
||||
{ PCI_DEVICE(0x1b4b, 0x91a3),
|
||||
.driver_data = board_ahci_yes_fbs },
|
||||
|
||||
|
|
|
|||
|
|
@ -984,6 +984,7 @@ static uint32_t fpga_tx(struct solos_card *card)
|
|||
} else if (skb && card->using_dma) {
|
||||
SKB_CB(skb)->dma_addr = pci_map_single(card->dev, skb->data,
|
||||
skb->len, PCI_DMA_TODEVICE);
|
||||
card->tx_skb[port] = skb;
|
||||
iowrite32(SKB_CB(skb)->dma_addr,
|
||||
card->config_regs + TX_DMA_ADDR(port));
|
||||
}
|
||||
|
|
@ -1152,7 +1153,8 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
db_fpga_upgrade = db_firmware_upgrade = 0;
|
||||
}
|
||||
|
||||
if (card->fpga_version >= DMA_SUPPORTED){
|
||||
if (card->fpga_version >= DMA_SUPPORTED) {
|
||||
pci_set_master(dev);
|
||||
card->using_dma = 1;
|
||||
} else {
|
||||
card->using_dma = 0;
|
||||
|
|
|
|||
|
|
@ -78,6 +78,9 @@ static struct usb_device_id ath3k_table[] = {
|
|||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||
|
||||
/* Atheros AR5BBU22 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE03C) },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
|
@ -94,6 +97,9 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
|||
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Atheros AR5BBU22 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ static struct usb_device_id btusb_table[] = {
|
|||
{ USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
|
||||
|
||||
/* Broadcom SoftSailing reporting vendor specific */
|
||||
{ USB_DEVICE(0x05ac, 0x21e1) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21e1) },
|
||||
|
||||
/* Apple MacBookPro 7,1 */
|
||||
{ USB_DEVICE(0x05ac, 0x8213) },
|
||||
|
|
@ -100,6 +100,17 @@ static struct usb_device_id btusb_table[] = {
|
|||
/* Canyon CN-BTU1 with HID interfaces */
|
||||
{ USB_DEVICE(0x0c10, 0x0000) },
|
||||
|
||||
/* Broadcom BCM20702A0 */
|
||||
{ USB_DEVICE(0x0489, 0xe042) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21e3) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21e6) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21e8) },
|
||||
{ USB_DEVICE(0x0a5c, 0x21f3) },
|
||||
{ USB_DEVICE(0x413c, 0x8197) },
|
||||
|
||||
/* Foxconn - Hon Hai */
|
||||
{ USB_DEVICE(0x0489, 0xe033) },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
|
@ -130,6 +141,9 @@ static struct usb_device_id blacklist_table[] = {
|
|||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Atheros AR5BBU12 with sflash firmware */
|
||||
{ USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
/* Broadcom BCM2035 */
|
||||
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
|
|
|||
|
|
@ -897,6 +897,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
|
|||
ID(PCI_DEVICE_ID_INTEL_B43_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_B43_1_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
|
||||
ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
|
||||
|
|
|
|||
|
|
@ -211,6 +211,7 @@
|
|||
#define PCI_DEVICE_ID_INTEL_G41_HB 0x2E30
|
||||
#define PCI_DEVICE_ID_INTEL_G41_IG 0x2E32
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB 0x0040
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB 0x0069
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG 0x0042
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB 0x0044
|
||||
#define PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB 0x0062
|
||||
|
|
|
|||
|
|
@ -173,6 +173,7 @@ config CRYPTO_DEV_MV_CESA
|
|||
select CRYPTO_ALGAPI
|
||||
select CRYPTO_AES
|
||||
select CRYPTO_BLKCIPHER2
|
||||
select CRYPTO_HASH
|
||||
help
|
||||
This driver allows you to utilize the Cryptographic Engines and
|
||||
Security Accelerator (CESA) which can be found on the Marvell Orion
|
||||
|
|
|
|||
|
|
@ -350,18 +350,19 @@ config GPIO_LANGWELL
|
|||
Say Y here to support Intel Langwell/Penwell GPIO.
|
||||
|
||||
config GPIO_PCH
|
||||
tristate "Intel EG20T PCH / OKI SEMICONDUCTOR ML7223 IOH GPIO"
|
||||
tristate "Intel EG20T PCH/LAPIS Semiconductor IOH(ML7223/ML7831) GPIO"
|
||||
depends on PCI && X86
|
||||
help
|
||||
This driver is for PCH(Platform controller Hub) GPIO of Intel Topcliff
|
||||
which is an IOH(Input/Output Hub) for x86 embedded processor.
|
||||
This driver can access PCH GPIO device.
|
||||
|
||||
This driver also can be used for OKI SEMICONDUCTOR IOH(Input/
|
||||
Output Hub), ML7223.
|
||||
This driver also can be used for LAPIS Semiconductor IOH(Input/
|
||||
Output Hub), ML7223 and ML7831.
|
||||
ML7223 IOH is for MP(Media Phone) use.
|
||||
ML7223 is companion chip for Intel Atom E6xx series.
|
||||
ML7223 is completely compatible for Intel EG20T PCH.
|
||||
ML7831 IOH is for general purpose use.
|
||||
ML7223/ML7831 is companion chip for Intel Atom E6xx series.
|
||||
ML7223/ML7831 is completely compatible for Intel EG20T PCH.
|
||||
|
||||
config GPIO_ML_IOH
|
||||
tristate "OKI SEMICONDUCTOR ML7213 IOH GPIO support"
|
||||
|
|
|
|||
|
|
@ -287,6 +287,7 @@ static int pch_gpio_resume(struct pci_dev *pdev)
|
|||
static DEFINE_PCI_DEVICE_TABLE(pch_gpio_pcidev_id) = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8803) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8014) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8803) },
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, pch_gpio_pcidev_id);
|
||||
|
|
|
|||
|
|
@ -422,14 +422,11 @@ static void gen6_pm_rps_work(struct work_struct *work)
|
|||
mutex_unlock(&dev_priv->dev->struct_mutex);
|
||||
}
|
||||
|
||||
static void pch_irq_handler(struct drm_device *dev)
|
||||
static void pch_irq_handler(struct drm_device *dev, u32 pch_iir)
|
||||
{
|
||||
drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;
|
||||
u32 pch_iir;
|
||||
int pipe;
|
||||
|
||||
pch_iir = I915_READ(SDEIIR);
|
||||
|
||||
if (pch_iir & SDE_AUDIO_POWER_MASK)
|
||||
DRM_DEBUG_DRIVER("PCH audio power change on port %d\n",
|
||||
(pch_iir & SDE_AUDIO_POWER_MASK) >>
|
||||
|
|
@ -527,7 +524,7 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS)
|
|||
if (de_iir & DE_PCH_EVENT_IVB) {
|
||||
if (pch_iir & SDE_HOTPLUG_MASK_CPT)
|
||||
queue_work(dev_priv->wq, &dev_priv->hotplug_work);
|
||||
pch_irq_handler(dev);
|
||||
pch_irq_handler(dev, pch_iir);
|
||||
}
|
||||
|
||||
if (pm_iir & GEN6_PM_DEFERRED_EVENTS) {
|
||||
|
|
@ -626,7 +623,7 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS)
|
|||
if (de_iir & DE_PCH_EVENT) {
|
||||
if (pch_iir & hotplug_mask)
|
||||
queue_work(dev_priv->wq, &dev_priv->hotplug_work);
|
||||
pch_irq_handler(dev);
|
||||
pch_irq_handler(dev, pch_iir);
|
||||
}
|
||||
|
||||
if (de_iir & DE_PCU_EVENT) {
|
||||
|
|
|
|||
|
|
@ -537,6 +537,21 @@
|
|||
|
||||
#define GEN6_BSD_RNCID 0x12198
|
||||
|
||||
#define GEN7_FF_THREAD_MODE 0x20a0
|
||||
#define GEN7_FF_SCHED_MASK 0x0077070
|
||||
#define GEN7_FF_TS_SCHED_HS1 (0x5<<16)
|
||||
#define GEN7_FF_TS_SCHED_HS0 (0x3<<16)
|
||||
#define GEN7_FF_TS_SCHED_LOAD_BALANCE (0x1<<16)
|
||||
#define GEN7_FF_TS_SCHED_HW (0x0<<16) /* Default */
|
||||
#define GEN7_FF_VS_SCHED_HS1 (0x5<<12)
|
||||
#define GEN7_FF_VS_SCHED_HS0 (0x3<<12)
|
||||
#define GEN7_FF_VS_SCHED_LOAD_BALANCE (0x1<<12) /* Default */
|
||||
#define GEN7_FF_VS_SCHED_HW (0x0<<12)
|
||||
#define GEN7_FF_DS_SCHED_HS1 (0x5<<4)
|
||||
#define GEN7_FF_DS_SCHED_HS0 (0x3<<4)
|
||||
#define GEN7_FF_DS_SCHED_LOAD_BALANCE (0x1<<4) /* Default */
|
||||
#define GEN7_FF_DS_SCHED_HW (0x0<<4)
|
||||
|
||||
/*
|
||||
* Framebuffer compression (915+ only)
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -6579,10 +6579,11 @@ static void intel_sanitize_modesetting(struct drm_device *dev,
|
|||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
u32 reg, val;
|
||||
int i;
|
||||
|
||||
/* Clear any frame start delays used for debugging left by the BIOS */
|
||||
for_each_pipe(pipe) {
|
||||
reg = PIPECONF(pipe);
|
||||
for_each_pipe(i) {
|
||||
reg = PIPECONF(i);
|
||||
I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
|
||||
}
|
||||
|
||||
|
|
@ -7451,6 +7452,18 @@ static void gen6_init_clock_gating(struct drm_device *dev)
|
|||
DISPPLANE_TRICKLE_FEED_DISABLE);
|
||||
}
|
||||
|
||||
static void gen7_setup_fixed_func_scheduler(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
uint32_t reg = I915_READ(GEN7_FF_THREAD_MODE);
|
||||
|
||||
reg &= ~GEN7_FF_SCHED_MASK;
|
||||
reg |= GEN7_FF_TS_SCHED_HW;
|
||||
reg |= GEN7_FF_VS_SCHED_HW;
|
||||
reg |= GEN7_FF_DS_SCHED_HW;
|
||||
|
||||
I915_WRITE(GEN7_FF_THREAD_MODE, reg);
|
||||
}
|
||||
|
||||
static void ivybridge_init_clock_gating(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
|
@ -7597,6 +7610,8 @@ static void ironlake_teardown_rc6(struct drm_device *dev)
|
|||
drm_gem_object_unreference(&dev_priv->pwrctx->base);
|
||||
dev_priv->pwrctx = NULL;
|
||||
}
|
||||
|
||||
gen7_setup_fixed_func_scheduler(dev_priv);
|
||||
}
|
||||
|
||||
static void ironlake_disable_rc6(struct drm_device *dev)
|
||||
|
|
|
|||
|
|
@ -762,10 +762,12 @@ static void intel_sdvo_get_dtd_from_mode(struct intel_sdvo_dtd *dtd,
|
|||
((v_sync_len & 0x30) >> 4);
|
||||
|
||||
dtd->part2.dtd_flags = 0x18;
|
||||
if (mode->flags & DRM_MODE_FLAG_INTERLACE)
|
||||
dtd->part2.dtd_flags |= DTD_FLAG_INTERLACE;
|
||||
if (mode->flags & DRM_MODE_FLAG_PHSYNC)
|
||||
dtd->part2.dtd_flags |= 0x2;
|
||||
dtd->part2.dtd_flags |= DTD_FLAG_HSYNC_POSITIVE;
|
||||
if (mode->flags & DRM_MODE_FLAG_PVSYNC)
|
||||
dtd->part2.dtd_flags |= 0x4;
|
||||
dtd->part2.dtd_flags |= DTD_FLAG_VSYNC_POSITIVE;
|
||||
|
||||
dtd->part2.sdvo_flags = 0;
|
||||
dtd->part2.v_sync_off_high = v_sync_offset & 0xc0;
|
||||
|
|
@ -799,9 +801,11 @@ static void intel_sdvo_get_mode_from_dtd(struct drm_display_mode * mode,
|
|||
mode->clock = dtd->part1.clock * 10;
|
||||
|
||||
mode->flags &= ~(DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC);
|
||||
if (dtd->part2.dtd_flags & 0x2)
|
||||
if (dtd->part2.dtd_flags & DTD_FLAG_INTERLACE)
|
||||
mode->flags |= DRM_MODE_FLAG_INTERLACE;
|
||||
if (dtd->part2.dtd_flags & DTD_FLAG_HSYNC_POSITIVE)
|
||||
mode->flags |= DRM_MODE_FLAG_PHSYNC;
|
||||
if (dtd->part2.dtd_flags & 0x4)
|
||||
if (dtd->part2.dtd_flags & DTD_FLAG_VSYNC_POSITIVE)
|
||||
mode->flags |= DRM_MODE_FLAG_PVSYNC;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,6 +61,11 @@ struct intel_sdvo_caps {
|
|||
u16 output_flags;
|
||||
} __attribute__((packed));
|
||||
|
||||
/* Note: SDVO detailed timing flags match EDID misc flags. */
|
||||
#define DTD_FLAG_HSYNC_POSITIVE (1 << 1)
|
||||
#define DTD_FLAG_VSYNC_POSITIVE (1 << 2)
|
||||
#define DTD_FLAG_INTERLACE (1 << 7)
|
||||
|
||||
/** This matches the EDID DTD structure, more or less */
|
||||
struct intel_sdvo_dtd {
|
||||
struct {
|
||||
|
|
|
|||
|
|
@ -1301,6 +1301,11 @@ intel_tv_detect_type (struct intel_tv *intel_tv,
|
|||
|
||||
I915_WRITE(TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN);
|
||||
I915_WRITE(TV_CTL, save_tv_ctl);
|
||||
POSTING_READ(TV_CTL);
|
||||
|
||||
/* For unknown reasons the hw barfs if we don't do this vblank wait. */
|
||||
intel_wait_for_vblank(intel_tv->base.base.dev,
|
||||
to_intel_crtc(intel_tv->base.base.crtc)->pipe);
|
||||
|
||||
/* Restore interrupt config */
|
||||
if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
|
||||
|
|
|
|||
|
|
@ -1075,7 +1075,7 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
|
|||
|
||||
nvbo->placement.fpfn = 0;
|
||||
nvbo->placement.lpfn = dev_priv->fb_mappable_pages;
|
||||
nouveau_bo_placement_set(nvbo, TTM_PL_VRAM, 0);
|
||||
nouveau_bo_placement_set(nvbo, TTM_PL_FLAG_VRAM, 0);
|
||||
return nouveau_bo_validate(nvbo, false, true, false);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -926,6 +926,11 @@ int evergreen_pcie_gart_enable(struct radeon_device *rdev)
|
|||
WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
|
||||
WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
|
||||
WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
|
||||
if ((rdev->family == CHIP_JUNIPER) ||
|
||||
(rdev->family == CHIP_CYPRESS) ||
|
||||
(rdev->family == CHIP_HEMLOCK) ||
|
||||
(rdev->family == CHIP_BARTS))
|
||||
WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
|
||||
}
|
||||
WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
|
||||
WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
|
||||
|
|
@ -2064,9 +2069,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
|||
WREG32(CC_SYS_RB_BACKEND_DISABLE, rb);
|
||||
WREG32(GC_USER_RB_BACKEND_DISABLE, rb);
|
||||
WREG32(CC_GC_SHADER_PIPE_CONFIG, sp);
|
||||
}
|
||||
}
|
||||
|
||||
grbm_gfx_index |= SE_BROADCAST_WRITES;
|
||||
grbm_gfx_index = INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES;
|
||||
WREG32(GRBM_GFX_INDEX, grbm_gfx_index);
|
||||
WREG32(RLC_GFX_INDEX, grbm_gfx_index);
|
||||
|
||||
|
|
|
|||
|
|
@ -230,6 +230,7 @@
|
|||
#define MC_VM_MD_L1_TLB0_CNTL 0x2654
|
||||
#define MC_VM_MD_L1_TLB1_CNTL 0x2658
|
||||
#define MC_VM_MD_L1_TLB2_CNTL 0x265C
|
||||
#define MC_VM_MD_L1_TLB3_CNTL 0x2698
|
||||
|
||||
#define FUS_MC_VM_MD_L1_TLB0_CNTL 0x265C
|
||||
#define FUS_MC_VM_MD_L1_TLB1_CNTL 0x2660
|
||||
|
|
|
|||
|
|
@ -480,7 +480,9 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
|
|||
*/
|
||||
if ((dev->pdev->device == 0x9498) &&
|
||||
(dev->pdev->subsystem_vendor == 0x1682) &&
|
||||
(dev->pdev->subsystem_device == 0x2452)) {
|
||||
(dev->pdev->subsystem_device == 0x2452) &&
|
||||
(i2c_bus->valid == false) &&
|
||||
!(supported_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))) {
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
*i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -151,6 +151,8 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev)
|
|||
WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
|
||||
WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
|
||||
WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
|
||||
if (rdev->family == CHIP_RV740)
|
||||
WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp);
|
||||
WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
|
||||
WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
|
||||
WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
|
||||
|
|
|
|||
|
|
@ -174,6 +174,7 @@
|
|||
#define MC_VM_MD_L1_TLB0_CNTL 0x2654
|
||||
#define MC_VM_MD_L1_TLB1_CNTL 0x2658
|
||||
#define MC_VM_MD_L1_TLB2_CNTL 0x265C
|
||||
#define MC_VM_MD_L1_TLB3_CNTL 0x2698
|
||||
#define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C
|
||||
#define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038
|
||||
#define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034
|
||||
|
|
|
|||
|
|
@ -1809,6 +1809,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)
|
|||
spin_unlock(&glob->lru_lock);
|
||||
(void) ttm_bo_cleanup_refs(bo, false, false, false);
|
||||
kref_put(&bo->list_kref, ttm_bo_release_list);
|
||||
spin_lock(&glob->lru_lock);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,14 +61,14 @@ static ssize_t show_power(struct device *dev,
|
|||
REG_TDP_RUNNING_AVERAGE, &val);
|
||||
running_avg_capture = (val >> 4) & 0x3fffff;
|
||||
running_avg_capture = sign_extend32(running_avg_capture, 21);
|
||||
running_avg_range = val & 0xf;
|
||||
running_avg_range = (val & 0xf) + 1;
|
||||
|
||||
pci_bus_read_config_dword(f4->bus, PCI_DEVFN(PCI_SLOT(f4->devfn), 5),
|
||||
REG_TDP_LIMIT3, &val);
|
||||
|
||||
tdp_limit = val >> 16;
|
||||
curr_pwr_watts = tdp_limit + data->base_tdp -
|
||||
(s32)(running_avg_capture >> (running_avg_range + 1));
|
||||
curr_pwr_watts = (tdp_limit + data->base_tdp) << running_avg_range;
|
||||
curr_pwr_watts -= running_avg_capture;
|
||||
curr_pwr_watts *= data->tdp_to_watts;
|
||||
|
||||
/*
|
||||
|
|
@ -78,7 +78,7 @@ static ssize_t show_power(struct device *dev,
|
|||
* scaling factor 1/(2^16). For conversion we use
|
||||
* (10^6)/(2^16) = 15625/(2^10)
|
||||
*/
|
||||
curr_pwr_watts = (curr_pwr_watts * 15625) >> 10;
|
||||
curr_pwr_watts = (curr_pwr_watts * 15625) >> (10 + running_avg_range);
|
||||
return sprintf(buf, "%u\n", (unsigned int) curr_pwr_watts);
|
||||
}
|
||||
static DEVICE_ATTR(power1_input, S_IRUGO, show_power, NULL);
|
||||
|
|
|
|||
|
|
@ -755,7 +755,7 @@ static int davinci_i2c_remove(struct platform_device *pdev)
|
|||
dev->clk = NULL;
|
||||
|
||||
davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, 0);
|
||||
free_irq(IRQ_I2C, dev);
|
||||
free_irq(dev->irq, dev);
|
||||
iounmap(dev->base);
|
||||
kfree(dev);
|
||||
|
||||
|
|
|
|||
|
|
@ -2316,6 +2316,12 @@ static int peer_abort_intr(struct c4iw_dev *dev, struct sk_buff *skb)
|
|||
unsigned int tid = GET_TID(req);
|
||||
|
||||
ep = lookup_tid(t, tid);
|
||||
if (!ep) {
|
||||
printk(KERN_WARNING MOD
|
||||
"Abort on non-existent endpoint, tid %d\n", tid);
|
||||
kfree_skb(skb);
|
||||
return 0;
|
||||
}
|
||||
if (is_neg_adv_abort(req->status)) {
|
||||
PDBG("%s neg_adv_abort ep %p tid %u\n", __func__, ep,
|
||||
ep->hwtid);
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include "gigaset.h"
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/isdn/capilli.h>
|
||||
#include <linux/isdn/capicmd.h>
|
||||
#include <linux/isdn/capiutil.h>
|
||||
|
|
@ -222,10 +223,14 @@ get_appl(struct gigaset_capi_ctr *iif, u16 appl)
|
|||
static inline void dump_cmsg(enum debuglevel level, const char *tag, _cmsg *p)
|
||||
{
|
||||
#ifdef CONFIG_GIGASET_DEBUG
|
||||
/* dump at most 20 messages in 20 secs */
|
||||
static DEFINE_RATELIMIT_STATE(msg_dump_ratelimit, 20 * HZ, 20);
|
||||
_cdebbuf *cdb;
|
||||
|
||||
if (!(gigaset_debuglevel & level))
|
||||
return;
|
||||
if (!___ratelimit(&msg_dump_ratelimit, tag))
|
||||
return;
|
||||
|
||||
cdb = capi_cmsg2str(p);
|
||||
if (cdb) {
|
||||
|
|
@ -2057,12 +2062,6 @@ static void do_reset_b3_req(struct gigaset_capi_ctr *iif,
|
|||
CapiResetProcedureNotSupportedByCurrentProtocol);
|
||||
}
|
||||
|
||||
/*
|
||||
* dump unsupported/ignored messages at most twice per minute,
|
||||
* some apps send those very frequently
|
||||
*/
|
||||
static unsigned long ignored_msg_dump_time;
|
||||
|
||||
/*
|
||||
* unsupported CAPI message handler
|
||||
*/
|
||||
|
|
@ -2072,8 +2071,7 @@ static void do_unsupported(struct gigaset_capi_ctr *iif,
|
|||
{
|
||||
/* decode message */
|
||||
capi_message2cmsg(&iif->acmsg, skb->data);
|
||||
if (printk_timed_ratelimit(&ignored_msg_dump_time, 30 * 1000))
|
||||
dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
|
||||
dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
|
||||
send_conf(iif, ap, skb, CapiMessageNotSupportedInCurrentState);
|
||||
}
|
||||
|
||||
|
|
@ -2084,11 +2082,9 @@ static void do_nothing(struct gigaset_capi_ctr *iif,
|
|||
struct gigaset_capi_appl *ap,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
if (printk_timed_ratelimit(&ignored_msg_dump_time, 30 * 1000)) {
|
||||
/* decode message */
|
||||
capi_message2cmsg(&iif->acmsg, skb->data);
|
||||
dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
|
||||
}
|
||||
/* decode message */
|
||||
capi_message2cmsg(&iif->acmsg, skb->data);
|
||||
dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
|
||||
dev_kfree_skb_any(skb);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -348,6 +348,8 @@ void mddev_suspend(mddev_t *mddev)
|
|||
synchronize_rcu();
|
||||
wait_event(mddev->sb_wait, atomic_read(&mddev->active_io) == 0);
|
||||
mddev->pers->quiesce(mddev, 1);
|
||||
|
||||
del_timer_sync(&mddev->safemode_timer);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mddev_suspend);
|
||||
|
||||
|
|
@ -407,7 +409,7 @@ static void submit_flushes(struct work_struct *ws)
|
|||
atomic_inc(&rdev->nr_pending);
|
||||
atomic_inc(&rdev->nr_pending);
|
||||
rcu_read_unlock();
|
||||
bi = bio_alloc_mddev(GFP_KERNEL, 0, mddev);
|
||||
bi = bio_alloc_mddev(GFP_NOIO, 0, mddev);
|
||||
bi->bi_end_io = md_end_flush;
|
||||
bi->bi_private = rdev;
|
||||
bi->bi_bdev = rdev->bdev;
|
||||
|
|
|
|||
|
|
@ -541,6 +541,8 @@ static const struct usb_device_id smsusb_id_table[] __devinitconst = {
|
|||
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
||||
{ USB_DEVICE(0x2040, 0xc090),
|
||||
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
||||
{ USB_DEVICE(0x2040, 0xc0a0),
|
||||
.driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1017,22 +1017,6 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
|
|||
|
||||
spin_lock_init(&dev->hw_lock);
|
||||
|
||||
/* claim the resources */
|
||||
error = -EBUSY;
|
||||
dev->hw_io = pnp_port_start(pnp_dev, 0);
|
||||
if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) {
|
||||
dev->hw_io = -1;
|
||||
dev->irq = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
dev->irq = pnp_irq(pnp_dev, 0);
|
||||
if (request_irq(dev->irq, ene_isr,
|
||||
IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) {
|
||||
dev->irq = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
pnp_set_drvdata(pnp_dev, dev);
|
||||
dev->pnp_dev = pnp_dev;
|
||||
|
||||
|
|
@ -1085,6 +1069,22 @@ static int ene_probe(struct pnp_dev *pnp_dev, const struct pnp_device_id *id)
|
|||
device_set_wakeup_capable(&pnp_dev->dev, true);
|
||||
device_set_wakeup_enable(&pnp_dev->dev, true);
|
||||
|
||||
/* claim the resources */
|
||||
error = -EBUSY;
|
||||
dev->hw_io = pnp_port_start(pnp_dev, 0);
|
||||
if (!request_region(dev->hw_io, ENE_IO_SIZE, ENE_DRIVER_NAME)) {
|
||||
dev->hw_io = -1;
|
||||
dev->irq = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
dev->irq = pnp_irq(pnp_dev, 0);
|
||||
if (request_irq(dev->irq, ene_isr,
|
||||
IRQF_SHARED, ENE_DRIVER_NAME, (void *)dev)) {
|
||||
dev->irq = -1;
|
||||
goto error;
|
||||
}
|
||||
|
||||
error = rc_register_device(rdev);
|
||||
if (error < 0)
|
||||
goto error;
|
||||
|
|
|
|||
|
|
@ -504,16 +504,6 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id
|
|||
|
||||
spin_lock_init(&fintek->fintek_lock);
|
||||
|
||||
ret = -EBUSY;
|
||||
/* now claim resources */
|
||||
if (!request_region(fintek->cir_addr,
|
||||
fintek->cir_port_len, FINTEK_DRIVER_NAME))
|
||||
goto failure;
|
||||
|
||||
if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED,
|
||||
FINTEK_DRIVER_NAME, (void *)fintek))
|
||||
goto failure;
|
||||
|
||||
pnp_set_drvdata(pdev, fintek);
|
||||
fintek->pdev = pdev;
|
||||
|
||||
|
|
@ -548,6 +538,16 @@ static int fintek_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id
|
|||
/* rx resolution is hardwired to 50us atm, 1, 25, 100 also possible */
|
||||
rdev->rx_resolution = US_TO_NS(CIR_SAMPLE_PERIOD);
|
||||
|
||||
ret = -EBUSY;
|
||||
/* now claim resources */
|
||||
if (!request_region(fintek->cir_addr,
|
||||
fintek->cir_port_len, FINTEK_DRIVER_NAME))
|
||||
goto failure;
|
||||
|
||||
if (request_irq(fintek->cir_irq, fintek_cir_isr, IRQF_SHARED,
|
||||
FINTEK_DRIVER_NAME, (void *)fintek))
|
||||
goto failure;
|
||||
|
||||
ret = rc_register_device(rdev);
|
||||
if (ret)
|
||||
goto failure;
|
||||
|
|
|
|||
|
|
@ -1519,16 +1519,6 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
|
|||
/* initialize raw event */
|
||||
init_ir_raw_event(&itdev->rawir);
|
||||
|
||||
ret = -EBUSY;
|
||||
/* now claim resources */
|
||||
if (!request_region(itdev->cir_addr,
|
||||
dev_desc->io_region_size, ITE_DRIVER_NAME))
|
||||
goto failure;
|
||||
|
||||
if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED,
|
||||
ITE_DRIVER_NAME, (void *)itdev))
|
||||
goto failure;
|
||||
|
||||
/* set driver data into the pnp device */
|
||||
pnp_set_drvdata(pdev, itdev);
|
||||
itdev->pdev = pdev;
|
||||
|
|
@ -1604,6 +1594,16 @@ static int ite_probe(struct pnp_dev *pdev, const struct pnp_device_id
|
|||
rdev->driver_name = ITE_DRIVER_NAME;
|
||||
rdev->map_name = RC_MAP_RC6_MCE;
|
||||
|
||||
ret = -EBUSY;
|
||||
/* now claim resources */
|
||||
if (!request_region(itdev->cir_addr,
|
||||
dev_desc->io_region_size, ITE_DRIVER_NAME))
|
||||
goto failure;
|
||||
|
||||
if (request_irq(itdev->cir_irq, ite_cir_isr, IRQF_SHARED,
|
||||
ITE_DRIVER_NAME, (void *)itdev))
|
||||
goto failure;
|
||||
|
||||
ret = rc_register_device(rdev);
|
||||
if (ret)
|
||||
goto failure;
|
||||
|
|
|
|||
|
|
@ -1027,24 +1027,6 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
|
|||
spin_lock_init(&nvt->nvt_lock);
|
||||
spin_lock_init(&nvt->tx.lock);
|
||||
|
||||
ret = -EBUSY;
|
||||
/* now claim resources */
|
||||
if (!request_region(nvt->cir_addr,
|
||||
CIR_IOREG_LENGTH, NVT_DRIVER_NAME))
|
||||
goto failure;
|
||||
|
||||
if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED,
|
||||
NVT_DRIVER_NAME, (void *)nvt))
|
||||
goto failure;
|
||||
|
||||
if (!request_region(nvt->cir_wake_addr,
|
||||
CIR_IOREG_LENGTH, NVT_DRIVER_NAME))
|
||||
goto failure;
|
||||
|
||||
if (request_irq(nvt->cir_wake_irq, nvt_cir_wake_isr, IRQF_SHARED,
|
||||
NVT_DRIVER_NAME, (void *)nvt))
|
||||
goto failure;
|
||||
|
||||
pnp_set_drvdata(pdev, nvt);
|
||||
nvt->pdev = pdev;
|
||||
|
||||
|
|
@ -1091,6 +1073,24 @@ static int nvt_probe(struct pnp_dev *pdev, const struct pnp_device_id *dev_id)
|
|||
rdev->tx_resolution = XYZ;
|
||||
#endif
|
||||
|
||||
ret = -EBUSY;
|
||||
/* now claim resources */
|
||||
if (!request_region(nvt->cir_addr,
|
||||
CIR_IOREG_LENGTH, NVT_DRIVER_NAME))
|
||||
goto failure;
|
||||
|
||||
if (request_irq(nvt->cir_irq, nvt_cir_isr, IRQF_SHARED,
|
||||
NVT_DRIVER_NAME, (void *)nvt))
|
||||
goto failure;
|
||||
|
||||
if (!request_region(nvt->cir_wake_addr,
|
||||
CIR_IOREG_LENGTH, NVT_DRIVER_NAME))
|
||||
goto failure;
|
||||
|
||||
if (request_irq(nvt->cir_wake_irq, nvt_cir_wake_isr, IRQF_SHARED,
|
||||
NVT_DRIVER_NAME, (void *)nvt))
|
||||
goto failure;
|
||||
|
||||
ret = rc_register_device(rdev);
|
||||
if (ret)
|
||||
goto failure;
|
||||
|
|
|
|||
|
|
@ -1003,39 +1003,10 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
|
|||
"(w: 0x%lX, e: 0x%lX, s: 0x%lX, i: %u)\n",
|
||||
data->wbase, data->ebase, data->sbase, data->irq);
|
||||
|
||||
if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) {
|
||||
dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
|
||||
data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1);
|
||||
err = -EBUSY;
|
||||
goto exit_free_data;
|
||||
}
|
||||
|
||||
if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) {
|
||||
dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
|
||||
data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1);
|
||||
err = -EBUSY;
|
||||
goto exit_release_wbase;
|
||||
}
|
||||
|
||||
if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) {
|
||||
dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
|
||||
data->sbase, data->sbase + SP_IOMEM_LEN - 1);
|
||||
err = -EBUSY;
|
||||
goto exit_release_ebase;
|
||||
}
|
||||
|
||||
err = request_irq(data->irq, wbcir_irq_handler,
|
||||
IRQF_DISABLED, DRVNAME, device);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to claim IRQ %u\n", data->irq);
|
||||
err = -EBUSY;
|
||||
goto exit_release_sbase;
|
||||
}
|
||||
|
||||
led_trigger_register_simple("cir-tx", &data->txtrigger);
|
||||
if (!data->txtrigger) {
|
||||
err = -ENOMEM;
|
||||
goto exit_free_irq;
|
||||
goto exit_free_data;
|
||||
}
|
||||
|
||||
led_trigger_register_simple("cir-rx", &data->rxtrigger);
|
||||
|
|
@ -1074,9 +1045,38 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
|
|||
data->dev->priv = data;
|
||||
data->dev->dev.parent = &device->dev;
|
||||
|
||||
if (!request_region(data->wbase, WAKEUP_IOMEM_LEN, DRVNAME)) {
|
||||
dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
|
||||
data->wbase, data->wbase + WAKEUP_IOMEM_LEN - 1);
|
||||
err = -EBUSY;
|
||||
goto exit_free_rc;
|
||||
}
|
||||
|
||||
if (!request_region(data->ebase, EHFUNC_IOMEM_LEN, DRVNAME)) {
|
||||
dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
|
||||
data->ebase, data->ebase + EHFUNC_IOMEM_LEN - 1);
|
||||
err = -EBUSY;
|
||||
goto exit_release_wbase;
|
||||
}
|
||||
|
||||
if (!request_region(data->sbase, SP_IOMEM_LEN, DRVNAME)) {
|
||||
dev_err(dev, "Region 0x%lx-0x%lx already in use!\n",
|
||||
data->sbase, data->sbase + SP_IOMEM_LEN - 1);
|
||||
err = -EBUSY;
|
||||
goto exit_release_ebase;
|
||||
}
|
||||
|
||||
err = request_irq(data->irq, wbcir_irq_handler,
|
||||
IRQF_DISABLED, DRVNAME, device);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to claim IRQ %u\n", data->irq);
|
||||
err = -EBUSY;
|
||||
goto exit_release_sbase;
|
||||
}
|
||||
|
||||
err = rc_register_device(data->dev);
|
||||
if (err)
|
||||
goto exit_free_rc;
|
||||
goto exit_free_irq;
|
||||
|
||||
device_init_wakeup(&device->dev, 1);
|
||||
|
||||
|
|
@ -1084,14 +1084,6 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
|
|||
|
||||
return 0;
|
||||
|
||||
exit_free_rc:
|
||||
rc_free_device(data->dev);
|
||||
exit_unregister_led:
|
||||
led_classdev_unregister(&data->led);
|
||||
exit_unregister_rxtrigger:
|
||||
led_trigger_unregister_simple(data->rxtrigger);
|
||||
exit_unregister_txtrigger:
|
||||
led_trigger_unregister_simple(data->txtrigger);
|
||||
exit_free_irq:
|
||||
free_irq(data->irq, device);
|
||||
exit_release_sbase:
|
||||
|
|
@ -1100,6 +1092,14 @@ wbcir_probe(struct pnp_dev *device, const struct pnp_device_id *dev_id)
|
|||
release_region(data->ebase, EHFUNC_IOMEM_LEN);
|
||||
exit_release_wbase:
|
||||
release_region(data->wbase, WAKEUP_IOMEM_LEN);
|
||||
exit_free_rc:
|
||||
rc_free_device(data->dev);
|
||||
exit_unregister_led:
|
||||
led_classdev_unregister(&data->led);
|
||||
exit_unregister_rxtrigger:
|
||||
led_trigger_unregister_simple(data->rxtrigger);
|
||||
exit_unregister_txtrigger:
|
||||
led_trigger_unregister_simple(data->txtrigger);
|
||||
exit_free_data:
|
||||
kfree(data);
|
||||
pnp_set_drvdata(device, NULL);
|
||||
|
|
|
|||
|
|
@ -713,7 +713,7 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
|
|||
break;
|
||||
}
|
||||
pin = iterm->id;
|
||||
} else if (pin < selector->bNrInPins) {
|
||||
} else if (index < selector->bNrInPins) {
|
||||
pin = selector->baSourceID[index];
|
||||
list_for_each_entry(iterm, &chain->entities, chain) {
|
||||
if (!UVC_ENTITY_IS_ITERM(iterm))
|
||||
|
|
|
|||
|
|
@ -690,7 +690,7 @@ static int mmc_sdio_resume(struct mmc_host *host)
|
|||
}
|
||||
|
||||
if (!err && host->sdio_irqs)
|
||||
mmc_signal_sdio_irq(host);
|
||||
wake_up_process(host->sdio_irq_thread);
|
||||
mmc_release_host(host);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -27,18 +27,20 @@
|
|||
|
||||
#include "sdio_ops.h"
|
||||
|
||||
static int process_sdio_pending_irqs(struct mmc_card *card)
|
||||
static int process_sdio_pending_irqs(struct mmc_host *host)
|
||||
{
|
||||
struct mmc_card *card = host->card;
|
||||
int i, ret, count;
|
||||
unsigned char pending;
|
||||
struct sdio_func *func;
|
||||
|
||||
/*
|
||||
* Optimization, if there is only 1 function interrupt registered
|
||||
* call irq handler directly
|
||||
* and we know an IRQ was signaled then call irq handler directly.
|
||||
* Otherwise do the full probe.
|
||||
*/
|
||||
func = card->sdio_single_irq;
|
||||
if (func) {
|
||||
if (func && host->sdio_irq_pending) {
|
||||
func->irq_handler(func);
|
||||
return 1;
|
||||
}
|
||||
|
|
@ -115,7 +117,8 @@ static int sdio_irq_thread(void *_host)
|
|||
ret = __mmc_claim_host(host, &host->sdio_irq_thread_abort);
|
||||
if (ret)
|
||||
break;
|
||||
ret = process_sdio_pending_irqs(host->card);
|
||||
ret = process_sdio_pending_irqs(host);
|
||||
host->sdio_irq_pending = false;
|
||||
mmc_release_host(host);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -360,6 +360,7 @@ static int scan_read_raw_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs,
|
|||
|
||||
buf += mtd->oobsize + mtd->writesize;
|
||||
len -= mtd->writesize;
|
||||
offs += mtd->writesize;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1256,7 +1256,7 @@ static void sm_remove_dev(struct mtd_blktrans_dev *dev)
|
|||
|
||||
static struct mtd_blktrans_ops sm_ftl_ops = {
|
||||
.name = "smblk",
|
||||
.major = -1,
|
||||
.major = 0,
|
||||
.part_bits = SM_FTL_PARTN_BITS,
|
||||
.blksize = SM_SECTOR_SIZE,
|
||||
.getgeo = sm_getgeo,
|
||||
|
|
|
|||
|
|
@ -2564,7 +2564,7 @@ config S6GMAC
|
|||
source "drivers/net/stmmac/Kconfig"
|
||||
|
||||
config PCH_GBE
|
||||
tristate "Intel EG20T PCH / OKI SEMICONDUCTOR ML7223 IOH GbE"
|
||||
tristate "Intel EG20T PCH/OKI SEMICONDUCTOR IOH(ML7223/ML7831) GbE"
|
||||
depends on PCI
|
||||
select MII
|
||||
---help---
|
||||
|
|
@ -2577,10 +2577,11 @@ config PCH_GBE
|
|||
This driver enables Gigabit Ethernet function.
|
||||
|
||||
This driver also can be used for OKI SEMICONDUCTOR IOH(Input/
|
||||
Output Hub), ML7223.
|
||||
ML7223 IOH is for MP(Media Phone) use.
|
||||
ML7223 is companion chip for Intel Atom E6xx series.
|
||||
ML7223 is completely compatible for Intel EG20T PCH.
|
||||
Output Hub), ML7223/ML7831.
|
||||
ML7223 IOH is for MP(Media Phone) use. ML7831 IOH is for general
|
||||
purpose use.
|
||||
ML7223/ML7831 is companion chip for Intel Atom E6xx series.
|
||||
ML7223/ML7831 is completely compatible for Intel EG20T PCH.
|
||||
|
||||
endif # NETDEV_1000
|
||||
|
||||
|
|
|
|||
|
|
@ -688,7 +688,7 @@ static int c_can_get_berr_counter(const struct net_device *dev,
|
|||
*
|
||||
* We iterate from priv->tx_echo to priv->tx_next and check if the
|
||||
* packet has been transmitted, echo it back to the CAN framework.
|
||||
* If we discover a not yet transmitted package, stop looking for more.
|
||||
* If we discover a not yet transmitted packet, stop looking for more.
|
||||
*/
|
||||
static void c_can_do_tx(struct net_device *dev)
|
||||
{
|
||||
|
|
@ -700,7 +700,7 @@ static void c_can_do_tx(struct net_device *dev)
|
|||
for (/* nix */; (priv->tx_next - priv->tx_echo) > 0; priv->tx_echo++) {
|
||||
msg_obj_no = get_tx_echo_msg_obj(priv);
|
||||
val = c_can_read_reg32(priv, &priv->regs->txrqst1);
|
||||
if (!(val & (1 << msg_obj_no))) {
|
||||
if (!(val & (1 << (msg_obj_no - 1)))) {
|
||||
can_get_echo_skb(dev,
|
||||
msg_obj_no - C_CAN_MSG_OBJ_TX_FIRST);
|
||||
stats->tx_bytes += priv->read_reg(priv,
|
||||
|
|
@ -708,6 +708,8 @@ static void c_can_do_tx(struct net_device *dev)
|
|||
& IF_MCONT_DLC_MASK;
|
||||
stats->tx_packets++;
|
||||
c_can_inval_msg_object(dev, 0, msg_obj_no);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -952,7 +954,7 @@ static int c_can_poll(struct napi_struct *napi, int quota)
|
|||
struct net_device *dev = napi->dev;
|
||||
struct c_can_priv *priv = netdev_priv(dev);
|
||||
|
||||
irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
|
||||
irqstatus = priv->irqstatus;
|
||||
if (!irqstatus)
|
||||
goto end;
|
||||
|
||||
|
|
@ -1030,12 +1032,11 @@ static int c_can_poll(struct napi_struct *napi, int quota)
|
|||
|
||||
static irqreturn_t c_can_isr(int irq, void *dev_id)
|
||||
{
|
||||
u16 irqstatus;
|
||||
struct net_device *dev = (struct net_device *)dev_id;
|
||||
struct c_can_priv *priv = netdev_priv(dev);
|
||||
|
||||
irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
|
||||
if (!irqstatus)
|
||||
priv->irqstatus = priv->read_reg(priv, &priv->regs->interrupt);
|
||||
if (!priv->irqstatus)
|
||||
return IRQ_NONE;
|
||||
|
||||
/* disable all interrupts and schedule the NAPI */
|
||||
|
|
@ -1065,10 +1066,11 @@ static int c_can_open(struct net_device *dev)
|
|||
goto exit_irq_fail;
|
||||
}
|
||||
|
||||
napi_enable(&priv->napi);
|
||||
|
||||
/* start the c_can controller */
|
||||
c_can_start(dev);
|
||||
|
||||
napi_enable(&priv->napi);
|
||||
netif_start_queue(dev);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ struct c_can_priv {
|
|||
unsigned int tx_next;
|
||||
unsigned int tx_echo;
|
||||
void *priv; /* for board-specific data */
|
||||
u16 irqstatus;
|
||||
};
|
||||
|
||||
struct net_device *alloc_c_can_dev(void);
|
||||
|
|
|
|||
|
|
@ -150,6 +150,8 @@ struct e1000_buffer {
|
|||
unsigned long time_stamp;
|
||||
u16 length;
|
||||
u16 next_to_watch;
|
||||
unsigned int segs;
|
||||
unsigned int bytecount;
|
||||
u16 mapped_as_page;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -2798,7 +2798,7 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
|||
struct e1000_buffer *buffer_info;
|
||||
unsigned int len = skb_headlen(skb);
|
||||
unsigned int offset = 0, size, count = 0, i;
|
||||
unsigned int f;
|
||||
unsigned int f, bytecount, segs;
|
||||
|
||||
i = tx_ring->next_to_use;
|
||||
|
||||
|
|
@ -2899,7 +2899,13 @@ static int e1000_tx_map(struct e1000_adapter *adapter,
|
|||
}
|
||||
}
|
||||
|
||||
segs = skb_shinfo(skb)->gso_segs ?: 1;
|
||||
/* multiply data chunks by size of headers */
|
||||
bytecount = ((segs - 1) * skb_headlen(skb)) + skb->len;
|
||||
|
||||
tx_ring->buffer_info[i].skb = skb;
|
||||
tx_ring->buffer_info[i].segs = segs;
|
||||
tx_ring->buffer_info[i].bytecount = bytecount;
|
||||
tx_ring->buffer_info[first].next_to_watch = i;
|
||||
|
||||
return count;
|
||||
|
|
@ -3573,14 +3579,8 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
|
|||
cleaned = (i == eop);
|
||||
|
||||
if (cleaned) {
|
||||
struct sk_buff *skb = buffer_info->skb;
|
||||
unsigned int segs, bytecount;
|
||||
segs = skb_shinfo(skb)->gso_segs ?: 1;
|
||||
/* multiply data chunks by size of headers */
|
||||
bytecount = ((segs - 1) * skb_headlen(skb)) +
|
||||
skb->len;
|
||||
total_tx_packets += segs;
|
||||
total_tx_bytes += bytecount;
|
||||
total_tx_packets += buffer_info->segs;
|
||||
total_tx_bytes += buffer_info->bytecount;
|
||||
}
|
||||
e1000_unmap_and_free_tx_resource(adapter, buffer_info);
|
||||
tx_desc->upper.data = 0;
|
||||
|
|
|
|||
|
|
@ -247,7 +247,7 @@ static int macvlan_queue_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
|
||||
xmit_world:
|
||||
skb->ip_summed = ip_summed;
|
||||
skb_set_dev(skb, vlan->lowerdev);
|
||||
skb->dev = vlan->lowerdev;
|
||||
return dev_queue_xmit(skb);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,9 @@ const char pch_driver_version[] = DRV_VERSION;
|
|||
#define PCI_VENDOR_ID_ROHM 0x10db
|
||||
#define PCI_DEVICE_ID_ROHM_ML7223_GBE 0x8013
|
||||
|
||||
/* Macros for ML7831 */
|
||||
#define PCI_DEVICE_ID_ROHM_ML7831_GBE 0x8802
|
||||
|
||||
#define PCH_GBE_TX_WEIGHT 64
|
||||
#define PCH_GBE_RX_WEIGHT 64
|
||||
#define PCH_GBE_RX_BUFFER_WRITE 16
|
||||
|
|
@ -717,13 +720,6 @@ static void pch_gbe_configure_rx(struct pch_gbe_adapter *adapter)
|
|||
iowrite32(rdba, &hw->reg->RX_DSC_BASE);
|
||||
iowrite32(rdlen, &hw->reg->RX_DSC_SIZE);
|
||||
iowrite32((rdba + rdlen), &hw->reg->RX_DSC_SW_P);
|
||||
|
||||
/* Enables Receive DMA */
|
||||
rxdma = ioread32(&hw->reg->DMA_CTRL);
|
||||
rxdma |= PCH_GBE_RX_DMA_EN;
|
||||
iowrite32(rxdma, &hw->reg->DMA_CTRL);
|
||||
/* Enables Receive */
|
||||
iowrite32(PCH_GBE_MRE_MAC_RX_EN, &hw->reg->MAC_RX_EN);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1097,6 +1093,19 @@ void pch_gbe_update_stats(struct pch_gbe_adapter *adapter)
|
|||
spin_unlock_irqrestore(&adapter->stats_lock, flags);
|
||||
}
|
||||
|
||||
static void pch_gbe_start_receive(struct pch_gbe_hw *hw)
|
||||
{
|
||||
u32 rxdma;
|
||||
|
||||
/* Enables Receive DMA */
|
||||
rxdma = ioread32(&hw->reg->DMA_CTRL);
|
||||
rxdma |= PCH_GBE_RX_DMA_EN;
|
||||
iowrite32(rxdma, &hw->reg->DMA_CTRL);
|
||||
/* Enables Receive */
|
||||
iowrite32(PCH_GBE_MRE_MAC_RX_EN, &hw->reg->MAC_RX_EN);
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* pch_gbe_intr - Interrupt Handler
|
||||
* @irq: Interrupt number
|
||||
|
|
@ -1701,6 +1710,12 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter)
|
|||
struct pch_gbe_rx_ring *rx_ring = adapter->rx_ring;
|
||||
int err;
|
||||
|
||||
/* Ensure we have a valid MAC */
|
||||
if (!is_valid_ether_addr(adapter->hw.mac.addr)) {
|
||||
pr_err("Error: Invalid MAC address\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* hardware has been reset, we need to reload some things */
|
||||
pch_gbe_set_multi(netdev);
|
||||
|
||||
|
|
@ -1717,6 +1732,7 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter)
|
|||
pch_gbe_alloc_tx_buffers(adapter, tx_ring);
|
||||
pch_gbe_alloc_rx_buffers(adapter, rx_ring, rx_ring->count);
|
||||
adapter->tx_queue_len = netdev->tx_queue_len;
|
||||
pch_gbe_start_receive(&adapter->hw);
|
||||
|
||||
mod_timer(&adapter->watchdog_timer, jiffies);
|
||||
|
||||
|
|
@ -2118,7 +2134,7 @@ static int pch_gbe_napi_poll(struct napi_struct *napi, int budget)
|
|||
/* If no Tx and not enough Rx work done,
|
||||
* exit the polling mode
|
||||
*/
|
||||
if ((work_done < budget) || !netif_running(netdev))
|
||||
if (work_done < budget)
|
||||
poll_end_flag = true;
|
||||
}
|
||||
|
||||
|
|
@ -2392,9 +2408,14 @@ static int pch_gbe_probe(struct pci_dev *pdev,
|
|||
|
||||
memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len);
|
||||
if (!is_valid_ether_addr(netdev->dev_addr)) {
|
||||
dev_err(&pdev->dev, "Invalid MAC Address\n");
|
||||
ret = -EIO;
|
||||
goto err_free_adapter;
|
||||
/*
|
||||
* If the MAC is invalid (or just missing), display a warning
|
||||
* but do not abort setting up the device. pch_gbe_up will
|
||||
* prevent the interface from being brought up until a valid MAC
|
||||
* is set.
|
||||
*/
|
||||
dev_err(&pdev->dev, "Invalid MAC address, "
|
||||
"interface disabled.\n");
|
||||
}
|
||||
setup_timer(&adapter->watchdog_timer, pch_gbe_watchdog,
|
||||
(unsigned long)adapter);
|
||||
|
|
@ -2452,6 +2473,13 @@ static DEFINE_PCI_DEVICE_TABLE(pch_gbe_pcidev_id) = {
|
|||
.class = (PCI_CLASS_NETWORK_ETHERNET << 8),
|
||||
.class_mask = (0xFFFF00)
|
||||
},
|
||||
{.vendor = PCI_VENDOR_ID_ROHM,
|
||||
.device = PCI_DEVICE_ID_ROHM_ML7831_GBE,
|
||||
.subvendor = PCI_ANY_ID,
|
||||
.subdevice = PCI_ANY_ID,
|
||||
.class = (PCI_CLASS_NETWORK_ETHERNET << 8),
|
||||
.class_mask = (0xFFFF00)
|
||||
},
|
||||
/* required last entry */
|
||||
{0}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -320,10 +320,10 @@ static void pch_gbe_check_copper_options(struct pch_gbe_adapter *adapter)
|
|||
pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n");
|
||||
hw->phy.autoneg_advertised = opt.def;
|
||||
} else {
|
||||
hw->phy.autoneg_advertised = AutoNeg;
|
||||
pch_gbe_validate_option(
|
||||
(int *)(&hw->phy.autoneg_advertised),
|
||||
&opt, adapter);
|
||||
int tmp = AutoNeg;
|
||||
|
||||
pch_gbe_validate_option(&tmp, &opt, adapter);
|
||||
hw->phy.autoneg_advertised = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -494,9 +494,10 @@ void pch_gbe_check_options(struct pch_gbe_adapter *adapter)
|
|||
.arg = { .l = { .nr = (int)ARRAY_SIZE(fc_list),
|
||||
.p = fc_list } }
|
||||
};
|
||||
hw->mac.fc = FlowControl;
|
||||
pch_gbe_validate_option((int *)(&hw->mac.fc),
|
||||
&opt, adapter);
|
||||
int tmp = FlowControl;
|
||||
|
||||
pch_gbe_validate_option(&tmp, &opt, adapter);
|
||||
hw->mac.fc = tmp;
|
||||
}
|
||||
|
||||
pch_gbe_check_copper_options(adapter);
|
||||
|
|
|
|||
|
|
@ -2344,8 +2344,13 @@ static struct sk_buff *receive_copy(struct sky2_port *sky2,
|
|||
skb_copy_from_linear_data(re->skb, skb->data, length);
|
||||
skb->ip_summed = re->skb->ip_summed;
|
||||
skb->csum = re->skb->csum;
|
||||
skb->rxhash = re->skb->rxhash;
|
||||
skb->vlan_tci = re->skb->vlan_tci;
|
||||
|
||||
pci_dma_sync_single_for_device(sky2->hw->pdev, re->data_addr,
|
||||
length, PCI_DMA_FROMDEVICE);
|
||||
re->skb->vlan_tci = 0;
|
||||
re->skb->rxhash = 0;
|
||||
re->skb->ip_summed = CHECKSUM_NONE;
|
||||
skb_put(skb, length);
|
||||
}
|
||||
|
|
@ -2430,9 +2435,6 @@ static struct sk_buff *sky2_receive(struct net_device *dev,
|
|||
struct sk_buff *skb = NULL;
|
||||
u16 count = (status & GMR_FS_LEN) >> 16;
|
||||
|
||||
if (status & GMR_FS_VLAN)
|
||||
count -= VLAN_HLEN; /* Account for vlan tag */
|
||||
|
||||
netif_printk(sky2, rx_status, KERN_DEBUG, dev,
|
||||
"rx slot %u status 0x%x len %d\n",
|
||||
sky2->rx_next, status, length);
|
||||
|
|
@ -2440,6 +2442,9 @@ static struct sk_buff *sky2_receive(struct net_device *dev,
|
|||
sky2->rx_next = (sky2->rx_next + 1) % sky2->rx_pending;
|
||||
prefetch(sky2->rx_ring + sky2->rx_next);
|
||||
|
||||
if (vlan_tx_tag_present(re->skb))
|
||||
count -= VLAN_HLEN; /* Account for vlan tag */
|
||||
|
||||
/* This chip has hardware problems that generates bogus status.
|
||||
* So do only marginal checking and expect higher level protocols
|
||||
* to handle crap frames.
|
||||
|
|
@ -2497,11 +2502,8 @@ static inline void sky2_tx_done(struct net_device *dev, u16 last)
|
|||
}
|
||||
|
||||
static inline void sky2_skb_rx(const struct sky2_port *sky2,
|
||||
u32 status, struct sk_buff *skb)
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
if (status & GMR_FS_VLAN)
|
||||
__vlan_hwaccel_put_tag(skb, be16_to_cpu(sky2->rx_tag));
|
||||
|
||||
if (skb->ip_summed == CHECKSUM_NONE)
|
||||
netif_receive_skb(skb);
|
||||
else
|
||||
|
|
@ -2555,6 +2557,14 @@ static void sky2_rx_checksum(struct sky2_port *sky2, u32 status)
|
|||
}
|
||||
}
|
||||
|
||||
static void sky2_rx_tag(struct sky2_port *sky2, u16 length)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = sky2->rx_ring[sky2->rx_next].skb;
|
||||
__vlan_hwaccel_put_tag(skb, be16_to_cpu(length));
|
||||
}
|
||||
|
||||
static void sky2_rx_hash(struct sky2_port *sky2, u32 status)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
|
@ -2613,8 +2623,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)
|
|||
}
|
||||
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
|
||||
sky2_skb_rx(sky2, status, skb);
|
||||
sky2_skb_rx(sky2, skb);
|
||||
|
||||
/* Stop after net poll weight */
|
||||
if (++work_done >= to_do)
|
||||
|
|
@ -2622,11 +2631,11 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)
|
|||
break;
|
||||
|
||||
case OP_RXVLAN:
|
||||
sky2->rx_tag = length;
|
||||
sky2_rx_tag(sky2, length);
|
||||
break;
|
||||
|
||||
case OP_RXCHKSVLAN:
|
||||
sky2->rx_tag = length;
|
||||
sky2_rx_tag(sky2, length);
|
||||
/* fall through */
|
||||
case OP_RXCHKS:
|
||||
if (likely(dev->features & NETIF_F_RXCSUM))
|
||||
|
|
|
|||
|
|
@ -2236,7 +2236,6 @@ struct sky2_port {
|
|||
u16 rx_pending;
|
||||
u16 rx_data_size;
|
||||
u16 rx_nfrags;
|
||||
u16 rx_tag;
|
||||
|
||||
struct {
|
||||
unsigned long last;
|
||||
|
|
|
|||
|
|
@ -2363,7 +2363,7 @@ static int gem_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
netif_device_detach(dev);
|
||||
|
||||
/* Switch off MAC, remember WOL setting */
|
||||
gp->asleep_wol = gp->wake_on_lan;
|
||||
gp->asleep_wol = !!gp->wake_on_lan;
|
||||
gem_do_stop(dev, gp->asleep_wol);
|
||||
} else
|
||||
gp->asleep_wol = 0;
|
||||
|
|
|
|||
|
|
@ -740,8 +740,13 @@ static inline unsigned int tg3_has_work(struct tg3_napi *tnapi)
|
|||
if (sblk->status & SD_STATUS_LINK_CHG)
|
||||
work_exists = 1;
|
||||
}
|
||||
/* check for RX/TX work to do */
|
||||
if (sblk->idx[0].tx_consumer != tnapi->tx_cons ||
|
||||
|
||||
/* check for TX work to do */
|
||||
if (sblk->idx[0].tx_consumer != tnapi->tx_cons)
|
||||
work_exists = 1;
|
||||
|
||||
/* check for RX work to do */
|
||||
if (tnapi->rx_rcb_prod_idx &&
|
||||
*(tnapi->rx_rcb_prod_idx) != tnapi->rx_rcb_ptr)
|
||||
work_exists = 1;
|
||||
|
||||
|
|
@ -5216,6 +5221,9 @@ static int tg3_poll_work(struct tg3_napi *tnapi, int work_done, int budget)
|
|||
return work_done;
|
||||
}
|
||||
|
||||
if (!tnapi->rx_rcb_prod_idx)
|
||||
return work_done;
|
||||
|
||||
/* run RX thread, within the bounds set by NAPI.
|
||||
* All RX "locking" is done by ensuring outside
|
||||
* code synchronizes with tg3->napi.poll()
|
||||
|
|
@ -6626,6 +6634,12 @@ static int tg3_alloc_consistent(struct tg3 *tp)
|
|||
*/
|
||||
switch (i) {
|
||||
default:
|
||||
if (tg3_flag(tp, ENABLE_RSS)) {
|
||||
tnapi->rx_rcb_prod_idx = NULL;
|
||||
break;
|
||||
}
|
||||
/* Fall through */
|
||||
case 1:
|
||||
tnapi->rx_rcb_prod_idx = &sblk->idx[0].rx_producer;
|
||||
break;
|
||||
case 2:
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||
struct cdc_state *info = (void *) &dev->data;
|
||||
int status;
|
||||
int rndis;
|
||||
bool android_rndis_quirk = false;
|
||||
struct usb_driver *driver = driver_of(intf);
|
||||
struct usb_cdc_mdlm_desc *desc = NULL;
|
||||
struct usb_cdc_mdlm_detail_desc *detail = NULL;
|
||||
|
|
@ -195,6 +196,11 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||
info->control,
|
||||
info->u->bSlaveInterface0,
|
||||
info->data);
|
||||
/* fall back to hard-wiring for RNDIS */
|
||||
if (rndis) {
|
||||
android_rndis_quirk = true;
|
||||
goto next_desc;
|
||||
}
|
||||
goto bad_desc;
|
||||
}
|
||||
if (info->control != intf) {
|
||||
|
|
@ -271,11 +277,15 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||
/* Microsoft ActiveSync based and some regular RNDIS devices lack the
|
||||
* CDC descriptors, so we'll hard-wire the interfaces and not check
|
||||
* for descriptors.
|
||||
*
|
||||
* Some Android RNDIS devices have a CDC Union descriptor pointing
|
||||
* to non-existing interfaces. Ignore that and attempt the same
|
||||
* hard-wired 0 and 1 interfaces.
|
||||
*/
|
||||
if (rndis && !info->u) {
|
||||
if (rndis && (!info->u || android_rndis_quirk)) {
|
||||
info->control = usb_ifnum_to_if(dev->udev, 0);
|
||||
info->data = usb_ifnum_to_if(dev->udev, 1);
|
||||
if (!info->control || !info->data) {
|
||||
if (!info->control || !info->data || info->control != intf) {
|
||||
dev_dbg(&intf->dev,
|
||||
"rndis: master #0/%p slave #1/%p\n",
|
||||
info->control,
|
||||
|
|
@ -472,6 +482,7 @@ static const struct driver_info wwan_info = {
|
|||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#define HUAWEI_VENDOR_ID 0x12D1
|
||||
#define NOVATEL_VENDOR_ID 0x1410
|
||||
|
||||
static const struct usb_device_id products [] = {
|
||||
/*
|
||||
|
|
@ -589,6 +600,21 @@ static const struct usb_device_id products [] = {
|
|||
* because of bugs/quirks in a given product (like Zaurus, above).
|
||||
*/
|
||||
{
|
||||
/* Novatel USB551L */
|
||||
/* This match must come *before* the generic CDC-ETHER match so that
|
||||
* we get FLAG_WWAN set on the device, since it's descriptors are
|
||||
* generic CDC-ETHER.
|
||||
*/
|
||||
.match_flags = USB_DEVICE_ID_MATCH_VENDOR
|
||||
| USB_DEVICE_ID_MATCH_PRODUCT
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
.idVendor = NOVATEL_VENDOR_ID,
|
||||
.idProduct = 0xB001,
|
||||
.bInterfaceClass = USB_CLASS_COMM,
|
||||
.bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET,
|
||||
.bInterfaceProtocol = USB_CDC_PROTO_NONE,
|
||||
.driver_info = (unsigned long)&wwan_info,
|
||||
}, {
|
||||
USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
|
||||
USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long) &cdc_info,
|
||||
|
|
|
|||
|
|
@ -943,7 +943,7 @@ struct sk_buff *sierra_net_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
static const u8 sierra_net_ifnum_list[] = { 7, 10, 11 };
|
||||
static const struct sierra_net_info_data sierra_net_info_data_68A3 = {
|
||||
static const struct sierra_net_info_data sierra_net_info_data_direct_ip = {
|
||||
.rx_urb_size = 8 * 1024,
|
||||
.whitelist = {
|
||||
.infolen = ARRAY_SIZE(sierra_net_ifnum_list),
|
||||
|
|
@ -951,7 +951,7 @@ static const struct sierra_net_info_data sierra_net_info_data_68A3 = {
|
|||
}
|
||||
};
|
||||
|
||||
static const struct driver_info sierra_net_info_68A3 = {
|
||||
static const struct driver_info sierra_net_info_direct_ip = {
|
||||
.description = "Sierra Wireless USB-to-WWAN Modem",
|
||||
.flags = FLAG_WWAN | FLAG_SEND_ZLP,
|
||||
.bind = sierra_net_bind,
|
||||
|
|
@ -959,12 +959,18 @@ static const struct driver_info sierra_net_info_68A3 = {
|
|||
.status = sierra_net_status,
|
||||
.rx_fixup = sierra_net_rx_fixup,
|
||||
.tx_fixup = sierra_net_tx_fixup,
|
||||
.data = (unsigned long)&sierra_net_info_data_68A3,
|
||||
.data = (unsigned long)&sierra_net_info_data_direct_ip,
|
||||
};
|
||||
|
||||
static const struct usb_device_id products[] = {
|
||||
{USB_DEVICE(0x1199, 0x68A3), /* Sierra Wireless USB-to-WWAN modem */
|
||||
.driver_info = (unsigned long) &sierra_net_info_68A3},
|
||||
.driver_info = (unsigned long) &sierra_net_info_direct_ip},
|
||||
{USB_DEVICE(0x0F3D, 0x68A3), /* AT&T Direct IP modem */
|
||||
.driver_info = (unsigned long) &sierra_net_info_direct_ip},
|
||||
{USB_DEVICE(0x1199, 0x68AA), /* Sierra Wireless Direct IP LTE modem */
|
||||
.driver_info = (unsigned long) &sierra_net_info_direct_ip},
|
||||
{USB_DEVICE(0x0F3D, 0x68AA), /* AT&T Direct IP LTE modem */
|
||||
.driver_info = (unsigned long) &sierra_net_info_direct_ip},
|
||||
|
||||
{}, /* last item */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1190,7 +1190,7 @@ static const struct driver_info smsc95xx_info = {
|
|||
.rx_fixup = smsc95xx_rx_fixup,
|
||||
.tx_fixup = smsc95xx_tx_fixup,
|
||||
.status = smsc95xx_status,
|
||||
.flags = FLAG_ETHER | FLAG_SEND_ZLP,
|
||||
.flags = FLAG_ETHER | FLAG_SEND_ZLP | FLAG_LINK_INTR,
|
||||
};
|
||||
|
||||
static const struct usb_device_id products[] = {
|
||||
|
|
|
|||
|
|
@ -280,17 +280,32 @@ int usbnet_change_mtu (struct net_device *net, int new_mtu)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(usbnet_change_mtu);
|
||||
|
||||
/* The caller must hold list->lock */
|
||||
static void __usbnet_queue_skb(struct sk_buff_head *list,
|
||||
struct sk_buff *newsk, enum skb_state state)
|
||||
{
|
||||
struct skb_data *entry = (struct skb_data *) newsk->cb;
|
||||
|
||||
__skb_queue_tail(list, newsk);
|
||||
entry->state = state;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* some LK 2.4 HCDs oopsed if we freed or resubmitted urbs from
|
||||
* completion callbacks. 2.5 should have fixed those bugs...
|
||||
*/
|
||||
|
||||
static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_head *list)
|
||||
static enum skb_state defer_bh(struct usbnet *dev, struct sk_buff *skb,
|
||||
struct sk_buff_head *list, enum skb_state state)
|
||||
{
|
||||
unsigned long flags;
|
||||
enum skb_state old_state;
|
||||
struct skb_data *entry = (struct skb_data *) skb->cb;
|
||||
|
||||
spin_lock_irqsave(&list->lock, flags);
|
||||
old_state = entry->state;
|
||||
entry->state = state;
|
||||
__skb_unlink(skb, list);
|
||||
spin_unlock(&list->lock);
|
||||
spin_lock(&dev->done.lock);
|
||||
|
|
@ -298,6 +313,7 @@ static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_hea
|
|||
if (dev->done.qlen == 1)
|
||||
tasklet_schedule(&dev->bh);
|
||||
spin_unlock_irqrestore(&dev->done.lock, flags);
|
||||
return old_state;
|
||||
}
|
||||
|
||||
/* some work can't be done in tasklets, so we use keventd
|
||||
|
|
@ -338,7 +354,6 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
|
|||
entry = (struct skb_data *) skb->cb;
|
||||
entry->urb = urb;
|
||||
entry->dev = dev;
|
||||
entry->state = rx_start;
|
||||
entry->length = 0;
|
||||
|
||||
usb_fill_bulk_urb (urb, dev->udev, dev->in,
|
||||
|
|
@ -370,7 +385,7 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
|
|||
tasklet_schedule (&dev->bh);
|
||||
break;
|
||||
case 0:
|
||||
__skb_queue_tail (&dev->rxq, skb);
|
||||
__usbnet_queue_skb(&dev->rxq, skb, rx_start);
|
||||
}
|
||||
} else {
|
||||
netif_dbg(dev, ifdown, dev->net, "rx: stopped\n");
|
||||
|
|
@ -421,16 +436,17 @@ static void rx_complete (struct urb *urb)
|
|||
struct skb_data *entry = (struct skb_data *) skb->cb;
|
||||
struct usbnet *dev = entry->dev;
|
||||
int urb_status = urb->status;
|
||||
enum skb_state state;
|
||||
|
||||
skb_put (skb, urb->actual_length);
|
||||
entry->state = rx_done;
|
||||
state = rx_done;
|
||||
entry->urb = NULL;
|
||||
|
||||
switch (urb_status) {
|
||||
/* success */
|
||||
case 0:
|
||||
if (skb->len < dev->net->hard_header_len) {
|
||||
entry->state = rx_cleanup;
|
||||
state = rx_cleanup;
|
||||
dev->net->stats.rx_errors++;
|
||||
dev->net->stats.rx_length_errors++;
|
||||
netif_dbg(dev, rx_err, dev->net,
|
||||
|
|
@ -469,7 +485,7 @@ static void rx_complete (struct urb *urb)
|
|||
"rx throttle %d\n", urb_status);
|
||||
}
|
||||
block:
|
||||
entry->state = rx_cleanup;
|
||||
state = rx_cleanup;
|
||||
entry->urb = urb;
|
||||
urb = NULL;
|
||||
break;
|
||||
|
|
@ -480,17 +496,18 @@ static void rx_complete (struct urb *urb)
|
|||
// FALLTHROUGH
|
||||
|
||||
default:
|
||||
entry->state = rx_cleanup;
|
||||
state = rx_cleanup;
|
||||
dev->net->stats.rx_errors++;
|
||||
netif_dbg(dev, rx_err, dev->net, "rx status %d\n", urb_status);
|
||||
break;
|
||||
}
|
||||
|
||||
defer_bh(dev, skb, &dev->rxq);
|
||||
state = defer_bh(dev, skb, &dev->rxq, state);
|
||||
|
||||
if (urb) {
|
||||
if (netif_running (dev->net) &&
|
||||
!test_bit (EVENT_RX_HALT, &dev->flags)) {
|
||||
!test_bit (EVENT_RX_HALT, &dev->flags) &&
|
||||
state != unlink_start) {
|
||||
rx_submit (dev, urb, GFP_ATOMIC);
|
||||
return;
|
||||
}
|
||||
|
|
@ -576,16 +593,23 @@ EXPORT_SYMBOL_GPL(usbnet_purge_paused_rxq);
|
|||
static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct sk_buff *skb, *skbnext;
|
||||
struct sk_buff *skb;
|
||||
int count = 0;
|
||||
|
||||
spin_lock_irqsave (&q->lock, flags);
|
||||
skb_queue_walk_safe(q, skb, skbnext) {
|
||||
while (!skb_queue_empty(q)) {
|
||||
struct skb_data *entry;
|
||||
struct urb *urb;
|
||||
int retval;
|
||||
|
||||
entry = (struct skb_data *) skb->cb;
|
||||
skb_queue_walk(q, skb) {
|
||||
entry = (struct skb_data *) skb->cb;
|
||||
if (entry->state != unlink_start)
|
||||
goto found;
|
||||
}
|
||||
break;
|
||||
found:
|
||||
entry->state = unlink_start;
|
||||
urb = entry->urb;
|
||||
|
||||
/*
|
||||
|
|
@ -1036,8 +1060,7 @@ static void tx_complete (struct urb *urb)
|
|||
}
|
||||
|
||||
usb_autopm_put_interface_async(dev->intf);
|
||||
entry->state = tx_done;
|
||||
defer_bh(dev, skb, &dev->txq);
|
||||
(void) defer_bh(dev, skb, &dev->txq, tx_done);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
|
@ -1090,7 +1113,6 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
|
|||
entry = (struct skb_data *) skb->cb;
|
||||
entry->urb = urb;
|
||||
entry->dev = dev;
|
||||
entry->state = tx_start;
|
||||
entry->length = length;
|
||||
|
||||
usb_fill_bulk_urb (urb, dev->udev, dev->out,
|
||||
|
|
@ -1149,7 +1171,7 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
|
|||
break;
|
||||
case 0:
|
||||
net->trans_start = jiffies;
|
||||
__skb_queue_tail (&dev->txq, skb);
|
||||
__usbnet_queue_skb(&dev->txq, skb, tx_start);
|
||||
if (dev->txq.qlen >= TX_QLEN (dev))
|
||||
netif_stop_queue (net);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1682,6 +1682,11 @@ int pci_prepare_to_sleep(struct pci_dev *dev)
|
|||
if (target_state == PCI_POWER_ERROR)
|
||||
return -EIO;
|
||||
|
||||
/* Some devices mustn't be in D3 during system sleep */
|
||||
if (target_state == PCI_D3hot &&
|
||||
(dev->dev_flags & PCI_DEV_FLAGS_NO_D3_DURING_SLEEP))
|
||||
return 0;
|
||||
|
||||
pci_enable_wake(dev, target_state, device_may_wakeup(&dev->dev));
|
||||
|
||||
error = pci_set_power_state(dev, target_state);
|
||||
|
|
|
|||
|
|
@ -2856,6 +2856,32 @@ static void __devinit disable_igfx_irq(struct pci_dev *dev)
|
|||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
|
||||
|
||||
/*
|
||||
* The Intel 6 Series/C200 Series chipset's EHCI controllers on many
|
||||
* ASUS motherboards will cause memory corruption or a system crash
|
||||
* if they are in D3 while the system is put into S3 sleep.
|
||||
*/
|
||||
static void __devinit asus_ehci_no_d3(struct pci_dev *dev)
|
||||
{
|
||||
const char *sys_info;
|
||||
static const char good_Asus_board[] = "P8Z68-V";
|
||||
|
||||
if (dev->dev_flags & PCI_DEV_FLAGS_NO_D3_DURING_SLEEP)
|
||||
return;
|
||||
if (dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK)
|
||||
return;
|
||||
sys_info = dmi_get_system_info(DMI_BOARD_NAME);
|
||||
if (sys_info && memcmp(sys_info, good_Asus_board,
|
||||
sizeof(good_Asus_board) - 1) == 0)
|
||||
return;
|
||||
|
||||
dev_info(&dev->dev, "broken D3 during system sleep on ASUS\n");
|
||||
dev->dev_flags |= PCI_DEV_FLAGS_NO_D3_DURING_SLEEP;
|
||||
device_set_wakeup_capable(&dev->dev, false);
|
||||
}
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1c26, asus_ehci_no_d3);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1c2d, asus_ehci_no_d3);
|
||||
|
||||
static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f,
|
||||
struct pci_fixup *end)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ MODULE_PARM_DESC(minor,
|
|||
"default is -1 (automatic)");
|
||||
#endif
|
||||
|
||||
static int kbd_backlight; /* = 1 */
|
||||
static int kbd_backlight = 1;
|
||||
module_param(kbd_backlight, int, 0444);
|
||||
MODULE_PARM_DESC(kbd_backlight,
|
||||
"set this to 0 to disable keyboard backlight, "
|
||||
|
|
|
|||
|
|
@ -688,7 +688,7 @@ static int max8997_set_voltage_buck(struct regulator_dev *rdev,
|
|||
}
|
||||
|
||||
new_val++;
|
||||
} while (desc->min + desc->step + new_val <= desc->max);
|
||||
} while (desc->min + desc->step * new_val <= desc->max);
|
||||
|
||||
new_idx = tmp_idx;
|
||||
new_val = tmp_val;
|
||||
|
|
|
|||
|
|
@ -312,6 +312,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
|||
int ret;
|
||||
struct pl031_local *ldata;
|
||||
struct rtc_class_ops *ops = id->data;
|
||||
unsigned long time;
|
||||
|
||||
ret = amba_request_regions(adev, NULL);
|
||||
if (ret)
|
||||
|
|
@ -343,6 +344,23 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
|||
writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN,
|
||||
ldata->base + RTC_CR);
|
||||
|
||||
/*
|
||||
* On ST PL031 variants, the RTC reset value does not provide correct
|
||||
* weekday for 2000-01-01. Correct the erroneous sunday to saturday.
|
||||
*/
|
||||
if (ldata->hw_designer == AMBA_VENDOR_ST) {
|
||||
if (readl(ldata->base + RTC_YDR) == 0x2000) {
|
||||
time = readl(ldata->base + RTC_DR);
|
||||
if ((time &
|
||||
(RTC_MON_MASK | RTC_MDAY_MASK | RTC_WDAY_MASK))
|
||||
== 0x02120000) {
|
||||
time = time | (0x7 << RTC_WDAY_SHIFT);
|
||||
writel(0x2000, ldata->base + RTC_YLR);
|
||||
writel(time, ldata->base + RTC_LR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ldata->rtc = rtc_device_register("pl031", &adev->dev, ops,
|
||||
THIS_MODULE);
|
||||
if (IS_ERR(ldata->rtc)) {
|
||||
|
|
|
|||
|
|
@ -1654,30 +1654,26 @@ static void figure_bus_target_lun(struct ctlr_info *h,
|
|||
|
||||
if (is_logical_dev_addr_mode(lunaddrbytes)) {
|
||||
/* logical device */
|
||||
if (unlikely(is_scsi_rev_5(h))) {
|
||||
/* p1210m, logical drives lun assignments
|
||||
* match SCSI REPORT LUNS data.
|
||||
lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
|
||||
if (is_msa2xxx(h, device)) {
|
||||
/* msa2xxx way, put logicals on bus 1
|
||||
* and match target/lun numbers box
|
||||
* reports.
|
||||
*/
|
||||
lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
|
||||
*bus = 0;
|
||||
*target = 0;
|
||||
*lun = (lunid & 0x3fff) + 1;
|
||||
*bus = 1;
|
||||
*target = (lunid >> 16) & 0x3fff;
|
||||
*lun = lunid & 0x00ff;
|
||||
} else {
|
||||
/* not p1210m... */
|
||||
lunid = le32_to_cpu(*((__le32 *) lunaddrbytes));
|
||||
if (is_msa2xxx(h, device)) {
|
||||
/* msa2xxx way, put logicals on bus 1
|
||||
* and match target/lun numbers box
|
||||
* reports.
|
||||
*/
|
||||
*bus = 1;
|
||||
*target = (lunid >> 16) & 0x3fff;
|
||||
*lun = lunid & 0x00ff;
|
||||
} else {
|
||||
/* Traditional smart array way. */
|
||||
if (likely(is_scsi_rev_5(h))) {
|
||||
/* All current smart arrays (circa 2011) */
|
||||
*bus = 0;
|
||||
*target = 0;
|
||||
*lun = (lunid & 0x3fff) + 1;
|
||||
} else {
|
||||
/* Traditional old smart array way. */
|
||||
*bus = 0;
|
||||
*lun = 0;
|
||||
*target = lunid & 0x3fff;
|
||||
*lun = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
@ -4037,10 +4033,10 @@ static int hpsa_request_irq(struct ctlr_info *h,
|
|||
|
||||
if (h->msix_vector || h->msi_vector)
|
||||
rc = request_irq(h->intr[h->intr_mode], msixhandler,
|
||||
IRQF_DISABLED, h->devname, h);
|
||||
0, h->devname, h);
|
||||
else
|
||||
rc = request_irq(h->intr[h->intr_mode], intxhandler,
|
||||
IRQF_DISABLED, h->devname, h);
|
||||
IRQF_SHARED, h->devname, h);
|
||||
if (rc) {
|
||||
dev_err(&h->pdev->dev, "unable to get irq %d for %s\n",
|
||||
h->intr[h->intr_mode], h->devname);
|
||||
|
|
|
|||
|
|
@ -454,7 +454,7 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic
|
|||
if (!orom)
|
||||
orom = isci_request_oprom(pdev);
|
||||
|
||||
for (i = 0; orom && i < ARRAY_SIZE(orom->ctrl); i++) {
|
||||
for (i = 0; orom && i < num_controllers(pdev); i++) {
|
||||
if (sci_oem_parameters_validate(&orom->ctrl[i])) {
|
||||
dev_warn(&pdev->dev,
|
||||
"[%d]: invalid oem parameters detected, falling back to firmware\n", i);
|
||||
|
|
|
|||
|
|
@ -3056,7 +3056,7 @@ _base_get_port_facts(struct MPT2SAS_ADAPTER *ioc, int port, int sleep_flag)
|
|||
}
|
||||
|
||||
pfacts = &ioc->pfacts[port];
|
||||
memset(pfacts, 0, sizeof(Mpi2PortFactsReply_t));
|
||||
memset(pfacts, 0, sizeof(struct mpt2sas_port_facts));
|
||||
pfacts->PortNumber = mpi_reply.PortNumber;
|
||||
pfacts->VP_ID = mpi_reply.VP_ID;
|
||||
pfacts->VF_ID = mpi_reply.VF_ID;
|
||||
|
|
@ -3098,7 +3098,7 @@ _base_get_ioc_facts(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
|
|||
}
|
||||
|
||||
facts = &ioc->facts;
|
||||
memset(facts, 0, sizeof(Mpi2IOCFactsReply_t));
|
||||
memset(facts, 0, sizeof(struct mpt2sas_facts));
|
||||
facts->MsgVersion = le16_to_cpu(mpi_reply.MsgVersion);
|
||||
facts->HeaderVersion = le16_to_cpu(mpi_reply.HeaderVersion);
|
||||
facts->VP_ID = mpi_reply.VP_ID;
|
||||
|
|
@ -3779,7 +3779,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc)
|
|||
goto out_free_resources;
|
||||
|
||||
ioc->pfacts = kcalloc(ioc->facts.NumberOfPorts,
|
||||
sizeof(Mpi2PortFactsReply_t), GFP_KERNEL);
|
||||
sizeof(struct mpt2sas_port_facts), GFP_KERNEL);
|
||||
if (!ioc->pfacts) {
|
||||
r = -ENOMEM;
|
||||
goto out_free_resources;
|
||||
|
|
|
|||
|
|
@ -1380,16 +1380,19 @@ static int scsi_lld_busy(struct request_queue *q)
|
|||
{
|
||||
struct scsi_device *sdev = q->queuedata;
|
||||
struct Scsi_Host *shost;
|
||||
struct scsi_target *starget;
|
||||
|
||||
if (!sdev)
|
||||
return 0;
|
||||
|
||||
shost = sdev->host;
|
||||
starget = scsi_target(sdev);
|
||||
|
||||
if (scsi_host_in_recovery(shost) || scsi_host_is_busy(shost) ||
|
||||
scsi_target_is_busy(starget) || scsi_device_is_busy(sdev))
|
||||
/*
|
||||
* Ignore host/starget busy state.
|
||||
* Since block layer does not have a concept of fairness across
|
||||
* multiple queues, congestion of host/starget needs to be handled
|
||||
* in SCSI layer.
|
||||
*/
|
||||
if (scsi_host_in_recovery(shost) || scsi_device_is_busy(sdev))
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <scsi/scsi_scan.h>
|
||||
#include "scsi_priv.h"
|
||||
|
||||
static int __init wait_scan_init(void)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -280,7 +280,7 @@ static int do_devconfig_ioctl(struct comedi_device *dev,
|
|||
if (ret == 0) {
|
||||
if (!try_module_get(dev->driver->module)) {
|
||||
comedi_device_detach(dev);
|
||||
return -ENOSYS;
|
||||
ret = -ENOSYS;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -368,6 +368,8 @@ static void mxs_auart_settermios(struct uart_port *u,
|
|||
|
||||
writel(ctrl, u->membase + AUART_LINECTRL);
|
||||
writel(ctrl2, u->membase + AUART_CTRL2);
|
||||
|
||||
uart_update_timeout(u, termios->c_cflag, baud);
|
||||
}
|
||||
|
||||
static irqreturn_t mxs_auart_irq_handle(int irq, void *context)
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user