Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
959327c784
|
@ -315,8 +315,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
CPU-intensive style benchmark, and it can vary highly in
|
||||
a microbenchmark depending on workload and compiler.
|
||||
|
||||
1: only for 32-bit processes
|
||||
2: only for 64-bit processes
|
||||
32: only for 32-bit processes
|
||||
64: only for 64-bit processes
|
||||
on: enable for both 32- and 64-bit processes
|
||||
off: disable for both 32- and 64-bit processes
|
||||
|
||||
|
|
|
@ -295,11 +295,11 @@ tcp_max_ssthresh - INTEGER
|
|||
Default: 0 (off)
|
||||
|
||||
tcp_max_syn_backlog - INTEGER
|
||||
Maximal number of remembered connection requests, which are
|
||||
still did not receive an acknowledgment from connecting client.
|
||||
Default value is 1024 for systems with more than 128Mb of memory,
|
||||
and 128 for low memory machines. If server suffers of overload,
|
||||
try to increase this number.
|
||||
Maximal number of remembered connection requests, which have not
|
||||
received an acknowledgment from connecting client.
|
||||
The minimal value is 128 for low memory machines, and it will
|
||||
increase in proportion to the memory of machine.
|
||||
If server suffers from overload, try increasing this number.
|
||||
|
||||
tcp_max_tw_buckets - INTEGER
|
||||
Maximal number of timewait sockets held by system simultaneously.
|
||||
|
|
|
@ -90,10 +90,10 @@ ServiceBinary=%12%\USBSER.sys
|
|||
[SourceDisksFiles]
|
||||
[SourceDisksNames]
|
||||
[DeviceList]
|
||||
%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02
|
||||
%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02, USB\VID_1D6B&PID_0106&MI_00
|
||||
|
||||
[DeviceList.NTamd64]
|
||||
%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02
|
||||
%DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02, USB\VID_1D6B&PID_0106&MI_00
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
|
|
|
@ -353,15 +353,15 @@ validate_group(struct perf_event *event)
|
|||
fake_pmu.used_mask = fake_used_mask;
|
||||
|
||||
if (!validate_event(&fake_pmu, leader))
|
||||
return -ENOSPC;
|
||||
return -EINVAL;
|
||||
|
||||
list_for_each_entry(sibling, &leader->sibling_list, group_entry) {
|
||||
if (!validate_event(&fake_pmu, sibling))
|
||||
return -ENOSPC;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!validate_event(&fake_pmu, event))
|
||||
return -ENOSPC;
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -623,7 +623,7 @@ static int mipspmu_event_init(struct perf_event *event)
|
|||
if (!atomic_inc_not_zero(&active_events)) {
|
||||
if (atomic_read(&active_events) > MIPS_MAX_HWEVENTS) {
|
||||
atomic_dec(&active_events);
|
||||
return -ENOSPC;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&pmu_reserve_mutex);
|
||||
|
@ -732,15 +732,15 @@ static int validate_group(struct perf_event *event)
|
|||
memset(&fake_cpuc, 0, sizeof(fake_cpuc));
|
||||
|
||||
if (!validate_event(&fake_cpuc, leader))
|
||||
return -ENOSPC;
|
||||
return -EINVAL;
|
||||
|
||||
list_for_each_entry(sibling, &leader->sibling_list, group_entry) {
|
||||
if (!validate_event(&fake_cpuc, sibling))
|
||||
return -ENOSPC;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!validate_event(&fake_cpuc, event))
|
||||
return -ENOSPC;
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -599,10 +599,10 @@ static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste)
|
|||
skey = page_get_storage_key(address);
|
||||
bits = skey & (_PAGE_CHANGED | _PAGE_REFERENCED);
|
||||
/* Clear page changed & referenced bit in the storage key */
|
||||
if (bits) {
|
||||
skey ^= bits;
|
||||
page_set_storage_key(address, skey, 1);
|
||||
}
|
||||
if (bits & _PAGE_CHANGED)
|
||||
page_set_storage_key(address, skey ^ bits, 1);
|
||||
else if (bits)
|
||||
page_reset_referenced(address);
|
||||
/* Transfer page changed & referenced bit to guest bits in pgste */
|
||||
pgste_val(pgste) |= bits << 48; /* RCP_GR_BIT & RCP_GC_BIT */
|
||||
/* Get host changed & referenced bits from pgste */
|
||||
|
|
|
@ -296,13 +296,6 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
|
|||
((data & PSW_MASK_EA) && !(data & PSW_MASK_BA))))
|
||||
/* Invalid psw mask. */
|
||||
return -EINVAL;
|
||||
if (addr == (addr_t) &dummy->regs.psw.addr)
|
||||
/*
|
||||
* The debugger changed the instruction address,
|
||||
* reset system call restart, see signal.c:do_signal
|
||||
*/
|
||||
task_thread_info(child)->system_call = 0;
|
||||
|
||||
*(addr_t *)((addr_t) &task_pt_regs(child)->psw + addr) = data;
|
||||
|
||||
} else if (addr < (addr_t) (&dummy->regs.orig_gpr2)) {
|
||||
|
@ -614,11 +607,6 @@ static int __poke_user_compat(struct task_struct *child,
|
|||
/* Transfer 31 bit amode bit to psw mask. */
|
||||
regs->psw.mask = (regs->psw.mask & ~PSW_MASK_BA) |
|
||||
(__u64)(tmp & PSW32_ADDR_AMODE);
|
||||
/*
|
||||
* The debugger changed the instruction address,
|
||||
* reset system call restart, see signal.c:do_signal
|
||||
*/
|
||||
task_thread_info(child)->system_call = 0;
|
||||
} else {
|
||||
/* gpr 0-15 */
|
||||
*(__u32*)((addr_t) ®s->psw + addr*2 + 4) = tmp;
|
||||
|
@ -905,6 +893,14 @@ static int s390_last_break_get(struct task_struct *target,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int s390_last_break_set(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static int s390_system_call_get(struct task_struct *target,
|
||||
|
@ -951,6 +947,7 @@ static const struct user_regset s390_regsets[] = {
|
|||
.size = sizeof(long),
|
||||
.align = sizeof(long),
|
||||
.get = s390_last_break_get,
|
||||
.set = s390_last_break_set,
|
||||
},
|
||||
#endif
|
||||
[REGSET_SYSTEM_CALL] = {
|
||||
|
@ -1116,6 +1113,14 @@ static int s390_compat_last_break_get(struct task_struct *target,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int s390_compat_last_break_set(struct task_struct *target,
|
||||
const struct user_regset *regset,
|
||||
unsigned int pos, unsigned int count,
|
||||
const void *kbuf, const void __user *ubuf)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct user_regset s390_compat_regsets[] = {
|
||||
[REGSET_GENERAL] = {
|
||||
.core_note_type = NT_PRSTATUS,
|
||||
|
@ -1139,6 +1144,7 @@ static const struct user_regset s390_compat_regsets[] = {
|
|||
.size = sizeof(long),
|
||||
.align = sizeof(long),
|
||||
.get = s390_compat_last_break_get,
|
||||
.set = s390_compat_last_break_set,
|
||||
},
|
||||
[REGSET_SYSTEM_CALL] = {
|
||||
.core_note_type = NT_S390_SYSTEM_CALL,
|
||||
|
|
|
@ -579,7 +579,7 @@ static unsigned long __init find_crash_base(unsigned long crash_size,
|
|||
*msg = "first memory chunk must be at least crashkernel size";
|
||||
return 0;
|
||||
}
|
||||
if (is_kdump_kernel() && (crash_size == OLDMEM_SIZE))
|
||||
if (OLDMEM_BASE && crash_size == OLDMEM_SIZE)
|
||||
return OLDMEM_BASE;
|
||||
|
||||
for (i = MEMORY_CHUNKS - 1; i >= 0; i--) {
|
||||
|
|
|
@ -460,9 +460,9 @@ void do_signal(struct pt_regs *regs)
|
|||
regs->svc_code >> 16);
|
||||
break;
|
||||
}
|
||||
/* No longer in a system call */
|
||||
clear_thread_flag(TIF_SYSCALL);
|
||||
}
|
||||
/* No longer in a system call */
|
||||
clear_thread_flag(TIF_SYSCALL);
|
||||
|
||||
if ((is_compat_task() ?
|
||||
handle_signal32(signr, &ka, &info, oldset, regs) :
|
||||
|
@ -486,6 +486,7 @@ void do_signal(struct pt_regs *regs)
|
|||
}
|
||||
|
||||
/* No handlers present - check for system call restart */
|
||||
clear_thread_flag(TIF_SYSCALL);
|
||||
if (current_thread_info()->system_call) {
|
||||
regs->svc_code = current_thread_info()->system_call;
|
||||
switch (regs->gprs[2]) {
|
||||
|
@ -500,9 +501,6 @@ void do_signal(struct pt_regs *regs)
|
|||
regs->gprs[2] = regs->orig_gpr2;
|
||||
set_thread_flag(TIF_SYSCALL);
|
||||
break;
|
||||
default:
|
||||
clear_thread_flag(TIF_SYSCALL);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,11 +3,15 @@
|
|||
|
||||
#include <linux/notifier.h>
|
||||
|
||||
#define IPCMSG_VRTC 0xFA /* Set vRTC device */
|
||||
#define IPCMSG_WARM_RESET 0xF0
|
||||
#define IPCMSG_COLD_RESET 0xF1
|
||||
#define IPCMSG_SOFT_RESET 0xF2
|
||||
#define IPCMSG_COLD_BOOT 0xF3
|
||||
|
||||
/* Command id associated with message IPCMSG_VRTC */
|
||||
#define IPC_CMD_VRTC_SETTIME 1 /* Set time */
|
||||
#define IPC_CMD_VRTC_SETALARM 2 /* Set alarm */
|
||||
#define IPCMSG_VRTC 0xFA /* Set vRTC device */
|
||||
/* Command id associated with message IPCMSG_VRTC */
|
||||
#define IPC_CMD_VRTC_SETTIME 1 /* Set time */
|
||||
#define IPC_CMD_VRTC_SETALARM 2 /* Set alarm */
|
||||
|
||||
/* Read single register */
|
||||
int intel_scu_ipc_ioread8(u16 addr, u8 *data);
|
||||
|
|
|
@ -31,11 +31,20 @@ enum mrst_cpu_type {
|
|||
};
|
||||
|
||||
extern enum mrst_cpu_type __mrst_cpu_chip;
|
||||
|
||||
#ifdef CONFIG_X86_INTEL_MID
|
||||
|
||||
static inline enum mrst_cpu_type mrst_identify_cpu(void)
|
||||
{
|
||||
return __mrst_cpu_chip;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_X86_INTEL_MID */
|
||||
|
||||
#define mrst_identify_cpu() (0)
|
||||
|
||||
#endif /* !CONFIG_X86_INTEL_MID */
|
||||
|
||||
enum mrst_timer_options {
|
||||
MRST_TIMER_DEFAULT,
|
||||
MRST_TIMER_APBT_ONLY,
|
||||
|
|
|
@ -169,7 +169,14 @@ static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high)
|
|||
return native_write_msr_safe(msr, low, high);
|
||||
}
|
||||
|
||||
/* rdmsr with exception handling */
|
||||
/*
|
||||
* rdmsr with exception handling.
|
||||
*
|
||||
* Please note that the exception handling works only after we've
|
||||
* switched to the "smart" #GP handler in trap_init() which knows about
|
||||
* exception tables - using this macro earlier than that causes machine
|
||||
* hangs on boxes which do not implement the @msr in the first argument.
|
||||
*/
|
||||
#define rdmsr_safe(msr, p1, p2) \
|
||||
({ \
|
||||
int __err; \
|
||||
|
|
|
@ -401,6 +401,7 @@ extern unsigned long arch_align_stack(unsigned long sp);
|
|||
extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
|
||||
|
||||
void default_idle(void);
|
||||
bool set_pm_idle_to_default(void);
|
||||
|
||||
void stop_this_cpu(void *dummy);
|
||||
|
||||
|
|
|
@ -32,6 +32,22 @@ extern int no_timer_check;
|
|||
* (mathieu.desnoyers@polymtl.ca)
|
||||
*
|
||||
* -johnstul@us.ibm.com "math is hard, lets go shopping!"
|
||||
*
|
||||
* In:
|
||||
*
|
||||
* ns = cycles * cyc2ns_scale / SC
|
||||
*
|
||||
* Although we may still have enough bits to store the value of ns,
|
||||
* in some cases, we may not have enough bits to store cycles * cyc2ns_scale,
|
||||
* leading to an incorrect result.
|
||||
*
|
||||
* To avoid this, we can decompose 'cycles' into quotient and remainder
|
||||
* of division by SC. Then,
|
||||
*
|
||||
* ns = (quot * SC + rem) * cyc2ns_scale / SC
|
||||
* = quot * cyc2ns_scale + (rem * cyc2ns_scale) / SC
|
||||
*
|
||||
* - sqazi@google.com
|
||||
*/
|
||||
|
||||
DECLARE_PER_CPU(unsigned long, cyc2ns);
|
||||
|
@ -41,9 +57,14 @@ DECLARE_PER_CPU(unsigned long long, cyc2ns_offset);
|
|||
|
||||
static inline unsigned long long __cycles_2_ns(unsigned long long cyc)
|
||||
{
|
||||
unsigned long long quot;
|
||||
unsigned long long rem;
|
||||
int cpu = smp_processor_id();
|
||||
unsigned long long ns = per_cpu(cyc2ns_offset, cpu);
|
||||
ns += cyc * per_cpu(cyc2ns, cpu) >> CYC2NS_SCALE_FACTOR;
|
||||
quot = (cyc >> CYC2NS_SCALE_FACTOR);
|
||||
rem = cyc & ((1ULL << CYC2NS_SCALE_FACTOR) - 1);
|
||||
ns += quot * per_cpu(cyc2ns, cpu) +
|
||||
((rem * per_cpu(cyc2ns, cpu)) >> CYC2NS_SCALE_FACTOR);
|
||||
return ns;
|
||||
}
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
|
||||
#define UV1_HUB_PART_NUMBER 0x88a5
|
||||
#define UV2_HUB_PART_NUMBER 0x8eb8
|
||||
#define UV2_HUB_PART_NUMBER_X 0x1111
|
||||
|
||||
/* Compat: if this #define is present, UV headers support UV2 */
|
||||
#define UV2_HUB_IS_SUPPORTED 1
|
||||
|
|
|
@ -93,6 +93,8 @@ static int __init early_get_pnodeid(void)
|
|||
|
||||
if (node_id.s.part_number == UV2_HUB_PART_NUMBER)
|
||||
uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1;
|
||||
if (node_id.s.part_number == UV2_HUB_PART_NUMBER_X)
|
||||
uv_min_hub_revision_id += UV2_HUB_REVISION_BASE - 1;
|
||||
|
||||
uv_hub_info->hub_revision = uv_min_hub_revision_id;
|
||||
pnode = (node_id.s.node_id >> 1) & ((1 << m_n_config.s.n_skt) - 1);
|
||||
|
|
|
@ -442,8 +442,6 @@ static void __cpuinit bsp_init_amd(struct cpuinfo_x86 *c)
|
|||
|
||||
static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 dummy;
|
||||
|
||||
early_init_amd_mc(c);
|
||||
|
||||
/*
|
||||
|
@ -473,12 +471,12 @@ static void __cpuinit early_init_amd(struct cpuinfo_x86 *c)
|
|||
set_cpu_cap(c, X86_FEATURE_EXTD_APICID);
|
||||
}
|
||||
#endif
|
||||
|
||||
rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);
|
||||
}
|
||||
|
||||
static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
||||
{
|
||||
u32 dummy;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
unsigned long long value;
|
||||
|
||||
|
@ -657,6 +655,8 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
|||
checking_wrmsrl(MSR_AMD64_MCx_MASK(4), mask);
|
||||
}
|
||||
}
|
||||
|
||||
rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
|
|
@ -547,6 +547,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
|||
|
||||
if (tmp != mask_lo) {
|
||||
printk(KERN_WARNING "mtrr: your BIOS has configured an incorrect mask, fixing it.\n");
|
||||
add_taint(TAINT_FIRMWARE_WORKAROUND);
|
||||
mask_lo = tmp;
|
||||
}
|
||||
}
|
||||
|
@ -693,6 +694,7 @@ static void prepare_set(void) __acquires(set_atomicity_lock)
|
|||
|
||||
/* Disable MTRRs, and set the default type to uncached */
|
||||
mtrr_wrmsr(MSR_MTRRdefType, deftype_lo & ~0xcff, deftype_hi);
|
||||
wbinvd();
|
||||
}
|
||||
|
||||
static void post_set(void) __releases(set_atomicity_lock)
|
||||
|
|
|
@ -312,12 +312,8 @@ int x86_setup_perfctr(struct perf_event *event)
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/*
|
||||
* Do not allow config1 (extended registers) to propagate,
|
||||
* there's no sane user-space generalization yet:
|
||||
*/
|
||||
if (attr->type == PERF_TYPE_RAW)
|
||||
return 0;
|
||||
return x86_pmu_extra_regs(event->attr.config, event);
|
||||
|
||||
if (attr->type == PERF_TYPE_HW_CACHE)
|
||||
return set_ext_hw_attr(hwc, event);
|
||||
|
@ -588,7 +584,7 @@ done:
|
|||
x86_pmu.put_event_constraints(cpuc, cpuc->event_list[i]);
|
||||
}
|
||||
}
|
||||
return num ? -ENOSPC : 0;
|
||||
return num ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -607,7 +603,7 @@ static int collect_events(struct cpu_hw_events *cpuc, struct perf_event *leader,
|
|||
|
||||
if (is_x86_event(leader)) {
|
||||
if (n >= max_count)
|
||||
return -ENOSPC;
|
||||
return -EINVAL;
|
||||
cpuc->event_list[n] = leader;
|
||||
n++;
|
||||
}
|
||||
|
@ -620,7 +616,7 @@ static int collect_events(struct cpu_hw_events *cpuc, struct perf_event *leader,
|
|||
continue;
|
||||
|
||||
if (n >= max_count)
|
||||
return -ENOSPC;
|
||||
return -EINVAL;
|
||||
|
||||
cpuc->event_list[n] = event;
|
||||
n++;
|
||||
|
@ -1316,7 +1312,7 @@ static int validate_event(struct perf_event *event)
|
|||
c = x86_pmu.get_event_constraints(fake_cpuc, event);
|
||||
|
||||
if (!c || !c->weight)
|
||||
ret = -ENOSPC;
|
||||
ret = -EINVAL;
|
||||
|
||||
if (x86_pmu.put_event_constraints)
|
||||
x86_pmu.put_event_constraints(fake_cpuc, event);
|
||||
|
@ -1341,7 +1337,7 @@ static int validate_group(struct perf_event *event)
|
|||
{
|
||||
struct perf_event *leader = event->group_leader;
|
||||
struct cpu_hw_events *fake_cpuc;
|
||||
int ret = -ENOSPC, n;
|
||||
int ret = -EINVAL, n;
|
||||
|
||||
fake_cpuc = allocate_fake_cpuc();
|
||||
if (IS_ERR(fake_cpuc))
|
||||
|
|
|
@ -199,8 +199,7 @@ static int force_ibs_eilvt_setup(void)
|
|||
goto out;
|
||||
}
|
||||
|
||||
pr_err(FW_BUG "using offset %d for IBS interrupts\n", offset);
|
||||
pr_err(FW_BUG "workaround enabled for IBS LVT offset\n");
|
||||
pr_info("IBS: LVT offset %d assigned\n", offset);
|
||||
|
||||
return 0;
|
||||
out:
|
||||
|
@ -265,19 +264,23 @@ perf_ibs_cpu_notifier(struct notifier_block *self, unsigned long action, void *h
|
|||
static __init int amd_ibs_init(void)
|
||||
{
|
||||
u32 caps;
|
||||
int ret;
|
||||
int ret = -EINVAL;
|
||||
|
||||
caps = __get_ibs_caps();
|
||||
if (!caps)
|
||||
return -ENODEV; /* ibs not supported by the cpu */
|
||||
|
||||
if (!ibs_eilvt_valid()) {
|
||||
ret = force_ibs_eilvt_setup();
|
||||
if (ret) {
|
||||
pr_err("Failed to setup IBS, %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Force LVT offset assignment for family 10h: The offsets are
|
||||
* not assigned by the BIOS for this family, so the OS is
|
||||
* responsible for doing it. If the OS assignment fails, fall
|
||||
* back to BIOS settings and try to setup this.
|
||||
*/
|
||||
if (boot_cpu_data.x86 == 0x10)
|
||||
force_ibs_eilvt_setup();
|
||||
|
||||
if (!ibs_eilvt_valid())
|
||||
goto out;
|
||||
|
||||
get_online_cpus();
|
||||
ibs_caps = caps;
|
||||
|
@ -287,7 +290,11 @@ static __init int amd_ibs_init(void)
|
|||
smp_call_function(setup_APIC_ibs, NULL, 1);
|
||||
put_online_cpus();
|
||||
|
||||
return perf_event_ibs_init();
|
||||
ret = perf_event_ibs_init();
|
||||
out:
|
||||
if (ret)
|
||||
pr_err("Failed to setup IBS, %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Since we need the pci subsystem to init ibs we can't do this earlier: */
|
||||
|
|
|
@ -1545,6 +1545,13 @@ static void intel_clovertown_quirks(void)
|
|||
x86_pmu.pebs_constraints = NULL;
|
||||
}
|
||||
|
||||
static void intel_sandybridge_quirks(void)
|
||||
{
|
||||
printk(KERN_WARNING "PEBS disabled due to CPU errata.\n");
|
||||
x86_pmu.pebs = 0;
|
||||
x86_pmu.pebs_constraints = NULL;
|
||||
}
|
||||
|
||||
__init int intel_pmu_init(void)
|
||||
{
|
||||
union cpuid10_edx edx;
|
||||
|
@ -1694,6 +1701,7 @@ __init int intel_pmu_init(void)
|
|||
break;
|
||||
|
||||
case 42: /* SandyBridge */
|
||||
x86_pmu.quirks = intel_sandybridge_quirks;
|
||||
case 45: /* SandyBridge, "Romely-EP" */
|
||||
memcpy(hw_cache_event_ids, snb_hw_cache_event_ids,
|
||||
sizeof(hw_cache_event_ids));
|
||||
|
|
|
@ -493,6 +493,7 @@ static int intel_pmu_pebs_fixup_ip(struct pt_regs *regs)
|
|||
unsigned long from = cpuc->lbr_entries[0].from;
|
||||
unsigned long old_to, to = cpuc->lbr_entries[0].to;
|
||||
unsigned long ip = regs->ip;
|
||||
int is_64bit = 0;
|
||||
|
||||
/*
|
||||
* We don't need to fixup if the PEBS assist is fault like
|
||||
|
@ -544,7 +545,10 @@ static int intel_pmu_pebs_fixup_ip(struct pt_regs *regs)
|
|||
} else
|
||||
kaddr = (void *)to;
|
||||
|
||||
kernel_insn_init(&insn, kaddr);
|
||||
#ifdef CONFIG_X86_64
|
||||
is_64bit = kernel_ip(to) || !test_thread_flag(TIF_IA32);
|
||||
#endif
|
||||
insn_init(&insn, kaddr, is_64bit);
|
||||
insn_get_length(&insn);
|
||||
to += insn.length;
|
||||
} while (to < ip);
|
||||
|
|
|
@ -1268,7 +1268,7 @@ reserve:
|
|||
}
|
||||
|
||||
done:
|
||||
return num ? -ENOSPC : 0;
|
||||
return num ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
static __initconst const struct x86_pmu p4_pmu = {
|
||||
|
|
|
@ -38,6 +38,9 @@ static inline void stack_overflow_check(struct pt_regs *regs)
|
|||
#ifdef CONFIG_DEBUG_STACKOVERFLOW
|
||||
u64 curbase = (u64)task_stack_page(current);
|
||||
|
||||
if (user_mode_vm(regs))
|
||||
return;
|
||||
|
||||
WARN_ONCE(regs->sp >= curbase &&
|
||||
regs->sp <= curbase + THREAD_SIZE &&
|
||||
regs->sp < curbase + sizeof(struct thread_info) +
|
||||
|
|
|
@ -256,7 +256,7 @@ static int __init microcode_dev_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void microcode_dev_exit(void)
|
||||
static void __exit microcode_dev_exit(void)
|
||||
{
|
||||
misc_deregister(µcode_dev);
|
||||
}
|
||||
|
@ -519,10 +519,8 @@ static int __init microcode_init(void)
|
|||
|
||||
microcode_pdev = platform_device_register_simple("microcode", -1,
|
||||
NULL, 0);
|
||||
if (IS_ERR(microcode_pdev)) {
|
||||
microcode_dev_exit();
|
||||
if (IS_ERR(microcode_pdev))
|
||||
return PTR_ERR(microcode_pdev);
|
||||
}
|
||||
|
||||
get_online_cpus();
|
||||
mutex_lock(µcode_mutex);
|
||||
|
@ -532,14 +530,12 @@ static int __init microcode_init(void)
|
|||
mutex_unlock(µcode_mutex);
|
||||
put_online_cpus();
|
||||
|
||||
if (error) {
|
||||
platform_device_unregister(microcode_pdev);
|
||||
return error;
|
||||
}
|
||||
if (error)
|
||||
goto out_pdev;
|
||||
|
||||
error = microcode_dev_init();
|
||||
if (error)
|
||||
return error;
|
||||
goto out_sysdev_driver;
|
||||
|
||||
register_syscore_ops(&mc_syscore_ops);
|
||||
register_hotcpu_notifier(&mc_cpu_notifier);
|
||||
|
@ -548,6 +544,20 @@ static int __init microcode_init(void)
|
|||
" <tigran@aivazian.fsnet.co.uk>, Peter Oruba\n");
|
||||
|
||||
return 0;
|
||||
|
||||
out_sysdev_driver:
|
||||
get_online_cpus();
|
||||
mutex_lock(µcode_mutex);
|
||||
|
||||
sysdev_driver_unregister(&cpu_sysdev_class, &mc_sysdev_driver);
|
||||
|
||||
mutex_unlock(µcode_mutex);
|
||||
put_online_cpus();
|
||||
|
||||
out_pdev:
|
||||
platform_device_unregister(microcode_pdev);
|
||||
return error;
|
||||
|
||||
}
|
||||
module_init(microcode_init);
|
||||
|
||||
|
|
|
@ -95,8 +95,8 @@ static void __init MP_bus_info(struct mpc_bus *m)
|
|||
}
|
||||
#endif
|
||||
|
||||
set_bit(m->busid, mp_bus_not_pci);
|
||||
if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA) - 1) == 0) {
|
||||
set_bit(m->busid, mp_bus_not_pci);
|
||||
#if defined(CONFIG_EISA) || defined(CONFIG_MCA)
|
||||
mp_bus_id_to_type[m->busid] = MP_BUS_ISA;
|
||||
#endif
|
||||
|
|
|
@ -403,6 +403,14 @@ void default_idle(void)
|
|||
EXPORT_SYMBOL(default_idle);
|
||||
#endif
|
||||
|
||||
bool set_pm_idle_to_default(void)
|
||||
{
|
||||
bool ret = !!pm_idle;
|
||||
|
||||
pm_idle = default_idle;
|
||||
|
||||
return ret;
|
||||
}
|
||||
void stop_this_cpu(void *dummy)
|
||||
{
|
||||
local_irq_disable();
|
||||
|
|
|
@ -553,4 +553,17 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC,
|
|||
quirk_amd_nb_node);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_LINK,
|
||||
quirk_amd_nb_node);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F0,
|
||||
quirk_amd_nb_node);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F1,
|
||||
quirk_amd_nb_node);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F2,
|
||||
quirk_amd_nb_node);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F3,
|
||||
quirk_amd_nb_node);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F4,
|
||||
quirk_amd_nb_node);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_15H_NB_F5,
|
||||
quirk_amd_nb_node);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -124,7 +124,7 @@ __setup("reboot=", reboot_setup);
|
|||
*/
|
||||
|
||||
/*
|
||||
* Some machines require the "reboot=b" commandline option,
|
||||
* Some machines require the "reboot=b" or "reboot=k" commandline options,
|
||||
* this quirk makes that automatic.
|
||||
*/
|
||||
static int __init set_bios_reboot(const struct dmi_system_id *d)
|
||||
|
@ -136,6 +136,15 @@ static int __init set_bios_reboot(const struct dmi_system_id *d)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init set_kbd_reboot(const struct dmi_system_id *d)
|
||||
{
|
||||
if (reboot_type != BOOT_KBD) {
|
||||
reboot_type = BOOT_KBD;
|
||||
printk(KERN_INFO "%s series board detected. Selecting KBD-method for reboot.\n", d->ident);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
||||
{ /* Handle problems with rebooting on Dell E520's */
|
||||
.callback = set_bios_reboot,
|
||||
|
@ -295,7 +304,7 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
|
|||
},
|
||||
},
|
||||
{ /* Handle reboot issue on Acer Aspire one */
|
||||
.callback = set_bios_reboot,
|
||||
.callback = set_kbd_reboot,
|
||||
.ident = "Acer Aspire One A110",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
|
||||
|
@ -443,6 +452,14 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude E6420"),
|
||||
},
|
||||
},
|
||||
{ /* Handle problems with rebooting on the OptiPlex 990. */
|
||||
.callback = set_pci_reboot,
|
||||
.ident = "Dell OptiPlex 990",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 990"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <asm/vsyscall.h>
|
||||
#include <asm/x86_init.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/mrst.h>
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
/*
|
||||
|
@ -242,6 +243,10 @@ static __init int add_rtc_cmos(void)
|
|||
if (of_have_populated_dt())
|
||||
return 0;
|
||||
|
||||
/* Intel MID platforms don't have ioport rtc */
|
||||
if (mrst_identify_cpu())
|
||||
return -ENODEV;
|
||||
|
||||
platform_device_register(&rtc_device);
|
||||
dev_info(&rtc_device.dev,
|
||||
"registered platform RTC device (no PNP device found)\n");
|
||||
|
|
|
@ -45,6 +45,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot)
|
|||
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
|
||||
BUG_ON(!pte_none(*(kmap_pte-idx)));
|
||||
set_pte(kmap_pte-idx, mk_pte(page, prot));
|
||||
arch_flush_lazy_mmu_mode();
|
||||
|
||||
return (void *)vaddr;
|
||||
}
|
||||
|
@ -88,6 +89,7 @@ void __kunmap_atomic(void *kvaddr)
|
|||
*/
|
||||
kpte_clear_flush(kmap_pte-idx, vaddr);
|
||||
kmap_atomic_idx_pop();
|
||||
arch_flush_lazy_mmu_mode();
|
||||
}
|
||||
#ifdef CONFIG_DEBUG_HIGHMEM
|
||||
else {
|
||||
|
|
|
@ -21,6 +21,7 @@ extern int op_nmi_timer_init(struct oprofile_operations *ops);
|
|||
extern void op_nmi_exit(void);
|
||||
extern void x86_backtrace(struct pt_regs * const regs, unsigned int depth);
|
||||
|
||||
static int nmi_timer;
|
||||
|
||||
int __init oprofile_arch_init(struct oprofile_operations *ops)
|
||||
{
|
||||
|
@ -31,8 +32,9 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
ret = op_nmi_init(ops);
|
||||
#endif
|
||||
nmi_timer = (ret != 0);
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
if (ret < 0)
|
||||
if (nmi_timer)
|
||||
ret = op_nmi_timer_init(ops);
|
||||
#endif
|
||||
ops->backtrace = x86_backtrace;
|
||||
|
@ -44,6 +46,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops)
|
|||
void oprofile_arch_exit(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
op_nmi_exit();
|
||||
if (!nmi_timer)
|
||||
op_nmi_exit();
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -76,6 +76,20 @@ struct sfi_rtc_table_entry sfi_mrtc_array[SFI_MRTC_MAX];
|
|||
EXPORT_SYMBOL_GPL(sfi_mrtc_array);
|
||||
int sfi_mrtc_num;
|
||||
|
||||
static void mrst_power_off(void)
|
||||
{
|
||||
if (__mrst_cpu_chip == MRST_CPU_CHIP_LINCROFT)
|
||||
intel_scu_ipc_simple_command(IPCMSG_COLD_RESET, 1);
|
||||
}
|
||||
|
||||
static void mrst_reboot(void)
|
||||
{
|
||||
if (__mrst_cpu_chip == MRST_CPU_CHIP_LINCROFT)
|
||||
intel_scu_ipc_simple_command(IPCMSG_COLD_RESET, 0);
|
||||
else
|
||||
intel_scu_ipc_simple_command(IPCMSG_COLD_BOOT, 0);
|
||||
}
|
||||
|
||||
/* parse all the mtimer info to a static mtimer array */
|
||||
static int __init sfi_parse_mtmr(struct sfi_table_header *table)
|
||||
{
|
||||
|
@ -265,17 +279,6 @@ static int mrst_i8042_detect(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Reboot and power off are handled by the SCU on a MID device */
|
||||
static void mrst_power_off(void)
|
||||
{
|
||||
intel_scu_ipc_simple_command(0xf1, 1);
|
||||
}
|
||||
|
||||
static void mrst_reboot(void)
|
||||
{
|
||||
intel_scu_ipc_simple_command(0xf1, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Moorestown does not have external NMI source nor port 0x61 to report
|
||||
* NMI status. The possible NMI sources are from pmu as a result of NMI
|
||||
|
@ -484,6 +487,46 @@ static void __init *max7315_platform_data(void *info)
|
|||
return max7315;
|
||||
}
|
||||
|
||||
static void *tca6416_platform_data(void *info)
|
||||
{
|
||||
static struct pca953x_platform_data tca6416;
|
||||
struct i2c_board_info *i2c_info = info;
|
||||
int gpio_base, intr;
|
||||
char base_pin_name[SFI_NAME_LEN + 1];
|
||||
char intr_pin_name[SFI_NAME_LEN + 1];
|
||||
|
||||
strcpy(i2c_info->type, "tca6416");
|
||||
strcpy(base_pin_name, "tca6416_base");
|
||||
strcpy(intr_pin_name, "tca6416_int");
|
||||
|
||||
gpio_base = get_gpio_by_name(base_pin_name);
|
||||
intr = get_gpio_by_name(intr_pin_name);
|
||||
|
||||
if (gpio_base == -1)
|
||||
return NULL;
|
||||
tca6416.gpio_base = gpio_base;
|
||||
if (intr != -1) {
|
||||
i2c_info->irq = intr + MRST_IRQ_OFFSET;
|
||||
tca6416.irq_base = gpio_base + MRST_IRQ_OFFSET;
|
||||
} else {
|
||||
i2c_info->irq = -1;
|
||||
tca6416.irq_base = -1;
|
||||
}
|
||||
return &tca6416;
|
||||
}
|
||||
|
||||
static void *mpu3050_platform_data(void *info)
|
||||
{
|
||||
struct i2c_board_info *i2c_info = info;
|
||||
int intr = get_gpio_by_name("mpu3050_int");
|
||||
|
||||
if (intr == -1)
|
||||
return NULL;
|
||||
|
||||
i2c_info->irq = intr + MRST_IRQ_OFFSET;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void __init *emc1403_platform_data(void *info)
|
||||
{
|
||||
static short intr2nd_pdata;
|
||||
|
@ -646,12 +689,15 @@ static void *msic_ocd_platform_data(void *info)
|
|||
static const struct devs_id __initconst device_ids[] = {
|
||||
{"bma023", SFI_DEV_TYPE_I2C, 1, &no_platform_data},
|
||||
{"pmic_gpio", SFI_DEV_TYPE_SPI, 1, &pmic_gpio_platform_data},
|
||||
{"pmic_gpio", SFI_DEV_TYPE_IPC, 1, &pmic_gpio_platform_data},
|
||||
{"spi_max3111", SFI_DEV_TYPE_SPI, 0, &max3111_platform_data},
|
||||
{"i2c_max7315", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data},
|
||||
{"i2c_max7315_2", SFI_DEV_TYPE_I2C, 1, &max7315_platform_data},
|
||||
{"tca6416", SFI_DEV_TYPE_I2C, 1, &tca6416_platform_data},
|
||||
{"emc1403", SFI_DEV_TYPE_I2C, 1, &emc1403_platform_data},
|
||||
{"i2c_accel", SFI_DEV_TYPE_I2C, 0, &lis331dl_platform_data},
|
||||
{"pmic_audio", SFI_DEV_TYPE_IPC, 1, &no_platform_data},
|
||||
{"mpu3050", SFI_DEV_TYPE_I2C, 1, &mpu3050_platform_data},
|
||||
|
||||
/* MSIC subdevices */
|
||||
{"msic_battery", SFI_DEV_TYPE_IPC, 1, &msic_battery_platform_data},
|
||||
|
|
|
@ -410,6 +410,6 @@ void __init xen_arch_setup(void)
|
|||
#endif
|
||||
disable_cpuidle();
|
||||
boot_option_idle_override = IDLE_HALT;
|
||||
|
||||
WARN_ON(set_pm_idle_to_default());
|
||||
fiddle_vdso();
|
||||
}
|
||||
|
|
|
@ -14,13 +14,34 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/sigma.h>
|
||||
|
||||
/* Return: 0==OK, <0==error, =1 ==no more actions */
|
||||
static int
|
||||
process_sigma_action(struct i2c_client *client, struct sigma_firmware *ssfw)
|
||||
static size_t sigma_action_size(struct sigma_action *sa)
|
||||
{
|
||||
size_t payload = 0;
|
||||
|
||||
switch (sa->instr) {
|
||||
case SIGMA_ACTION_WRITEXBYTES:
|
||||
case SIGMA_ACTION_WRITESINGLE:
|
||||
case SIGMA_ACTION_WRITESAFELOAD:
|
||||
payload = sigma_action_len(sa);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
payload = ALIGN(payload, 2);
|
||||
|
||||
return payload + sizeof(struct sigma_action);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns a negative error value in case of an error, 0 if processing of
|
||||
* the firmware should be stopped after this action, 1 otherwise.
|
||||
*/
|
||||
static int
|
||||
process_sigma_action(struct i2c_client *client, struct sigma_action *sa)
|
||||
{
|
||||
struct sigma_action *sa = (void *)(ssfw->fw->data + ssfw->pos);
|
||||
size_t len = sigma_action_len(sa);
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
pr_debug("%s: instr:%i addr:%#x len:%zu\n", __func__,
|
||||
sa->instr, sa->addr, len);
|
||||
|
@ -29,44 +50,50 @@ process_sigma_action(struct i2c_client *client, struct sigma_firmware *ssfw)
|
|||
case SIGMA_ACTION_WRITEXBYTES:
|
||||
case SIGMA_ACTION_WRITESINGLE:
|
||||
case SIGMA_ACTION_WRITESAFELOAD:
|
||||
if (ssfw->fw->size < ssfw->pos + len)
|
||||
return -EINVAL;
|
||||
ret = i2c_master_send(client, (void *)&sa->addr, len);
|
||||
if (ret < 0)
|
||||
return -EINVAL;
|
||||
break;
|
||||
|
||||
case SIGMA_ACTION_DELAY:
|
||||
ret = 0;
|
||||
udelay(len);
|
||||
len = 0;
|
||||
break;
|
||||
|
||||
case SIGMA_ACTION_END:
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* when arrive here ret=0 or sent data */
|
||||
ssfw->pos += sigma_action_size(sa, len);
|
||||
return ssfw->pos == ssfw->fw->size;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int
|
||||
process_sigma_actions(struct i2c_client *client, struct sigma_firmware *ssfw)
|
||||
{
|
||||
pr_debug("%s: processing %p\n", __func__, ssfw);
|
||||
struct sigma_action *sa;
|
||||
size_t size;
|
||||
int ret;
|
||||
|
||||
while (ssfw->pos + sizeof(*sa) <= ssfw->fw->size) {
|
||||
sa = (struct sigma_action *)(ssfw->fw->data + ssfw->pos);
|
||||
|
||||
size = sigma_action_size(sa);
|
||||
ssfw->pos += size;
|
||||
if (ssfw->pos > ssfw->fw->size || size == 0)
|
||||
break;
|
||||
|
||||
ret = process_sigma_action(client, sa);
|
||||
|
||||
while (1) {
|
||||
int ret = process_sigma_action(client, ssfw);
|
||||
pr_debug("%s: action returned %i\n", __func__, ret);
|
||||
if (ret == 1)
|
||||
return 0;
|
||||
else if (ret)
|
||||
|
||||
if (ret <= 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (ssfw->pos != ssfw->fw->size)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int process_sigma_firmware(struct i2c_client *client, const char *name)
|
||||
|
@ -89,16 +116,24 @@ int process_sigma_firmware(struct i2c_client *client, const char *name)
|
|||
|
||||
/* then verify the header */
|
||||
ret = -EINVAL;
|
||||
if (fw->size < sizeof(*ssfw_head))
|
||||
|
||||
/*
|
||||
* Reject too small or unreasonable large files. The upper limit has been
|
||||
* chosen a bit arbitrarily, but it should be enough for all practical
|
||||
* purposes and having the limit makes it easier to avoid integer
|
||||
* overflows later in the loading process.
|
||||
*/
|
||||
if (fw->size < sizeof(*ssfw_head) || fw->size >= 0x4000000)
|
||||
goto done;
|
||||
|
||||
ssfw_head = (void *)fw->data;
|
||||
if (memcmp(ssfw_head->magic, SIGMA_MAGIC, ARRAY_SIZE(ssfw_head->magic)))
|
||||
goto done;
|
||||
|
||||
crc = crc32(0, fw->data, fw->size);
|
||||
crc = crc32(0, fw->data + sizeof(*ssfw_head),
|
||||
fw->size - sizeof(*ssfw_head));
|
||||
pr_debug("%s: crc=%x\n", __func__, crc);
|
||||
if (crc != ssfw_head->crc)
|
||||
if (crc != le32_to_cpu(ssfw_head->crc))
|
||||
goto done;
|
||||
|
||||
ssfw.pos = sizeof(*ssfw_head);
|
||||
|
|
|
@ -18,7 +18,7 @@ obj-$(CONFIG_ARCH_DAVINCI) += gpio-davinci.o
|
|||
obj-$(CONFIG_GPIO_EP93XX) += gpio-ep93xx.o
|
||||
obj-$(CONFIG_GPIO_IT8761E) += gpio-it8761e.o
|
||||
obj-$(CONFIG_GPIO_JANZ_TTL) += gpio-janz-ttl.o
|
||||
obj-$(CONFIG_MACH_KS8695) += gpio-ks8695.o
|
||||
obj-$(CONFIG_ARCH_KS8695) += gpio-ks8695.o
|
||||
obj-$(CONFIG_GPIO_LANGWELL) += gpio-langwell.o
|
||||
obj-$(CONFIG_ARCH_LPC32XX) += gpio-lpc32xx.o
|
||||
obj-$(CONFIG_GPIO_MAX730X) += gpio-max730x.o
|
||||
|
|
|
@ -456,6 +456,30 @@ done:
|
|||
EXPORT_SYMBOL(drm_crtc_helper_set_mode);
|
||||
|
||||
|
||||
static int
|
||||
drm_crtc_helper_disable(struct drm_crtc *crtc)
|
||||
{
|
||||
struct drm_device *dev = crtc->dev;
|
||||
struct drm_connector *connector;
|
||||
struct drm_encoder *encoder;
|
||||
|
||||
/* Decouple all encoders and their attached connectors from this crtc */
|
||||
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
||||
if (encoder->crtc != crtc)
|
||||
continue;
|
||||
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
if (connector->encoder != encoder)
|
||||
continue;
|
||||
|
||||
connector->encoder = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
drm_helper_disable_unused_functions(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_crtc_helper_set_config - set a new config from userspace
|
||||
* @crtc: CRTC to setup
|
||||
|
@ -510,8 +534,7 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
|
|||
(int)set->num_connectors, set->x, set->y);
|
||||
} else {
|
||||
DRM_DEBUG_KMS("[CRTC:%d] [NOFB]\n", set->crtc->base.id);
|
||||
set->mode = NULL;
|
||||
set->num_connectors = 0;
|
||||
return drm_crtc_helper_disable(set->crtc);
|
||||
}
|
||||
|
||||
dev = set->crtc->dev;
|
||||
|
|
|
@ -369,3 +369,48 @@ nouveau_finish_page_flip(struct nouveau_channel *chan,
|
|||
spin_unlock_irqrestore(&dev->event_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
|
||||
struct drm_mode_create_dumb *args)
|
||||
{
|
||||
struct nouveau_bo *bo;
|
||||
int ret;
|
||||
|
||||
args->pitch = roundup(args->width * (args->bpp / 8), 256);
|
||||
args->size = args->pitch * args->height;
|
||||
args->size = roundup(args->size, PAGE_SIZE);
|
||||
|
||||
ret = nouveau_gem_new(dev, args->size, 0, TTM_PL_FLAG_VRAM, 0, 0, &bo);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = drm_gem_handle_create(file_priv, bo->gem, &args->handle);
|
||||
drm_gem_object_unreference_unlocked(bo->gem);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
nouveau_display_dumb_destroy(struct drm_file *file_priv, struct drm_device *dev,
|
||||
uint32_t handle)
|
||||
{
|
||||
return drm_gem_handle_delete(file_priv, handle);
|
||||
}
|
||||
|
||||
int
|
||||
nouveau_display_dumb_map_offset(struct drm_file *file_priv,
|
||||
struct drm_device *dev,
|
||||
uint32_t handle, uint64_t *poffset)
|
||||
{
|
||||
struct drm_gem_object *gem;
|
||||
|
||||
gem = drm_gem_object_lookup(dev, file_priv, handle);
|
||||
if (gem) {
|
||||
struct nouveau_bo *bo = gem->driver_private;
|
||||
*poffset = bo->bo.addr_space_offset;
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
|
|
@ -433,6 +433,10 @@ static struct drm_driver driver = {
|
|||
.gem_open_object = nouveau_gem_object_open,
|
||||
.gem_close_object = nouveau_gem_object_close,
|
||||
|
||||
.dumb_create = nouveau_display_dumb_create,
|
||||
.dumb_map_offset = nouveau_display_dumb_map_offset,
|
||||
.dumb_destroy = nouveau_display_dumb_destroy,
|
||||
|
||||
.name = DRIVER_NAME,
|
||||
.desc = DRIVER_DESC,
|
||||
#ifdef GIT_REVISION
|
||||
|
|
|
@ -1418,6 +1418,12 @@ int nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
|
|||
struct drm_pending_vblank_event *event);
|
||||
int nouveau_finish_page_flip(struct nouveau_channel *,
|
||||
struct nouveau_page_flip_state *);
|
||||
int nouveau_display_dumb_create(struct drm_file *, struct drm_device *,
|
||||
struct drm_mode_create_dumb *args);
|
||||
int nouveau_display_dumb_map_offset(struct drm_file *, struct drm_device *,
|
||||
uint32_t handle, uint64_t *offset);
|
||||
int nouveau_display_dumb_destroy(struct drm_file *, struct drm_device *,
|
||||
uint32_t handle);
|
||||
|
||||
/* nv10_gpio.c */
|
||||
int nv10_gpio_get(struct drm_device *dev, enum dcb_gpio_tag tag);
|
||||
|
|
|
@ -680,7 +680,7 @@ nouveau_gpuobj_channel_init_pramin(struct nouveau_channel *chan)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = drm_mm_init(&chan->ramin_heap, base, size);
|
||||
ret = drm_mm_init(&chan->ramin_heap, base, size - base);
|
||||
if (ret) {
|
||||
NV_ERROR(dev, "Error creating PRAMIN heap: %d\n", ret);
|
||||
nouveau_gpuobj_ref(NULL, &chan->ramin);
|
||||
|
|
|
@ -67,7 +67,10 @@ nouveau_sgdma_clear(struct ttm_backend *be)
|
|||
pci_unmap_page(dev->pdev, nvbe->pages[nvbe->nr_pages],
|
||||
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
}
|
||||
nvbe->unmap_pages = false;
|
||||
}
|
||||
|
||||
nvbe->pages = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -616,7 +616,7 @@ nv50_display_unk10_handler(struct drm_device *dev)
|
|||
struct drm_nouveau_private *dev_priv = dev->dev_private;
|
||||
struct nv50_display *disp = nv50_display(dev);
|
||||
u32 unk30 = nv_rd32(dev, 0x610030), mc;
|
||||
int i, crtc, or, type = OUTPUT_ANY;
|
||||
int i, crtc, or = 0, type = OUTPUT_ANY;
|
||||
|
||||
NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
|
||||
disp->irq.dcb = NULL;
|
||||
|
@ -708,7 +708,7 @@ nv50_display_unk20_handler(struct drm_device *dev)
|
|||
struct nv50_display *disp = nv50_display(dev);
|
||||
u32 unk30 = nv_rd32(dev, 0x610030), tmp, pclk, script, mc = 0;
|
||||
struct dcb_entry *dcb;
|
||||
int i, crtc, or, type = OUTPUT_ANY;
|
||||
int i, crtc, or = 0, type = OUTPUT_ANY;
|
||||
|
||||
NV_DEBUG_KMS(dev, "0x610030: 0x%08x\n", unk30);
|
||||
dcb = disp->irq.dcb;
|
||||
|
|
|
@ -381,6 +381,8 @@ nvc0_graph_init_gpc_0(struct drm_device *dev)
|
|||
u8 tpnr[GPC_MAX];
|
||||
int i, gpc, tpc;
|
||||
|
||||
nv_wr32(dev, TP_UNIT(0, 0, 0x5c), 1); /* affects TFB offset queries */
|
||||
|
||||
/*
|
||||
* TP ROP UNKVAL(magic_not_rop_nr)
|
||||
* 450: 4/0/0/0 2 3
|
||||
|
|
|
@ -780,7 +780,7 @@ nvd0_sor_dpms(struct drm_encoder *encoder, int mode)
|
|||
continue;
|
||||
|
||||
if (nv_partner != nv_encoder &&
|
||||
nv_partner->dcb->or == nv_encoder->or) {
|
||||
nv_partner->dcb->or == nv_encoder->dcb->or) {
|
||||
if (nv_partner->last_dpms == DRM_MODE_DPMS_ON)
|
||||
return;
|
||||
break;
|
||||
|
|
|
@ -1107,9 +1107,40 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (tiling_flags & RADEON_TILING_MACRO)
|
||||
if (tiling_flags & RADEON_TILING_MACRO) {
|
||||
if (rdev->family >= CHIP_CAYMAN)
|
||||
tmp = rdev->config.cayman.tile_config;
|
||||
else
|
||||
tmp = rdev->config.evergreen.tile_config;
|
||||
|
||||
switch ((tmp & 0xf0) >> 4) {
|
||||
case 0: /* 4 banks */
|
||||
fb_format |= EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_4_BANK);
|
||||
break;
|
||||
case 1: /* 8 banks */
|
||||
default:
|
||||
fb_format |= EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_8_BANK);
|
||||
break;
|
||||
case 2: /* 16 banks */
|
||||
fb_format |= EVERGREEN_GRPH_NUM_BANKS(EVERGREEN_ADDR_SURF_16_BANK);
|
||||
break;
|
||||
}
|
||||
|
||||
switch ((tmp & 0xf000) >> 12) {
|
||||
case 0: /* 1KB rows */
|
||||
default:
|
||||
fb_format |= EVERGREEN_GRPH_TILE_SPLIT(EVERGREEN_ADDR_SURF_TILE_SPLIT_1KB);
|
||||
break;
|
||||
case 1: /* 2KB rows */
|
||||
fb_format |= EVERGREEN_GRPH_TILE_SPLIT(EVERGREEN_ADDR_SURF_TILE_SPLIT_2KB);
|
||||
break;
|
||||
case 2: /* 4KB rows */
|
||||
fb_format |= EVERGREEN_GRPH_TILE_SPLIT(EVERGREEN_ADDR_SURF_TILE_SPLIT_4KB);
|
||||
break;
|
||||
}
|
||||
|
||||
fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1);
|
||||
else if (tiling_flags & RADEON_TILING_MICRO)
|
||||
} else if (tiling_flags & RADEON_TILING_MICRO)
|
||||
fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1);
|
||||
|
||||
switch (radeon_crtc->crtc_id) {
|
||||
|
|
|
@ -82,6 +82,7 @@ u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
|
|||
{
|
||||
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
|
||||
u32 tmp = RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset);
|
||||
int i;
|
||||
|
||||
/* Lock the graphics update lock */
|
||||
tmp |= EVERGREEN_GRPH_UPDATE_LOCK;
|
||||
|
@ -99,7 +100,11 @@ u32 evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
|
|||
(u32)crtc_base);
|
||||
|
||||
/* Wait for update_pending to go high. */
|
||||
while (!(RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING));
|
||||
for (i = 0; i < rdev->usec_timeout; i++) {
|
||||
if (RREG32(EVERGREEN_GRPH_UPDATE + radeon_crtc->crtc_offset) & EVERGREEN_GRPH_SURFACE_UPDATE_PENDING)
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
|
||||
|
||||
/* Unlock the lock, so double-buffering can take place inside vblank */
|
||||
|
|
|
@ -38,6 +38,7 @@ struct evergreen_cs_track {
|
|||
u32 group_size;
|
||||
u32 nbanks;
|
||||
u32 npipes;
|
||||
u32 row_size;
|
||||
/* value we track */
|
||||
u32 nsamples;
|
||||
u32 cb_color_base_last[12];
|
||||
|
@ -77,6 +78,44 @@ struct evergreen_cs_track {
|
|||
struct radeon_bo *db_s_write_bo;
|
||||
};
|
||||
|
||||
static u32 evergreen_cs_get_aray_mode(u32 tiling_flags)
|
||||
{
|
||||
if (tiling_flags & RADEON_TILING_MACRO)
|
||||
return ARRAY_2D_TILED_THIN1;
|
||||
else if (tiling_flags & RADEON_TILING_MICRO)
|
||||
return ARRAY_1D_TILED_THIN1;
|
||||
else
|
||||
return ARRAY_LINEAR_GENERAL;
|
||||
}
|
||||
|
||||
static u32 evergreen_cs_get_num_banks(u32 nbanks)
|
||||
{
|
||||
switch (nbanks) {
|
||||
case 2:
|
||||
return ADDR_SURF_2_BANK;
|
||||
case 4:
|
||||
return ADDR_SURF_4_BANK;
|
||||
case 8:
|
||||
default:
|
||||
return ADDR_SURF_8_BANK;
|
||||
case 16:
|
||||
return ADDR_SURF_16_BANK;
|
||||
}
|
||||
}
|
||||
|
||||
static u32 evergreen_cs_get_tile_split(u32 row_size)
|
||||
{
|
||||
switch (row_size) {
|
||||
case 1:
|
||||
default:
|
||||
return ADDR_SURF_TILE_SPLIT_1KB;
|
||||
case 2:
|
||||
return ADDR_SURF_TILE_SPLIT_2KB;
|
||||
case 4:
|
||||
return ADDR_SURF_TILE_SPLIT_4KB;
|
||||
}
|
||||
}
|
||||
|
||||
static void evergreen_cs_track_init(struct evergreen_cs_track *track)
|
||||
{
|
||||
int i;
|
||||
|
@ -490,12 +529,11 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
|
|||
}
|
||||
ib[idx] &= ~Z_ARRAY_MODE(0xf);
|
||||
track->db_z_info &= ~Z_ARRAY_MODE(0xf);
|
||||
ib[idx] |= Z_ARRAY_MODE(evergreen_cs_get_aray_mode(reloc->lobj.tiling_flags));
|
||||
track->db_z_info |= Z_ARRAY_MODE(evergreen_cs_get_aray_mode(reloc->lobj.tiling_flags));
|
||||
if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
|
||||
ib[idx] |= Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
|
||||
track->db_z_info |= Z_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
|
||||
} else {
|
||||
ib[idx] |= Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
|
||||
track->db_z_info |= Z_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
|
||||
ib[idx] |= DB_NUM_BANKS(evergreen_cs_get_num_banks(track->nbanks));
|
||||
ib[idx] |= DB_TILE_SPLIT(evergreen_cs_get_tile_split(track->row_size));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -618,13 +656,8 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
|
|||
"0x%04X\n", reg);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
|
||||
ib[idx] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
|
||||
track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
|
||||
} else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
|
||||
ib[idx] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
|
||||
track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
|
||||
}
|
||||
ib[idx] |= CB_ARRAY_MODE(evergreen_cs_get_aray_mode(reloc->lobj.tiling_flags));
|
||||
track->cb_color_info[tmp] |= CB_ARRAY_MODE(evergreen_cs_get_aray_mode(reloc->lobj.tiling_flags));
|
||||
}
|
||||
break;
|
||||
case CB_COLOR8_INFO:
|
||||
|
@ -640,13 +673,8 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
|
|||
"0x%04X\n", reg);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
|
||||
ib[idx] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
|
||||
track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
|
||||
} else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) {
|
||||
ib[idx] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
|
||||
track->cb_color_info[tmp] |= CB_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
|
||||
}
|
||||
ib[idx] |= CB_ARRAY_MODE(evergreen_cs_get_aray_mode(reloc->lobj.tiling_flags));
|
||||
track->cb_color_info[tmp] |= CB_ARRAY_MODE(evergreen_cs_get_aray_mode(reloc->lobj.tiling_flags));
|
||||
}
|
||||
break;
|
||||
case CB_COLOR0_PITCH:
|
||||
|
@ -701,6 +729,16 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx)
|
|||
case CB_COLOR9_ATTRIB:
|
||||
case CB_COLOR10_ATTRIB:
|
||||
case CB_COLOR11_ATTRIB:
|
||||
r = evergreen_cs_packet_next_reloc(p, &reloc);
|
||||
if (r) {
|
||||
dev_warn(p->dev, "bad SET_CONTEXT_REG "
|
||||
"0x%04X\n", reg);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
|
||||
ib[idx] |= CB_NUM_BANKS(evergreen_cs_get_num_banks(track->nbanks));
|
||||
ib[idx] |= CB_TILE_SPLIT(evergreen_cs_get_tile_split(track->row_size));
|
||||
}
|
||||
break;
|
||||
case CB_COLOR0_DIM:
|
||||
case CB_COLOR1_DIM:
|
||||
|
@ -1318,10 +1356,14 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p,
|
|||
}
|
||||
ib[idx+1+(i*8)+2] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);
|
||||
if (!p->keep_tiling_flags) {
|
||||
if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO)
|
||||
ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_2D_TILED_THIN1);
|
||||
else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO)
|
||||
ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_1D_TILED_THIN1);
|
||||
ib[idx+1+(i*8)+1] |=
|
||||
TEX_ARRAY_MODE(evergreen_cs_get_aray_mode(reloc->lobj.tiling_flags));
|
||||
if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) {
|
||||
ib[idx+1+(i*8)+6] |=
|
||||
TEX_TILE_SPLIT(evergreen_cs_get_tile_split(track->row_size));
|
||||
ib[idx+1+(i*8)+7] |=
|
||||
TEX_NUM_BANKS(evergreen_cs_get_num_banks(track->nbanks));
|
||||
}
|
||||
}
|
||||
texture = reloc->robj;
|
||||
/* tex mip base */
|
||||
|
@ -1422,6 +1464,7 @@ int evergreen_cs_parse(struct radeon_cs_parser *p)
|
|||
{
|
||||
struct radeon_cs_packet pkt;
|
||||
struct evergreen_cs_track *track;
|
||||
u32 tmp;
|
||||
int r;
|
||||
|
||||
if (p->track == NULL) {
|
||||
|
@ -1430,9 +1473,63 @@ int evergreen_cs_parse(struct radeon_cs_parser *p)
|
|||
if (track == NULL)
|
||||
return -ENOMEM;
|
||||
evergreen_cs_track_init(track);
|
||||
track->npipes = p->rdev->config.evergreen.tiling_npipes;
|
||||
track->nbanks = p->rdev->config.evergreen.tiling_nbanks;
|
||||
track->group_size = p->rdev->config.evergreen.tiling_group_size;
|
||||
if (p->rdev->family >= CHIP_CAYMAN)
|
||||
tmp = p->rdev->config.cayman.tile_config;
|
||||
else
|
||||
tmp = p->rdev->config.evergreen.tile_config;
|
||||
|
||||
switch (tmp & 0xf) {
|
||||
case 0:
|
||||
track->npipes = 1;
|
||||
break;
|
||||
case 1:
|
||||
default:
|
||||
track->npipes = 2;
|
||||
break;
|
||||
case 2:
|
||||
track->npipes = 4;
|
||||
break;
|
||||
case 3:
|
||||
track->npipes = 8;
|
||||
break;
|
||||
}
|
||||
|
||||
switch ((tmp & 0xf0) >> 4) {
|
||||
case 0:
|
||||
track->nbanks = 4;
|
||||
break;
|
||||
case 1:
|
||||
default:
|
||||
track->nbanks = 8;
|
||||
break;
|
||||
case 2:
|
||||
track->nbanks = 16;
|
||||
break;
|
||||
}
|
||||
|
||||
switch ((tmp & 0xf00) >> 8) {
|
||||
case 0:
|
||||
track->group_size = 256;
|
||||
break;
|
||||
case 1:
|
||||
default:
|
||||
track->group_size = 512;
|
||||
break;
|
||||
}
|
||||
|
||||
switch ((tmp & 0xf000) >> 12) {
|
||||
case 0:
|
||||
track->row_size = 1;
|
||||
break;
|
||||
case 1:
|
||||
default:
|
||||
track->row_size = 2;
|
||||
break;
|
||||
case 2:
|
||||
track->row_size = 4;
|
||||
break;
|
||||
}
|
||||
|
||||
p->track = track;
|
||||
}
|
||||
do {
|
||||
|
|
|
@ -42,6 +42,17 @@
|
|||
# define EVERGREEN_GRPH_DEPTH_8BPP 0
|
||||
# define EVERGREEN_GRPH_DEPTH_16BPP 1
|
||||
# define EVERGREEN_GRPH_DEPTH_32BPP 2
|
||||
# define EVERGREEN_GRPH_NUM_BANKS(x) (((x) & 0x3) << 2)
|
||||
# define EVERGREEN_ADDR_SURF_2_BANK 0
|
||||
# define EVERGREEN_ADDR_SURF_4_BANK 1
|
||||
# define EVERGREEN_ADDR_SURF_8_BANK 2
|
||||
# define EVERGREEN_ADDR_SURF_16_BANK 3
|
||||
# define EVERGREEN_GRPH_Z(x) (((x) & 0x3) << 4)
|
||||
# define EVERGREEN_GRPH_BANK_WIDTH(x) (((x) & 0x3) << 6)
|
||||
# define EVERGREEN_ADDR_SURF_BANK_WIDTH_1 0
|
||||
# define EVERGREEN_ADDR_SURF_BANK_WIDTH_2 1
|
||||
# define EVERGREEN_ADDR_SURF_BANK_WIDTH_4 2
|
||||
# define EVERGREEN_ADDR_SURF_BANK_WIDTH_8 3
|
||||
# define EVERGREEN_GRPH_FORMAT(x) (((x) & 0x7) << 8)
|
||||
/* 8 BPP */
|
||||
# define EVERGREEN_GRPH_FORMAT_INDEXED 0
|
||||
|
@ -61,6 +72,24 @@
|
|||
# define EVERGREEN_GRPH_FORMAT_8B_BGRA1010102 5
|
||||
# define EVERGREEN_GRPH_FORMAT_RGB111110 6
|
||||
# define EVERGREEN_GRPH_FORMAT_BGR101111 7
|
||||
# define EVERGREEN_GRPH_BANK_HEIGHT(x) (((x) & 0x3) << 11)
|
||||
# define EVERGREEN_ADDR_SURF_BANK_HEIGHT_1 0
|
||||
# define EVERGREEN_ADDR_SURF_BANK_HEIGHT_2 1
|
||||
# define EVERGREEN_ADDR_SURF_BANK_HEIGHT_4 2
|
||||
# define EVERGREEN_ADDR_SURF_BANK_HEIGHT_8 3
|
||||
# define EVERGREEN_GRPH_TILE_SPLIT(x) (((x) & 0x7) << 13)
|
||||
# define EVERGREEN_ADDR_SURF_TILE_SPLIT_64B 0
|
||||
# define EVERGREEN_ADDR_SURF_TILE_SPLIT_128B 1
|
||||
# define EVERGREEN_ADDR_SURF_TILE_SPLIT_256B 2
|
||||
# define EVERGREEN_ADDR_SURF_TILE_SPLIT_512B 3
|
||||
# define EVERGREEN_ADDR_SURF_TILE_SPLIT_1KB 4
|
||||
# define EVERGREEN_ADDR_SURF_TILE_SPLIT_2KB 5
|
||||
# define EVERGREEN_ADDR_SURF_TILE_SPLIT_4KB 6
|
||||
# define EVERGREEN_GRPH_MACRO_TILE_ASPECT(x) (((x) & 0x3) << 18)
|
||||
# define EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_1 0
|
||||
# define EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_2 1
|
||||
# define EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_4 2
|
||||
# define EVERGREEN_ADDR_SURF_MACRO_TILE_ASPECT_8 3
|
||||
# define EVERGREEN_GRPH_ARRAY_MODE(x) (((x) & 0x7) << 20)
|
||||
# define EVERGREEN_GRPH_ARRAY_LINEAR_GENERAL 0
|
||||
# define EVERGREEN_GRPH_ARRAY_LINEAR_ALIGNED 1
|
||||
|
|
|
@ -899,6 +899,10 @@
|
|||
#define DB_HTILE_DATA_BASE 0x28014
|
||||
#define DB_Z_INFO 0x28040
|
||||
# define Z_ARRAY_MODE(x) ((x) << 4)
|
||||
# define DB_TILE_SPLIT(x) (((x) & 0x7) << 8)
|
||||
# define DB_NUM_BANKS(x) (((x) & 0x3) << 12)
|
||||
# define DB_BANK_WIDTH(x) (((x) & 0x3) << 16)
|
||||
# define DB_BANK_HEIGHT(x) (((x) & 0x3) << 20)
|
||||
#define DB_STENCIL_INFO 0x28044
|
||||
#define DB_Z_READ_BASE 0x28048
|
||||
#define DB_STENCIL_READ_BASE 0x2804c
|
||||
|
@ -951,6 +955,29 @@
|
|||
# define CB_SF_EXPORT_FULL 0
|
||||
# define CB_SF_EXPORT_NORM 1
|
||||
#define CB_COLOR0_ATTRIB 0x28c74
|
||||
# define CB_TILE_SPLIT(x) (((x) & 0x7) << 5)
|
||||
# define ADDR_SURF_TILE_SPLIT_64B 0
|
||||
# define ADDR_SURF_TILE_SPLIT_128B 1
|
||||
# define ADDR_SURF_TILE_SPLIT_256B 2
|
||||
# define ADDR_SURF_TILE_SPLIT_512B 3
|
||||
# define ADDR_SURF_TILE_SPLIT_1KB 4
|
||||
# define ADDR_SURF_TILE_SPLIT_2KB 5
|
||||
# define ADDR_SURF_TILE_SPLIT_4KB 6
|
||||
# define CB_NUM_BANKS(x) (((x) & 0x3) << 10)
|
||||
# define ADDR_SURF_2_BANK 0
|
||||
# define ADDR_SURF_4_BANK 1
|
||||
# define ADDR_SURF_8_BANK 2
|
||||
# define ADDR_SURF_16_BANK 3
|
||||
# define CB_BANK_WIDTH(x) (((x) & 0x3) << 13)
|
||||
# define ADDR_SURF_BANK_WIDTH_1 0
|
||||
# define ADDR_SURF_BANK_WIDTH_2 1
|
||||
# define ADDR_SURF_BANK_WIDTH_4 2
|
||||
# define ADDR_SURF_BANK_WIDTH_8 3
|
||||
# define CB_BANK_HEIGHT(x) (((x) & 0x3) << 16)
|
||||
# define ADDR_SURF_BANK_HEIGHT_1 0
|
||||
# define ADDR_SURF_BANK_HEIGHT_2 1
|
||||
# define ADDR_SURF_BANK_HEIGHT_4 2
|
||||
# define ADDR_SURF_BANK_HEIGHT_8 3
|
||||
#define CB_COLOR0_DIM 0x28c78
|
||||
/* only CB0-7 blocks have these regs */
|
||||
#define CB_COLOR0_CMASK 0x28c7c
|
||||
|
@ -1137,7 +1164,11 @@
|
|||
# define SQ_SEL_1 5
|
||||
#define SQ_TEX_RESOURCE_WORD5_0 0x30014
|
||||
#define SQ_TEX_RESOURCE_WORD6_0 0x30018
|
||||
# define TEX_TILE_SPLIT(x) (((x) & 0x7) << 29)
|
||||
#define SQ_TEX_RESOURCE_WORD7_0 0x3001c
|
||||
# define TEX_BANK_WIDTH(x) (((x) & 0x3) << 8)
|
||||
# define TEX_BANK_HEIGHT(x) (((x) & 0x3) << 10)
|
||||
# define TEX_NUM_BANKS(x) (((x) & 0x3) << 16)
|
||||
|
||||
#define SQ_VTX_CONSTANT_WORD0_0 0x30000
|
||||
#define SQ_VTX_CONSTANT_WORD1_0 0x30004
|
||||
|
|
|
@ -187,13 +187,18 @@ u32 r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
|
|||
{
|
||||
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
|
||||
u32 tmp = ((u32)crtc_base) | RADEON_CRTC_OFFSET__OFFSET_LOCK;
|
||||
int i;
|
||||
|
||||
/* Lock the graphics update lock */
|
||||
/* update the scanout addresses */
|
||||
WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, tmp);
|
||||
|
||||
/* Wait for update_pending to go high. */
|
||||
while (!(RREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset) & RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET));
|
||||
for (i = 0; i < rdev->usec_timeout; i++) {
|
||||
if (RREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset) & RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET)
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
|
||||
|
||||
/* Unlock the lock, so double-buffering can take place inside vblank */
|
||||
|
|
|
@ -35,7 +35,8 @@ static int radeon_atif_call(acpi_handle handle)
|
|||
|
||||
/* Fail only if calling the method fails and ATIF is supported */
|
||||
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
||||
printk(KERN_DEBUG "failed to evaluate ATIF got %s\n", acpi_format_exception(status));
|
||||
DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n",
|
||||
acpi_format_exception(status));
|
||||
kfree(buffer.pointer);
|
||||
return 1;
|
||||
}
|
||||
|
@ -50,13 +51,13 @@ int radeon_acpi_init(struct radeon_device *rdev)
|
|||
acpi_handle handle;
|
||||
int ret;
|
||||
|
||||
/* No need to proceed if we're sure that ATIF is not supported */
|
||||
if (!ASIC_IS_AVIVO(rdev) || !rdev->bios)
|
||||
return 0;
|
||||
|
||||
/* Get the device handle */
|
||||
handle = DEVICE_ACPI_HANDLE(&rdev->pdev->dev);
|
||||
|
||||
/* No need to proceed if we're sure that ATIF is not supported */
|
||||
if (!ASIC_IS_AVIVO(rdev) || !rdev->bios || !handle)
|
||||
return 0;
|
||||
|
||||
/* Call the ATIF method */
|
||||
ret = radeon_atif_call(handle);
|
||||
if (ret)
|
||||
|
|
|
@ -62,6 +62,7 @@ u32 rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
|
|||
{
|
||||
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
|
||||
u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
|
||||
int i;
|
||||
|
||||
/* Lock the graphics update lock */
|
||||
tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
|
||||
|
@ -74,7 +75,11 @@ u32 rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
|
|||
(u32)crtc_base);
|
||||
|
||||
/* Wait for update_pending to go high. */
|
||||
while (!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING));
|
||||
for (i = 0; i < rdev->usec_timeout; i++) {
|
||||
if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
|
||||
|
||||
/* Unlock the lock, so double-buffering can take place inside vblank */
|
||||
|
|
|
@ -47,6 +47,7 @@ u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
|
|||
{
|
||||
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
|
||||
u32 tmp = RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset);
|
||||
int i;
|
||||
|
||||
/* Lock the graphics update lock */
|
||||
tmp |= AVIVO_D1GRPH_UPDATE_LOCK;
|
||||
|
@ -66,7 +67,11 @@ u32 rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base)
|
|||
(u32)crtc_base);
|
||||
|
||||
/* Wait for update_pending to go high. */
|
||||
while (!(RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING));
|
||||
for (i = 0; i < rdev->usec_timeout; i++) {
|
||||
if (RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset) & AVIVO_D1GRPH_SURFACE_UPDATE_PENDING)
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
DRM_DEBUG("Update pending now high. Unlocking vupdate_lock.\n");
|
||||
|
||||
/* Unlock the lock, so double-buffering can take place inside vblank */
|
||||
|
|
|
@ -1809,7 +1809,8 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
|
|||
}
|
||||
|
||||
rects_size = arg->num_outputs * sizeof(struct drm_vmw_rect);
|
||||
rects = kzalloc(rects_size, GFP_KERNEL);
|
||||
rects = kcalloc(arg->num_outputs, sizeof(struct drm_vmw_rect),
|
||||
GFP_KERNEL);
|
||||
if (unlikely(!rects)) {
|
||||
ret = -ENOMEM;
|
||||
goto out_unlock;
|
||||
|
@ -1824,10 +1825,10 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
|
|||
}
|
||||
|
||||
for (i = 0; i < arg->num_outputs; ++i) {
|
||||
if (rects->x < 0 ||
|
||||
rects->y < 0 ||
|
||||
rects->x + rects->w > mode_config->max_width ||
|
||||
rects->y + rects->h > mode_config->max_height) {
|
||||
if (rects[i].x < 0 ||
|
||||
rects[i].y < 0 ||
|
||||
rects[i].x + rects[i].w > mode_config->max_width ||
|
||||
rects[i].y + rects[i].h > mode_config->max_height) {
|
||||
DRM_ERROR("Invalid GUI layout.\n");
|
||||
ret = -EINVAL;
|
||||
goto out_free;
|
||||
|
|
|
@ -1771,8 +1771,8 @@ static const struct hid_device_id hid_ignore_list[] = {
|
|||
{ HID_USB_DEVICE(USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC5UH) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ETT, USB_DEVICE_ID_TC4UM) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0001) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0002) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0003) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GENERAL_TOUCH, 0x0004) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30) },
|
||||
|
|
|
@ -266,7 +266,7 @@
|
|||
#define USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR 0x0002
|
||||
|
||||
#define USB_VENDOR_ID_GENERAL_TOUCH 0x0dfc
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS 0x0001
|
||||
#define USB_DEVICE_ID_GENERAL_TOUCH_WIN7_TWOFINGERS 0x0003
|
||||
|
||||
#define USB_VENDOR_ID_GLAB 0x06c2
|
||||
#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038
|
||||
|
|
|
@ -3524,7 +3524,7 @@ found:
|
|||
return 0;
|
||||
}
|
||||
|
||||
int dmar_parse_rmrr_atsr_dev(void)
|
||||
int __init dmar_parse_rmrr_atsr_dev(void)
|
||||
{
|
||||
struct dmar_rmrr_unit *rmrr, *rmrr_n;
|
||||
struct dmar_atsr_unit *atsr, *atsr_n;
|
||||
|
|
|
@ -773,7 +773,7 @@ int __init parse_ioapics_under_ir(void)
|
|||
return ir_supported;
|
||||
}
|
||||
|
||||
int ir_dev_scope_init(void)
|
||||
int __init ir_dev_scope_init(void)
|
||||
{
|
||||
if (!intr_remapping_enabled)
|
||||
return 0;
|
||||
|
|
|
@ -2,4 +2,5 @@
|
|||
# Makefile for the A Semi network device drivers.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_PASEMI_MAC) += pasemi_mac.o pasemi_mac_ethtool.o
|
||||
obj-$(CONFIG_PASEMI_MAC) += pasemi_mac_driver.o
|
||||
pasemi_mac_driver-objs := pasemi_mac.o pasemi_mac_ethtool.o
|
||||
|
|
|
@ -1180,11 +1180,13 @@ static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr)
|
|||
return value;
|
||||
}
|
||||
|
||||
static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
|
||||
static void rtl8169_irq_mask_and_ack(struct rtl8169_private *tp)
|
||||
{
|
||||
RTL_W16(IntrMask, 0x0000);
|
||||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
|
||||
RTL_W16(IntrStatus, 0xffff);
|
||||
RTL_W16(IntrMask, 0x0000);
|
||||
RTL_W16(IntrStatus, tp->intr_event);
|
||||
RTL_R8(ChipCmd);
|
||||
}
|
||||
|
||||
static unsigned int rtl8169_tbi_reset_pending(struct rtl8169_private *tp)
|
||||
|
@ -3933,8 +3935,6 @@ static void rtl_hw_reset(struct rtl8169_private *tp)
|
|||
break;
|
||||
udelay(100);
|
||||
}
|
||||
|
||||
rtl8169_init_ring_indexes(tp);
|
||||
}
|
||||
|
||||
static int __devinit
|
||||
|
@ -4339,7 +4339,7 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp)
|
|||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
|
||||
/* Disable interrupts */
|
||||
rtl8169_irq_mask_and_ack(ioaddr);
|
||||
rtl8169_irq_mask_and_ack(tp);
|
||||
|
||||
rtl_rx_close(tp);
|
||||
|
||||
|
@ -4885,8 +4885,7 @@ static void rtl_hw_start_8168(struct net_device *dev)
|
|||
RTL_W16(IntrMitigate, 0x5151);
|
||||
|
||||
/* Work around for RxFIFO overflow. */
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_11 ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_22) {
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
|
||||
tp->intr_event |= RxFIFOOver | PCSTimeout;
|
||||
tp->intr_event &= ~RxOverflow;
|
||||
}
|
||||
|
@ -5076,6 +5075,11 @@ static void rtl_hw_start_8101(struct net_device *dev)
|
|||
void __iomem *ioaddr = tp->mmio_addr;
|
||||
struct pci_dev *pdev = tp->pci_dev;
|
||||
|
||||
if (tp->mac_version >= RTL_GIGA_MAC_VER_30) {
|
||||
tp->intr_event &= ~RxFIFOOver;
|
||||
tp->napi_event &= ~RxFIFOOver;
|
||||
}
|
||||
|
||||
if (tp->mac_version == RTL_GIGA_MAC_VER_13 ||
|
||||
tp->mac_version == RTL_GIGA_MAC_VER_16) {
|
||||
int cap = pci_pcie_cap(pdev);
|
||||
|
@ -5342,7 +5346,7 @@ static void rtl8169_wait_for_quiescence(struct net_device *dev)
|
|||
/* Wait for any pending NAPI task to complete */
|
||||
napi_disable(&tp->napi);
|
||||
|
||||
rtl8169_irq_mask_and_ack(ioaddr);
|
||||
rtl8169_irq_mask_and_ack(tp);
|
||||
|
||||
tp->intr_mask = 0xffff;
|
||||
RTL_W16(IntrMask, tp->intr_event);
|
||||
|
@ -5389,14 +5393,16 @@ static void rtl8169_reset_task(struct work_struct *work)
|
|||
if (!netif_running(dev))
|
||||
goto out_unlock;
|
||||
|
||||
rtl8169_hw_reset(tp);
|
||||
|
||||
rtl8169_wait_for_quiescence(dev);
|
||||
|
||||
for (i = 0; i < NUM_RX_DESC; i++)
|
||||
rtl8169_mark_to_asic(tp->RxDescArray + i, rx_buf_sz);
|
||||
|
||||
rtl8169_tx_clear(tp);
|
||||
rtl8169_init_ring_indexes(tp);
|
||||
|
||||
rtl8169_hw_reset(tp);
|
||||
rtl_hw_start(dev);
|
||||
netif_wake_queue(dev);
|
||||
rtl8169_check_link_status(dev, tp, tp->mmio_addr);
|
||||
|
@ -5407,11 +5413,6 @@ out_unlock:
|
|||
|
||||
static void rtl8169_tx_timeout(struct net_device *dev)
|
||||
{
|
||||
struct rtl8169_private *tp = netdev_priv(dev);
|
||||
|
||||
rtl8169_hw_reset(tp);
|
||||
|
||||
/* Let's wait a bit while any (async) irq lands on */
|
||||
rtl8169_schedule_work(dev, rtl8169_reset_task);
|
||||
}
|
||||
|
||||
|
@ -5804,6 +5805,10 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||
*/
|
||||
status = RTL_R16(IntrStatus);
|
||||
while (status && status != 0xffff) {
|
||||
status &= tp->intr_event;
|
||||
if (!status)
|
||||
break;
|
||||
|
||||
handled = 1;
|
||||
|
||||
/* Handle all of the error cases first. These will reset
|
||||
|
@ -5818,27 +5823,9 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
|
|||
switch (tp->mac_version) {
|
||||
/* Work around for rx fifo overflow */
|
||||
case RTL_GIGA_MAC_VER_11:
|
||||
case RTL_GIGA_MAC_VER_22:
|
||||
case RTL_GIGA_MAC_VER_26:
|
||||
netif_stop_queue(dev);
|
||||
rtl8169_tx_timeout(dev);
|
||||
goto done;
|
||||
/* Testers needed. */
|
||||
case RTL_GIGA_MAC_VER_17:
|
||||
case RTL_GIGA_MAC_VER_19:
|
||||
case RTL_GIGA_MAC_VER_20:
|
||||
case RTL_GIGA_MAC_VER_21:
|
||||
case RTL_GIGA_MAC_VER_23:
|
||||
case RTL_GIGA_MAC_VER_24:
|
||||
case RTL_GIGA_MAC_VER_27:
|
||||
case RTL_GIGA_MAC_VER_28:
|
||||
case RTL_GIGA_MAC_VER_31:
|
||||
/* Experimental science. Pktgen proof. */
|
||||
case RTL_GIGA_MAC_VER_12:
|
||||
case RTL_GIGA_MAC_VER_25:
|
||||
if (status == RxFIFOOver)
|
||||
goto done;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -1664,7 +1664,7 @@ static int __init netback_init(void)
|
|||
"netback/%u", group);
|
||||
|
||||
if (IS_ERR(netbk->task)) {
|
||||
printk(KERN_ALERT "kthread_run() fails at netback\n");
|
||||
printk(KERN_ALERT "kthread_create() fails at netback\n");
|
||||
del_timer(&netbk->net_timer);
|
||||
rc = PTR_ERR(netbk->task);
|
||||
goto failed_init;
|
||||
|
|
|
@ -239,26 +239,45 @@ int oprofile_set_ulong(unsigned long *addr, unsigned long val)
|
|||
return err;
|
||||
}
|
||||
|
||||
static int timer_mode;
|
||||
|
||||
static int __init oprofile_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
/* always init architecture to setup backtrace support */
|
||||
err = oprofile_arch_init(&oprofile_ops);
|
||||
if (err < 0 || timer) {
|
||||
printk(KERN_INFO "oprofile: using timer interrupt.\n");
|
||||
|
||||
timer_mode = err || timer; /* fall back to timer mode on errors */
|
||||
if (timer_mode) {
|
||||
if (!err)
|
||||
oprofile_arch_exit();
|
||||
err = oprofile_timer_init(&oprofile_ops);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
return oprofilefs_register();
|
||||
|
||||
err = oprofilefs_register();
|
||||
if (!err)
|
||||
return 0;
|
||||
|
||||
/* failed */
|
||||
if (timer_mode)
|
||||
oprofile_timer_exit();
|
||||
else
|
||||
oprofile_arch_exit();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
static void __exit oprofile_exit(void)
|
||||
{
|
||||
oprofile_timer_exit();
|
||||
oprofilefs_unregister();
|
||||
oprofile_arch_exit();
|
||||
if (timer_mode)
|
||||
oprofile_timer_exit();
|
||||
else
|
||||
oprofile_arch_exit();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -110,6 +110,7 @@ int oprofile_timer_init(struct oprofile_operations *ops)
|
|||
ops->start = oprofile_hrtimer_start;
|
||||
ops->stop = oprofile_hrtimer_stop;
|
||||
ops->cpu_type = "timer";
|
||||
printk(KERN_INFO "oprofile: using timer interrupt.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -121,6 +121,7 @@ struct toshiba_acpi_dev {
|
|||
int illumination_supported:1;
|
||||
int video_supported:1;
|
||||
int fan_supported:1;
|
||||
int system_event_supported:1;
|
||||
|
||||
struct mutex mutex;
|
||||
};
|
||||
|
@ -724,7 +725,7 @@ static int keys_proc_show(struct seq_file *m, void *v)
|
|||
u32 hci_result;
|
||||
u32 value;
|
||||
|
||||
if (!dev->key_event_valid) {
|
||||
if (!dev->key_event_valid && dev->system_event_supported) {
|
||||
hci_read1(dev, HCI_SYSTEM_EVENT, &value, &hci_result);
|
||||
if (hci_result == HCI_SUCCESS) {
|
||||
dev->key_event_valid = 1;
|
||||
|
@ -964,6 +965,8 @@ static int __devinit toshiba_acpi_add(struct acpi_device *acpi_dev)
|
|||
|
||||
/* enable event fifo */
|
||||
hci_write1(dev, HCI_SYSTEM_EVENT, 1, &hci_result);
|
||||
if (hci_result == HCI_SUCCESS)
|
||||
dev->system_event_supported = 1;
|
||||
|
||||
props.type = BACKLIGHT_PLATFORM;
|
||||
props.max_brightness = HCI_LCD_BRIGHTNESS_LEVELS - 1;
|
||||
|
@ -1032,12 +1035,15 @@ static void toshiba_acpi_notify(struct acpi_device *acpi_dev, u32 event)
|
|||
{
|
||||
struct toshiba_acpi_dev *dev = acpi_driver_data(acpi_dev);
|
||||
u32 hci_result, value;
|
||||
int retries = 3;
|
||||
|
||||
if (event != 0x80)
|
||||
if (!dev->system_event_supported || event != 0x80)
|
||||
return;
|
||||
|
||||
do {
|
||||
hci_read1(dev, HCI_SYSTEM_EVENT, &value, &hci_result);
|
||||
if (hci_result == HCI_SUCCESS) {
|
||||
switch (hci_result) {
|
||||
case HCI_SUCCESS:
|
||||
if (value == 0x100)
|
||||
continue;
|
||||
/* act on key press; ignore key release */
|
||||
|
@ -1049,14 +1055,19 @@ static void toshiba_acpi_notify(struct acpi_device *acpi_dev, u32 event)
|
|||
pr_info("Unknown key %x\n",
|
||||
value);
|
||||
}
|
||||
} else if (hci_result == HCI_NOT_SUPPORTED) {
|
||||
break;
|
||||
case HCI_NOT_SUPPORTED:
|
||||
/* This is a workaround for an unresolved issue on
|
||||
* some machines where system events sporadically
|
||||
* become disabled. */
|
||||
hci_write1(dev, HCI_SYSTEM_EVENT, 1, &hci_result);
|
||||
pr_notice("Re-enabled hotkeys\n");
|
||||
/* fall through */
|
||||
default:
|
||||
retries--;
|
||||
break;
|
||||
}
|
||||
} while (hci_result != HCI_EMPTY);
|
||||
} while (retries && hci_result != HCI_EMPTY);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -61,7 +61,8 @@ MODULE_PARM_DESC(debug, "Flag to enable PMIC Battery debug messages.");
|
|||
#define PMIC_BATT_CHR_SBATDET_MASK (1 << 5)
|
||||
#define PMIC_BATT_CHR_SDCLMT_MASK (1 << 6)
|
||||
#define PMIC_BATT_CHR_SUSBOVP_MASK (1 << 7)
|
||||
#define PMIC_BATT_CHR_EXCPT_MASK 0xC6
|
||||
#define PMIC_BATT_CHR_EXCPT_MASK 0x86
|
||||
|
||||
#define PMIC_BATT_ADC_ACCCHRG_MASK (1 << 31)
|
||||
#define PMIC_BATT_ADC_ACCCHRGVAL_MASK 0x7FFFFFFF
|
||||
|
||||
|
@ -304,11 +305,6 @@ static void pmic_battery_read_status(struct pmic_power_module_info *pbi)
|
|||
pbi->batt_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
|
||||
pmic_battery_log_event(BATT_EVENT_BATOVP_EXCPT);
|
||||
batt_exception = 1;
|
||||
} else if (r8 & PMIC_BATT_CHR_SDCLMT_MASK) {
|
||||
pbi->batt_health = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
|
||||
pbi->batt_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
|
||||
pmic_battery_log_event(BATT_EVENT_DCLMT_EXCPT);
|
||||
batt_exception = 1;
|
||||
} else if (r8 & PMIC_BATT_CHR_STEMP_MASK) {
|
||||
pbi->batt_health = POWER_SUPPLY_HEALTH_OVERHEAT;
|
||||
pbi->batt_status = POWER_SUPPLY_STATUS_NOT_CHARGING;
|
||||
|
@ -316,6 +312,10 @@ static void pmic_battery_read_status(struct pmic_power_module_info *pbi)
|
|||
batt_exception = 1;
|
||||
} else {
|
||||
pbi->batt_health = POWER_SUPPLY_HEALTH_GOOD;
|
||||
if (r8 & PMIC_BATT_CHR_SDCLMT_MASK) {
|
||||
/* PMIC will change charging current automatically */
|
||||
pmic_battery_log_event(BATT_EVENT_DCLMT_EXCPT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -63,7 +63,7 @@ static int rtc_suspend(struct device *dev, pm_message_t mesg)
|
|||
*/
|
||||
delta = timespec_sub(old_system, old_rtc);
|
||||
delta_delta = timespec_sub(delta, old_delta);
|
||||
if (abs(delta_delta.tv_sec) >= 2) {
|
||||
if (delta_delta.tv_sec < -2 || delta_delta.tv_sec >= 2) {
|
||||
/*
|
||||
* if delta_delta is too large, assume time correction
|
||||
* has occured and set old_delta to the current delta.
|
||||
|
@ -97,9 +97,8 @@ static int rtc_resume(struct device *dev)
|
|||
rtc_tm_to_time(&tm, &new_rtc.tv_sec);
|
||||
new_rtc.tv_nsec = 0;
|
||||
|
||||
if (new_rtc.tv_sec <= old_rtc.tv_sec) {
|
||||
if (new_rtc.tv_sec < old_rtc.tv_sec)
|
||||
pr_debug("%s: time travel!\n", dev_name(&rtc->dev));
|
||||
if (new_rtc.tv_sec < old_rtc.tv_sec) {
|
||||
pr_debug("%s: time travel!\n", dev_name(&rtc->dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -116,7 +115,8 @@ static int rtc_resume(struct device *dev)
|
|||
sleep_time = timespec_sub(sleep_time,
|
||||
timespec_sub(new_system, old_system));
|
||||
|
||||
timekeeping_inject_sleeptime(&sleep_time);
|
||||
if (sleep_time.tv_sec >= 0)
|
||||
timekeeping_inject_sleeptime(&sleep_time);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -319,6 +319,20 @@ int rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(rtc_read_alarm);
|
||||
|
||||
static int ___rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!rtc->ops)
|
||||
err = -ENODEV;
|
||||
else if (!rtc->ops->set_alarm)
|
||||
err = -EINVAL;
|
||||
else
|
||||
err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
|
||||
{
|
||||
struct rtc_time tm;
|
||||
|
@ -342,14 +356,7 @@ static int __rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
|
|||
* over right here, before we set the alarm.
|
||||
*/
|
||||
|
||||
if (!rtc->ops)
|
||||
err = -ENODEV;
|
||||
else if (!rtc->ops->set_alarm)
|
||||
err = -EINVAL;
|
||||
else
|
||||
err = rtc->ops->set_alarm(rtc->dev.parent, alarm);
|
||||
|
||||
return err;
|
||||
return ___rtc_set_alarm(rtc, alarm);
|
||||
}
|
||||
|
||||
int rtc_set_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
|
||||
|
@ -763,6 +770,20 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct rtc_timer *timer)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void rtc_alarm_disable(struct rtc_device *rtc)
|
||||
{
|
||||
struct rtc_wkalrm alarm;
|
||||
struct rtc_time tm;
|
||||
|
||||
__rtc_read_time(rtc, &tm);
|
||||
|
||||
alarm.time = rtc_ktime_to_tm(ktime_add(rtc_tm_to_ktime(tm),
|
||||
ktime_set(300, 0)));
|
||||
alarm.enabled = 0;
|
||||
|
||||
___rtc_set_alarm(rtc, &alarm);
|
||||
}
|
||||
|
||||
/**
|
||||
* rtc_timer_remove - Removes a rtc_timer from the rtc_device timerqueue
|
||||
* @rtc rtc device
|
||||
|
@ -784,8 +805,10 @@ static void rtc_timer_remove(struct rtc_device *rtc, struct rtc_timer *timer)
|
|||
struct rtc_wkalrm alarm;
|
||||
int err;
|
||||
next = timerqueue_getnext(&rtc->timerqueue);
|
||||
if (!next)
|
||||
if (!next) {
|
||||
rtc_alarm_disable(rtc);
|
||||
return;
|
||||
}
|
||||
alarm.time = rtc_ktime_to_tm(next->expires);
|
||||
alarm.enabled = 1;
|
||||
err = __rtc_set_alarm(rtc, &alarm);
|
||||
|
@ -847,7 +870,8 @@ again:
|
|||
err = __rtc_set_alarm(rtc, &alarm);
|
||||
if (err == -ETIME)
|
||||
goto again;
|
||||
}
|
||||
} else
|
||||
rtc_alarm_disable(rtc);
|
||||
|
||||
mutex_unlock(&rtc->ops_lock);
|
||||
}
|
||||
|
|
|
@ -529,10 +529,7 @@ __s390_vary_chpid_on(struct subchannel_id schid, void *data)
|
|||
int chsc_chp_vary(struct chp_id chpid, int on)
|
||||
{
|
||||
struct channel_path *chp = chpid_to_chp(chpid);
|
||||
struct chp_link link;
|
||||
|
||||
memset(&link, 0, sizeof(struct chp_link));
|
||||
link.chpid = chpid;
|
||||
/* Wait until previous actions have settled. */
|
||||
css_wait_for_slow_path();
|
||||
/*
|
||||
|
@ -542,10 +539,10 @@ int chsc_chp_vary(struct chp_id chpid, int on)
|
|||
/* Try to update the channel path descritor. */
|
||||
chsc_determine_base_channel_path_desc(chpid, &chp->desc);
|
||||
for_each_subchannel_staged(s390_subchannel_vary_chpid_on,
|
||||
__s390_vary_chpid_on, &link);
|
||||
__s390_vary_chpid_on, &chpid);
|
||||
} else
|
||||
for_each_subchannel_staged(s390_subchannel_vary_chpid_off,
|
||||
NULL, &link);
|
||||
NULL, &chpid);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -68,8 +68,13 @@ struct schib {
|
|||
__u8 mda[4]; /* model dependent area */
|
||||
} __attribute__ ((packed,aligned(4)));
|
||||
|
||||
/*
|
||||
* When rescheduled, todo's with higher values will overwrite those
|
||||
* with lower values.
|
||||
*/
|
||||
enum sch_todo {
|
||||
SCH_TODO_NOTHING,
|
||||
SCH_TODO_EVAL,
|
||||
SCH_TODO_UNREG,
|
||||
};
|
||||
|
||||
|
|
|
@ -195,51 +195,6 @@ void css_sch_device_unregister(struct subchannel *sch)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(css_sch_device_unregister);
|
||||
|
||||
static void css_sch_todo(struct work_struct *work)
|
||||
{
|
||||
struct subchannel *sch;
|
||||
enum sch_todo todo;
|
||||
|
||||
sch = container_of(work, struct subchannel, todo_work);
|
||||
/* Find out todo. */
|
||||
spin_lock_irq(sch->lock);
|
||||
todo = sch->todo;
|
||||
CIO_MSG_EVENT(4, "sch_todo: sch=0.%x.%04x, todo=%d\n", sch->schid.ssid,
|
||||
sch->schid.sch_no, todo);
|
||||
sch->todo = SCH_TODO_NOTHING;
|
||||
spin_unlock_irq(sch->lock);
|
||||
/* Perform todo. */
|
||||
if (todo == SCH_TODO_UNREG)
|
||||
css_sch_device_unregister(sch);
|
||||
/* Release workqueue ref. */
|
||||
put_device(&sch->dev);
|
||||
}
|
||||
|
||||
/**
|
||||
* css_sched_sch_todo - schedule a subchannel operation
|
||||
* @sch: subchannel
|
||||
* @todo: todo
|
||||
*
|
||||
* Schedule the operation identified by @todo to be performed on the slow path
|
||||
* workqueue. Do nothing if another operation with higher priority is already
|
||||
* scheduled. Needs to be called with subchannel lock held.
|
||||
*/
|
||||
void css_sched_sch_todo(struct subchannel *sch, enum sch_todo todo)
|
||||
{
|
||||
CIO_MSG_EVENT(4, "sch_todo: sched sch=0.%x.%04x todo=%d\n",
|
||||
sch->schid.ssid, sch->schid.sch_no, todo);
|
||||
if (sch->todo >= todo)
|
||||
return;
|
||||
/* Get workqueue ref. */
|
||||
if (!get_device(&sch->dev))
|
||||
return;
|
||||
sch->todo = todo;
|
||||
if (!queue_work(cio_work_q, &sch->todo_work)) {
|
||||
/* Already queued, release workqueue ref. */
|
||||
put_device(&sch->dev);
|
||||
}
|
||||
}
|
||||
|
||||
static void ssd_from_pmcw(struct chsc_ssd_info *ssd, struct pmcw *pmcw)
|
||||
{
|
||||
int i;
|
||||
|
@ -466,6 +421,65 @@ static void css_evaluate_subchannel(struct subchannel_id schid, int slow)
|
|||
css_schedule_eval(schid);
|
||||
}
|
||||
|
||||
/**
|
||||
* css_sched_sch_todo - schedule a subchannel operation
|
||||
* @sch: subchannel
|
||||
* @todo: todo
|
||||
*
|
||||
* Schedule the operation identified by @todo to be performed on the slow path
|
||||
* workqueue. Do nothing if another operation with higher priority is already
|
||||
* scheduled. Needs to be called with subchannel lock held.
|
||||
*/
|
||||
void css_sched_sch_todo(struct subchannel *sch, enum sch_todo todo)
|
||||
{
|
||||
CIO_MSG_EVENT(4, "sch_todo: sched sch=0.%x.%04x todo=%d\n",
|
||||
sch->schid.ssid, sch->schid.sch_no, todo);
|
||||
if (sch->todo >= todo)
|
||||
return;
|
||||
/* Get workqueue ref. */
|
||||
if (!get_device(&sch->dev))
|
||||
return;
|
||||
sch->todo = todo;
|
||||
if (!queue_work(cio_work_q, &sch->todo_work)) {
|
||||
/* Already queued, release workqueue ref. */
|
||||
put_device(&sch->dev);
|
||||
}
|
||||
}
|
||||
|
||||
static void css_sch_todo(struct work_struct *work)
|
||||
{
|
||||
struct subchannel *sch;
|
||||
enum sch_todo todo;
|
||||
int ret;
|
||||
|
||||
sch = container_of(work, struct subchannel, todo_work);
|
||||
/* Find out todo. */
|
||||
spin_lock_irq(sch->lock);
|
||||
todo = sch->todo;
|
||||
CIO_MSG_EVENT(4, "sch_todo: sch=0.%x.%04x, todo=%d\n", sch->schid.ssid,
|
||||
sch->schid.sch_no, todo);
|
||||
sch->todo = SCH_TODO_NOTHING;
|
||||
spin_unlock_irq(sch->lock);
|
||||
/* Perform todo. */
|
||||
switch (todo) {
|
||||
case SCH_TODO_NOTHING:
|
||||
break;
|
||||
case SCH_TODO_EVAL:
|
||||
ret = css_evaluate_known_subchannel(sch, 1);
|
||||
if (ret == -EAGAIN) {
|
||||
spin_lock_irq(sch->lock);
|
||||
css_sched_sch_todo(sch, todo);
|
||||
spin_unlock_irq(sch->lock);
|
||||
}
|
||||
break;
|
||||
case SCH_TODO_UNREG:
|
||||
css_sch_device_unregister(sch);
|
||||
break;
|
||||
}
|
||||
/* Release workqueue ref. */
|
||||
put_device(&sch->dev);
|
||||
}
|
||||
|
||||
static struct idset *slow_subchannel_set;
|
||||
static spinlock_t slow_subchannel_lock;
|
||||
static wait_queue_head_t css_eval_wq;
|
||||
|
|
|
@ -1868,9 +1868,9 @@ static void __ccw_device_pm_restore(struct ccw_device *cdev)
|
|||
*/
|
||||
cdev->private->flags.resuming = 1;
|
||||
cdev->private->path_new_mask = LPM_ANYPATH;
|
||||
css_schedule_eval(sch->schid);
|
||||
css_sched_sch_todo(sch, SCH_TODO_EVAL);
|
||||
spin_unlock_irq(sch->lock);
|
||||
css_complete_work();
|
||||
css_wait_for_slow_path();
|
||||
|
||||
/* cdev may have been moved to a different subchannel. */
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
|
|
|
@ -496,8 +496,26 @@ static void ccw_device_reset_path_events(struct ccw_device *cdev)
|
|||
cdev->private->pgid_reset_mask = 0;
|
||||
}
|
||||
|
||||
void
|
||||
ccw_device_verify_done(struct ccw_device *cdev, int err)
|
||||
static void create_fake_irb(struct irb *irb, int type)
|
||||
{
|
||||
memset(irb, 0, sizeof(*irb));
|
||||
if (type == FAKE_CMD_IRB) {
|
||||
struct cmd_scsw *scsw = &irb->scsw.cmd;
|
||||
scsw->cc = 1;
|
||||
scsw->fctl = SCSW_FCTL_START_FUNC;
|
||||
scsw->actl = SCSW_ACTL_START_PEND;
|
||||
scsw->stctl = SCSW_STCTL_STATUS_PEND;
|
||||
} else if (type == FAKE_TM_IRB) {
|
||||
struct tm_scsw *scsw = &irb->scsw.tm;
|
||||
scsw->x = 1;
|
||||
scsw->cc = 1;
|
||||
scsw->fctl = SCSW_FCTL_START_FUNC;
|
||||
scsw->actl = SCSW_ACTL_START_PEND;
|
||||
scsw->stctl = SCSW_STCTL_STATUS_PEND;
|
||||
}
|
||||
}
|
||||
|
||||
void ccw_device_verify_done(struct ccw_device *cdev, int err)
|
||||
{
|
||||
struct subchannel *sch;
|
||||
|
||||
|
@ -520,12 +538,8 @@ callback:
|
|||
ccw_device_done(cdev, DEV_STATE_ONLINE);
|
||||
/* Deliver fake irb to device driver, if needed. */
|
||||
if (cdev->private->flags.fake_irb) {
|
||||
memset(&cdev->private->irb, 0, sizeof(struct irb));
|
||||
cdev->private->irb.scsw.cmd.cc = 1;
|
||||
cdev->private->irb.scsw.cmd.fctl = SCSW_FCTL_START_FUNC;
|
||||
cdev->private->irb.scsw.cmd.actl = SCSW_ACTL_START_PEND;
|
||||
cdev->private->irb.scsw.cmd.stctl =
|
||||
SCSW_STCTL_STATUS_PEND;
|
||||
create_fake_irb(&cdev->private->irb,
|
||||
cdev->private->flags.fake_irb);
|
||||
cdev->private->flags.fake_irb = 0;
|
||||
if (cdev->handler)
|
||||
cdev->handler(cdev, cdev->private->intparm,
|
||||
|
|
|
@ -198,7 +198,7 @@ int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,
|
|||
if (cdev->private->state == DEV_STATE_VERIFY) {
|
||||
/* Remember to fake irb when finished. */
|
||||
if (!cdev->private->flags.fake_irb) {
|
||||
cdev->private->flags.fake_irb = 1;
|
||||
cdev->private->flags.fake_irb = FAKE_CMD_IRB;
|
||||
cdev->private->intparm = intparm;
|
||||
return 0;
|
||||
} else
|
||||
|
@ -213,9 +213,9 @@ int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,
|
|||
ret = cio_set_options (sch, flags);
|
||||
if (ret)
|
||||
return ret;
|
||||
/* Adjust requested path mask to excluded varied off paths. */
|
||||
/* Adjust requested path mask to exclude unusable paths. */
|
||||
if (lpm) {
|
||||
lpm &= sch->opm;
|
||||
lpm &= sch->lpm;
|
||||
if (lpm == 0)
|
||||
return -EACCES;
|
||||
}
|
||||
|
@ -605,11 +605,21 @@ int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw,
|
|||
sch = to_subchannel(cdev->dev.parent);
|
||||
if (!sch->schib.pmcw.ena)
|
||||
return -EINVAL;
|
||||
if (cdev->private->state == DEV_STATE_VERIFY) {
|
||||
/* Remember to fake irb when finished. */
|
||||
if (!cdev->private->flags.fake_irb) {
|
||||
cdev->private->flags.fake_irb = FAKE_TM_IRB;
|
||||
cdev->private->intparm = intparm;
|
||||
return 0;
|
||||
} else
|
||||
/* There's already a fake I/O around. */
|
||||
return -EBUSY;
|
||||
}
|
||||
if (cdev->private->state != DEV_STATE_ONLINE)
|
||||
return -EIO;
|
||||
/* Adjust requested path mask to excluded varied off paths. */
|
||||
/* Adjust requested path mask to exclude unusable paths. */
|
||||
if (lpm) {
|
||||
lpm &= sch->opm;
|
||||
lpm &= sch->lpm;
|
||||
if (lpm == 0)
|
||||
return -EACCES;
|
||||
}
|
||||
|
|
|
@ -111,6 +111,9 @@ enum cdev_todo {
|
|||
CDEV_TODO_UNREG_EVAL,
|
||||
};
|
||||
|
||||
#define FAKE_CMD_IRB 1
|
||||
#define FAKE_TM_IRB 2
|
||||
|
||||
struct ccw_device_private {
|
||||
struct ccw_device *cdev;
|
||||
struct subchannel *sch;
|
||||
|
@ -138,7 +141,7 @@ struct ccw_device_private {
|
|||
unsigned int doverify:1; /* delayed path verification */
|
||||
unsigned int donotify:1; /* call notify function */
|
||||
unsigned int recog_done:1; /* dev. recog. complete */
|
||||
unsigned int fake_irb:1; /* deliver faked irb */
|
||||
unsigned int fake_irb:2; /* deliver faked irb */
|
||||
unsigned int resuming:1; /* recognition while resume */
|
||||
unsigned int pgroup:1; /* pathgroup is set up */
|
||||
unsigned int mpath:1; /* multipathing is set up */
|
||||
|
|
|
@ -1552,6 +1552,8 @@ static void ap_reset(struct ap_device *ap_dev)
|
|||
rc = ap_init_queue(ap_dev->qid);
|
||||
if (rc == -ENODEV)
|
||||
ap_dev->unregistered = 1;
|
||||
else
|
||||
__ap_schedule_poll_timer();
|
||||
}
|
||||
|
||||
static int __ap_poll_device(struct ap_device *ap_dev, unsigned long *flags)
|
||||
|
|
|
@ -671,7 +671,7 @@ static int do_insnlist_ioctl(struct comedi_device *dev,
|
|||
}
|
||||
|
||||
insns =
|
||||
kmalloc(sizeof(struct comedi_insn) * insnlist.n_insns, GFP_KERNEL);
|
||||
kcalloc(insnlist.n_insns, sizeof(struct comedi_insn), GFP_KERNEL);
|
||||
if (!insns) {
|
||||
DPRINTK("kmalloc failed\n");
|
||||
ret = -ENOMEM;
|
||||
|
@ -1432,7 +1432,21 @@ static int do_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void comedi_unmap(struct vm_area_struct *area)
|
||||
|
||||
static void comedi_vm_open(struct vm_area_struct *area)
|
||||
{
|
||||
struct comedi_async *async;
|
||||
struct comedi_device *dev;
|
||||
|
||||
async = area->vm_private_data;
|
||||
dev = async->subdevice->device;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
async->mmap_count++;
|
||||
mutex_unlock(&dev->mutex);
|
||||
}
|
||||
|
||||
static void comedi_vm_close(struct vm_area_struct *area)
|
||||
{
|
||||
struct comedi_async *async;
|
||||
struct comedi_device *dev;
|
||||
|
@ -1446,15 +1460,13 @@ static void comedi_unmap(struct vm_area_struct *area)
|
|||
}
|
||||
|
||||
static struct vm_operations_struct comedi_vm_ops = {
|
||||
.close = comedi_unmap,
|
||||
.open = comedi_vm_open,
|
||||
.close = comedi_vm_close,
|
||||
};
|
||||
|
||||
static int comedi_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_async *async = NULL;
|
||||
unsigned long start = vma->vm_start;
|
||||
unsigned long size;
|
||||
|
@ -1462,6 +1474,15 @@ static int comedi_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
int i;
|
||||
int retval;
|
||||
struct comedi_subdevice *s;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
if (!dev->attached) {
|
||||
|
@ -1528,11 +1549,17 @@ static unsigned int comedi_poll(struct file *file, poll_table * wait)
|
|||
{
|
||||
unsigned int mask = 0;
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_subdevice *read_subdev;
|
||||
struct comedi_subdevice *write_subdev;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
if (!dev->attached) {
|
||||
|
@ -1578,9 +1605,15 @@ static ssize_t comedi_write(struct file *file, const char __user *buf,
|
|||
int n, m, count = 0, retval = 0;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
if (!dev->attached) {
|
||||
DPRINTK("no driver configured on comedi%i\n", dev->minor);
|
||||
|
@ -1640,11 +1673,11 @@ static ssize_t comedi_write(struct file *file, const char __user *buf,
|
|||
retval = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
schedule();
|
||||
if (signal_pending(current)) {
|
||||
retval = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
schedule();
|
||||
if (!s->busy)
|
||||
break;
|
||||
if (s->busy != file) {
|
||||
|
@ -1683,9 +1716,15 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes,
|
|||
int n, m, count = 0, retval = 0;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
if (!dev->attached) {
|
||||
DPRINTK("no driver configured on comedi%i\n", dev->minor);
|
||||
|
@ -1741,11 +1780,11 @@ static ssize_t comedi_read(struct file *file, char __user *buf, size_t nbytes,
|
|||
retval = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
schedule();
|
||||
if (signal_pending(current)) {
|
||||
retval = -ERESTARTSYS;
|
||||
break;
|
||||
}
|
||||
schedule();
|
||||
if (!s->busy) {
|
||||
retval = 0;
|
||||
break;
|
||||
|
@ -1885,11 +1924,17 @@ ok:
|
|||
static int comedi_close(struct inode *inode, struct file *file)
|
||||
{
|
||||
const unsigned minor = iminor(inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
struct comedi_subdevice *s = NULL;
|
||||
int i;
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
mutex_lock(&dev->mutex);
|
||||
|
||||
|
@ -1923,10 +1968,15 @@ static int comedi_close(struct inode *inode, struct file *file)
|
|||
static int comedi_fasync(int fd, struct file *file, int on)
|
||||
{
|
||||
const unsigned minor = iminor(file->f_dentry->d_inode);
|
||||
struct comedi_device_file_info *dev_file_info =
|
||||
comedi_get_device_file_info(minor);
|
||||
struct comedi_device_file_info *dev_file_info;
|
||||
struct comedi_device *dev;
|
||||
dev_file_info = comedi_get_device_file_info(minor);
|
||||
|
||||
struct comedi_device *dev = dev_file_info->device;
|
||||
if (dev_file_info == NULL)
|
||||
return -ENODEV;
|
||||
dev = dev_file_info->device;
|
||||
if (dev == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
return fasync_helper(fd, file, on, &dev->async_queue);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#define DRIVER_VERSION "v0.5"
|
||||
#define DRIVER_VERSION "v0.6"
|
||||
#define DRIVER_AUTHOR "Bernd Porr, BerndPorr@f2s.com"
|
||||
#define DRIVER_DESC "Stirling/ITL USB-DUX SIGMA -- Bernd.Porr@f2s.com"
|
||||
/*
|
||||
|
@ -25,7 +25,7 @@ Driver: usbduxsigma
|
|||
Description: University of Stirling USB DAQ & INCITE Technology Limited
|
||||
Devices: [ITL] USB-DUX (usbduxsigma.o)
|
||||
Author: Bernd Porr <BerndPorr@f2s.com>
|
||||
Updated: 21 Jul 2011
|
||||
Updated: 8 Nov 2011
|
||||
Status: testing
|
||||
*/
|
||||
/*
|
||||
|
@ -44,6 +44,7 @@ Status: testing
|
|||
* 0.3: proper vendor ID and driver name
|
||||
* 0.4: fixed D/A voltage range
|
||||
* 0.5: various bug fixes, health check at startup
|
||||
* 0.6: corrected wrong input range
|
||||
*/
|
||||
|
||||
/* generates loads of debug info */
|
||||
|
@ -175,7 +176,7 @@ Status: testing
|
|||
/* comedi constants */
|
||||
static const struct comedi_lrange range_usbdux_ai_range = { 1, {
|
||||
BIP_RANGE
|
||||
(2.65)
|
||||
(2.65/2.0)
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -1021,6 +1021,7 @@ static int __devinit rtsx_probe(struct pci_dev *pci,
|
|||
th = kthread_create(rtsx_scan_thread, dev, "rtsx-scan");
|
||||
if (IS_ERR(th)) {
|
||||
printk(KERN_ERR "Unable to start the device-scanning thread\n");
|
||||
complete(&dev->scanning_done);
|
||||
quiesce_and_remove_host(dev);
|
||||
err = PTR_ERR(th);
|
||||
goto errout;
|
||||
|
|
|
@ -68,6 +68,7 @@ static void vhci_recv_ret_submit(struct vhci_device *vdev,
|
|||
{
|
||||
struct usbip_device *ud = &vdev->ud;
|
||||
struct urb *urb;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&vdev->priv_lock);
|
||||
urb = pickup_urb_and_free_priv(vdev, pdu->base.seqnum);
|
||||
|
@ -101,9 +102,9 @@ static void vhci_recv_ret_submit(struct vhci_device *vdev,
|
|||
|
||||
usbip_dbg_vhci_rx("now giveback urb %p\n", urb);
|
||||
|
||||
spin_lock(&the_controller->lock);
|
||||
spin_lock_irqsave(&the_controller->lock, flags);
|
||||
usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb);
|
||||
spin_unlock(&the_controller->lock);
|
||||
spin_unlock_irqrestore(&the_controller->lock, flags);
|
||||
|
||||
usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb, urb->status);
|
||||
|
||||
|
@ -141,6 +142,7 @@ static void vhci_recv_ret_unlink(struct vhci_device *vdev,
|
|||
{
|
||||
struct vhci_unlink *unlink;
|
||||
struct urb *urb;
|
||||
unsigned long flags;
|
||||
|
||||
usbip_dump_header(pdu);
|
||||
|
||||
|
@ -170,9 +172,9 @@ static void vhci_recv_ret_unlink(struct vhci_device *vdev,
|
|||
urb->status = pdu->u.ret_unlink.status;
|
||||
pr_info("urb->status %d\n", urb->status);
|
||||
|
||||
spin_lock(&the_controller->lock);
|
||||
spin_lock_irqsave(&the_controller->lock, flags);
|
||||
usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb);
|
||||
spin_unlock(&the_controller->lock);
|
||||
spin_unlock_irqrestore(&the_controller->lock, flags);
|
||||
|
||||
usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb,
|
||||
urb->status);
|
||||
|
|
|
@ -1959,7 +1959,7 @@ static int amd5536_start(struct usb_gadget_driver *driver,
|
|||
u32 tmp;
|
||||
|
||||
if (!driver || !bind || !driver->setup
|
||||
|| driver->speed != USB_SPEED_HIGH)
|
||||
|| driver->speed < USB_SPEED_HIGH)
|
||||
return -EINVAL;
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
|
|
|
@ -131,8 +131,8 @@ static int gser_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
|
|||
}
|
||||
if (!gser->port.in->desc || !gser->port.out->desc) {
|
||||
DBG(cdev, "activate generic ttyGS%d\n", gser->port_num);
|
||||
if (!config_ep_by_speed(cdev->gadget, f, gser->port.in) ||
|
||||
!config_ep_by_speed(cdev->gadget, f, gser->port.out)) {
|
||||
if (config_ep_by_speed(cdev->gadget, f, gser->port.in) ||
|
||||
config_ep_by_speed(cdev->gadget, f, gser->port.out)) {
|
||||
gser->port.in->desc = NULL;
|
||||
gser->port.out->desc = NULL;
|
||||
return -EINVAL;
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/fsl_devices.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
|
||||
|
@ -88,7 +89,6 @@ eenahb:
|
|||
void fsl_udc_clk_finalize(struct platform_device *pdev)
|
||||
{
|
||||
struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data;
|
||||
#if defined(CONFIG_SOC_IMX35)
|
||||
if (cpu_is_mx35()) {
|
||||
unsigned int v;
|
||||
|
||||
|
@ -101,7 +101,6 @@ void fsl_udc_clk_finalize(struct platform_device *pdev)
|
|||
USBPHYCTRL_OTGBASE_OFFSET));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ULPI transceivers don't need usbpll */
|
||||
if (pdata->phy_mode == FSL_USB2_PHY_ULPI) {
|
||||
|
|
|
@ -2336,8 +2336,7 @@ static int fsl_qe_start(struct usb_gadget_driver *driver,
|
|||
if (!udc_controller)
|
||||
return -ENODEV;
|
||||
|
||||
if (!driver || (driver->speed != USB_SPEED_FULL
|
||||
&& driver->speed != USB_SPEED_HIGH)
|
||||
if (!driver || driver->speed < USB_SPEED_FULL
|
||||
|| !bind || !driver->disconnect || !driver->setup)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -696,12 +696,31 @@ static void fsl_free_request(struct usb_ep *_ep, struct usb_request *_req)
|
|||
kfree(req);
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/* Actually add a dTD chain to an empty dQH and let go */
|
||||
static void fsl_prime_ep(struct fsl_ep *ep, struct ep_td_struct *td)
|
||||
{
|
||||
struct ep_queue_head *qh = get_qh_by_ep(ep);
|
||||
|
||||
/* Write dQH next pointer and terminate bit to 0 */
|
||||
qh->next_dtd_ptr = cpu_to_hc32(td->td_dma
|
||||
& EP_QUEUE_HEAD_NEXT_POINTER_MASK);
|
||||
|
||||
/* Clear active and halt bit */
|
||||
qh->size_ioc_int_sts &= cpu_to_hc32(~(EP_QUEUE_HEAD_STATUS_ACTIVE
|
||||
| EP_QUEUE_HEAD_STATUS_HALT));
|
||||
|
||||
/* Ensure that updates to the QH will occur before priming. */
|
||||
wmb();
|
||||
|
||||
/* Prime endpoint by writing correct bit to ENDPTPRIME */
|
||||
fsl_writel(ep_is_in(ep) ? (1 << (ep_index(ep) + 16))
|
||||
: (1 << (ep_index(ep))), &dr_regs->endpointprime);
|
||||
}
|
||||
|
||||
/* Add dTD chain to the dQH of an EP */
|
||||
static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
|
||||
{
|
||||
int i = ep_index(ep) * 2 + ep_is_in(ep);
|
||||
u32 temp, bitmask, tmp_stat;
|
||||
struct ep_queue_head *dQH = &ep->udc->ep_qh[i];
|
||||
|
||||
/* VDBG("QH addr Register 0x%8x", dr_regs->endpointlistaddr);
|
||||
VDBG("ep_qh[%d] addr is 0x%8x", i, (u32)&(ep->udc->ep_qh[i])); */
|
||||
|
@ -719,7 +738,7 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
|
|||
cpu_to_hc32(req->head->td_dma & DTD_ADDR_MASK);
|
||||
/* Read prime bit, if 1 goto done */
|
||||
if (fsl_readl(&dr_regs->endpointprime) & bitmask)
|
||||
goto out;
|
||||
return;
|
||||
|
||||
do {
|
||||
/* Set ATDTW bit in USBCMD */
|
||||
|
@ -736,28 +755,10 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req)
|
|||
fsl_writel(temp & ~USB_CMD_ATDTW, &dr_regs->usbcmd);
|
||||
|
||||
if (tmp_stat)
|
||||
goto out;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Write dQH next pointer and terminate bit to 0 */
|
||||
temp = req->head->td_dma & EP_QUEUE_HEAD_NEXT_POINTER_MASK;
|
||||
dQH->next_dtd_ptr = cpu_to_hc32(temp);
|
||||
|
||||
/* Clear active and halt bit */
|
||||
temp = cpu_to_hc32(~(EP_QUEUE_HEAD_STATUS_ACTIVE
|
||||
| EP_QUEUE_HEAD_STATUS_HALT));
|
||||
dQH->size_ioc_int_sts &= temp;
|
||||
|
||||
/* Ensure that updates to the QH will occur before priming. */
|
||||
wmb();
|
||||
|
||||
/* Prime endpoint by writing 1 to ENDPTPRIME */
|
||||
temp = ep_is_in(ep)
|
||||
? (1 << (ep_index(ep) + 16))
|
||||
: (1 << (ep_index(ep)));
|
||||
fsl_writel(temp, &dr_regs->endpointprime);
|
||||
out:
|
||||
return;
|
||||
fsl_prime_ep(ep, req->head);
|
||||
}
|
||||
|
||||
/* Fill in the dTD structure
|
||||
|
@ -877,7 +878,7 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
|
|||
VDBG("%s, bad ep", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
|
||||
if (usb_endpoint_xfer_isoc(ep->desc)) {
|
||||
if (req->req.length > ep->ep.maxpacket)
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
@ -973,25 +974,20 @@ static int fsl_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
|
|||
|
||||
/* The request isn't the last request in this ep queue */
|
||||
if (req->queue.next != &ep->queue) {
|
||||
struct ep_queue_head *qh;
|
||||
struct fsl_req *next_req;
|
||||
|
||||
qh = ep->qh;
|
||||
next_req = list_entry(req->queue.next, struct fsl_req,
|
||||
queue);
|
||||
|
||||
/* Point the QH to the first TD of next request */
|
||||
fsl_writel((u32) next_req->head, &qh->curr_dtd_ptr);
|
||||
/* prime with dTD of next request */
|
||||
fsl_prime_ep(ep, next_req->head);
|
||||
}
|
||||
|
||||
/* The request hasn't been processed, patch up the TD chain */
|
||||
/* The request hasn't been processed, patch up the TD chain */
|
||||
} else {
|
||||
struct fsl_req *prev_req;
|
||||
|
||||
prev_req = list_entry(req->queue.prev, struct fsl_req, queue);
|
||||
fsl_writel(fsl_readl(&req->tail->next_td_ptr),
|
||||
&prev_req->tail->next_td_ptr);
|
||||
|
||||
prev_req->tail->next_td_ptr = req->tail->next_td_ptr;
|
||||
}
|
||||
|
||||
done(ep, req, -ECONNRESET);
|
||||
|
@ -1032,7 +1028,7 @@ static int fsl_ep_set_halt(struct usb_ep *_ep, int value)
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
|
||||
if (usb_endpoint_xfer_isoc(ep->desc)) {
|
||||
status = -EOPNOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1068,7 +1064,7 @@ static int fsl_ep_fifo_status(struct usb_ep *_ep)
|
|||
struct fsl_udc *udc;
|
||||
int size = 0;
|
||||
u32 bitmask;
|
||||
struct ep_queue_head *d_qh;
|
||||
struct ep_queue_head *qh;
|
||||
|
||||
ep = container_of(_ep, struct fsl_ep, ep);
|
||||
if (!_ep || (!ep->desc && ep_index(ep) != 0))
|
||||
|
@ -1079,13 +1075,13 @@ static int fsl_ep_fifo_status(struct usb_ep *_ep)
|
|||
if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN)
|
||||
return -ESHUTDOWN;
|
||||
|
||||
d_qh = &ep->udc->ep_qh[ep_index(ep) * 2 + ep_is_in(ep)];
|
||||
qh = get_qh_by_ep(ep);
|
||||
|
||||
bitmask = (ep_is_in(ep)) ? (1 << (ep_index(ep) + 16)) :
|
||||
(1 << (ep_index(ep)));
|
||||
|
||||
if (fsl_readl(&dr_regs->endptstatus) & bitmask)
|
||||
size = (d_qh->size_ioc_int_sts & DTD_PACKET_SIZE)
|
||||
size = (qh->size_ioc_int_sts & DTD_PACKET_SIZE)
|
||||
>> DTD_LENGTH_BIT_POS;
|
||||
|
||||
pr_debug("%s %u\n", __func__, size);
|
||||
|
@ -1938,8 +1934,7 @@ static int fsl_start(struct usb_gadget_driver *driver,
|
|||
if (!udc_controller)
|
||||
return -ENODEV;
|
||||
|
||||
if (!driver || (driver->speed != USB_SPEED_FULL
|
||||
&& driver->speed != USB_SPEED_HIGH)
|
||||
if (!driver || driver->speed < USB_SPEED_FULL
|
||||
|| !bind || !driver->disconnect || !driver->setup)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -569,6 +569,16 @@ static void dump_msg(const char *label, const u8 * buf, unsigned int length)
|
|||
* 2 + ((windex & USB_DIR_IN) ? 1 : 0))
|
||||
#define get_pipe_by_ep(EP) (ep_index(EP) * 2 + ep_is_in(EP))
|
||||
|
||||
static inline struct ep_queue_head *get_qh_by_ep(struct fsl_ep *ep)
|
||||
{
|
||||
/* we only have one ep0 structure but two queue heads */
|
||||
if (ep_index(ep) != 0)
|
||||
return ep->qh;
|
||||
else
|
||||
return &ep->udc->ep_qh[(ep->udc->ep0_dir ==
|
||||
USB_DIR_IN) ? 1 : 0];
|
||||
}
|
||||
|
||||
struct platform_device;
|
||||
#ifdef CONFIG_ARCH_MXC
|
||||
int fsl_udc_clk_init(struct platform_device *pdev);
|
||||
|
|
|
@ -1472,7 +1472,7 @@ static int m66592_start(struct usb_gadget_driver *driver,
|
|||
int retval;
|
||||
|
||||
if (!driver
|
||||
|| driver->speed != USB_SPEED_HIGH
|
||||
|| driver->speed < USB_SPEED_HIGH
|
||||
|| !bind
|
||||
|| !driver->setup)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -1881,7 +1881,7 @@ static int net2280_start(struct usb_gadget *_gadget,
|
|||
* (dev->usb->xcvrdiag & FORCE_FULL_SPEED_MODE)
|
||||
* "must not be used in normal operation"
|
||||
*/
|
||||
if (!driver || driver->speed != USB_SPEED_HIGH
|
||||
if (!driver || driver->speed < USB_SPEED_HIGH
|
||||
|| !driver->setup)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -1746,7 +1746,7 @@ static int r8a66597_start(struct usb_gadget *gadget,
|
|||
struct r8a66597 *r8a66597 = gadget_to_r8a66597(gadget);
|
||||
|
||||
if (!driver
|
||||
|| driver->speed != USB_SPEED_HIGH
|
||||
|| driver->speed < USB_SPEED_HIGH
|
||||
|| !driver->setup)
|
||||
return -EINVAL;
|
||||
if (!r8a66597)
|
||||
|
|
|
@ -2586,10 +2586,8 @@ static int s3c_hsotg_start(struct usb_gadget_driver *driver,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (driver->speed != USB_SPEED_HIGH &&
|
||||
driver->speed != USB_SPEED_FULL) {
|
||||
if (driver->speed < USB_SPEED_FULL)
|
||||
dev_err(hsotg->dev, "%s: bad speed\n", __func__);
|
||||
}
|
||||
|
||||
if (!bind || !driver->setup) {
|
||||
dev_err(hsotg->dev, "%s: missing entry points\n", __func__);
|
||||
|
|
|
@ -1142,8 +1142,7 @@ static int s3c_hsudc_start(struct usb_gadget_driver *driver,
|
|||
int ret;
|
||||
|
||||
if (!driver
|
||||
|| (driver->speed != USB_SPEED_FULL &&
|
||||
driver->speed != USB_SPEED_HIGH)
|
||||
|| driver->speed < USB_SPEED_FULL
|
||||
|| !bind
|
||||
|| !driver->unbind || !driver->disconnect || !driver->setup)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -1475,6 +1475,7 @@ iso_stream_schedule (
|
|||
* jump until after the queue is primed.
|
||||
*/
|
||||
else {
|
||||
int done = 0;
|
||||
start = SCHEDULE_SLOP + (now & ~0x07);
|
||||
|
||||
/* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */
|
||||
|
@ -1492,18 +1493,18 @@ iso_stream_schedule (
|
|||
if (stream->highspeed) {
|
||||
if (itd_slot_ok(ehci, mod, start,
|
||||
stream->usecs, period))
|
||||
break;
|
||||
done = 1;
|
||||
} else {
|
||||
if ((start % 8) >= 6)
|
||||
continue;
|
||||
if (sitd_slot_ok(ehci, mod, stream,
|
||||
start, sched, period))
|
||||
break;
|
||||
done = 1;
|
||||
}
|
||||
} while (start > next);
|
||||
} while (start > next && !done);
|
||||
|
||||
/* no room in the schedule */
|
||||
if (start == next) {
|
||||
if (!done) {
|
||||
ehci_dbg(ehci, "iso resched full %p (now %d max %d)\n",
|
||||
urb, now, now + mod);
|
||||
status = -ENOSPC;
|
||||
|
|
|
@ -124,7 +124,7 @@ void qset_clear(struct whc *whc, struct whc_qset *qset)
|
|||
{
|
||||
qset->td_start = qset->td_end = qset->ntds = 0;
|
||||
|
||||
qset->qh.link = cpu_to_le32(QH_LINK_NTDS(8) | QH_LINK_T);
|
||||
qset->qh.link = cpu_to_le64(QH_LINK_NTDS(8) | QH_LINK_T);
|
||||
qset->qh.status = qset->qh.status & QH_STATUS_SEQ_MASK;
|
||||
qset->qh.err_count = 0;
|
||||
qset->qh.scratch[0] = 0;
|
||||
|
|
|
@ -711,7 +711,10 @@ static void xhci_clear_command_ring(struct xhci_hcd *xhci)
|
|||
ring = xhci->cmd_ring;
|
||||
seg = ring->deq_seg;
|
||||
do {
|
||||
memset(seg->trbs, 0, SEGMENT_SIZE);
|
||||
memset(seg->trbs, 0,
|
||||
sizeof(union xhci_trb) * (TRBS_PER_SEGMENT - 1));
|
||||
seg->trbs[TRBS_PER_SEGMENT - 1].link.control &=
|
||||
cpu_to_le32(~TRB_CYCLE);
|
||||
seg = seg->next;
|
||||
} while (seg != ring->deq_seg);
|
||||
|
||||
|
|
|
@ -2301,18 +2301,12 @@ static int musb_suspend(struct device *dev)
|
|||
*/
|
||||
}
|
||||
|
||||
musb_save_context(musb);
|
||||
|
||||
spin_unlock_irqrestore(&musb->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int musb_resume_noirq(struct device *dev)
|
||||
{
|
||||
struct musb *musb = dev_to_musb(dev);
|
||||
|
||||
musb_restore_context(musb);
|
||||
|
||||
/* for static cmos like DaVinci, register values were preserved
|
||||
* unless for some reason the whole soc powered down or the USB
|
||||
* module got reset through the PSC (vs just being disabled).
|
||||
|
|
|
@ -1903,7 +1903,7 @@ static int musb_gadget_start(struct usb_gadget *g,
|
|||
unsigned long flags;
|
||||
int retval = -EINVAL;
|
||||
|
||||
if (driver->speed != USB_SPEED_HIGH)
|
||||
if (driver->speed < USB_SPEED_HIGH)
|
||||
goto err0;
|
||||
|
||||
pm_runtime_get_sync(musb->controller);
|
||||
|
|
|
@ -751,53 +751,32 @@ static int usbhsg_gadget_start(struct usb_gadget *gadget,
|
|||
struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget);
|
||||
struct usbhs_priv *priv;
|
||||
struct device *dev;
|
||||
int ret;
|
||||
struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv);
|
||||
|
||||
if (!driver ||
|
||||
!driver->setup ||
|
||||
driver->speed != USB_SPEED_HIGH)
|
||||
driver->speed < USB_SPEED_FULL)
|
||||
return -EINVAL;
|
||||
|
||||
dev = usbhsg_gpriv_to_dev(gpriv);
|
||||
priv = usbhsg_gpriv_to_priv(gpriv);
|
||||
|
||||
/* first hook up the driver ... */
|
||||
gpriv->driver = driver;
|
||||
gpriv->gadget.dev.driver = &driver->driver;
|
||||
|
||||
ret = device_add(&gpriv->gadget.dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "device_add error %d\n", ret);
|
||||
goto add_fail;
|
||||
}
|
||||
|
||||
return usbhsg_try_start(priv, USBHSG_STATUS_REGISTERD);
|
||||
|
||||
add_fail:
|
||||
gpriv->driver = NULL;
|
||||
gpriv->gadget.dev.driver = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int usbhsg_gadget_stop(struct usb_gadget *gadget,
|
||||
struct usb_gadget_driver *driver)
|
||||
{
|
||||
struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget);
|
||||
struct usbhs_priv *priv;
|
||||
struct device *dev;
|
||||
struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv);
|
||||
|
||||
if (!driver ||
|
||||
!driver->unbind)
|
||||
return -EINVAL;
|
||||
|
||||
dev = usbhsg_gpriv_to_dev(gpriv);
|
||||
priv = usbhsg_gpriv_to_priv(gpriv);
|
||||
|
||||
usbhsg_try_stop(priv, USBHSG_STATUS_REGISTERD);
|
||||
device_del(&gpriv->gadget.dev);
|
||||
gpriv->gadget.dev.driver = NULL;
|
||||
gpriv->driver = NULL;
|
||||
|
||||
return 0;
|
||||
|
@ -827,6 +806,13 @@ static int usbhsg_start(struct usbhs_priv *priv)
|
|||
|
||||
static int usbhsg_stop(struct usbhs_priv *priv)
|
||||
{
|
||||
struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv);
|
||||
|
||||
/* cable disconnect */
|
||||
if (gpriv->driver &&
|
||||
gpriv->driver->disconnect)
|
||||
gpriv->driver->disconnect(&gpriv->gadget);
|
||||
|
||||
return usbhsg_try_stop(priv, USBHSG_STATUS_STARTED);
|
||||
}
|
||||
|
||||
|
@ -876,12 +862,14 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
|
|||
/*
|
||||
* init gadget
|
||||
*/
|
||||
device_initialize(&gpriv->gadget.dev);
|
||||
dev_set_name(&gpriv->gadget.dev, "gadget");
|
||||
gpriv->gadget.dev.parent = dev;
|
||||
gpriv->gadget.name = "renesas_usbhs_udc";
|
||||
gpriv->gadget.ops = &usbhsg_gadget_ops;
|
||||
gpriv->gadget.is_dualspeed = 1;
|
||||
ret = device_register(&gpriv->gadget.dev);
|
||||
if (ret < 0)
|
||||
goto err_add_udc;
|
||||
|
||||
INIT_LIST_HEAD(&gpriv->gadget.ep_list);
|
||||
|
||||
|
@ -912,12 +900,15 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv)
|
|||
|
||||
ret = usb_add_gadget_udc(dev, &gpriv->gadget);
|
||||
if (ret)
|
||||
goto err_add_udc;
|
||||
goto err_register;
|
||||
|
||||
|
||||
dev_info(dev, "gadget probed\n");
|
||||
|
||||
return 0;
|
||||
|
||||
err_register:
|
||||
device_unregister(&gpriv->gadget.dev);
|
||||
err_add_udc:
|
||||
kfree(gpriv->uep);
|
||||
|
||||
|
@ -933,6 +924,8 @@ void usbhs_mod_gadget_remove(struct usbhs_priv *priv)
|
|||
|
||||
usb_del_gadget_udc(&gpriv->gadget);
|
||||
|
||||
device_unregister(&gpriv->gadget.dev);
|
||||
|
||||
usbhsg_controller_unregister(gpriv);
|
||||
|
||||
kfree(gpriv->uep);
|
||||
|
|
|
@ -736,6 +736,7 @@ static struct usb_device_id id_table_combined [] = {
|
|||
{ USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) },
|
||||
{ USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) },
|
||||
{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID),
|
||||
.driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
|
||||
{ USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID),
|
||||
|
|
|
@ -112,6 +112,7 @@
|
|||
|
||||
/* Propox devices */
|
||||
#define FTDI_PROPOX_JTAGCABLEII_PID 0xD738
|
||||
#define FTDI_PROPOX_ISPCABLEIII_PID 0xD739
|
||||
|
||||
/* Lenz LI-USB Computer Interface. */
|
||||
#define FTDI_LENZ_LIUSB_PID 0xD780
|
||||
|
|
|
@ -661,6 +661,9 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x31) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x32) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x02) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x03) },
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x08) },
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) },
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) },
|
||||
{ USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) },
|
||||
|
@ -747,6 +750,7 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) },
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */
|
||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */
|
||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) },
|
||||
{ USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue