Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
0a379e21c5
138 changed files with 785 additions and 439 deletions
|
@ -159,6 +159,8 @@ clock which they consume.
|
|||
mixer 343
|
||||
hdmi 344
|
||||
g2d 345
|
||||
mdma0 346
|
||||
smmu_mdma0 347
|
||||
|
||||
|
||||
[Clock Muxes]
|
||||
|
|
|
@ -1368,6 +1368,9 @@ T: git git://git.xilinx.com/linux-xlnx.git
|
|||
S: Supported
|
||||
F: arch/arm/mach-zynq/
|
||||
F: drivers/cpuidle/cpuidle-zynq.c
|
||||
N: zynq
|
||||
N: xilinx
|
||||
F: drivers/clocksource/cadence_ttc_timer.c
|
||||
|
||||
ARM SMMU DRIVER
|
||||
M: Will Deacon <will.deacon@arm.com>
|
||||
|
@ -2815,8 +2818,10 @@ F: include/uapi/drm/
|
|||
|
||||
INTEL DRM DRIVERS (excluding Poulsbo, Moorestown and derivative chipsets)
|
||||
M: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
M: Jani Nikula <jani.nikula@linux.intel.com>
|
||||
L: intel-gfx@lists.freedesktop.org
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
Q: http://patchwork.freedesktop.org/project/intel-gfx/
|
||||
T: git git://people.freedesktop.org/~danvet/drm-intel
|
||||
S: Supported
|
||||
F: drivers/gpu/drm/i915/
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 13
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = One Giant Leap for Frogkind
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -559,7 +559,7 @@
|
|||
compatible = "arm,pl330", "arm,primecell";
|
||||
reg = <0x10800000 0x1000>;
|
||||
interrupts = <0 33 0>;
|
||||
clocks = <&clock 271>;
|
||||
clocks = <&clock 346>;
|
||||
clock-names = "apb_pclk";
|
||||
#dma-cells = <1>;
|
||||
#dma-channels = <8>;
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
# define VFP_ABI_FRAME 0
|
||||
# define BSAES_ASM_EXTENDED_KEY
|
||||
# define XTS_CHAIN_TWEAK
|
||||
# define __ARM_ARCH__ __LINUX_ARM_ARCH__
|
||||
# define __ARM_ARCH__ 7
|
||||
#endif
|
||||
|
||||
#ifdef __thumb__
|
||||
|
|
|
@ -701,7 +701,7 @@ $code.=<<___;
|
|||
# define VFP_ABI_FRAME 0
|
||||
# define BSAES_ASM_EXTENDED_KEY
|
||||
# define XTS_CHAIN_TWEAK
|
||||
# define __ARM_ARCH__ __LINUX_ARM_ARCH__
|
||||
# define __ARM_ARCH__ 7
|
||||
#endif
|
||||
|
||||
#ifdef __thumb__
|
||||
|
|
|
@ -329,7 +329,7 @@ extern void _memset_io(volatile void __iomem *, int, size_t);
|
|||
*/
|
||||
#define ioremap(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE)
|
||||
#define ioremap_nocache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE)
|
||||
#define ioremap_cached(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_CACHED)
|
||||
#define ioremap_cache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_CACHED)
|
||||
#define ioremap_wc(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_WC)
|
||||
#define iounmap __arm_iounmap
|
||||
|
||||
|
|
|
@ -347,7 +347,8 @@ static inline __deprecated void *bus_to_virt(unsigned long x)
|
|||
#define ARCH_PFN_OFFSET PHYS_PFN_OFFSET
|
||||
|
||||
#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
|
||||
#define virt_addr_valid(kaddr) ((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory)
|
||||
#define virt_addr_valid(kaddr) (((unsigned long)(kaddr) >= PAGE_OFFSET && (unsigned long)(kaddr) < (unsigned long)high_memory) \
|
||||
&& pfn_valid(__pa(kaddr) >> PAGE_SHIFT) )
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -117,6 +117,6 @@ static inline bool set_phys_to_machine(unsigned long pfn, unsigned long mfn)
|
|||
return __set_phys_to_machine(pfn, mfn);
|
||||
}
|
||||
|
||||
#define xen_remap(cookie, size) ioremap_cached((cookie), (size));
|
||||
#define xen_remap(cookie, size) ioremap_cache((cookie), (size));
|
||||
|
||||
#endif /* _ASM_ARM_XEN_PAGE_H */
|
||||
|
|
|
@ -36,7 +36,13 @@
|
|||
#include <asm/system_misc.h>
|
||||
#include <asm/opcodes.h>
|
||||
|
||||
static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" };
|
||||
static const char *handler[]= {
|
||||
"prefetch abort",
|
||||
"data abort",
|
||||
"address exception",
|
||||
"interrupt",
|
||||
"undefined instruction",
|
||||
};
|
||||
|
||||
void *vectors_page;
|
||||
|
||||
|
|
|
@ -96,11 +96,12 @@ static struct irqaction footbridge_timer_irq = {
|
|||
void __init footbridge_timer_init(void)
|
||||
{
|
||||
struct clock_event_device *ce = &ckevt_dc21285;
|
||||
unsigned rate = DIV_ROUND_CLOSEST(mem_fclk_21285, 16);
|
||||
|
||||
clocksource_register_hz(&cksrc_dc21285, (mem_fclk_21285 + 8) / 16);
|
||||
clocksource_register_hz(&cksrc_dc21285, rate);
|
||||
|
||||
setup_irq(ce->irq, &footbridge_timer_irq);
|
||||
|
||||
ce->cpumask = cpumask_of(smp_processor_id());
|
||||
clockevents_config_and_register(ce, mem_fclk_21285, 0x4, 0xffffff);
|
||||
clockevents_config_and_register(ce, rate, 0x4, 0xffffff);
|
||||
}
|
||||
|
|
|
@ -483,7 +483,7 @@ static struct platform_device lcdc0_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &lcdc0_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -580,7 +580,7 @@ static struct platform_device hdmi_lcdc_device = {
|
|||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &hdmi_lcdc_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -334,7 +334,7 @@ static struct platform_device lcdc_device = {
|
|||
.resource = lcdc_resources,
|
||||
.dev = {
|
||||
.platform_data = &lcdc_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -409,7 +409,7 @@ static struct platform_device lcdc_device = {
|
|||
.resource = lcdc_resources,
|
||||
.dev = {
|
||||
.platform_data = &lcdc_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -499,7 +499,7 @@ static struct platform_device hdmi_lcdc_device = {
|
|||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &hdmi_lcdc_info,
|
||||
.coherent_dma_mask = ~0,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -175,16 +175,16 @@ void __flush_dcache_page(struct address_space *mapping, struct page *page)
|
|||
unsigned long i;
|
||||
if (cache_is_vipt_nonaliasing()) {
|
||||
for (i = 0; i < (1 << compound_order(page)); i++) {
|
||||
void *addr = kmap_atomic(page);
|
||||
void *addr = kmap_atomic(page + i);
|
||||
__cpuc_flush_dcache_area(addr, PAGE_SIZE);
|
||||
kunmap_atomic(addr);
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < (1 << compound_order(page)); i++) {
|
||||
void *addr = kmap_high_get(page);
|
||||
void *addr = kmap_high_get(page + i);
|
||||
if (addr) {
|
||||
__cpuc_flush_dcache_area(addr, PAGE_SIZE);
|
||||
kunmap_high(page);
|
||||
kunmap_high(page + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -125,42 +125,38 @@ flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vma
|
|||
void mark_rodata_ro(void);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PA8X00
|
||||
/* Only pa8800, pa8900 needs this */
|
||||
|
||||
#include <asm/kmap_types.h>
|
||||
|
||||
#define ARCH_HAS_KMAP
|
||||
|
||||
void kunmap_parisc(void *addr);
|
||||
|
||||
static inline void *kmap(struct page *page)
|
||||
{
|
||||
might_sleep();
|
||||
flush_dcache_page(page);
|
||||
return page_address(page);
|
||||
}
|
||||
|
||||
static inline void kunmap(struct page *page)
|
||||
{
|
||||
kunmap_parisc(page_address(page));
|
||||
flush_kernel_dcache_page_addr(page_address(page));
|
||||
}
|
||||
|
||||
static inline void *kmap_atomic(struct page *page)
|
||||
{
|
||||
pagefault_disable();
|
||||
flush_dcache_page(page);
|
||||
return page_address(page);
|
||||
}
|
||||
|
||||
static inline void __kunmap_atomic(void *addr)
|
||||
{
|
||||
kunmap_parisc(addr);
|
||||
flush_kernel_dcache_page_addr(addr);
|
||||
pagefault_enable();
|
||||
}
|
||||
|
||||
#define kmap_atomic_prot(page, prot) kmap_atomic(page)
|
||||
#define kmap_atomic_pfn(pfn) kmap_atomic(pfn_to_page(pfn))
|
||||
#define kmap_atomic_to_page(ptr) virt_to_page(ptr)
|
||||
#endif
|
||||
|
||||
#endif /* _PARISC_CACHEFLUSH_H */
|
||||
|
||||
|
|
|
@ -28,9 +28,8 @@ struct page;
|
|||
|
||||
void clear_page_asm(void *page);
|
||||
void copy_page_asm(void *to, void *from);
|
||||
void clear_user_page(void *vto, unsigned long vaddr, struct page *pg);
|
||||
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||
struct page *pg);
|
||||
#define clear_user_page(vto, vaddr, page) clear_page_asm(vto)
|
||||
#define copy_user_page(vto, vfrom, vaddr, page) copy_page_asm(vto, vfrom)
|
||||
|
||||
/* #define CONFIG_PARISC_TMPALIAS */
|
||||
|
||||
|
|
|
@ -388,41 +388,6 @@ void flush_kernel_dcache_page_addr(void *addr)
|
|||
}
|
||||
EXPORT_SYMBOL(flush_kernel_dcache_page_addr);
|
||||
|
||||
void clear_user_page(void *vto, unsigned long vaddr, struct page *page)
|
||||
{
|
||||
clear_page_asm(vto);
|
||||
if (!parisc_requires_coherency())
|
||||
flush_kernel_dcache_page_asm(vto);
|
||||
}
|
||||
EXPORT_SYMBOL(clear_user_page);
|
||||
|
||||
void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
|
||||
struct page *pg)
|
||||
{
|
||||
/* Copy using kernel mapping. No coherency is needed
|
||||
(all in kmap/kunmap) on machines that don't support
|
||||
non-equivalent aliasing. However, the `from' page
|
||||
needs to be flushed before it can be accessed through
|
||||
the kernel mapping. */
|
||||
preempt_disable();
|
||||
flush_dcache_page_asm(__pa(vfrom), vaddr);
|
||||
preempt_enable();
|
||||
copy_page_asm(vto, vfrom);
|
||||
if (!parisc_requires_coherency())
|
||||
flush_kernel_dcache_page_asm(vto);
|
||||
}
|
||||
EXPORT_SYMBOL(copy_user_page);
|
||||
|
||||
#ifdef CONFIG_PA8X00
|
||||
|
||||
void kunmap_parisc(void *addr)
|
||||
{
|
||||
if (parisc_requires_coherency())
|
||||
flush_kernel_dcache_page_addr(addr);
|
||||
}
|
||||
EXPORT_SYMBOL(kunmap_parisc);
|
||||
#endif
|
||||
|
||||
void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
|
|
@ -135,7 +135,6 @@ config S390
|
|||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_UID16 if 32BIT
|
||||
select HAVE_VIRT_CPU_ACCOUNTING
|
||||
select INIT_ALL_POSSIBLE
|
||||
select KTIME_SCALAR if 32BIT
|
||||
select MODULES_USE_ELF_RELA
|
||||
select OLD_SIGACTION
|
||||
|
|
|
@ -31,6 +31,7 @@ extern void smp_yield(void);
|
|||
extern void smp_stop_cpu(void);
|
||||
extern void smp_cpu_set_polarization(int cpu, int val);
|
||||
extern int smp_cpu_get_polarization(int cpu);
|
||||
extern void smp_fill_possible_mask(void);
|
||||
|
||||
#else /* CONFIG_SMP */
|
||||
|
||||
|
@ -50,6 +51,7 @@ static inline int smp_vcpu_scheduled(int cpu) { return 1; }
|
|||
static inline void smp_yield_cpu(int cpu) { }
|
||||
static inline void smp_yield(void) { }
|
||||
static inline void smp_stop_cpu(void) { }
|
||||
static inline void smp_fill_possible_mask(void) { }
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
|
|
|
@ -1023,6 +1023,7 @@ void __init setup_arch(char **cmdline_p)
|
|||
setup_vmcoreinfo();
|
||||
setup_lowcore();
|
||||
|
||||
smp_fill_possible_mask();
|
||||
cpu_init();
|
||||
s390_init_cpu_topology();
|
||||
|
||||
|
|
|
@ -721,18 +721,14 @@ int __cpu_up(unsigned int cpu, struct task_struct *tidle)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __init setup_possible_cpus(char *s)
|
||||
{
|
||||
int max, cpu;
|
||||
static unsigned int setup_possible_cpus __initdata;
|
||||
|
||||
if (kstrtoint(s, 0, &max) < 0)
|
||||
return 0;
|
||||
init_cpu_possible(cpumask_of(0));
|
||||
for (cpu = 1; cpu < max && cpu < nr_cpu_ids; cpu++)
|
||||
set_cpu_possible(cpu, true);
|
||||
static int __init _setup_possible_cpus(char *s)
|
||||
{
|
||||
get_option(&s, &setup_possible_cpus);
|
||||
return 0;
|
||||
}
|
||||
early_param("possible_cpus", setup_possible_cpus);
|
||||
early_param("possible_cpus", _setup_possible_cpus);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
|
||||
|
@ -775,6 +771,17 @@ void __noreturn cpu_die(void)
|
|||
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
void __init smp_fill_possible_mask(void)
|
||||
{
|
||||
unsigned int possible, cpu;
|
||||
|
||||
possible = setup_possible_cpus;
|
||||
if (!possible)
|
||||
possible = MACHINE_IS_VM ? 64 : nr_cpu_ids;
|
||||
for (cpu = 0; cpu < possible && cpu < nr_cpu_ids; cpu++)
|
||||
set_cpu_possible(cpu, true);
|
||||
}
|
||||
|
||||
void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
/* request the 0x1201 emergency signal external interrupt */
|
||||
|
|
|
@ -75,6 +75,7 @@ void zpci_event_availability(void *data)
|
|||
if (!zdev || zdev->state == ZPCI_FN_STATE_CONFIGURED)
|
||||
break;
|
||||
zdev->state = ZPCI_FN_STATE_CONFIGURED;
|
||||
zdev->fh = ccdf->fh;
|
||||
ret = zpci_enable_device(zdev);
|
||||
if (ret)
|
||||
break;
|
||||
|
@ -101,6 +102,7 @@ void zpci_event_availability(void *data)
|
|||
if (pdev)
|
||||
pci_stop_and_remove_bus_device(pdev);
|
||||
|
||||
zdev->fh = ccdf->fh;
|
||||
zpci_disable_device(zdev);
|
||||
zdev->state = ZPCI_FN_STATE_STANDBY;
|
||||
break;
|
||||
|
|
|
@ -20,6 +20,11 @@ EXPORT_SYMBOL(csum_partial_copy_generic);
|
|||
EXPORT_SYMBOL(copy_page);
|
||||
EXPORT_SYMBOL(__clear_user);
|
||||
EXPORT_SYMBOL(empty_zero_page);
|
||||
#ifdef CONFIG_FLATMEM
|
||||
/* need in pfn_valid macro */
|
||||
EXPORT_SYMBOL(min_low_pfn);
|
||||
EXPORT_SYMBOL(max_low_pfn);
|
||||
#endif
|
||||
|
||||
#define DECLARE_EXPORT(name) \
|
||||
extern void name(void);EXPORT_SYMBOL(name)
|
||||
|
|
|
@ -262,8 +262,8 @@ extern unsigned long __must_check __clear_user(void __user *, unsigned long);
|
|||
extern __must_check long strlen_user(const char __user *str);
|
||||
extern __must_check long strnlen_user(const char __user *str, long n);
|
||||
|
||||
#define __copy_to_user_inatomic ___copy_to_user
|
||||
#define __copy_from_user_inatomic ___copy_from_user
|
||||
#define __copy_to_user_inatomic __copy_to_user
|
||||
#define __copy_from_user_inatomic __copy_from_user
|
||||
|
||||
struct pt_regs;
|
||||
extern unsigned long compute_effective_address(struct pt_regs *,
|
||||
|
|
|
@ -854,7 +854,7 @@ int dma_supported(struct device *dev, u64 device_mask)
|
|||
return 1;
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
if (dev->bus == &pci_bus_type)
|
||||
if (dev_is_pci(dev))
|
||||
return pci64_dma_supported(to_pci_dev(dev), device_mask);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -666,10 +666,9 @@ EXPORT_SYMBOL(dma_ops);
|
|||
*/
|
||||
int dma_supported(struct device *dev, u64 mask)
|
||||
{
|
||||
#ifdef CONFIG_PCI
|
||||
if (dev->bus == &pci_bus_type)
|
||||
if (dev_is_pci(dev))
|
||||
return 1;
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dma_supported);
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <linux/kgdb.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/context_tracking.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/kdebug.h>
|
||||
|
|
|
@ -123,11 +123,12 @@ void smp_callin(void)
|
|||
rmb();
|
||||
|
||||
set_cpu_online(cpuid, true);
|
||||
local_irq_enable();
|
||||
|
||||
/* idle thread is expected to have preempt disabled */
|
||||
preempt_disable();
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
cpu_startup_entry(CPUHP_ONLINE);
|
||||
}
|
||||
|
||||
|
|
|
@ -1350,6 +1350,10 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
|
|||
return;
|
||||
}
|
||||
|
||||
if (!kvm_vcpu_is_bsp(apic->vcpu))
|
||||
value &= ~MSR_IA32_APICBASE_BSP;
|
||||
vcpu->arch.apic_base = value;
|
||||
|
||||
/* update jump label if enable bit changes */
|
||||
if ((vcpu->arch.apic_base ^ value) & MSR_IA32_APICBASE_ENABLE) {
|
||||
if (value & MSR_IA32_APICBASE_ENABLE)
|
||||
|
@ -1359,10 +1363,6 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
|
|||
recalculate_apic_map(vcpu->kvm);
|
||||
}
|
||||
|
||||
if (!kvm_vcpu_is_bsp(apic->vcpu))
|
||||
value &= ~MSR_IA32_APICBASE_BSP;
|
||||
|
||||
vcpu->arch.apic_base = value;
|
||||
if ((old_value ^ value) & X2APIC_ENABLE) {
|
||||
if (value & X2APIC_ENABLE) {
|
||||
u32 id = kvm_apic_id(apic);
|
||||
|
|
|
@ -8283,8 +8283,7 @@ static void load_vmcs12_host_state(struct kvm_vcpu *vcpu,
|
|||
vcpu->arch.cr4_guest_owned_bits = ~vmcs_readl(CR4_GUEST_HOST_MASK);
|
||||
kvm_set_cr4(vcpu, vmcs12->host_cr4);
|
||||
|
||||
if (nested_cpu_has_ept(vmcs12))
|
||||
nested_ept_uninit_mmu_context(vcpu);
|
||||
nested_ept_uninit_mmu_context(vcpu);
|
||||
|
||||
kvm_set_cr3(vcpu, vmcs12->host_cr3);
|
||||
kvm_mmu_reset_context(vcpu);
|
||||
|
|
|
@ -207,7 +207,7 @@ static int acpi_ac_probe(struct platform_device *pdev)
|
|||
goto end;
|
||||
|
||||
result = acpi_install_notify_handler(ACPI_HANDLE(&pdev->dev),
|
||||
ACPI_DEVICE_NOTIFY, acpi_ac_notify_handler, ac);
|
||||
ACPI_ALL_NOTIFY, acpi_ac_notify_handler, ac);
|
||||
if (result) {
|
||||
power_supply_unregister(&ac->charger);
|
||||
goto end;
|
||||
|
@ -255,7 +255,7 @@ static int acpi_ac_remove(struct platform_device *pdev)
|
|||
return -EINVAL;
|
||||
|
||||
acpi_remove_notify_handler(ACPI_HANDLE(&pdev->dev),
|
||||
ACPI_DEVICE_NOTIFY, acpi_ac_notify_handler);
|
||||
ACPI_ALL_NOTIFY, acpi_ac_notify_handler);
|
||||
|
||||
ac = platform_get_drvdata(pdev);
|
||||
if (ac->charger.dev)
|
||||
|
|
|
@ -62,6 +62,7 @@ MODULE_AUTHOR("Alexey Starikovskiy <astarikovskiy@suse.de>");
|
|||
MODULE_DESCRIPTION("ACPI Battery Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int battery_bix_broken_package;
|
||||
static unsigned int cache_time = 1000;
|
||||
module_param(cache_time, uint, 0644);
|
||||
MODULE_PARM_DESC(cache_time, "cache time in milliseconds");
|
||||
|
@ -416,7 +417,12 @@ static int acpi_battery_get_info(struct acpi_battery *battery)
|
|||
ACPI_EXCEPTION((AE_INFO, status, "Evaluating %s", name));
|
||||
return -ENODEV;
|
||||
}
|
||||
if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags))
|
||||
|
||||
if (battery_bix_broken_package)
|
||||
result = extract_package(battery, buffer.pointer,
|
||||
extended_info_offsets + 1,
|
||||
ARRAY_SIZE(extended_info_offsets) - 1);
|
||||
else if (test_bit(ACPI_BATTERY_XINFO_PRESENT, &battery->flags))
|
||||
result = extract_package(battery, buffer.pointer,
|
||||
extended_info_offsets,
|
||||
ARRAY_SIZE(extended_info_offsets));
|
||||
|
@ -754,6 +760,17 @@ static int battery_notify(struct notifier_block *nb,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct dmi_system_id bat_dmi_table[] = {
|
||||
{
|
||||
.ident = "NEC LZ750/LS",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "NEC"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PC-LZ750LS"),
|
||||
},
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
static int acpi_battery_add(struct acpi_device *device)
|
||||
{
|
||||
int result = 0;
|
||||
|
@ -846,6 +863,9 @@ static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie)
|
|||
{
|
||||
if (acpi_disabled)
|
||||
return;
|
||||
|
||||
if (dmi_check_system(bat_dmi_table))
|
||||
battery_bix_broken_package = 1;
|
||||
acpi_bus_register_driver(&acpi_battery_driver);
|
||||
}
|
||||
|
||||
|
|
|
@ -156,6 +156,16 @@ int acpi_bus_get_private_data(acpi_handle handle, void **data)
|
|||
}
|
||||
EXPORT_SYMBOL(acpi_bus_get_private_data);
|
||||
|
||||
void acpi_bus_no_hotplug(acpi_handle handle)
|
||||
{
|
||||
struct acpi_device *adev = NULL;
|
||||
|
||||
acpi_bus_get_device(handle, &adev);
|
||||
if (adev)
|
||||
adev->flags.no_hotplug = true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_bus_no_hotplug);
|
||||
|
||||
static void acpi_print_osc_error(acpi_handle handle,
|
||||
struct acpi_osc_context *context, char *error)
|
||||
{
|
||||
|
|
|
@ -427,6 +427,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||
.driver_data = board_ahci_yes_fbs }, /* 88se9128 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9125),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9125 */
|
||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_MARVELL_EXT, 0x9178,
|
||||
PCI_VENDOR_ID_MARVELL_EXT, 0x9170),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9170 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172),
|
||||
|
|
|
@ -83,6 +83,10 @@ static struct pci_driver sis_pci_driver = {
|
|||
.id_table = sis_pci_tbl,
|
||||
.probe = sis_init_one,
|
||||
.remove = ata_pci_remove_one,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = ata_pci_device_suspend,
|
||||
.resume = ata_pci_device_resume,
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct scsi_host_template sis_sht = {
|
||||
|
|
|
@ -27,15 +27,18 @@ static char *tpm_device_name = "TPM";
|
|||
static acpi_status ppi_callback(acpi_handle handle, u32 level, void *context,
|
||||
void **return_value)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
status = acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
|
||||
if (strstr(buffer.pointer, context) != NULL) {
|
||||
*return_value = handle;
|
||||
|
||||
if (ACPI_SUCCESS(acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer))) {
|
||||
if (strstr(buffer.pointer, context) != NULL) {
|
||||
*return_value = handle;
|
||||
status = AE_CTRL_TERMINATE;
|
||||
}
|
||||
kfree(buffer.pointer);
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
return AE_OK;
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
static inline void ppi_assign_params(union acpi_object params[4],
|
||||
|
|
|
@ -87,7 +87,7 @@ static unsigned int _get_table_val(const struct clk_div_table *table,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int _get_val(struct clk_divider *divider, u8 div)
|
||||
static unsigned int _get_val(struct clk_divider *divider, unsigned int div)
|
||||
{
|
||||
if (divider->flags & CLK_DIVIDER_ONE_BASED)
|
||||
return div;
|
||||
|
|
|
@ -26,17 +26,17 @@ static struct clk_onecell_data clk_data;
|
|||
#define ASS_CLK_DIV 0x4
|
||||
#define ASS_CLK_GATE 0x8
|
||||
|
||||
/* list of all parent clock list */
|
||||
static const char *mout_audss_p[] = { "fin_pll", "fout_epll" };
|
||||
static const char *mout_i2s_p[] = { "mout_audss", "cdclk0", "sclk_audio0" };
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static unsigned long reg_save[][2] = {
|
||||
{ASS_CLK_SRC, 0},
|
||||
{ASS_CLK_DIV, 0},
|
||||
{ASS_CLK_GATE, 0},
|
||||
};
|
||||
|
||||
/* list of all parent clock list */
|
||||
static const char *mout_audss_p[] = { "fin_pll", "fout_epll" };
|
||||
static const char *mout_i2s_p[] = { "mout_audss", "cdclk0", "sclk_audio0" };
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int exynos_audss_clk_suspend(void)
|
||||
{
|
||||
int i;
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
#define SRC_TOP1 0xc214
|
||||
#define SRC_CAM 0xc220
|
||||
#define SRC_TV 0xc224
|
||||
#define SRC_MFC 0xcc28
|
||||
#define SRC_MFC 0xc228
|
||||
#define SRC_G3D 0xc22c
|
||||
#define E4210_SRC_IMAGE 0xc230
|
||||
#define SRC_LCD0 0xc234
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#define MPLL_LOCK 0x4000
|
||||
#define MPLL_CON0 0x4100
|
||||
#define SRC_CORE1 0x4204
|
||||
#define GATE_IP_ACP 0x8800
|
||||
#define CPLL_LOCK 0x10020
|
||||
#define EPLL_LOCK 0x10030
|
||||
#define VPLL_LOCK 0x10040
|
||||
|
@ -75,7 +76,6 @@
|
|||
#define SRC_CDREX 0x20200
|
||||
#define PLL_DIV2_SEL 0x20a24
|
||||
#define GATE_IP_DISP1 0x10928
|
||||
#define GATE_IP_ACP 0x10000
|
||||
|
||||
/* list of PLLs to be registered */
|
||||
enum exynos5250_plls {
|
||||
|
@ -120,7 +120,8 @@ enum exynos5250_clks {
|
|||
spi2, i2s1, i2s2, pcm1, pcm2, pwm, spdif, ac97, hsi2c0, hsi2c1, hsi2c2,
|
||||
hsi2c3, chipid, sysreg, pmu, cmu_top, cmu_core, cmu_mem, tzpc0, tzpc1,
|
||||
tzpc2, tzpc3, tzpc4, tzpc5, tzpc6, tzpc7, tzpc8, tzpc9, hdmi_cec, mct,
|
||||
wdt, rtc, tmu, fimd1, mie1, dsim0, dp, mixer, hdmi, g2d,
|
||||
wdt, rtc, tmu, fimd1, mie1, dsim0, dp, mixer, hdmi, g2d, mdma0,
|
||||
smmu_mdma0,
|
||||
|
||||
/* mux clocks */
|
||||
mout_hdmi = 1024,
|
||||
|
@ -354,8 +355,8 @@ static struct samsung_gate_clock exynos5250_gate_clks[] __initdata = {
|
|||
GATE(smmu_gscl2, "smmu_gscl2", "aclk266", GATE_IP_GSCL, 9, 0, 0),
|
||||
GATE(smmu_gscl3, "smmu_gscl3", "aclk266", GATE_IP_GSCL, 10, 0, 0),
|
||||
GATE(mfc, "mfc", "aclk333", GATE_IP_MFC, 0, 0, 0),
|
||||
GATE(smmu_mfcl, "smmu_mfcl", "aclk333", GATE_IP_MFC, 1, 0, 0),
|
||||
GATE(smmu_mfcr, "smmu_mfcr", "aclk333", GATE_IP_MFC, 2, 0, 0),
|
||||
GATE(smmu_mfcl, "smmu_mfcl", "aclk333", GATE_IP_MFC, 2, 0, 0),
|
||||
GATE(smmu_mfcr, "smmu_mfcr", "aclk333", GATE_IP_MFC, 1, 0, 0),
|
||||
GATE(rotator, "rotator", "aclk266", GATE_IP_GEN, 1, 0, 0),
|
||||
GATE(jpeg, "jpeg", "aclk166", GATE_IP_GEN, 2, 0, 0),
|
||||
GATE(mdma1, "mdma1", "aclk266", GATE_IP_GEN, 4, 0, 0),
|
||||
|
@ -406,7 +407,8 @@ static struct samsung_gate_clock exynos5250_gate_clks[] __initdata = {
|
|||
GATE(hsi2c2, "hsi2c2", "aclk66", GATE_IP_PERIC, 30, 0, 0),
|
||||
GATE(hsi2c3, "hsi2c3", "aclk66", GATE_IP_PERIC, 31, 0, 0),
|
||||
GATE(chipid, "chipid", "aclk66", GATE_IP_PERIS, 0, 0, 0),
|
||||
GATE(sysreg, "sysreg", "aclk66", GATE_IP_PERIS, 1, 0, 0),
|
||||
GATE(sysreg, "sysreg", "aclk66",
|
||||
GATE_IP_PERIS, 1, CLK_IGNORE_UNUSED, 0),
|
||||
GATE(pmu, "pmu", "aclk66", GATE_IP_PERIS, 2, CLK_IGNORE_UNUSED, 0),
|
||||
GATE(tzpc0, "tzpc0", "aclk66", GATE_IP_PERIS, 6, 0, 0),
|
||||
GATE(tzpc1, "tzpc1", "aclk66", GATE_IP_PERIS, 7, 0, 0),
|
||||
|
@ -492,6 +494,8 @@ static struct samsung_gate_clock exynos5250_gate_clks[] __initdata = {
|
|||
GATE(mixer, "mixer", "mout_aclk200_disp1", GATE_IP_DISP1, 5, 0, 0),
|
||||
GATE(hdmi, "hdmi", "mout_aclk200_disp1", GATE_IP_DISP1, 6, 0, 0),
|
||||
GATE(g2d, "g2d", "aclk200", GATE_IP_ACP, 3, 0, 0),
|
||||
GATE(mdma0, "mdma0", "aclk266", GATE_IP_ACP, 1, 0, 0),
|
||||
GATE(smmu_mdma0, "smmu_mdma0", "aclk266", GATE_IP_ACP, 5, 0, 0),
|
||||
};
|
||||
|
||||
static struct samsung_pll_rate_table vpll_24mhz_tbl[] __initdata = {
|
||||
|
|
|
@ -839,9 +839,6 @@ static void cpufreq_init_policy(struct cpufreq_policy *policy)
|
|||
|
||||
/* set default policy */
|
||||
ret = cpufreq_set_policy(policy, &new_policy);
|
||||
policy->user_policy.policy = policy->policy;
|
||||
policy->user_policy.governor = policy->governor;
|
||||
|
||||
if (ret) {
|
||||
pr_debug("setting policy failed\n");
|
||||
if (cpufreq_driver->exit)
|
||||
|
@ -1016,15 +1013,17 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
|
|||
read_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
#endif
|
||||
|
||||
if (frozen)
|
||||
/* Restore the saved policy when doing light-weight init */
|
||||
policy = cpufreq_policy_restore(cpu);
|
||||
else
|
||||
/*
|
||||
* Restore the saved policy when doing light-weight init and fall back
|
||||
* to the full init if that fails.
|
||||
*/
|
||||
policy = frozen ? cpufreq_policy_restore(cpu) : NULL;
|
||||
if (!policy) {
|
||||
frozen = false;
|
||||
policy = cpufreq_policy_alloc();
|
||||
|
||||
if (!policy)
|
||||
goto nomem_out;
|
||||
|
||||
if (!policy)
|
||||
goto nomem_out;
|
||||
}
|
||||
|
||||
/*
|
||||
* In the resume path, since we restore a saved policy, the assignment
|
||||
|
@ -1069,8 +1068,10 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
|
|||
*/
|
||||
cpumask_and(policy->cpus, policy->cpus, cpu_online_mask);
|
||||
|
||||
policy->user_policy.min = policy->min;
|
||||
policy->user_policy.max = policy->max;
|
||||
if (!frozen) {
|
||||
policy->user_policy.min = policy->min;
|
||||
policy->user_policy.max = policy->max;
|
||||
}
|
||||
|
||||
blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
|
||||
CPUFREQ_START, policy);
|
||||
|
@ -1101,6 +1102,11 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
|
|||
|
||||
cpufreq_init_policy(policy);
|
||||
|
||||
if (!frozen) {
|
||||
policy->user_policy.policy = policy->policy;
|
||||
policy->user_policy.governor = policy->governor;
|
||||
}
|
||||
|
||||
kobject_uevent(&policy->kobj, KOBJ_ADD);
|
||||
up_read(&cpufreq_rwsem);
|
||||
|
||||
|
@ -1118,8 +1124,11 @@ static int __cpufreq_add_dev(struct device *dev, struct subsys_interface *sif,
|
|||
if (cpufreq_driver->exit)
|
||||
cpufreq_driver->exit(policy);
|
||||
err_set_policy_cpu:
|
||||
if (frozen)
|
||||
if (frozen) {
|
||||
/* Do not leave stale fallback data behind. */
|
||||
per_cpu(cpufreq_cpu_data_fallback, cpu) = NULL;
|
||||
cpufreq_policy_put_kobj(policy);
|
||||
}
|
||||
cpufreq_policy_free(policy);
|
||||
|
||||
nomem_out:
|
||||
|
|
|
@ -581,7 +581,8 @@ static void intel_pstate_timer_func(unsigned long __data)
|
|||
}
|
||||
|
||||
#define ICPU(model, policy) \
|
||||
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (unsigned long)&policy }
|
||||
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_APERFMPERF,\
|
||||
(unsigned long)&policy }
|
||||
|
||||
static const struct x86_cpu_id intel_pstate_cpu_ids[] = {
|
||||
ICPU(0x2a, core_params),
|
||||
|
@ -614,6 +615,11 @@ static int intel_pstate_init_cpu(unsigned int cpunum)
|
|||
cpu = all_cpu_data[cpunum];
|
||||
|
||||
intel_pstate_get_cpu_pstates(cpu);
|
||||
if (!cpu->pstate.current_pstate) {
|
||||
all_cpu_data[cpunum] = NULL;
|
||||
kfree(cpu);
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
cpu->cpu = cpunum;
|
||||
|
||||
|
|
|
@ -65,7 +65,7 @@ static struct cpuidle_driver calxeda_idle_driver = {
|
|||
.state_count = 2,
|
||||
};
|
||||
|
||||
static int __init calxeda_cpuidle_probe(struct platform_device *pdev)
|
||||
static int calxeda_cpuidle_probe(struct platform_device *pdev)
|
||||
{
|
||||
return cpuidle_register(&calxeda_idle_driver, NULL);
|
||||
}
|
||||
|
|
|
@ -1410,14 +1410,12 @@ static const struct platform_device_info ixp_dev_info __initdata = {
|
|||
static int __init ixp_module_init(void)
|
||||
{
|
||||
int num = ARRAY_SIZE(ixp4xx_algos);
|
||||
int i, err ;
|
||||
int i, err;
|
||||
|
||||
pdev = platform_device_register_full(&ixp_dev_info);
|
||||
if (IS_ERR(pdev))
|
||||
return PTR_ERR(pdev);
|
||||
|
||||
dev = &pdev->dev;
|
||||
|
||||
spin_lock_init(&desc_lock);
|
||||
spin_lock_init(&emerg_lock);
|
||||
|
||||
|
|
|
@ -817,7 +817,15 @@ int ioat_dma_self_test(struct ioatdma_device *device)
|
|||
}
|
||||
|
||||
dma_src = dma_map_single(dev, src, IOAT_TEST_SIZE, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(dev, dma_src)) {
|
||||
dev_err(dev, "mapping src buffer failed\n");
|
||||
goto free_resources;
|
||||
}
|
||||
dma_dest = dma_map_single(dev, dest, IOAT_TEST_SIZE, DMA_FROM_DEVICE);
|
||||
if (dma_mapping_error(dev, dma_dest)) {
|
||||
dev_err(dev, "mapping dest buffer failed\n");
|
||||
goto unmap_src;
|
||||
}
|
||||
flags = DMA_PREP_INTERRUPT;
|
||||
tx = device->common.device_prep_dma_memcpy(dma_chan, dma_dest, dma_src,
|
||||
IOAT_TEST_SIZE, flags);
|
||||
|
@ -855,8 +863,9 @@ int ioat_dma_self_test(struct ioatdma_device *device)
|
|||
}
|
||||
|
||||
unmap_dma:
|
||||
dma_unmap_single(dev, dma_src, IOAT_TEST_SIZE, DMA_TO_DEVICE);
|
||||
dma_unmap_single(dev, dma_dest, IOAT_TEST_SIZE, DMA_FROM_DEVICE);
|
||||
unmap_src:
|
||||
dma_unmap_single(dev, dma_src, IOAT_TEST_SIZE, DMA_TO_DEVICE);
|
||||
free_resources:
|
||||
dma->device_free_chan_resources(dma_chan);
|
||||
out:
|
||||
|
|
|
@ -906,14 +906,12 @@ static void gen8_ggtt_insert_entries(struct i915_address_space *vm,
|
|||
WARN_ON(readq(>t_entries[i-1])
|
||||
!= gen8_pte_encode(addr, level, true));
|
||||
|
||||
#if 0 /* TODO: Still needed on GEN8? */
|
||||
/* This next bit makes the above posting read even more important. We
|
||||
* want to flush the TLBs only after we're certain all the PTE updates
|
||||
* have finished.
|
||||
*/
|
||||
I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
|
||||
POSTING_READ(GFX_FLSH_CNTL_GEN6);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -10541,11 +10541,20 @@ static struct intel_quirk intel_quirks[] = {
|
|||
/* Sony Vaio Y cannot use SSC on LVDS */
|
||||
{ 0x0046, 0x104d, 0x9076, quirk_ssc_force_disable },
|
||||
|
||||
/*
|
||||
* All GM45 Acer (and its brands eMachines and Packard Bell) laptops
|
||||
* seem to use inverted backlight PWM.
|
||||
*/
|
||||
{ 0x2a42, 0x1025, PCI_ANY_ID, quirk_invert_brightness },
|
||||
/* Acer Aspire 5734Z must invert backlight brightness */
|
||||
{ 0x2a42, 0x1025, 0x0459, quirk_invert_brightness },
|
||||
|
||||
/* Acer/eMachines G725 */
|
||||
{ 0x2a42, 0x1025, 0x0210, quirk_invert_brightness },
|
||||
|
||||
/* Acer/eMachines e725 */
|
||||
{ 0x2a42, 0x1025, 0x0212, quirk_invert_brightness },
|
||||
|
||||
/* Acer/Packard Bell NCL20 */
|
||||
{ 0x2a42, 0x1025, 0x034b, quirk_invert_brightness },
|
||||
|
||||
/* Acer Aspire 4736Z */
|
||||
{ 0x2a42, 0x1025, 0x0260, quirk_invert_brightness },
|
||||
|
||||
/* Dell XPS13 HD Sandy Bridge */
|
||||
{ 0x0116, 0x1028, 0x052e, quirk_no_pcm_pwm_enable },
|
||||
|
|
|
@ -104,11 +104,8 @@ nouveau_subdev_create_(struct nouveau_object *parent,
|
|||
|
||||
if (parent) {
|
||||
struct nouveau_device *device = nv_device(parent);
|
||||
int subidx = nv_hclass(subdev) & 0xff;
|
||||
|
||||
subdev->debug = nouveau_dbgopt(device->dbgopt, subname);
|
||||
subdev->mmio = nv_subdev(device)->mmio;
|
||||
device->subdev[subidx] = *pobject;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -268,6 +268,8 @@ nouveau_devobj_ctor(struct nouveau_object *parent,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
device->subdev[i] = devobj->subdev[i];
|
||||
|
||||
/* note: can't init *any* subdevs until devinit has been run
|
||||
* due to not knowing exactly what the vbios init tables will
|
||||
* mess with. devinit also can't be run until all of its
|
||||
|
|
|
@ -161,7 +161,7 @@ nvc0_identify(struct nouveau_device *device)
|
|||
device->oclass[NVDEV_SUBDEV_THERM ] = &nva3_therm_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_DEVINIT] = &nvc0_devinit_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_MC ] = nvc0_mc_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
|
||||
device->oclass[NVDEV_SUBDEV_FB ] = nvc0_fb_oclass;
|
||||
|
|
|
@ -334,7 +334,7 @@ nvc0_graph_mthd(struct nvc0_graph_priv *priv, struct nvc0_graph_mthd *mthds)
|
|||
while ((mthd = &mthds[i++]) && (init = mthd->init)) {
|
||||
u32 addr = 0x80000000 | mthd->oclass;
|
||||
for (data = 0; init->count; init++) {
|
||||
if (data != init->data) {
|
||||
if (init == mthd->init || data != init->data) {
|
||||
nv_wr32(priv, 0x40448c, init->data);
|
||||
data = init->data;
|
||||
}
|
||||
|
|
|
@ -75,6 +75,11 @@ struct nouveau_fb {
|
|||
static inline struct nouveau_fb *
|
||||
nouveau_fb(void *obj)
|
||||
{
|
||||
/* fbram uses this before device subdev pointer is valid */
|
||||
if (nv_iclass(obj, NV_SUBDEV_CLASS) &&
|
||||
nv_subidx(obj) == NVDEV_SUBDEV_FB)
|
||||
return obj;
|
||||
|
||||
return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_FB];
|
||||
}
|
||||
|
||||
|
|
|
@ -365,13 +365,13 @@ static u16
|
|||
init_script(struct nouveau_bios *bios, int index)
|
||||
{
|
||||
struct nvbios_init init = { .bios = bios };
|
||||
u16 data;
|
||||
u16 bmp_ver = bmp_version(bios), data;
|
||||
|
||||
if (bmp_version(bios) && bmp_version(bios) < 0x0510) {
|
||||
if (index > 1)
|
||||
if (bmp_ver && bmp_ver < 0x0510) {
|
||||
if (index > 1 || bmp_ver < 0x0100)
|
||||
return 0x0000;
|
||||
|
||||
data = bios->bmp_offset + (bios->version.major < 2 ? 14 : 18);
|
||||
data = bios->bmp_offset + (bmp_ver < 0x0200 ? 14 : 18);
|
||||
return nv_ro16(bios, data + (index * 2));
|
||||
}
|
||||
|
||||
|
@ -1294,7 +1294,11 @@ init_jump(struct nvbios_init *init)
|
|||
u16 offset = nv_ro16(bios, init->offset + 1);
|
||||
|
||||
trace("JUMP\t0x%04x\n", offset);
|
||||
init->offset = offset;
|
||||
|
||||
if (init_exec(init))
|
||||
init->offset = offset;
|
||||
else
|
||||
init->offset += 3;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -447,6 +447,8 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)
|
|||
if (ret)
|
||||
goto done;
|
||||
|
||||
info->offset = ntfy->node->offset;
|
||||
|
||||
done:
|
||||
if (ret)
|
||||
nouveau_abi16_ntfy_fini(chan, ntfy);
|
||||
|
|
|
@ -51,6 +51,7 @@ static struct nouveau_dsm_priv {
|
|||
bool dsm_detected;
|
||||
bool optimus_detected;
|
||||
acpi_handle dhandle;
|
||||
acpi_handle other_handle;
|
||||
acpi_handle rom_handle;
|
||||
} nouveau_dsm_priv;
|
||||
|
||||
|
@ -260,9 +261,10 @@ static int nouveau_dsm_pci_probe(struct pci_dev *pdev)
|
|||
if (!dhandle)
|
||||
return false;
|
||||
|
||||
if (!acpi_has_method(dhandle, "_DSM"))
|
||||
if (!acpi_has_method(dhandle, "_DSM")) {
|
||||
nouveau_dsm_priv.other_handle = dhandle;
|
||||
return false;
|
||||
|
||||
}
|
||||
if (nouveau_test_dsm(dhandle, nouveau_dsm, NOUVEAU_DSM_POWER))
|
||||
retval |= NOUVEAU_DSM_HAS_MUX;
|
||||
|
||||
|
@ -338,6 +340,16 @@ static bool nouveau_dsm_detect(void)
|
|||
printk(KERN_INFO "VGA switcheroo: detected DSM switching method %s handle\n",
|
||||
acpi_method_name);
|
||||
nouveau_dsm_priv.dsm_detected = true;
|
||||
/*
|
||||
* On some systems hotplug events are generated for the device
|
||||
* being switched off when _DSM is executed. They cause ACPI
|
||||
* hotplug to trigger and attempt to remove the device from
|
||||
* the system, which causes it to break down. Prevent that from
|
||||
* happening by setting the no_hotplug flag for the involved
|
||||
* ACPI device objects.
|
||||
*/
|
||||
acpi_bus_no_hotplug(nouveau_dsm_priv.dhandle);
|
||||
acpi_bus_no_hotplug(nouveau_dsm_priv.other_handle);
|
||||
ret = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -610,7 +610,7 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
|
|||
ret = nouveau_fence_sync(fence, chan);
|
||||
nouveau_fence_unref(&fence);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto fail_free;
|
||||
|
||||
if (new_bo != old_bo) {
|
||||
ret = nouveau_bo_pin(new_bo, TTM_PL_FLAG_VRAM);
|
||||
|
|
|
@ -1143,31 +1143,53 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
|||
}
|
||||
|
||||
if (tiling_flags & RADEON_TILING_MACRO) {
|
||||
if (rdev->family >= CHIP_BONAIRE)
|
||||
tmp = rdev->config.cik.tile_config;
|
||||
else if (rdev->family >= CHIP_TAHITI)
|
||||
tmp = rdev->config.si.tile_config;
|
||||
else if (rdev->family >= CHIP_CAYMAN)
|
||||
tmp = rdev->config.cayman.tile_config;
|
||||
else
|
||||
tmp = rdev->config.evergreen.tile_config;
|
||||
evergreen_tiling_fields(tiling_flags, &bankw, &bankh, &mtaspect, &tile_split);
|
||||
|
||||
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;
|
||||
/* Set NUM_BANKS. */
|
||||
if (rdev->family >= CHIP_BONAIRE) {
|
||||
unsigned tileb, index, num_banks, tile_split_bytes;
|
||||
|
||||
/* Calculate the macrotile mode index. */
|
||||
tile_split_bytes = 64 << tile_split;
|
||||
tileb = 8 * 8 * target_fb->bits_per_pixel / 8;
|
||||
tileb = min(tile_split_bytes, tileb);
|
||||
|
||||
for (index = 0; tileb > 64; index++) {
|
||||
tileb >>= 1;
|
||||
}
|
||||
|
||||
if (index >= 16) {
|
||||
DRM_ERROR("Wrong screen bpp (%u) or tile split (%u)\n",
|
||||
target_fb->bits_per_pixel, tile_split);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
num_banks = (rdev->config.cik.macrotile_mode_array[index] >> 6) & 0x3;
|
||||
fb_format |= EVERGREEN_GRPH_NUM_BANKS(num_banks);
|
||||
} else {
|
||||
/* SI and older. */
|
||||
if (rdev->family >= CHIP_TAHITI)
|
||||
tmp = rdev->config.si.tile_config;
|
||||
else 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;
|
||||
}
|
||||
}
|
||||
|
||||
fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1);
|
||||
|
||||
evergreen_tiling_fields(tiling_flags, &bankw, &bankh, &mtaspect, &tile_split);
|
||||
fb_format |= EVERGREEN_GRPH_TILE_SPLIT(tile_split);
|
||||
fb_format |= EVERGREEN_GRPH_BANK_WIDTH(bankw);
|
||||
fb_format |= EVERGREEN_GRPH_BANK_HEIGHT(bankh);
|
||||
|
@ -1180,19 +1202,12 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
|
|||
fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1);
|
||||
|
||||
if (rdev->family >= CHIP_BONAIRE) {
|
||||
u32 num_pipe_configs = rdev->config.cik.max_tile_pipes;
|
||||
u32 num_rb = rdev->config.cik.max_backends_per_se;
|
||||
if (num_pipe_configs > 8)
|
||||
num_pipe_configs = 8;
|
||||
if (num_pipe_configs == 8)
|
||||
fb_format |= CIK_GRPH_PIPE_CONFIG(CIK_ADDR_SURF_P8_32x32_16x16);
|
||||
else if (num_pipe_configs == 4) {
|
||||
if (num_rb == 4)
|
||||
fb_format |= CIK_GRPH_PIPE_CONFIG(CIK_ADDR_SURF_P4_16x16);
|
||||
else if (num_rb < 4)
|
||||
fb_format |= CIK_GRPH_PIPE_CONFIG(CIK_ADDR_SURF_P4_8x16);
|
||||
} else if (num_pipe_configs == 2)
|
||||
fb_format |= CIK_GRPH_PIPE_CONFIG(CIK_ADDR_SURF_P2);
|
||||
/* Read the pipe config from the 2D TILED SCANOUT mode.
|
||||
* It should be the same for the other modes too, but not all
|
||||
* modes set the pipe config field. */
|
||||
u32 pipe_config = (rdev->config.cik.tile_mode_array[10] >> 6) & 0x1f;
|
||||
|
||||
fb_format |= CIK_GRPH_PIPE_CONFIG(pipe_config);
|
||||
} else if ((rdev->family == CHIP_TAHITI) ||
|
||||
(rdev->family == CHIP_PITCAIRN))
|
||||
fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P8_32x32_8x16);
|
||||
|
|
|
@ -3057,7 +3057,7 @@ static u32 cik_create_bitmask(u32 bit_width)
|
|||
* Returns the disabled RB bitmask.
|
||||
*/
|
||||
static u32 cik_get_rb_disabled(struct radeon_device *rdev,
|
||||
u32 max_rb_num, u32 se_num,
|
||||
u32 max_rb_num_per_se,
|
||||
u32 sh_per_se)
|
||||
{
|
||||
u32 data, mask;
|
||||
|
@ -3071,7 +3071,7 @@ static u32 cik_get_rb_disabled(struct radeon_device *rdev,
|
|||
|
||||
data >>= BACKEND_DISABLE_SHIFT;
|
||||
|
||||
mask = cik_create_bitmask(max_rb_num / se_num / sh_per_se);
|
||||
mask = cik_create_bitmask(max_rb_num_per_se / sh_per_se);
|
||||
|
||||
return data & mask;
|
||||
}
|
||||
|
@ -3088,7 +3088,7 @@ static u32 cik_get_rb_disabled(struct radeon_device *rdev,
|
|||
*/
|
||||
static void cik_setup_rb(struct radeon_device *rdev,
|
||||
u32 se_num, u32 sh_per_se,
|
||||
u32 max_rb_num)
|
||||
u32 max_rb_num_per_se)
|
||||
{
|
||||
int i, j;
|
||||
u32 data, mask;
|
||||
|
@ -3098,7 +3098,7 @@ static void cik_setup_rb(struct radeon_device *rdev,
|
|||
for (i = 0; i < se_num; i++) {
|
||||
for (j = 0; j < sh_per_se; j++) {
|
||||
cik_select_se_sh(rdev, i, j);
|
||||
data = cik_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
|
||||
data = cik_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
|
||||
if (rdev->family == CHIP_HAWAII)
|
||||
disabled_rbs |= data << ((i * sh_per_se + j) * HAWAII_RB_BITMAP_WIDTH_PER_SH);
|
||||
else
|
||||
|
@ -3108,12 +3108,14 @@ static void cik_setup_rb(struct radeon_device *rdev,
|
|||
cik_select_se_sh(rdev, 0xffffffff, 0xffffffff);
|
||||
|
||||
mask = 1;
|
||||
for (i = 0; i < max_rb_num; i++) {
|
||||
for (i = 0; i < max_rb_num_per_se * se_num; i++) {
|
||||
if (!(disabled_rbs & mask))
|
||||
enabled_rbs |= mask;
|
||||
mask <<= 1;
|
||||
}
|
||||
|
||||
rdev->config.cik.backend_enable_mask = enabled_rbs;
|
||||
|
||||
for (i = 0; i < se_num; i++) {
|
||||
cik_select_se_sh(rdev, i, 0xffffffff);
|
||||
data = 0;
|
||||
|
|
|
@ -1940,7 +1940,7 @@ struct si_asic {
|
|||
unsigned sc_earlyz_tile_fifo_size;
|
||||
|
||||
unsigned num_tile_pipes;
|
||||
unsigned num_backends_per_se;
|
||||
unsigned backend_enable_mask;
|
||||
unsigned backend_disable_mask_per_asic;
|
||||
unsigned backend_map;
|
||||
unsigned num_texture_channel_caches;
|
||||
|
@ -1970,7 +1970,7 @@ struct cik_asic {
|
|||
unsigned sc_earlyz_tile_fifo_size;
|
||||
|
||||
unsigned num_tile_pipes;
|
||||
unsigned num_backends_per_se;
|
||||
unsigned backend_enable_mask;
|
||||
unsigned backend_disable_mask_per_asic;
|
||||
unsigned backend_map;
|
||||
unsigned num_texture_channel_caches;
|
||||
|
|
|
@ -33,6 +33,7 @@ static struct radeon_atpx_priv {
|
|||
bool atpx_detected;
|
||||
/* handle for device - and atpx */
|
||||
acpi_handle dhandle;
|
||||
acpi_handle other_handle;
|
||||
struct radeon_atpx atpx;
|
||||
} radeon_atpx_priv;
|
||||
|
||||
|
@ -451,9 +452,10 @@ static bool radeon_atpx_pci_probe_handle(struct pci_dev *pdev)
|
|||
return false;
|
||||
|
||||
status = acpi_get_handle(dhandle, "ATPX", &atpx_handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
if (ACPI_FAILURE(status)) {
|
||||
radeon_atpx_priv.other_handle = dhandle;
|
||||
return false;
|
||||
|
||||
}
|
||||
radeon_atpx_priv.dhandle = dhandle;
|
||||
radeon_atpx_priv.atpx.handle = atpx_handle;
|
||||
return true;
|
||||
|
@ -530,6 +532,16 @@ static bool radeon_atpx_detect(void)
|
|||
printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n",
|
||||
acpi_method_name);
|
||||
radeon_atpx_priv.atpx_detected = true;
|
||||
/*
|
||||
* On some systems hotplug events are generated for the device
|
||||
* being switched off when ATPX is executed. They cause ACPI
|
||||
* hotplug to trigger and attempt to remove the device from
|
||||
* the system, which causes it to break down. Prevent that from
|
||||
* happening by setting the no_hotplug flag for the involved
|
||||
* ACPI device objects.
|
||||
*/
|
||||
acpi_bus_no_hotplug(radeon_atpx_priv.dhandle);
|
||||
acpi_bus_no_hotplug(radeon_atpx_priv.other_handle);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
@ -77,9 +77,10 @@
|
|||
* 2.33.0 - Add SI tiling mode array query
|
||||
* 2.34.0 - Add CIK tiling mode array query
|
||||
* 2.35.0 - Add CIK macrotile mode array query
|
||||
* 2.36.0 - Fix CIK DCE tiling setup
|
||||
*/
|
||||
#define KMS_DRIVER_MAJOR 2
|
||||
#define KMS_DRIVER_MINOR 35
|
||||
#define KMS_DRIVER_MINOR 36
|
||||
#define KMS_DRIVER_PATCHLEVEL 0
|
||||
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
|
||||
int radeon_driver_unload_kms(struct drm_device *dev);
|
||||
|
|
|
@ -461,6 +461,15 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|
|||
case RADEON_INFO_SI_CP_DMA_COMPUTE:
|
||||
*value = 1;
|
||||
break;
|
||||
case RADEON_INFO_SI_BACKEND_ENABLED_MASK:
|
||||
if (rdev->family >= CHIP_BONAIRE) {
|
||||
*value = rdev->config.cik.backend_enable_mask;
|
||||
} else if (rdev->family >= CHIP_TAHITI) {
|
||||
*value = rdev->config.si.backend_enable_mask;
|
||||
} else {
|
||||
DRM_DEBUG_KMS("BACKEND_ENABLED_MASK is si+ only!\n");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
DRM_DEBUG_KMS("Invalid request %d\n", info->request);
|
||||
return -EINVAL;
|
||||
|
|
|
@ -473,7 +473,7 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if ((start >> 28) != (end >> 28)) {
|
||||
if ((start >> 28) != ((end - 1) >> 28)) {
|
||||
DRM_ERROR("reloc %LX-%LX crossing 256MB boundary!\n",
|
||||
start, end);
|
||||
return -EINVAL;
|
||||
|
|
|
@ -2811,7 +2811,7 @@ static void si_setup_spi(struct radeon_device *rdev,
|
|||
}
|
||||
|
||||
static u32 si_get_rb_disabled(struct radeon_device *rdev,
|
||||
u32 max_rb_num, u32 se_num,
|
||||
u32 max_rb_num_per_se,
|
||||
u32 sh_per_se)
|
||||
{
|
||||
u32 data, mask;
|
||||
|
@ -2825,14 +2825,14 @@ static u32 si_get_rb_disabled(struct radeon_device *rdev,
|
|||
|
||||
data >>= BACKEND_DISABLE_SHIFT;
|
||||
|
||||
mask = si_create_bitmask(max_rb_num / se_num / sh_per_se);
|
||||
mask = si_create_bitmask(max_rb_num_per_se / sh_per_se);
|
||||
|
||||
return data & mask;
|
||||
}
|
||||
|
||||
static void si_setup_rb(struct radeon_device *rdev,
|
||||
u32 se_num, u32 sh_per_se,
|
||||
u32 max_rb_num)
|
||||
u32 max_rb_num_per_se)
|
||||
{
|
||||
int i, j;
|
||||
u32 data, mask;
|
||||
|
@ -2842,19 +2842,21 @@ static void si_setup_rb(struct radeon_device *rdev,
|
|||
for (i = 0; i < se_num; i++) {
|
||||
for (j = 0; j < sh_per_se; j++) {
|
||||
si_select_se_sh(rdev, i, j);
|
||||
data = si_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se);
|
||||
data = si_get_rb_disabled(rdev, max_rb_num_per_se, sh_per_se);
|
||||
disabled_rbs |= data << ((i * sh_per_se + j) * TAHITI_RB_BITMAP_WIDTH_PER_SH);
|
||||
}
|
||||
}
|
||||
si_select_se_sh(rdev, 0xffffffff, 0xffffffff);
|
||||
|
||||
mask = 1;
|
||||
for (i = 0; i < max_rb_num; i++) {
|
||||
for (i = 0; i < max_rb_num_per_se * se_num; i++) {
|
||||
if (!(disabled_rbs & mask))
|
||||
enabled_rbs |= mask;
|
||||
mask <<= 1;
|
||||
}
|
||||
|
||||
rdev->config.si.backend_enable_mask = enabled_rbs;
|
||||
|
||||
for (i = 0; i < se_num; i++) {
|
||||
si_select_se_sh(rdev, i, 0xffffffff);
|
||||
data = 0;
|
||||
|
|
|
@ -123,7 +123,7 @@ static struct cpuidle_state *cpuidle_state_table;
|
|||
* which is also the index into the MWAIT hint array.
|
||||
* Thus C0 is a dummy.
|
||||
*/
|
||||
static struct cpuidle_state nehalem_cstates[] __initdata = {
|
||||
static struct cpuidle_state nehalem_cstates[] = {
|
||||
{
|
||||
.name = "C1-NHM",
|
||||
.desc = "MWAIT 0x00",
|
||||
|
@ -156,7 +156,7 @@ static struct cpuidle_state nehalem_cstates[] __initdata = {
|
|||
.enter = NULL }
|
||||
};
|
||||
|
||||
static struct cpuidle_state snb_cstates[] __initdata = {
|
||||
static struct cpuidle_state snb_cstates[] = {
|
||||
{
|
||||
.name = "C1-SNB",
|
||||
.desc = "MWAIT 0x00",
|
||||
|
@ -196,7 +196,7 @@ static struct cpuidle_state snb_cstates[] __initdata = {
|
|||
.enter = NULL }
|
||||
};
|
||||
|
||||
static struct cpuidle_state ivb_cstates[] __initdata = {
|
||||
static struct cpuidle_state ivb_cstates[] = {
|
||||
{
|
||||
.name = "C1-IVB",
|
||||
.desc = "MWAIT 0x00",
|
||||
|
@ -236,7 +236,7 @@ static struct cpuidle_state ivb_cstates[] __initdata = {
|
|||
.enter = NULL }
|
||||
};
|
||||
|
||||
static struct cpuidle_state hsw_cstates[] __initdata = {
|
||||
static struct cpuidle_state hsw_cstates[] = {
|
||||
{
|
||||
.name = "C1-HSW",
|
||||
.desc = "MWAIT 0x00",
|
||||
|
@ -297,7 +297,7 @@ static struct cpuidle_state hsw_cstates[] __initdata = {
|
|||
.enter = NULL }
|
||||
};
|
||||
|
||||
static struct cpuidle_state atom_cstates[] __initdata = {
|
||||
static struct cpuidle_state atom_cstates[] = {
|
||||
{
|
||||
.name = "C1E-ATM",
|
||||
.desc = "MWAIT 0x00",
|
||||
|
@ -329,7 +329,7 @@ static struct cpuidle_state atom_cstates[] __initdata = {
|
|||
{
|
||||
.enter = NULL }
|
||||
};
|
||||
static struct cpuidle_state avn_cstates[] __initdata = {
|
||||
static struct cpuidle_state avn_cstates[] = {
|
||||
{
|
||||
.name = "C1-AVN",
|
||||
.desc = "MWAIT 0x00",
|
||||
|
@ -344,6 +344,8 @@ static struct cpuidle_state avn_cstates[] __initdata = {
|
|||
.exit_latency = 15,
|
||||
.target_residency = 45,
|
||||
.enter = &intel_idle },
|
||||
{
|
||||
.enter = NULL }
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -1871,6 +1871,10 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int
|
|||
break;
|
||||
|
||||
case EV_ABS:
|
||||
input_alloc_absinfo(dev);
|
||||
if (!dev->absinfo)
|
||||
return;
|
||||
|
||||
__set_bit(code, dev->absbit);
|
||||
break;
|
||||
|
||||
|
|
|
@ -455,7 +455,18 @@ static void zforce_complete(struct zforce_ts *ts, int cmd, int result)
|
|||
}
|
||||
}
|
||||
|
||||
static irqreturn_t zforce_interrupt(int irq, void *dev_id)
|
||||
static irqreturn_t zforce_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct zforce_ts *ts = dev_id;
|
||||
struct i2c_client *client = ts->client;
|
||||
|
||||
if (ts->suspended && device_may_wakeup(&client->dev))
|
||||
pm_wakeup_event(&client->dev, 500);
|
||||
|
||||
return IRQ_WAKE_THREAD;
|
||||
}
|
||||
|
||||
static irqreturn_t zforce_irq_thread(int irq, void *dev_id)
|
||||
{
|
||||
struct zforce_ts *ts = dev_id;
|
||||
struct i2c_client *client = ts->client;
|
||||
|
@ -465,12 +476,10 @@ static irqreturn_t zforce_interrupt(int irq, void *dev_id)
|
|||
u8 *payload;
|
||||
|
||||
/*
|
||||
* When suspended, emit a wakeup signal if necessary and return.
|
||||
* When still suspended, return.
|
||||
* Due to the level-interrupt we will get re-triggered later.
|
||||
*/
|
||||
if (ts->suspended) {
|
||||
if (device_may_wakeup(&client->dev))
|
||||
pm_wakeup_event(&client->dev, 500);
|
||||
msleep(20);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
@ -763,8 +772,8 @@ static int zforce_probe(struct i2c_client *client,
|
|||
* Therefore we can trigger the interrupt anytime it is low and do
|
||||
* not need to limit it to the interrupt edge.
|
||||
*/
|
||||
ret = devm_request_threaded_irq(&client->dev, client->irq, NULL,
|
||||
zforce_interrupt,
|
||||
ret = devm_request_threaded_irq(&client->dev, client->irq,
|
||||
zforce_irq, zforce_irq_thread,
|
||||
IRQF_TRIGGER_LOW | IRQF_ONESHOT,
|
||||
input_dev->name, ts);
|
||||
if (ret) {
|
||||
|
|
|
@ -244,18 +244,12 @@ static int lp5521_update_program_memory(struct lp55xx_chip *chip,
|
|||
if (i % 2)
|
||||
goto err;
|
||||
|
||||
mutex_lock(&chip->lock);
|
||||
|
||||
for (i = 0; i < LP5521_PROGRAM_LENGTH; i++) {
|
||||
ret = lp55xx_write(chip, addr[idx] + i, pattern[i]);
|
||||
if (ret) {
|
||||
mutex_unlock(&chip->lock);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&chip->lock);
|
||||
|
||||
return size;
|
||||
|
||||
err:
|
||||
|
@ -427,15 +421,17 @@ static ssize_t store_engine_load(struct device *dev,
|
|||
{
|
||||
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
|
||||
struct lp55xx_chip *chip = led->chip;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&chip->lock);
|
||||
|
||||
chip->engine_idx = nr;
|
||||
lp5521_load_engine(chip);
|
||||
ret = lp5521_update_program_memory(chip, buf, len);
|
||||
|
||||
mutex_unlock(&chip->lock);
|
||||
|
||||
return lp5521_update_program_memory(chip, buf, len);
|
||||
return ret;
|
||||
}
|
||||
store_load(1)
|
||||
store_load(2)
|
||||
|
|
|
@ -337,18 +337,12 @@ static int lp5523_update_program_memory(struct lp55xx_chip *chip,
|
|||
if (i % 2)
|
||||
goto err;
|
||||
|
||||
mutex_lock(&chip->lock);
|
||||
|
||||
for (i = 0; i < LP5523_PROGRAM_LENGTH; i++) {
|
||||
ret = lp55xx_write(chip, LP5523_REG_PROG_MEM + i, pattern[i]);
|
||||
if (ret) {
|
||||
mutex_unlock(&chip->lock);
|
||||
if (ret)
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&chip->lock);
|
||||
|
||||
return size;
|
||||
|
||||
err:
|
||||
|
@ -548,15 +542,17 @@ static ssize_t store_engine_load(struct device *dev,
|
|||
{
|
||||
struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
|
||||
struct lp55xx_chip *chip = led->chip;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&chip->lock);
|
||||
|
||||
chip->engine_idx = nr;
|
||||
lp5523_load_engine_and_select_page(chip);
|
||||
ret = lp5523_update_program_memory(chip, buf, len);
|
||||
|
||||
mutex_unlock(&chip->lock);
|
||||
|
||||
return lp5523_update_program_memory(chip, buf, len);
|
||||
return ret;
|
||||
}
|
||||
store_load(1)
|
||||
store_load(2)
|
||||
|
|
|
@ -1228,8 +1228,14 @@ static void rtsx_pci_remove(struct pci_dev *pcidev)
|
|||
|
||||
pcr->remove_pci = true;
|
||||
|
||||
cancel_delayed_work(&pcr->carddet_work);
|
||||
cancel_delayed_work(&pcr->idle_work);
|
||||
/* Disable interrupts at the pcr level */
|
||||
spin_lock_irq(&pcr->lock);
|
||||
rtsx_pci_writel(pcr, RTSX_BIER, 0);
|
||||
pcr->bier = 0;
|
||||
spin_unlock_irq(&pcr->lock);
|
||||
|
||||
cancel_delayed_work_sync(&pcr->carddet_work);
|
||||
cancel_delayed_work_sync(&pcr->idle_work);
|
||||
|
||||
mfd_remove_devices(&pcidev->dev);
|
||||
|
||||
|
|
|
@ -73,7 +73,7 @@ static int pxa2xx_flash_probe(struct platform_device *pdev)
|
|||
return -ENOMEM;
|
||||
}
|
||||
info->map.cached =
|
||||
ioremap_cached(info->map.phys, info->map.size);
|
||||
ioremap_cache(info->map.phys, info->map.size);
|
||||
if (!info->map.cached)
|
||||
printk(KERN_WARNING "Failed to ioremap cached %s\n",
|
||||
info->map.name);
|
||||
|
|
|
@ -3692,7 +3692,8 @@ static inline int bond_slave_override(struct bonding *bond,
|
|||
}
|
||||
|
||||
|
||||
static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
static u16 bond_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
/*
|
||||
* This helper function exists to help dev_pick_tx get the correct
|
||||
|
|
|
@ -520,10 +520,12 @@ struct bnx2x_fastpath {
|
|||
#define BNX2X_FP_STATE_IDLE 0
|
||||
#define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */
|
||||
#define BNX2X_FP_STATE_POLL (1 << 1) /* poll owns this FP */
|
||||
#define BNX2X_FP_STATE_NAPI_YIELD (1 << 2) /* NAPI yielded this FP */
|
||||
#define BNX2X_FP_STATE_POLL_YIELD (1 << 3) /* poll yielded this FP */
|
||||
#define BNX2X_FP_STATE_DISABLED (1 << 2)
|
||||
#define BNX2X_FP_STATE_NAPI_YIELD (1 << 3) /* NAPI yielded this FP */
|
||||
#define BNX2X_FP_STATE_POLL_YIELD (1 << 4) /* poll yielded this FP */
|
||||
#define BNX2X_FP_OWNED (BNX2X_FP_STATE_NAPI | BNX2X_FP_STATE_POLL)
|
||||
#define BNX2X_FP_YIELD (BNX2X_FP_STATE_NAPI_YIELD | BNX2X_FP_STATE_POLL_YIELD)
|
||||
#define BNX2X_FP_LOCKED (BNX2X_FP_STATE_NAPI | BNX2X_FP_STATE_POLL)
|
||||
#define BNX2X_FP_LOCKED (BNX2X_FP_OWNED | BNX2X_FP_STATE_DISABLED)
|
||||
#define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD)
|
||||
/* protect state */
|
||||
spinlock_t lock;
|
||||
|
@ -613,7 +615,7 @@ static inline bool bnx2x_fp_lock_napi(struct bnx2x_fastpath *fp)
|
|||
{
|
||||
bool rc = true;
|
||||
|
||||
spin_lock(&fp->lock);
|
||||
spin_lock_bh(&fp->lock);
|
||||
if (fp->state & BNX2X_FP_LOCKED) {
|
||||
WARN_ON(fp->state & BNX2X_FP_STATE_NAPI);
|
||||
fp->state |= BNX2X_FP_STATE_NAPI_YIELD;
|
||||
|
@ -622,7 +624,7 @@ static inline bool bnx2x_fp_lock_napi(struct bnx2x_fastpath *fp)
|
|||
/* we don't care if someone yielded */
|
||||
fp->state = BNX2X_FP_STATE_NAPI;
|
||||
}
|
||||
spin_unlock(&fp->lock);
|
||||
spin_unlock_bh(&fp->lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -631,14 +633,16 @@ static inline bool bnx2x_fp_unlock_napi(struct bnx2x_fastpath *fp)
|
|||
{
|
||||
bool rc = false;
|
||||
|
||||
spin_lock(&fp->lock);
|
||||
spin_lock_bh(&fp->lock);
|
||||
WARN_ON(fp->state &
|
||||
(BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_NAPI_YIELD));
|
||||
|
||||
if (fp->state & BNX2X_FP_STATE_POLL_YIELD)
|
||||
rc = true;
|
||||
fp->state = BNX2X_FP_STATE_IDLE;
|
||||
spin_unlock(&fp->lock);
|
||||
|
||||
/* state ==> idle, unless currently disabled */
|
||||
fp->state &= BNX2X_FP_STATE_DISABLED;
|
||||
spin_unlock_bh(&fp->lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -669,7 +673,9 @@ static inline bool bnx2x_fp_unlock_poll(struct bnx2x_fastpath *fp)
|
|||
|
||||
if (fp->state & BNX2X_FP_STATE_POLL_YIELD)
|
||||
rc = true;
|
||||
fp->state = BNX2X_FP_STATE_IDLE;
|
||||
|
||||
/* state ==> idle, unless currently disabled */
|
||||
fp->state &= BNX2X_FP_STATE_DISABLED;
|
||||
spin_unlock_bh(&fp->lock);
|
||||
return rc;
|
||||
}
|
||||
|
@ -677,9 +683,23 @@ static inline bool bnx2x_fp_unlock_poll(struct bnx2x_fastpath *fp)
|
|||
/* true if a socket is polling, even if it did not get the lock */
|
||||
static inline bool bnx2x_fp_ll_polling(struct bnx2x_fastpath *fp)
|
||||
{
|
||||
WARN_ON(!(fp->state & BNX2X_FP_LOCKED));
|
||||
WARN_ON(!(fp->state & BNX2X_FP_OWNED));
|
||||
return fp->state & BNX2X_FP_USER_PEND;
|
||||
}
|
||||
|
||||
/* false if fp is currently owned */
|
||||
static inline bool bnx2x_fp_ll_disable(struct bnx2x_fastpath *fp)
|
||||
{
|
||||
int rc = true;
|
||||
|
||||
spin_lock_bh(&fp->lock);
|
||||
if (fp->state & BNX2X_FP_OWNED)
|
||||
rc = false;
|
||||
fp->state |= BNX2X_FP_STATE_DISABLED;
|
||||
spin_unlock_bh(&fp->lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
#else
|
||||
static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp)
|
||||
{
|
||||
|
@ -709,6 +729,10 @@ static inline bool bnx2x_fp_ll_polling(struct bnx2x_fastpath *fp)
|
|||
{
|
||||
return false;
|
||||
}
|
||||
static inline bool bnx2x_fp_ll_disable(struct bnx2x_fastpath *fp)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif /* CONFIG_NET_RX_BUSY_POLL */
|
||||
|
||||
/* Use 2500 as a mini-jumbo MTU for FCoE */
|
||||
|
|
|
@ -197,6 +197,7 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
|
|||
struct sk_buff *skb = tx_buf->skb;
|
||||
u16 bd_idx = TX_BD(tx_buf->first_bd), new_cons;
|
||||
int nbd;
|
||||
u16 split_bd_len = 0;
|
||||
|
||||
/* prefetch skb end pointer to speedup dev_kfree_skb() */
|
||||
prefetch(&skb->end);
|
||||
|
@ -204,10 +205,7 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
|
|||
DP(NETIF_MSG_TX_DONE, "fp[%d]: pkt_idx %d buff @(%p)->skb %p\n",
|
||||
txdata->txq_index, idx, tx_buf, skb);
|
||||
|
||||
/* unmap first bd */
|
||||
tx_start_bd = &txdata->tx_desc_ring[bd_idx].start_bd;
|
||||
dma_unmap_single(&bp->pdev->dev, BD_UNMAP_ADDR(tx_start_bd),
|
||||
BD_UNMAP_LEN(tx_start_bd), DMA_TO_DEVICE);
|
||||
|
||||
nbd = le16_to_cpu(tx_start_bd->nbd) - 1;
|
||||
#ifdef BNX2X_STOP_ON_ERROR
|
||||
|
@ -225,12 +223,19 @@ static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
|
|||
--nbd;
|
||||
bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
|
||||
|
||||
/* ...and the TSO split header bd since they have no mapping */
|
||||
/* TSO headers+data bds share a common mapping. See bnx2x_tx_split() */
|
||||
if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) {
|
||||
tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd;
|
||||
split_bd_len = BD_UNMAP_LEN(tx_data_bd);
|
||||
--nbd;
|
||||
bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
|
||||
}
|
||||
|
||||
/* unmap first bd */
|
||||
dma_unmap_single(&bp->pdev->dev, BD_UNMAP_ADDR(tx_start_bd),
|
||||
BD_UNMAP_LEN(tx_start_bd) + split_bd_len,
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
/* now free frags */
|
||||
while (nbd > 0) {
|
||||
|
||||
|
@ -1829,26 +1834,22 @@ static void bnx2x_napi_disable_cnic(struct bnx2x *bp)
|
|||
{
|
||||
int i;
|
||||
|
||||
local_bh_disable();
|
||||
for_each_rx_queue_cnic(bp, i) {
|
||||
napi_disable(&bnx2x_fp(bp, i, napi));
|
||||
while (!bnx2x_fp_lock_napi(&bp->fp[i]))
|
||||
mdelay(1);
|
||||
while (!bnx2x_fp_ll_disable(&bp->fp[i]))
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
static void bnx2x_napi_disable(struct bnx2x *bp)
|
||||
{
|
||||
int i;
|
||||
|
||||
local_bh_disable();
|
||||
for_each_eth_queue(bp, i) {
|
||||
napi_disable(&bnx2x_fp(bp, i, napi));
|
||||
while (!bnx2x_fp_lock_napi(&bp->fp[i]))
|
||||
mdelay(1);
|
||||
while (!bnx2x_fp_ll_disable(&bp->fp[i]))
|
||||
usleep_range(1000, 2000);
|
||||
}
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
void bnx2x_netif_start(struct bnx2x *bp)
|
||||
|
@ -1871,7 +1872,8 @@ void bnx2x_netif_stop(struct bnx2x *bp, int disable_hw)
|
|||
bnx2x_napi_disable_cnic(bp);
|
||||
}
|
||||
|
||||
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
struct bnx2x *bp = netdev_priv(dev);
|
||||
|
||||
|
|
|
@ -495,7 +495,8 @@ int bnx2x_set_vf_mac(struct net_device *dev, int queue, u8 *mac);
|
|||
int bnx2x_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos);
|
||||
|
||||
/* select_queue callback */
|
||||
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb);
|
||||
u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv);
|
||||
|
||||
static inline void bnx2x_update_rx_prod(struct bnx2x *bp,
|
||||
struct bnx2x_fastpath *fp,
|
||||
|
|
|
@ -423,7 +423,7 @@ u64 cxgb4_select_ntuple(struct net_device *dev,
|
|||
* in the Compressed Filter Tuple.
|
||||
*/
|
||||
if (tp->vlan_shift >= 0 && l2t->vlan != VLAN_NONE)
|
||||
ntuple |= (F_FT_VLAN_VLD | l2t->vlan) << tp->vlan_shift;
|
||||
ntuple |= (u64)(F_FT_VLAN_VLD | l2t->vlan) << tp->vlan_shift;
|
||||
|
||||
if (tp->port_shift >= 0)
|
||||
ntuple |= (u64)l2t->lport << tp->port_shift;
|
||||
|
|
|
@ -6827,12 +6827,20 @@ static inline int ixgbe_maybe_stop_tx(struct ixgbe_ring *tx_ring, u16 size)
|
|||
return __ixgbe_maybe_stop_tx(tx_ring, size);
|
||||
}
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
struct ixgbe_fwd_adapter *fwd_adapter = accel_priv;
|
||||
#ifdef IXGBE_FCOE
|
||||
struct ixgbe_adapter *adapter;
|
||||
struct ixgbe_ring_feature *f;
|
||||
int txq;
|
||||
#endif
|
||||
|
||||
if (fwd_adapter)
|
||||
return skb->queue_mapping + fwd_adapter->tx_base_queue;
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
|
||||
/*
|
||||
* only execute the code below if protocol is FCoE
|
||||
|
@ -6858,9 +6866,11 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb)
|
|||
txq -= f->indices;
|
||||
|
||||
return txq + f->offset;
|
||||
#else
|
||||
return __netdev_pick_tx(dev, skb);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
|
||||
struct ixgbe_adapter *adapter,
|
||||
struct ixgbe_ring *tx_ring)
|
||||
|
@ -7629,27 +7639,11 @@ static void ixgbe_fwd_del(struct net_device *pdev, void *priv)
|
|||
kfree(fwd_adapter);
|
||||
}
|
||||
|
||||
static netdev_tx_t ixgbe_fwd_xmit(struct sk_buff *skb,
|
||||
struct net_device *dev,
|
||||
void *priv)
|
||||
{
|
||||
struct ixgbe_fwd_adapter *fwd_adapter = priv;
|
||||
unsigned int queue;
|
||||
struct ixgbe_ring *tx_ring;
|
||||
|
||||
queue = skb->queue_mapping + fwd_adapter->tx_base_queue;
|
||||
tx_ring = fwd_adapter->real_adapter->tx_ring[queue];
|
||||
|
||||
return __ixgbe_xmit_frame(skb, dev, tx_ring);
|
||||
}
|
||||
|
||||
static const struct net_device_ops ixgbe_netdev_ops = {
|
||||
.ndo_open = ixgbe_open,
|
||||
.ndo_stop = ixgbe_close,
|
||||
.ndo_start_xmit = ixgbe_xmit_frame,
|
||||
#ifdef IXGBE_FCOE
|
||||
.ndo_select_queue = ixgbe_select_queue,
|
||||
#endif
|
||||
.ndo_set_rx_mode = ixgbe_set_rx_mode,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_set_mac_address = ixgbe_set_mac,
|
||||
|
@ -7689,7 +7683,6 @@ static const struct net_device_ops ixgbe_netdev_ops = {
|
|||
.ndo_bridge_getlink = ixgbe_ndo_bridge_getlink,
|
||||
.ndo_dfwd_add_station = ixgbe_fwd_add,
|
||||
.ndo_dfwd_del_station = ixgbe_fwd_del,
|
||||
.ndo_dfwd_start_xmit = ixgbe_fwd_xmit,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -618,7 +618,8 @@ ltq_etop_set_multicast_list(struct net_device *dev)
|
|||
}
|
||||
|
||||
static u16
|
||||
ltq_etop_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
ltq_etop_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
/* we are currently only using the first queue */
|
||||
return 0;
|
||||
|
|
|
@ -628,7 +628,8 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, struct sk_buff *sk
|
|||
}
|
||||
}
|
||||
|
||||
u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
struct mlx4_en_priv *priv = netdev_priv(dev);
|
||||
u16 rings_p_up = priv->num_tx_rings_p_up;
|
||||
|
|
|
@ -722,7 +722,8 @@ int mlx4_en_set_cq_moder(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
|
|||
int mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq);
|
||||
|
||||
void mlx4_en_tx_irq(struct mlx4_cq *mcq);
|
||||
u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb);
|
||||
u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv);
|
||||
netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev);
|
||||
|
||||
int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv,
|
||||
|
|
|
@ -1723,6 +1723,7 @@ int qlcnic_83xx_init_mailbox_work(struct qlcnic_adapter *);
|
|||
void qlcnic_83xx_detach_mailbox_work(struct qlcnic_adapter *);
|
||||
void qlcnic_83xx_reinit_mbx_work(struct qlcnic_mailbox *mbx);
|
||||
void qlcnic_83xx_free_mailbox(struct qlcnic_mailbox *mbx);
|
||||
void qlcnic_update_stats(struct qlcnic_adapter *);
|
||||
|
||||
/* Adapter hardware abstraction */
|
||||
struct qlcnic_hardware_ops {
|
||||
|
|
|
@ -167,27 +167,35 @@ static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = {
|
|||
|
||||
#define QLCNIC_TEST_LEN ARRAY_SIZE(qlcnic_gstrings_test)
|
||||
|
||||
static inline int qlcnic_82xx_statistics(void)
|
||||
static inline int qlcnic_82xx_statistics(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
return ARRAY_SIZE(qlcnic_device_gstrings_stats) +
|
||||
ARRAY_SIZE(qlcnic_83xx_mac_stats_strings);
|
||||
return ARRAY_SIZE(qlcnic_gstrings_stats) +
|
||||
ARRAY_SIZE(qlcnic_83xx_mac_stats_strings) +
|
||||
QLCNIC_TX_STATS_LEN * adapter->drv_tx_rings;
|
||||
}
|
||||
|
||||
static inline int qlcnic_83xx_statistics(void)
|
||||
static inline int qlcnic_83xx_statistics(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
return ARRAY_SIZE(qlcnic_83xx_tx_stats_strings) +
|
||||
return ARRAY_SIZE(qlcnic_gstrings_stats) +
|
||||
ARRAY_SIZE(qlcnic_83xx_tx_stats_strings) +
|
||||
ARRAY_SIZE(qlcnic_83xx_mac_stats_strings) +
|
||||
ARRAY_SIZE(qlcnic_83xx_rx_stats_strings);
|
||||
ARRAY_SIZE(qlcnic_83xx_rx_stats_strings) +
|
||||
QLCNIC_TX_STATS_LEN * adapter->drv_tx_rings;
|
||||
}
|
||||
|
||||
static int qlcnic_dev_statistics_len(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
if (qlcnic_82xx_check(adapter))
|
||||
return qlcnic_82xx_statistics();
|
||||
else if (qlcnic_83xx_check(adapter))
|
||||
return qlcnic_83xx_statistics();
|
||||
else
|
||||
return -1;
|
||||
int len = -1;
|
||||
|
||||
if (qlcnic_82xx_check(adapter)) {
|
||||
len = qlcnic_82xx_statistics(adapter);
|
||||
if (adapter->flags & QLCNIC_ESWITCH_ENABLED)
|
||||
len += ARRAY_SIZE(qlcnic_device_gstrings_stats);
|
||||
} else if (qlcnic_83xx_check(adapter)) {
|
||||
len = qlcnic_83xx_statistics(adapter);
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
#define QLCNIC_TX_INTR_NOT_CONFIGURED 0X78563412
|
||||
|
@ -923,18 +931,13 @@ static int qlcnic_eeprom_test(struct net_device *dev)
|
|||
|
||||
static int qlcnic_get_sset_count(struct net_device *dev, int sset)
|
||||
{
|
||||
int len;
|
||||
|
||||
struct qlcnic_adapter *adapter = netdev_priv(dev);
|
||||
switch (sset) {
|
||||
case ETH_SS_TEST:
|
||||
return QLCNIC_TEST_LEN;
|
||||
case ETH_SS_STATS:
|
||||
len = qlcnic_dev_statistics_len(adapter) + QLCNIC_STATS_LEN;
|
||||
if ((adapter->flags & QLCNIC_ESWITCH_ENABLED) ||
|
||||
qlcnic_83xx_check(adapter))
|
||||
return len;
|
||||
return qlcnic_82xx_statistics();
|
||||
return qlcnic_dev_statistics_len(adapter);
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
@ -1270,7 +1273,7 @@ static u64 *qlcnic_fill_stats(u64 *data, void *stats, int type)
|
|||
return data;
|
||||
}
|
||||
|
||||
static void qlcnic_update_stats(struct qlcnic_adapter *adapter)
|
||||
void qlcnic_update_stats(struct qlcnic_adapter *adapter)
|
||||
{
|
||||
struct qlcnic_host_tx_ring *tx_ring;
|
||||
int ring;
|
||||
|
|
|
@ -2780,6 +2780,9 @@ static struct net_device_stats *qlcnic_get_stats(struct net_device *netdev)
|
|||
struct qlcnic_adapter *adapter = netdev_priv(netdev);
|
||||
struct net_device_stats *stats = &netdev->stats;
|
||||
|
||||
if (test_bit(__QLCNIC_DEV_UP, &adapter->state))
|
||||
qlcnic_update_stats(adapter);
|
||||
|
||||
stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts;
|
||||
stats->tx_packets = adapter->stats.xmitfinished;
|
||||
stats->rx_bytes = adapter->stats.rxbytes + adapter->stats.lrobytes;
|
||||
|
|
|
@ -2070,7 +2070,8 @@ static int tile_net_tx(struct sk_buff *skb, struct net_device *dev)
|
|||
}
|
||||
|
||||
/* Return subqueue id on this core (one per core). */
|
||||
static u16 tile_net_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
static u16 tile_net_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
return smp_processor_id();
|
||||
}
|
||||
|
|
|
@ -299,7 +299,7 @@ static netdev_tx_t macvlan_start_xmit(struct sk_buff *skb,
|
|||
|
||||
if (vlan->fwd_priv) {
|
||||
skb->dev = vlan->lowerdev;
|
||||
ret = dev_hard_start_xmit(skb, skb->dev, NULL, vlan->fwd_priv);
|
||||
ret = dev_queue_xmit_accel(skb, vlan->fwd_priv);
|
||||
} else {
|
||||
ret = macvlan_queue_xmit(skb, dev);
|
||||
}
|
||||
|
@ -337,6 +337,8 @@ static const struct header_ops macvlan_hard_header_ops = {
|
|||
.cache_update = eth_header_cache_update,
|
||||
};
|
||||
|
||||
static struct rtnl_link_ops macvlan_link_ops;
|
||||
|
||||
static int macvlan_open(struct net_device *dev)
|
||||
{
|
||||
struct macvlan_dev *vlan = netdev_priv(dev);
|
||||
|
@ -352,7 +354,8 @@ static int macvlan_open(struct net_device *dev)
|
|||
goto hash_add;
|
||||
}
|
||||
|
||||
if (lowerdev->features & NETIF_F_HW_L2FW_DOFFLOAD) {
|
||||
if (lowerdev->features & NETIF_F_HW_L2FW_DOFFLOAD &&
|
||||
dev->rtnl_link_ops == &macvlan_link_ops) {
|
||||
vlan->fwd_priv =
|
||||
lowerdev->netdev_ops->ndo_dfwd_add_station(lowerdev, dev);
|
||||
|
||||
|
@ -361,10 +364,8 @@ static int macvlan_open(struct net_device *dev)
|
|||
*/
|
||||
if (IS_ERR_OR_NULL(vlan->fwd_priv)) {
|
||||
vlan->fwd_priv = NULL;
|
||||
} else {
|
||||
dev->features &= ~NETIF_F_LLTX;
|
||||
} else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
err = -EBUSY;
|
||||
|
@ -698,8 +699,7 @@ static netdev_features_t macvlan_fix_features(struct net_device *dev,
|
|||
features = netdev_increment_features(vlan->lowerdev->features,
|
||||
features,
|
||||
mask);
|
||||
if (!vlan->fwd_priv)
|
||||
features |= NETIF_F_LLTX;
|
||||
features |= NETIF_F_LLTX;
|
||||
|
||||
return features;
|
||||
}
|
||||
|
|
|
@ -1647,7 +1647,8 @@ static netdev_tx_t team_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
static u16 team_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
static u16 team_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
/*
|
||||
* This helper function exists to help dev_pick_tx get the correct
|
||||
|
|
|
@ -364,7 +364,8 @@ static inline void tun_flow_save_rps_rxhash(struct tun_flow_entry *e, u32 hash)
|
|||
* different rxq no. here. If we could not get rxhash, then we would
|
||||
* hope the rxq no. may help here.
|
||||
*/
|
||||
static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
struct tun_struct *tun = netdev_priv(dev);
|
||||
struct tun_flow_entry *e;
|
||||
|
|
|
@ -1244,7 +1244,7 @@ static int build_dma_sg(const struct sk_buff *skb, struct urb *urb)
|
|||
return -ENOMEM;
|
||||
|
||||
urb->num_sgs = num_sgs;
|
||||
sg_init_table(urb->sg, urb->num_sgs);
|
||||
sg_init_table(urb->sg, urb->num_sgs + 1);
|
||||
|
||||
sg_set_buf(&urb->sg[s++], skb->data, skb_headlen(skb));
|
||||
total_len += skb_headlen(skb);
|
||||
|
|
|
@ -362,21 +362,27 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
|
|||
{IWL_PCI_DEVICE(0x095B, 0x5310, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095B, 0x5302, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095B, 0x5210, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095B, 0x5012, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095B, 0x500A, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5012, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x500A, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5410, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5400, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x1010, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5000, iwl7265_2n_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095B, 0x5200, iwl7265_2n_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5002, iwl7265_n_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095B, 0x5202, iwl7265_n_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x9010, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x9110, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x9210, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x9510, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x9310, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x9410, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5020, iwl7265_2n_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x502A, iwl7265_2n_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5420, iwl7265_2n_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5090, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5190, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5590, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095B, 0x5290, iwl7265_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x095A, 0x5490, iwl7265_2ac_cfg)},
|
||||
#endif /* CONFIG_IWLMVM */
|
||||
|
|
|
@ -2018,7 +2018,7 @@ static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2,
|
|||
(hwsim_flags & HWSIM_TX_STAT_ACK)) {
|
||||
if (skb->len >= 16) {
|
||||
hdr = (struct ieee80211_hdr *) skb->data;
|
||||
mac80211_hwsim_monitor_ack(txi->rate_driver_data[0],
|
||||
mac80211_hwsim_monitor_ack(data2->channel,
|
||||
hdr->addr2);
|
||||
}
|
||||
txi->flags |= IEEE80211_TX_STAT_ACK;
|
||||
|
|
|
@ -747,7 +747,8 @@ static struct net_device_stats *mwifiex_get_stats(struct net_device *dev)
|
|||
}
|
||||
|
||||
static u16
|
||||
mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
skb->priority = cfg80211_classify8021d(skb, NULL);
|
||||
return mwifiex_1d_to_wmm_queue[skb->priority];
|
||||
|
|
|
@ -279,7 +279,9 @@ static acpi_status register_slot(acpi_handle handle, u32 lvl, void *data,
|
|||
|
||||
status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_handle_warn(handle, "can't evaluate _ADR (%#x)\n", status);
|
||||
if (status != AE_NOT_FOUND)
|
||||
acpi_handle_warn(handle,
|
||||
"can't evaluate _ADR (%#x)\n", status);
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
|
@ -643,6 +645,24 @@ static void disable_slot(struct acpiphp_slot *slot)
|
|||
slot->flags &= (~SLOT_ENABLED);
|
||||
}
|
||||
|
||||
static bool acpiphp_no_hotplug(acpi_handle handle)
|
||||
{
|
||||
struct acpi_device *adev = NULL;
|
||||
|
||||
acpi_bus_get_device(handle, &adev);
|
||||
return adev && adev->flags.no_hotplug;
|
||||
}
|
||||
|
||||
static bool slot_no_hotplug(struct acpiphp_slot *slot)
|
||||
{
|
||||
struct acpiphp_func *func;
|
||||
|
||||
list_for_each_entry(func, &slot->funcs, sibling)
|
||||
if (acpiphp_no_hotplug(func_to_handle(func)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* get_slot_status - get ACPI slot status
|
||||
|
@ -701,7 +721,8 @@ static void trim_stale_devices(struct pci_dev *dev)
|
|||
unsigned long long sta;
|
||||
|
||||
status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
|
||||
alive = ACPI_SUCCESS(status) && sta == ACPI_STA_ALL;
|
||||
alive = (ACPI_SUCCESS(status) && sta == ACPI_STA_ALL)
|
||||
|| acpiphp_no_hotplug(handle);
|
||||
}
|
||||
if (!alive) {
|
||||
u32 v;
|
||||
|
@ -741,8 +762,9 @@ static void acpiphp_check_bridge(struct acpiphp_bridge *bridge)
|
|||
struct pci_dev *dev, *tmp;
|
||||
|
||||
mutex_lock(&slot->crit_sect);
|
||||
/* wake up all functions */
|
||||
if (get_slot_status(slot) == ACPI_STA_ALL) {
|
||||
if (slot_no_hotplug(slot)) {
|
||||
; /* do nothing */
|
||||
} else if (get_slot_status(slot) == ACPI_STA_ALL) {
|
||||
/* remove stale devices if any */
|
||||
list_for_each_entry_safe(dev, tmp, &bus->devices,
|
||||
bus_list)
|
||||
|
|
|
@ -330,29 +330,32 @@ static int acpi_pci_find_device(struct device *dev, acpi_handle *handle)
|
|||
static void pci_acpi_setup(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pci_dev = to_pci_dev(dev);
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
struct acpi_device *adev;
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
|
||||
if (acpi_bus_get_device(handle, &adev) || !adev->wakeup.flags.valid)
|
||||
if (!adev)
|
||||
return;
|
||||
|
||||
pci_acpi_add_pm_notifier(adev, pci_dev);
|
||||
if (!adev->wakeup.flags.valid)
|
||||
return;
|
||||
|
||||
device_set_wakeup_capable(dev, true);
|
||||
acpi_pci_sleep_wake(pci_dev, false);
|
||||
|
||||
pci_acpi_add_pm_notifier(adev, pci_dev);
|
||||
if (adev->wakeup.flags.run_wake)
|
||||
device_set_run_wake(dev, true);
|
||||
}
|
||||
|
||||
static void pci_acpi_cleanup(struct device *dev)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
struct acpi_device *adev;
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
|
||||
if (!acpi_bus_get_device(handle, &adev) && adev->wakeup.flags.valid) {
|
||||
if (!adev)
|
||||
return;
|
||||
|
||||
pci_acpi_remove_pm_notifier(adev);
|
||||
if (adev->wakeup.flags.valid) {
|
||||
device_set_wakeup_capable(dev, false);
|
||||
device_set_run_wake(dev, false);
|
||||
pci_acpi_remove_pm_notifier(adev);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -196,6 +196,7 @@ config BATTERY_MAX17040
|
|||
config BATTERY_MAX17042
|
||||
tristate "Maxim MAX17042/17047/17050/8997/8966 Fuel Gauge"
|
||||
depends on I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
MAX17042 is fuel-gauge systems for lithium-ion (Li+) batteries
|
||||
in handheld and portable equipment. The MAX17042 is configured
|
||||
|
|
|
@ -511,6 +511,10 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
|
|||
dev_set_drvdata(dev, psy);
|
||||
psy->dev = dev;
|
||||
|
||||
rc = dev_set_name(dev, "%s", psy->name);
|
||||
if (rc)
|
||||
goto dev_set_name_failed;
|
||||
|
||||
INIT_WORK(&psy->changed_work, power_supply_changed_work);
|
||||
|
||||
rc = power_supply_check_supplies(psy);
|
||||
|
@ -524,10 +528,6 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
|
|||
if (rc)
|
||||
goto wakeup_init_failed;
|
||||
|
||||
rc = kobject_set_name(&dev->kobj, "%s", psy->name);
|
||||
if (rc)
|
||||
goto kobject_set_name_failed;
|
||||
|
||||
rc = device_add(dev);
|
||||
if (rc)
|
||||
goto device_add_failed;
|
||||
|
@ -553,11 +553,11 @@ int power_supply_register(struct device *parent, struct power_supply *psy)
|
|||
register_cooler_failed:
|
||||
psy_unregister_thermal(psy);
|
||||
register_thermal_failed:
|
||||
wakeup_init_failed:
|
||||
device_del(dev);
|
||||
kobject_set_name_failed:
|
||||
device_add_failed:
|
||||
wakeup_init_failed:
|
||||
check_supplies_failed:
|
||||
dev_set_name_failed:
|
||||
put_device(dev);
|
||||
success:
|
||||
return rc;
|
||||
|
|
|
@ -942,7 +942,7 @@ static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
|
|||
return rc;
|
||||
}
|
||||
|
||||
tp->screen = tty3270_alloc_screen(tp->view.cols, tp->view.rows);
|
||||
tp->screen = tty3270_alloc_screen(tp->view.rows, tp->view.cols);
|
||||
if (IS_ERR(tp->screen)) {
|
||||
rc = PTR_ERR(tp->screen);
|
||||
raw3270_put_view(&tp->view);
|
||||
|
|
|
@ -39,7 +39,8 @@ static INT bcm_close(struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static u16 bcm_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
static u16 bcm_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
return ClassifyPacket(netdev_priv(dev), skb);
|
||||
}
|
||||
|
|
|
@ -306,7 +306,8 @@ static netdev_tx_t xlr_net_start_xmit(struct sk_buff *skb,
|
|||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
static u16 xlr_net_select_queue(struct net_device *ndev, struct sk_buff *skb)
|
||||
static u16 xlr_net_select_queue(struct net_device *ndev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
return (u16)smp_processor_id();
|
||||
}
|
||||
|
|
|
@ -652,7 +652,8 @@ static unsigned int rtw_classify8021d(struct sk_buff *skb)
|
|||
return dscp >> 5;
|
||||
}
|
||||
|
||||
static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb)
|
||||
static u16 rtw_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
void *accel_priv)
|
||||
{
|
||||
struct adapter *padapter = rtw_netdev_priv(dev);
|
||||
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue