Merge remote-tracking branch 'common/android-4.9' into hikey-4.9
Change-Id: I996b88b143ac2b1f5c3bc72800f9afcc37f47100
This commit is contained in:
@@ -13,10 +13,6 @@ EnBW AM1808 based CMC board
|
||||
Required root node properties:
|
||||
- compatible = "enbw,cmc", "ti,da850;
|
||||
|
||||
LEGO MINDSTORMS EV3 (AM1808 based)
|
||||
Required root node properties:
|
||||
- compatible = "lego,ev3", "ti,da850";
|
||||
|
||||
Generic DaVinci Boards
|
||||
----------------------
|
||||
|
||||
|
||||
@@ -154,7 +154,6 @@ kosagi Sutajio Ko-Usagi PTE Ltd.
|
||||
kyo Kyocera Corporation
|
||||
lacie LaCie
|
||||
lantiq Lantiq Semiconductor
|
||||
lego LEGO Systems A/S
|
||||
lenovo Lenovo Group Ltd.
|
||||
lg LG Corporation
|
||||
linaro Linaro Limited
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 62
|
||||
SUBLEVEL = 65
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -143,10 +143,11 @@
|
||||
};
|
||||
|
||||
scm_conf: scm_conf@0 {
|
||||
compatible = "syscon";
|
||||
compatible = "syscon", "simple-bus";
|
||||
reg = <0x0 0x800>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0x800>;
|
||||
|
||||
scm_clocks: clocks {
|
||||
#address-cells = <1>;
|
||||
|
||||
@@ -252,7 +252,7 @@
|
||||
};
|
||||
|
||||
uart1: uart@20000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
compatible = "ti,am3352-uart", "ti,omap3-uart";
|
||||
ti,hwmods = "uart1";
|
||||
reg = <0x20000 0x2000>;
|
||||
clock-frequency = <48000000>;
|
||||
@@ -262,7 +262,7 @@
|
||||
};
|
||||
|
||||
uart2: uart@22000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
compatible = "ti,am3352-uart", "ti,omap3-uart";
|
||||
ti,hwmods = "uart2";
|
||||
reg = <0x22000 0x2000>;
|
||||
clock-frequency = <48000000>;
|
||||
@@ -272,7 +272,7 @@
|
||||
};
|
||||
|
||||
uart3: uart@24000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
compatible = "ti,am3352-uart", "ti,omap3-uart";
|
||||
ti,hwmods = "uart3";
|
||||
reg = <0x24000 0x2000>;
|
||||
clock-frequency = <48000000>;
|
||||
@@ -332,10 +332,11 @@
|
||||
ranges = <0 0x140000 0x20000>;
|
||||
|
||||
scm_conf: scm_conf@0 {
|
||||
compatible = "syscon";
|
||||
compatible = "syscon", "simple-bus";
|
||||
reg = <0x0 0x800>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0x800>;
|
||||
|
||||
scm_clocks: clocks {
|
||||
#address-cells = <1>;
|
||||
|
||||
@@ -371,7 +371,7 @@
|
||||
};
|
||||
|
||||
uart1: uart@48020000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
compatible = "ti,am3352-uart", "ti,omap3-uart";
|
||||
ti,hwmods = "uart1";
|
||||
reg = <0x48020000 0x2000>;
|
||||
clock-frequency = <48000000>;
|
||||
@@ -381,7 +381,7 @@
|
||||
};
|
||||
|
||||
uart2: uart@48022000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
compatible = "ti,am3352-uart", "ti,omap3-uart";
|
||||
ti,hwmods = "uart2";
|
||||
reg = <0x48022000 0x2000>;
|
||||
clock-frequency = <48000000>;
|
||||
@@ -391,7 +391,7 @@
|
||||
};
|
||||
|
||||
uart3: uart@48024000 {
|
||||
compatible = "ti,omap3-uart";
|
||||
compatible = "ti,am3352-uart", "ti,omap3-uart";
|
||||
ti,hwmods = "uart3";
|
||||
reg = <0x48024000 0x2000>;
|
||||
clock-frequency = <48000000>;
|
||||
|
||||
@@ -215,16 +215,16 @@
|
||||
|
||||
pinctrl_fec: fecgrp {
|
||||
fsl,pins = <
|
||||
MX53_PAD_FEC_MDC__FEC_MDC 0x4
|
||||
MX53_PAD_FEC_MDIO__FEC_MDIO 0x1fc
|
||||
MX53_PAD_FEC_REF_CLK__FEC_TX_CLK 0x180
|
||||
MX53_PAD_FEC_RX_ER__FEC_RX_ER 0x180
|
||||
MX53_PAD_FEC_CRS_DV__FEC_RX_DV 0x180
|
||||
MX53_PAD_FEC_RXD1__FEC_RDATA_1 0x180
|
||||
MX53_PAD_FEC_RXD0__FEC_RDATA_0 0x180
|
||||
MX53_PAD_FEC_TX_EN__FEC_TX_EN 0x4
|
||||
MX53_PAD_FEC_TXD1__FEC_TDATA_1 0x4
|
||||
MX53_PAD_FEC_TXD0__FEC_TDATA_0 0x4
|
||||
MX53_PAD_FEC_MDC__FEC_MDC 0x80000000
|
||||
MX53_PAD_FEC_MDIO__FEC_MDIO 0x80000000
|
||||
MX53_PAD_FEC_REF_CLK__FEC_TX_CLK 0x80000000
|
||||
MX53_PAD_FEC_RX_ER__FEC_RX_ER 0x80000000
|
||||
MX53_PAD_FEC_CRS_DV__FEC_RX_DV 0x80000000
|
||||
MX53_PAD_FEC_RXD1__FEC_RDATA_1 0x80000000
|
||||
MX53_PAD_FEC_RXD0__FEC_RDATA_0 0x80000000
|
||||
MX53_PAD_FEC_TX_EN__FEC_TX_EN 0x80000000
|
||||
MX53_PAD_FEC_TXD1__FEC_TDATA_1 0x80000000
|
||||
MX53_PAD_FEC_TXD0__FEC_TDATA_0 0x80000000
|
||||
>;
|
||||
};
|
||||
|
||||
|
||||
@@ -18,6 +18,10 @@
|
||||
reg = <0 0x80000000 0 0x7f000000>; /* 2032 MB */
|
||||
};
|
||||
|
||||
aliases {
|
||||
ethernet = ðernet;
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
led1 {
|
||||
@@ -72,6 +76,23 @@
|
||||
>;
|
||||
};
|
||||
|
||||
&usbhsehci {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
hub@2 {
|
||||
compatible = "usb424,3503";
|
||||
reg = <2>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
|
||||
ethernet: usbether@3 {
|
||||
compatible = "usb424,9730";
|
||||
reg = <3>;
|
||||
};
|
||||
};
|
||||
|
||||
&wlcore {
|
||||
compatible = "ti,wl1837";
|
||||
};
|
||||
|
||||
@@ -363,7 +363,7 @@ static struct crypto_alg aesbs_algs[] = { {
|
||||
}, {
|
||||
.cra_name = "cbc(aes)",
|
||||
.cra_driver_name = "cbc-aes-neonbs",
|
||||
.cra_priority = 300,
|
||||
.cra_priority = 250,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER|CRYPTO_ALG_ASYNC,
|
||||
.cra_blocksize = AES_BLOCK_SIZE,
|
||||
.cra_ctxsize = sizeof(struct async_helper_ctx),
|
||||
@@ -383,7 +383,7 @@ static struct crypto_alg aesbs_algs[] = { {
|
||||
}, {
|
||||
.cra_name = "ctr(aes)",
|
||||
.cra_driver_name = "ctr-aes-neonbs",
|
||||
.cra_priority = 300,
|
||||
.cra_priority = 250,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER|CRYPTO_ALG_ASYNC,
|
||||
.cra_blocksize = 1,
|
||||
.cra_ctxsize = sizeof(struct async_helper_ctx),
|
||||
@@ -403,7 +403,7 @@ static struct crypto_alg aesbs_algs[] = { {
|
||||
}, {
|
||||
.cra_name = "xts(aes)",
|
||||
.cra_driver_name = "xts-aes-neonbs",
|
||||
.cra_priority = 300,
|
||||
.cra_priority = 250,
|
||||
.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER|CRYPTO_ALG_ASYNC,
|
||||
.cra_blocksize = AES_BLOCK_SIZE,
|
||||
.cra_ctxsize = sizeof(struct async_helper_ctx),
|
||||
|
||||
@@ -600,7 +600,6 @@ static void pdata_quirks_check(struct pdata_init *quirks)
|
||||
if (of_machine_is_compatible(quirks->compatible)) {
|
||||
if (quirks->fn)
|
||||
quirks->fn();
|
||||
break;
|
||||
}
|
||||
quirks++;
|
||||
}
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/memreserve/ 0x81000000 0x00200000;
|
||||
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/clock/bcm-ns2.h>
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
* If the page is in the bottom half, we have to use the top half. If
|
||||
* the page is in the top half, we have to use the bottom half:
|
||||
*
|
||||
* T = __virt_to_phys(__hyp_idmap_text_start)
|
||||
* T = __pa_symbol(__hyp_idmap_text_start)
|
||||
* if (T & BIT(VA_BITS - 1))
|
||||
* HYP_VA_MIN = 0 //idmap in upper half
|
||||
* else
|
||||
@@ -270,7 +270,7 @@ static inline void __kvm_flush_dcache_pud(pud_t pud)
|
||||
kvm_flush_dcache_to_poc(page_address(page), PUD_SIZE);
|
||||
}
|
||||
|
||||
#define kvm_virt_to_phys(x) __virt_to_phys((unsigned long)(x))
|
||||
#define kvm_virt_to_phys(x) __pa_symbol(x)
|
||||
|
||||
void kvm_set_way_flush(struct kvm_vcpu *vcpu);
|
||||
void kvm_toggle_cache(struct kvm_vcpu *vcpu, bool was_enabled);
|
||||
|
||||
@@ -205,6 +205,7 @@ static inline void *phys_to_virt(phys_addr_t x)
|
||||
#define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x)))
|
||||
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
||||
#define virt_to_pfn(x) __phys_to_pfn(__virt_to_phys(x))
|
||||
#define sym_to_pfn(x) __phys_to_pfn(__pa_symbol(x))
|
||||
|
||||
/*
|
||||
* virt_to_page(k) convert a _valid_ virtual address to struct page *
|
||||
|
||||
@@ -45,7 +45,7 @@ static inline void contextidr_thread_switch(struct task_struct *next)
|
||||
*/
|
||||
static inline void cpu_set_reserved_ttbr0(void)
|
||||
{
|
||||
unsigned long ttbr = virt_to_phys(empty_zero_page);
|
||||
unsigned long ttbr = __pa_symbol(empty_zero_page);
|
||||
|
||||
write_sysreg(ttbr, ttbr0_el1);
|
||||
isb();
|
||||
@@ -114,7 +114,7 @@ static inline void cpu_install_idmap(void)
|
||||
local_flush_tlb_all();
|
||||
cpu_set_idmap_tcr_t0sz();
|
||||
|
||||
cpu_switch_mm(idmap_pg_dir, &init_mm);
|
||||
cpu_switch_mm(lm_alias(idmap_pg_dir), &init_mm);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -129,7 +129,7 @@ static inline void cpu_replace_ttbr1(pgd_t *pgd)
|
||||
|
||||
phys_addr_t pgd_phys = virt_to_phys(pgd);
|
||||
|
||||
replace_phys = (void *)virt_to_phys(idmap_cpu_replace_ttbr1);
|
||||
replace_phys = (void *)__pa_symbol(idmap_cpu_replace_ttbr1);
|
||||
|
||||
cpu_install_idmap();
|
||||
replace_phys(pgd_phys);
|
||||
|
||||
@@ -52,7 +52,7 @@ extern void __pgd_error(const char *file, int line, unsigned long val);
|
||||
* for zero-mapped memory areas etc..
|
||||
*/
|
||||
extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
|
||||
#define ZERO_PAGE(vaddr) pfn_to_page(PHYS_PFN(__pa(empty_zero_page)))
|
||||
#define ZERO_PAGE(vaddr) phys_to_page(__pa_symbol(empty_zero_page))
|
||||
|
||||
#define pte_ERROR(pte) __pte_error(__FILE__, __LINE__, pte_val(pte))
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/cpu_ops.h>
|
||||
@@ -109,7 +110,7 @@ static int acpi_parking_protocol_cpu_boot(unsigned int cpu)
|
||||
* that read this address need to convert this address to the
|
||||
* Boot-Loader's endianness before jumping.
|
||||
*/
|
||||
writeq_relaxed(__pa(secondary_entry), &mailbox->entry_point);
|
||||
writeq_relaxed(__pa_symbol(secondary_entry), &mailbox->entry_point);
|
||||
writel_relaxed(cpu_entry->gic_cpu_id, &mailbox->cpu_id);
|
||||
|
||||
arch_send_wakeup_ipi_mask(cpumask_of(cpu));
|
||||
|
||||
@@ -24,7 +24,7 @@ static inline void __noreturn cpu_soft_restart(unsigned long el2_switch,
|
||||
|
||||
el2_switch = el2_switch && !is_kernel_in_hyp_mode() &&
|
||||
is_hyp_mode_available();
|
||||
restart = (void *)virt_to_phys(__cpu_soft_restart);
|
||||
restart = (void *)__pa_symbol(__cpu_soft_restart);
|
||||
|
||||
cpu_install_idmap();
|
||||
restart(el2_switch, entry, arg0, arg1, arg2);
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/sort.h>
|
||||
#include <linux/stop_machine.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/cpu_ops.h>
|
||||
@@ -739,7 +740,7 @@ static bool runs_at_el2(const struct arm64_cpu_capabilities *entry, int __unused
|
||||
static bool hyp_offset_low(const struct arm64_cpu_capabilities *entry,
|
||||
int __unused)
|
||||
{
|
||||
phys_addr_t idmap_addr = virt_to_phys(__hyp_idmap_text_start);
|
||||
phys_addr_t idmap_addr = __pa_symbol(__hyp_idmap_text_start);
|
||||
|
||||
/*
|
||||
* Activate the lower HYP offset only if:
|
||||
|
||||
@@ -50,9 +50,6 @@
|
||||
*/
|
||||
extern int in_suspend;
|
||||
|
||||
/* Find a symbols alias in the linear map */
|
||||
#define LMADDR(x) phys_to_virt(virt_to_phys(x))
|
||||
|
||||
/* Do we need to reset el2? */
|
||||
#define el2_reset_needed() (is_hyp_mode_available() && !is_kernel_in_hyp_mode())
|
||||
|
||||
@@ -102,8 +99,8 @@ static inline void arch_hdr_invariants(struct arch_hibernate_hdr_invariants *i)
|
||||
|
||||
int pfn_is_nosave(unsigned long pfn)
|
||||
{
|
||||
unsigned long nosave_begin_pfn = virt_to_pfn(&__nosave_begin);
|
||||
unsigned long nosave_end_pfn = virt_to_pfn(&__nosave_end - 1);
|
||||
unsigned long nosave_begin_pfn = sym_to_pfn(&__nosave_begin);
|
||||
unsigned long nosave_end_pfn = sym_to_pfn(&__nosave_end - 1);
|
||||
|
||||
return (pfn >= nosave_begin_pfn) && (pfn <= nosave_end_pfn);
|
||||
}
|
||||
@@ -125,12 +122,12 @@ int arch_hibernation_header_save(void *addr, unsigned int max_size)
|
||||
return -EOVERFLOW;
|
||||
|
||||
arch_hdr_invariants(&hdr->invariants);
|
||||
hdr->ttbr1_el1 = virt_to_phys(swapper_pg_dir);
|
||||
hdr->ttbr1_el1 = __pa_symbol(swapper_pg_dir);
|
||||
hdr->reenter_kernel = _cpu_resume;
|
||||
|
||||
/* We can't use __hyp_get_vectors() because kvm may still be loaded */
|
||||
if (el2_reset_needed())
|
||||
hdr->__hyp_stub_vectors = virt_to_phys(__hyp_stub_vectors);
|
||||
hdr->__hyp_stub_vectors = __pa_symbol(__hyp_stub_vectors);
|
||||
else
|
||||
hdr->__hyp_stub_vectors = 0;
|
||||
|
||||
@@ -460,7 +457,6 @@ int swsusp_arch_resume(void)
|
||||
void *zero_page;
|
||||
size_t exit_size;
|
||||
pgd_t *tmp_pg_dir;
|
||||
void *lm_restore_pblist;
|
||||
phys_addr_t phys_hibernate_exit;
|
||||
void __noreturn (*hibernate_exit)(phys_addr_t, phys_addr_t, void *,
|
||||
void *, phys_addr_t, phys_addr_t);
|
||||
@@ -480,12 +476,6 @@ int swsusp_arch_resume(void)
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* Since we only copied the linear map, we need to find restore_pblist's
|
||||
* linear map address.
|
||||
*/
|
||||
lm_restore_pblist = LMADDR(restore_pblist);
|
||||
|
||||
/*
|
||||
* We need a zero page that is zero before & after resume in order to
|
||||
* to break before make on the ttbr1 page tables.
|
||||
@@ -537,7 +527,7 @@ int swsusp_arch_resume(void)
|
||||
}
|
||||
|
||||
hibernate_exit(virt_to_phys(tmp_pg_dir), resume_hdr.ttbr1_el1,
|
||||
resume_hdr.reenter_kernel, lm_restore_pblist,
|
||||
resume_hdr.reenter_kernel, restore_pblist,
|
||||
resume_hdr.__hyp_stub_vectors, virt_to_phys(zero_page));
|
||||
|
||||
out:
|
||||
|
||||
@@ -97,7 +97,7 @@ static void __kprobes *patch_map(void *addr, int fixmap)
|
||||
if (module && IS_ENABLED(CONFIG_DEBUG_SET_MODULE_RONX))
|
||||
page = vmalloc_to_page(addr);
|
||||
else if (!module)
|
||||
page = pfn_to_page(PHYS_PFN(__pa(addr)));
|
||||
page = phys_to_page(__pa_symbol(addr));
|
||||
else
|
||||
return addr;
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include <linux/smp.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/psci.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <uapi/linux/psci.h>
|
||||
|
||||
@@ -45,7 +46,7 @@ static int __init cpu_psci_cpu_prepare(unsigned int cpu)
|
||||
|
||||
static int cpu_psci_cpu_boot(unsigned int cpu)
|
||||
{
|
||||
int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa(secondary_entry));
|
||||
int err = psci_ops.cpu_on(cpu_logical_map(cpu), __pa_symbol(secondary_entry));
|
||||
if (err)
|
||||
pr_err("failed to boot CPU%d (%d)\n", cpu, err);
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
#include <linux/of_fdt.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/psci.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/acpi.h>
|
||||
#include <asm/fixmap.h>
|
||||
@@ -199,10 +200,10 @@ static void __init request_standard_resources(void)
|
||||
struct memblock_region *region;
|
||||
struct resource *res;
|
||||
|
||||
kernel_code.start = virt_to_phys(_text);
|
||||
kernel_code.end = virt_to_phys(__init_begin - 1);
|
||||
kernel_data.start = virt_to_phys(_sdata);
|
||||
kernel_data.end = virt_to_phys(_end - 1);
|
||||
kernel_code.start = __pa_symbol(_text);
|
||||
kernel_code.end = __pa_symbol(__init_begin - 1);
|
||||
kernel_data.start = __pa_symbol(_sdata);
|
||||
kernel_data.end = __pa_symbol(_end - 1);
|
||||
|
||||
for_each_memblock(memory, region) {
|
||||
res = alloc_bootmem_low(sizeof(*res));
|
||||
@@ -297,7 +298,7 @@ void __init setup_arch(char **cmdline_p)
|
||||
* faults in case uaccess_enable() is inadvertently called by the init
|
||||
* thread.
|
||||
*/
|
||||
init_thread_info.ttbr0 = virt_to_phys(empty_zero_page);
|
||||
init_thread_info.ttbr0 = __pa_symbol(empty_zero_page);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_VT
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/of.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cpu_ops.h>
|
||||
@@ -98,7 +99,7 @@ static int smp_spin_table_cpu_prepare(unsigned int cpu)
|
||||
* boot-loader's endianess before jumping. This is mandated by
|
||||
* the boot protocol.
|
||||
*/
|
||||
writeq_relaxed(__pa(secondary_holding_pen), release_addr);
|
||||
writeq_relaxed(__pa_symbol(secondary_holding_pen), release_addr);
|
||||
__flush_dcache_area((__force void *)release_addr,
|
||||
sizeof(*release_addr));
|
||||
|
||||
|
||||
@@ -123,6 +123,7 @@ static int __init vdso_init(void)
|
||||
{
|
||||
int i;
|
||||
struct page **vdso_pagelist;
|
||||
unsigned long pfn;
|
||||
|
||||
if (memcmp(&vdso_start, "\177ELF", 4)) {
|
||||
pr_err("vDSO is not a valid ELF object!\n");
|
||||
@@ -140,11 +141,14 @@ static int __init vdso_init(void)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Grab the vDSO data page. */
|
||||
vdso_pagelist[0] = pfn_to_page(PHYS_PFN(__pa(vdso_data)));
|
||||
vdso_pagelist[0] = phys_to_page(__pa_symbol(vdso_data));
|
||||
|
||||
|
||||
/* Grab the vDSO code pages. */
|
||||
pfn = sym_to_pfn(&vdso_start);
|
||||
|
||||
for (i = 0; i < vdso_pages; i++)
|
||||
vdso_pagelist[i + 1] = pfn_to_page(PHYS_PFN(__pa(&vdso_start)) + i);
|
||||
vdso_pagelist[i + 1] = pfn_to_page(pfn + i);
|
||||
|
||||
vdso_spec[0].pages = &vdso_pagelist[0];
|
||||
vdso_spec[1].pages = &vdso_pagelist[1];
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <linux/efi.h>
|
||||
#include <linux/swiotlb.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/boot.h>
|
||||
#include <asm/fixmap.h>
|
||||
@@ -211,8 +212,8 @@ void __init arm64_memblock_init(void)
|
||||
* linear mapping. Take care not to clip the kernel which may be
|
||||
* high in memory.
|
||||
*/
|
||||
memblock_remove(max_t(u64, memstart_addr + linear_region_size, __pa(_end)),
|
||||
ULLONG_MAX);
|
||||
memblock_remove(max_t(u64, memstart_addr + linear_region_size,
|
||||
__pa_symbol(_end)), ULLONG_MAX);
|
||||
if (memstart_addr + linear_region_size < memblock_end_of_DRAM()) {
|
||||
/* ensure that memstart_addr remains sufficiently aligned */
|
||||
memstart_addr = round_up(memblock_end_of_DRAM() - linear_region_size,
|
||||
@@ -227,7 +228,7 @@ void __init arm64_memblock_init(void)
|
||||
*/
|
||||
if (memory_limit != (phys_addr_t)ULLONG_MAX) {
|
||||
memblock_mem_limit_remove_map(memory_limit);
|
||||
memblock_add(__pa(_text), (u64)(_end - _text));
|
||||
memblock_add(__pa_symbol(_text), (u64)(_end - _text));
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_start) {
|
||||
@@ -280,7 +281,7 @@ void __init arm64_memblock_init(void)
|
||||
* Register the kernel text, kernel data, initrd, and initial
|
||||
* pagetables with memblock.
|
||||
*/
|
||||
memblock_reserve(__pa(_text), _end - _text);
|
||||
memblock_reserve(__pa_symbol(_text), _end - _text);
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
if (initrd_start) {
|
||||
memblock_reserve(initrd_start, initrd_end - initrd_start);
|
||||
@@ -488,7 +489,8 @@ void __init mem_init(void)
|
||||
|
||||
void free_initmem(void)
|
||||
{
|
||||
free_reserved_area(__va(__pa(__init_begin)), __va(__pa(__init_end)),
|
||||
free_reserved_area(lm_alias(__init_begin),
|
||||
lm_alias(__init_end),
|
||||
0, "unused kernel");
|
||||
/*
|
||||
* Unmap the __init region but leave the VM area in place. This
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/start_kernel.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/kernel-pgtable.h>
|
||||
@@ -26,6 +27,13 @@
|
||||
|
||||
static pgd_t tmp_pg_dir[PTRS_PER_PGD] __initdata __aligned(PGD_SIZE);
|
||||
|
||||
/*
|
||||
* The p*d_populate functions call virt_to_phys implicitly so they can't be used
|
||||
* directly on kernel symbols (bm_p*d). All the early functions are called too
|
||||
* early to use lm_alias so __p*d_populate functions must be used to populate
|
||||
* with the physical address from __pa_symbol.
|
||||
*/
|
||||
|
||||
static void __init kasan_early_pte_populate(pmd_t *pmd, unsigned long addr,
|
||||
unsigned long end)
|
||||
{
|
||||
@@ -33,12 +41,12 @@ static void __init kasan_early_pte_populate(pmd_t *pmd, unsigned long addr,
|
||||
unsigned long next;
|
||||
|
||||
if (pmd_none(*pmd))
|
||||
pmd_populate_kernel(&init_mm, pmd, kasan_zero_pte);
|
||||
__pmd_populate(pmd, __pa_symbol(kasan_zero_pte), PMD_TYPE_TABLE);
|
||||
|
||||
pte = pte_offset_kimg(pmd, addr);
|
||||
do {
|
||||
next = addr + PAGE_SIZE;
|
||||
set_pte(pte, pfn_pte(virt_to_pfn(kasan_zero_page),
|
||||
set_pte(pte, pfn_pte(sym_to_pfn(kasan_zero_page),
|
||||
PAGE_KERNEL));
|
||||
} while (pte++, addr = next, addr != end && pte_none(*pte));
|
||||
}
|
||||
@@ -51,7 +59,7 @@ static void __init kasan_early_pmd_populate(pud_t *pud,
|
||||
unsigned long next;
|
||||
|
||||
if (pud_none(*pud))
|
||||
pud_populate(&init_mm, pud, kasan_zero_pmd);
|
||||
__pud_populate(pud, __pa_symbol(kasan_zero_pmd), PMD_TYPE_TABLE);
|
||||
|
||||
pmd = pmd_offset_kimg(pud, addr);
|
||||
do {
|
||||
@@ -68,7 +76,7 @@ static void __init kasan_early_pud_populate(pgd_t *pgd,
|
||||
unsigned long next;
|
||||
|
||||
if (pgd_none(*pgd))
|
||||
pgd_populate(&init_mm, pgd, kasan_zero_pud);
|
||||
__pgd_populate(pgd, __pa_symbol(kasan_zero_pud), PUD_TYPE_TABLE);
|
||||
|
||||
pud = pud_offset_kimg(pgd, addr);
|
||||
do {
|
||||
@@ -148,7 +156,7 @@ void __init kasan_init(void)
|
||||
*/
|
||||
memcpy(tmp_pg_dir, swapper_pg_dir, sizeof(tmp_pg_dir));
|
||||
dsb(ishst);
|
||||
cpu_replace_ttbr1(tmp_pg_dir);
|
||||
cpu_replace_ttbr1(lm_alias(tmp_pg_dir));
|
||||
|
||||
clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END);
|
||||
|
||||
@@ -199,10 +207,10 @@ void __init kasan_init(void)
|
||||
*/
|
||||
for (i = 0; i < PTRS_PER_PTE; i++)
|
||||
set_pte(&kasan_zero_pte[i],
|
||||
pfn_pte(virt_to_pfn(kasan_zero_page), PAGE_KERNEL_RO));
|
||||
pfn_pte(sym_to_pfn(kasan_zero_page), PAGE_KERNEL_RO));
|
||||
|
||||
memset(kasan_zero_page, 0, PAGE_SIZE);
|
||||
cpu_replace_ttbr1(swapper_pg_dir);
|
||||
cpu_replace_ttbr1(lm_alias(swapper_pg_dir));
|
||||
|
||||
/* At this point kasan is fully initialized. Enable error messages */
|
||||
init_task.kasan_depth = 0;
|
||||
|
||||
+21
-12
@@ -30,6 +30,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/stop_machine.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/barrier.h>
|
||||
#include <asm/cputype.h>
|
||||
@@ -319,8 +320,8 @@ static void create_mapping_late(phys_addr_t phys, unsigned long virt,
|
||||
|
||||
static void __init __map_memblock(pgd_t *pgd, phys_addr_t start, phys_addr_t end)
|
||||
{
|
||||
unsigned long kernel_start = __pa(_text);
|
||||
unsigned long kernel_end = __pa(__init_begin);
|
||||
unsigned long kernel_start = __pa_symbol(_text);
|
||||
unsigned long kernel_end = __pa_symbol(__init_begin);
|
||||
|
||||
/*
|
||||
* Take care not to create a writable alias for the
|
||||
@@ -387,21 +388,21 @@ void mark_rodata_ro(void)
|
||||
unsigned long section_size;
|
||||
|
||||
section_size = (unsigned long)_etext - (unsigned long)_text;
|
||||
create_mapping_late(__pa(_text), (unsigned long)_text,
|
||||
create_mapping_late(__pa_symbol(_text), (unsigned long)_text,
|
||||
section_size, PAGE_KERNEL_ROX);
|
||||
/*
|
||||
* mark .rodata as read only. Use __init_begin rather than __end_rodata
|
||||
* to cover NOTES and EXCEPTION_TABLE.
|
||||
*/
|
||||
section_size = (unsigned long)__init_begin - (unsigned long)__start_rodata;
|
||||
create_mapping_late(__pa(__start_rodata), (unsigned long)__start_rodata,
|
||||
create_mapping_late(__pa_symbol(__start_rodata), (unsigned long)__start_rodata,
|
||||
section_size, PAGE_KERNEL_RO);
|
||||
}
|
||||
|
||||
static void __init map_kernel_segment(pgd_t *pgd, void *va_start, void *va_end,
|
||||
pgprot_t prot, struct vm_struct *vma)
|
||||
{
|
||||
phys_addr_t pa_start = __pa(va_start);
|
||||
phys_addr_t pa_start = __pa_symbol(va_start);
|
||||
unsigned long size = va_end - va_start;
|
||||
|
||||
BUG_ON(!PAGE_ALIGNED(pa_start));
|
||||
@@ -449,7 +450,7 @@ static void __init map_kernel(pgd_t *pgd)
|
||||
*/
|
||||
BUG_ON(!IS_ENABLED(CONFIG_ARM64_16K_PAGES));
|
||||
set_pud(pud_set_fixmap_offset(pgd, FIXADDR_START),
|
||||
__pud(__pa(bm_pmd) | PUD_TYPE_TABLE));
|
||||
__pud(__pa_symbol(bm_pmd) | PUD_TYPE_TABLE));
|
||||
pud_clear_fixmap();
|
||||
} else {
|
||||
BUG();
|
||||
@@ -480,7 +481,7 @@ void __init paging_init(void)
|
||||
*/
|
||||
cpu_replace_ttbr1(__va(pgd_phys));
|
||||
memcpy(swapper_pg_dir, pgd, PAGE_SIZE);
|
||||
cpu_replace_ttbr1(swapper_pg_dir);
|
||||
cpu_replace_ttbr1(lm_alias(swapper_pg_dir));
|
||||
|
||||
pgd_clear_fixmap();
|
||||
memblock_free(pgd_phys, PAGE_SIZE);
|
||||
@@ -489,7 +490,7 @@ void __init paging_init(void)
|
||||
* We only reuse the PGD from the swapper_pg_dir, not the pud + pmd
|
||||
* allocated with it.
|
||||
*/
|
||||
memblock_free(__pa(swapper_pg_dir) + PAGE_SIZE,
|
||||
memblock_free(__pa_symbol(swapper_pg_dir) + PAGE_SIZE,
|
||||
SWAPPER_DIR_SIZE - PAGE_SIZE);
|
||||
}
|
||||
|
||||
@@ -600,6 +601,12 @@ static inline pte_t * fixmap_pte(unsigned long addr)
|
||||
return &bm_pte[pte_index(addr)];
|
||||
}
|
||||
|
||||
/*
|
||||
* The p*d_populate functions call virt_to_phys implicitly so they can't be used
|
||||
* directly on kernel symbols (bm_p*d). This function is called too early to use
|
||||
* lm_alias so __p*d_populate functions must be used to populate with the
|
||||
* physical address from __pa_symbol.
|
||||
*/
|
||||
void __init early_fixmap_init(void)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
@@ -609,7 +616,7 @@ void __init early_fixmap_init(void)
|
||||
|
||||
pgd = pgd_offset_k(addr);
|
||||
if (CONFIG_PGTABLE_LEVELS > 3 &&
|
||||
!(pgd_none(*pgd) || pgd_page_paddr(*pgd) == __pa(bm_pud))) {
|
||||
!(pgd_none(*pgd) || pgd_page_paddr(*pgd) == __pa_symbol(bm_pud))) {
|
||||
/*
|
||||
* We only end up here if the kernel mapping and the fixmap
|
||||
* share the top level pgd entry, which should only happen on
|
||||
@@ -618,12 +625,14 @@ void __init early_fixmap_init(void)
|
||||
BUG_ON(!IS_ENABLED(CONFIG_ARM64_16K_PAGES));
|
||||
pud = pud_offset_kimg(pgd, addr);
|
||||
} else {
|
||||
pgd_populate(&init_mm, pgd, bm_pud);
|
||||
if (pgd_none(*pgd))
|
||||
__pgd_populate(pgd, __pa_symbol(bm_pud), PUD_TYPE_TABLE);
|
||||
pud = fixmap_pud(addr);
|
||||
}
|
||||
pud_populate(&init_mm, pud, bm_pmd);
|
||||
if (pud_none(*pud))
|
||||
__pud_populate(pud, __pa_symbol(bm_pmd), PMD_TYPE_TABLE);
|
||||
pmd = fixmap_pmd(addr);
|
||||
pmd_populate_kernel(&init_mm, pmd, bm_pte);
|
||||
__pmd_populate(pmd, __pa_symbol(bm_pte), PMD_TYPE_TABLE);
|
||||
|
||||
/*
|
||||
* The boot-ioremap range spans multiple pmds, for which
|
||||
|
||||
@@ -54,7 +54,8 @@
|
||||
.align 2; \
|
||||
.type symbol, @function; \
|
||||
.ent symbol, 0; \
|
||||
symbol: .frame sp, 0, ra
|
||||
symbol: .frame sp, 0, ra; \
|
||||
.insn
|
||||
|
||||
/*
|
||||
* NESTED - declare nested routine entry point
|
||||
@@ -63,8 +64,9 @@ symbol: .frame sp, 0, ra
|
||||
.globl symbol; \
|
||||
.align 2; \
|
||||
.type symbol, @function; \
|
||||
.ent symbol, 0; \
|
||||
symbol: .frame sp, framesize, rpc
|
||||
.ent symbol, 0; \
|
||||
symbol: .frame sp, framesize, rpc; \
|
||||
.insn
|
||||
|
||||
/*
|
||||
* END - mark end of function
|
||||
@@ -86,7 +88,7 @@ symbol:
|
||||
#define FEXPORT(symbol) \
|
||||
.globl symbol; \
|
||||
.type symbol, @function; \
|
||||
symbol:
|
||||
symbol: .insn
|
||||
|
||||
/*
|
||||
* ABS - export absolute symbol
|
||||
|
||||
@@ -187,6 +187,7 @@ BUILD_CM_R_(config, MIPS_CM_GCB_OFS + 0x00)
|
||||
BUILD_CM_RW(base, MIPS_CM_GCB_OFS + 0x08)
|
||||
BUILD_CM_RW(access, MIPS_CM_GCB_OFS + 0x20)
|
||||
BUILD_CM_R_(rev, MIPS_CM_GCB_OFS + 0x30)
|
||||
BUILD_CM_RW(err_control, MIPS_CM_GCB_OFS + 0x38)
|
||||
BUILD_CM_RW(error_mask, MIPS_CM_GCB_OFS + 0x40)
|
||||
BUILD_CM_RW(error_cause, MIPS_CM_GCB_OFS + 0x48)
|
||||
BUILD_CM_RW(error_addr, MIPS_CM_GCB_OFS + 0x50)
|
||||
@@ -266,6 +267,12 @@ BUILD_CM_Cx_R_(tcid_8_priority, 0x80)
|
||||
#define CM_REV_CM2_5 CM_ENCODE_REV(7, 0)
|
||||
#define CM_REV_CM3 CM_ENCODE_REV(8, 0)
|
||||
|
||||
/* GCR_ERR_CONTROL register fields */
|
||||
#define CM_GCR_ERR_CONTROL_L2_ECC_EN_SHF 1
|
||||
#define CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK (_ULCAST_(0x1) << 1)
|
||||
#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_SHF 0
|
||||
#define CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_MSK (_ULCAST_(0x1) << 0)
|
||||
|
||||
/* GCR_ERROR_CAUSE register fields */
|
||||
#define CM_GCR_ERROR_CAUSE_ERRTYPE_SHF 27
|
||||
#define CM_GCR_ERROR_CAUSE_ERRTYPE_MSK (_ULCAST_(0x1f) << 27)
|
||||
|
||||
@@ -153,6 +153,35 @@ void __init detect_memory_region(phys_addr_t start, phys_addr_t sz_min, phys_add
|
||||
add_memory_region(start, size, BOOT_MEM_RAM);
|
||||
}
|
||||
|
||||
bool __init memory_region_available(phys_addr_t start, phys_addr_t size)
|
||||
{
|
||||
int i;
|
||||
bool in_ram = false, free = true;
|
||||
|
||||
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
||||
phys_addr_t start_, end_;
|
||||
|
||||
start_ = boot_mem_map.map[i].addr;
|
||||
end_ = boot_mem_map.map[i].addr + boot_mem_map.map[i].size;
|
||||
|
||||
switch (boot_mem_map.map[i].type) {
|
||||
case BOOT_MEM_RAM:
|
||||
if (start >= start_ && start + size <= end_)
|
||||
in_ram = true;
|
||||
break;
|
||||
case BOOT_MEM_RESERVED:
|
||||
if ((start >= start_ && start < end_) ||
|
||||
(start < start_ && start + size >= start_))
|
||||
free = false;
|
||||
break;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return in_ram && free;
|
||||
}
|
||||
|
||||
static void __init print_memory_map(void)
|
||||
{
|
||||
int i;
|
||||
@@ -332,11 +361,19 @@ static void __init bootmem_init(void)
|
||||
|
||||
#else /* !CONFIG_SGI_IP27 */
|
||||
|
||||
static unsigned long __init bootmap_bytes(unsigned long pages)
|
||||
{
|
||||
unsigned long bytes = DIV_ROUND_UP(pages, 8);
|
||||
|
||||
return ALIGN(bytes, sizeof(long));
|
||||
}
|
||||
|
||||
static void __init bootmem_init(void)
|
||||
{
|
||||
unsigned long reserved_end;
|
||||
unsigned long mapstart = ~0UL;
|
||||
unsigned long bootmap_size;
|
||||
bool bootmap_valid = false;
|
||||
int i;
|
||||
|
||||
/*
|
||||
@@ -429,12 +466,43 @@ static void __init bootmem_init(void)
|
||||
mapstart = max(mapstart, (unsigned long)PFN_UP(__pa(initrd_end)));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* check that mapstart doesn't overlap with any of
|
||||
* memory regions that have been reserved through eg. DTB
|
||||
*/
|
||||
bootmap_size = bootmap_bytes(max_low_pfn - min_low_pfn);
|
||||
|
||||
bootmap_valid = memory_region_available(PFN_PHYS(mapstart),
|
||||
bootmap_size);
|
||||
for (i = 0; i < boot_mem_map.nr_map && !bootmap_valid; i++) {
|
||||
unsigned long mapstart_addr;
|
||||
|
||||
switch (boot_mem_map.map[i].type) {
|
||||
case BOOT_MEM_RESERVED:
|
||||
mapstart_addr = PFN_ALIGN(boot_mem_map.map[i].addr +
|
||||
boot_mem_map.map[i].size);
|
||||
if (PHYS_PFN(mapstart_addr) < mapstart)
|
||||
break;
|
||||
|
||||
bootmap_valid = memory_region_available(mapstart_addr,
|
||||
bootmap_size);
|
||||
if (bootmap_valid)
|
||||
mapstart = PHYS_PFN(mapstart_addr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!bootmap_valid)
|
||||
panic("No memory area to place a bootmap bitmap");
|
||||
|
||||
/*
|
||||
* Initialize the boot-time allocator with low memory only.
|
||||
*/
|
||||
bootmap_size = init_bootmem_node(NODE_DATA(0), mapstart,
|
||||
min_low_pfn, max_low_pfn);
|
||||
|
||||
if (bootmap_size != init_bootmem_node(NODE_DATA(0), mapstart,
|
||||
min_low_pfn, max_low_pfn))
|
||||
panic("Unexpected memory size required for bootmap");
|
||||
|
||||
for (i = 0; i < boot_mem_map.nr_map; i++) {
|
||||
unsigned long start, end;
|
||||
@@ -483,6 +551,10 @@ static void __init bootmem_init(void)
|
||||
continue;
|
||||
default:
|
||||
/* Not usable memory */
|
||||
if (start > min_low_pfn && end < max_low_pfn)
|
||||
reserve_bootmem(boot_mem_map.map[i].addr,
|
||||
boot_mem_map.map[i].size,
|
||||
BOOTMEM_DEFAULT);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
#include <asm/idle.h>
|
||||
#include <asm/mips-cm.h>
|
||||
#include <asm/mips-r2-to-r6-emul.h>
|
||||
#include <asm/mips-cm.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/mipsmtregs.h>
|
||||
#include <asm/module.h>
|
||||
@@ -1646,6 +1647,65 @@ __setup("nol2par", nol2parity);
|
||||
*/
|
||||
static inline void parity_protection_init(void)
|
||||
{
|
||||
#define ERRCTL_PE 0x80000000
|
||||
#define ERRCTL_L2P 0x00800000
|
||||
|
||||
if (mips_cm_revision() >= CM_REV_CM3) {
|
||||
ulong gcr_ectl, cp0_ectl;
|
||||
|
||||
/*
|
||||
* With CM3 systems we need to ensure that the L1 & L2
|
||||
* parity enables are set to the same value, since this
|
||||
* is presumed by the hardware engineers.
|
||||
*
|
||||
* If the user disabled either of L1 or L2 ECC checking,
|
||||
* disable both.
|
||||
*/
|
||||
l1parity &= l2parity;
|
||||
l2parity &= l1parity;
|
||||
|
||||
/* Probe L1 ECC support */
|
||||
cp0_ectl = read_c0_ecc();
|
||||
write_c0_ecc(cp0_ectl | ERRCTL_PE);
|
||||
back_to_back_c0_hazard();
|
||||
cp0_ectl = read_c0_ecc();
|
||||
|
||||
/* Probe L2 ECC support */
|
||||
gcr_ectl = read_gcr_err_control();
|
||||
|
||||
if (!(gcr_ectl & CM_GCR_ERR_CONTROL_L2_ECC_SUPPORT_MSK) ||
|
||||
!(cp0_ectl & ERRCTL_PE)) {
|
||||
/*
|
||||
* One of L1 or L2 ECC checking isn't supported,
|
||||
* so we cannot enable either.
|
||||
*/
|
||||
l1parity = l2parity = 0;
|
||||
}
|
||||
|
||||
/* Configure L1 ECC checking */
|
||||
if (l1parity)
|
||||
cp0_ectl |= ERRCTL_PE;
|
||||
else
|
||||
cp0_ectl &= ~ERRCTL_PE;
|
||||
write_c0_ecc(cp0_ectl);
|
||||
back_to_back_c0_hazard();
|
||||
WARN_ON(!!(read_c0_ecc() & ERRCTL_PE) != l1parity);
|
||||
|
||||
/* Configure L2 ECC checking */
|
||||
if (l2parity)
|
||||
gcr_ectl |= CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK;
|
||||
else
|
||||
gcr_ectl &= ~CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK;
|
||||
write_gcr_err_control(gcr_ectl);
|
||||
gcr_ectl = read_gcr_err_control();
|
||||
gcr_ectl &= CM_GCR_ERR_CONTROL_L2_ECC_EN_MSK;
|
||||
WARN_ON(!!gcr_ectl != l2parity);
|
||||
|
||||
pr_info("Cache parity protection %sabled\n",
|
||||
l1parity ? "en" : "dis");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (current_cpu_type()) {
|
||||
case CPU_24K:
|
||||
case CPU_34K:
|
||||
@@ -1656,11 +1716,8 @@ static inline void parity_protection_init(void)
|
||||
case CPU_PROAPTIV:
|
||||
case CPU_P5600:
|
||||
case CPU_QEMU_GENERIC:
|
||||
case CPU_I6400:
|
||||
case CPU_P6600:
|
||||
{
|
||||
#define ERRCTL_PE 0x80000000
|
||||
#define ERRCTL_L2P 0x00800000
|
||||
unsigned long errctl;
|
||||
unsigned int l1parity_present, l2parity_present;
|
||||
|
||||
|
||||
@@ -275,7 +275,7 @@ asmlinkage void plat_irq_dispatch(void)
|
||||
do_IRQ(nlm_irq_to_xirq(node, i));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
#ifdef CONFIG_CPU_XLP
|
||||
static const struct irq_domain_ops xlp_pic_irq_domain_ops = {
|
||||
.xlate = irq_domain_xlate_onetwocell,
|
||||
};
|
||||
@@ -348,7 +348,7 @@ void __init arch_init_irq(void)
|
||||
#if defined(CONFIG_CPU_XLR)
|
||||
nlm_setup_fmn_irq();
|
||||
#endif
|
||||
#if defined(CONFIG_OF)
|
||||
#ifdef CONFIG_CPU_XLP
|
||||
of_irq_init(xlp_pic_irq_ids);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -1087,11 +1087,6 @@ source "arch/powerpc/Kconfig.debug"
|
||||
|
||||
source "security/Kconfig"
|
||||
|
||||
config KEYS_COMPAT
|
||||
bool
|
||||
depends on COMPAT && KEYS
|
||||
default y
|
||||
|
||||
source "crypto/Kconfig"
|
||||
|
||||
config PPC_LIB_RHEAP
|
||||
|
||||
@@ -359,9 +359,6 @@ config COMPAT
|
||||
config SYSVIPC_COMPAT
|
||||
def_bool y if COMPAT && SYSVIPC
|
||||
|
||||
config KEYS_COMPAT
|
||||
def_bool y if COMPAT && KEYS
|
||||
|
||||
config SMP
|
||||
def_bool y
|
||||
prompt "Symmetric multi-processing support"
|
||||
|
||||
@@ -568,9 +568,6 @@ config SYSVIPC_COMPAT
|
||||
depends on COMPAT && SYSVIPC
|
||||
default y
|
||||
|
||||
config KEYS_COMPAT
|
||||
def_bool y if COMPAT && KEYS
|
||||
|
||||
endmenu
|
||||
|
||||
source "net/Kconfig"
|
||||
|
||||
@@ -2732,10 +2732,6 @@ config COMPAT_FOR_U64_ALIGNMENT
|
||||
config SYSVIPC_COMPAT
|
||||
def_bool y
|
||||
depends on SYSVIPC
|
||||
|
||||
config KEYS_COMPAT
|
||||
def_bool y
|
||||
depends on KEYS
|
||||
endif
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -1863,14 +1863,14 @@ static void __smp_spurious_interrupt(u8 vector)
|
||||
"should never happen.\n", vector, smp_processor_id());
|
||||
}
|
||||
|
||||
__visible void smp_spurious_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_spurious_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_spurious_interrupt(~regs->orig_ax);
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_spurious_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_spurious_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
u8 vector = ~regs->orig_ax;
|
||||
|
||||
@@ -1921,14 +1921,14 @@ static void __smp_error_interrupt(struct pt_regs *regs)
|
||||
|
||||
}
|
||||
|
||||
__visible void smp_error_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_error_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_error_interrupt(regs);
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_error_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_error_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
trace_error_apic_entry(ERROR_APIC_VECTOR);
|
||||
|
||||
@@ -559,7 +559,7 @@ void send_cleanup_vector(struct irq_cfg *cfg)
|
||||
__send_cleanup_vector(data);
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_irq_move_cleanup_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_irq_move_cleanup_interrupt(void)
|
||||
{
|
||||
unsigned vector, me;
|
||||
|
||||
|
||||
@@ -245,6 +245,9 @@ static int mce_severity_amd(struct mce *m, int tolerant, char **msg, bool is_exc
|
||||
|
||||
if (m->status & MCI_STATUS_UC) {
|
||||
|
||||
if (ctx == IN_KERNEL)
|
||||
return MCE_PANIC_SEVERITY;
|
||||
|
||||
/*
|
||||
* On older systems where overflow_recov flag is not present, we
|
||||
* should simply panic if an error overflow occurs. If
|
||||
@@ -255,10 +258,6 @@ static int mce_severity_amd(struct mce *m, int tolerant, char **msg, bool is_exc
|
||||
if (mce_flags.smca)
|
||||
return mce_severity_amd_smca(m, ctx);
|
||||
|
||||
/* software can try to contain */
|
||||
if (!(m->mcgstatus & MCG_STATUS_RIPV) && (ctx == IN_KERNEL))
|
||||
return MCE_PANIC_SEVERITY;
|
||||
|
||||
/* kill current process */
|
||||
return MCE_AR_SEVERITY;
|
||||
} else {
|
||||
|
||||
@@ -593,14 +593,14 @@ static inline void __smp_deferred_error_interrupt(void)
|
||||
deferred_error_int_vector();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_deferred_error_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_deferred_error_interrupt(void)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_deferred_error_interrupt();
|
||||
exiting_ack_irq();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_trace_deferred_error_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_trace_deferred_error_interrupt(void)
|
||||
{
|
||||
entering_irq();
|
||||
trace_deferred_error_apic_entry(DEFERRED_ERROR_VECTOR);
|
||||
|
||||
@@ -431,14 +431,16 @@ static inline void __smp_thermal_interrupt(void)
|
||||
smp_thermal_vector();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_thermal_interrupt(struct pt_regs *regs)
|
||||
asmlinkage __visible void __irq_entry
|
||||
smp_thermal_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_thermal_interrupt();
|
||||
exiting_ack_irq();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_trace_thermal_interrupt(struct pt_regs *regs)
|
||||
asmlinkage __visible void __irq_entry
|
||||
smp_trace_thermal_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
entering_irq();
|
||||
trace_thermal_apic_entry(THERMAL_APIC_VECTOR);
|
||||
|
||||
@@ -24,14 +24,14 @@ static inline void __smp_threshold_interrupt(void)
|
||||
mce_threshold_vector();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_threshold_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_threshold_interrupt(void)
|
||||
{
|
||||
entering_irq();
|
||||
__smp_threshold_interrupt();
|
||||
exiting_ack_irq();
|
||||
}
|
||||
|
||||
asmlinkage __visible void smp_trace_threshold_interrupt(void)
|
||||
asmlinkage __visible void __irq_entry smp_trace_threshold_interrupt(void)
|
||||
{
|
||||
entering_irq();
|
||||
trace_threshold_apic_entry(THRESHOLD_APIC_VECTOR);
|
||||
|
||||
@@ -265,7 +265,7 @@ void __smp_x86_platform_ipi(void)
|
||||
x86_platform_ipi_callback();
|
||||
}
|
||||
|
||||
__visible void smp_x86_platform_ipi(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_x86_platform_ipi(struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
|
||||
@@ -316,7 +316,7 @@ __visible void smp_kvm_posted_intr_wakeup_ipi(struct pt_regs *regs)
|
||||
}
|
||||
#endif
|
||||
|
||||
__visible void smp_trace_x86_platform_ipi(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_x86_platform_ipi(struct pt_regs *regs)
|
||||
{
|
||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/hardirq.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/trace/irq_vectors.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
static inline void __smp_irq_work_interrupt(void)
|
||||
{
|
||||
@@ -16,14 +17,14 @@ static inline void __smp_irq_work_interrupt(void)
|
||||
irq_work_run();
|
||||
}
|
||||
|
||||
__visible void smp_irq_work_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_irq_work_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
__smp_irq_work_interrupt();
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_irq_work_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_irq_work_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
trace_irq_work_entry(IRQ_WORK_VECTOR);
|
||||
|
||||
@@ -259,7 +259,7 @@ static inline void __smp_reschedule_interrupt(void)
|
||||
scheduler_ipi();
|
||||
}
|
||||
|
||||
__visible void smp_reschedule_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
irq_enter();
|
||||
ack_APIC_irq();
|
||||
@@ -270,7 +270,7 @@ __visible void smp_reschedule_interrupt(struct pt_regs *regs)
|
||||
*/
|
||||
}
|
||||
|
||||
__visible void smp_trace_reschedule_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_trace_reschedule_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
/*
|
||||
* Need to call irq_enter() before calling the trace point.
|
||||
@@ -294,14 +294,15 @@ static inline void __smp_call_function_interrupt(void)
|
||||
inc_irq_stat(irq_call_count);
|
||||
}
|
||||
|
||||
__visible void smp_call_function_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry smp_call_function_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
__smp_call_function_interrupt();
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_call_function_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry
|
||||
smp_trace_call_function_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
trace_call_function_entry(CALL_FUNCTION_VECTOR);
|
||||
@@ -316,14 +317,16 @@ static inline void __smp_call_function_single_interrupt(void)
|
||||
inc_irq_stat(irq_call_count);
|
||||
}
|
||||
|
||||
__visible void smp_call_function_single_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry
|
||||
smp_call_function_single_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
__smp_call_function_single_interrupt();
|
||||
exiting_irq();
|
||||
}
|
||||
|
||||
__visible void smp_trace_call_function_single_interrupt(struct pt_regs *regs)
|
||||
__visible void __irq_entry
|
||||
smp_trace_call_function_single_interrupt(struct pt_regs *regs)
|
||||
{
|
||||
ipi_entering_ack_irq();
|
||||
trace_call_function_single_entry(CALL_FUNCTION_SINGLE_VECTOR);
|
||||
|
||||
@@ -360,7 +360,6 @@ config CRYPTO_XTS
|
||||
select CRYPTO_BLKCIPHER
|
||||
select CRYPTO_MANAGER
|
||||
select CRYPTO_GF128MUL
|
||||
select CRYPTO_ECB
|
||||
help
|
||||
XTS: IEEE1619/D16 narrow block cipher use with aes-xts-plain,
|
||||
key size 256, 384 or 512 bits. This implementation currently
|
||||
|
||||
+15
-19
@@ -21,19 +21,12 @@ struct dh_ctx {
|
||||
MPI xa;
|
||||
};
|
||||
|
||||
static inline void dh_clear_params(struct dh_ctx *ctx)
|
||||
static void dh_clear_ctx(struct dh_ctx *ctx)
|
||||
{
|
||||
mpi_free(ctx->p);
|
||||
mpi_free(ctx->g);
|
||||
ctx->p = NULL;
|
||||
ctx->g = NULL;
|
||||
}
|
||||
|
||||
static void dh_free_ctx(struct dh_ctx *ctx)
|
||||
{
|
||||
dh_clear_params(ctx);
|
||||
mpi_free(ctx->xa);
|
||||
ctx->xa = NULL;
|
||||
memset(ctx, 0, sizeof(*ctx));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -71,10 +64,8 @@ static int dh_set_params(struct dh_ctx *ctx, struct dh *params)
|
||||
return -EINVAL;
|
||||
|
||||
ctx->g = mpi_read_raw_data(params->g, params->g_size);
|
||||
if (!ctx->g) {
|
||||
mpi_free(ctx->p);
|
||||
if (!ctx->g)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -84,19 +75,24 @@ static int dh_set_secret(struct crypto_kpp *tfm, void *buf, unsigned int len)
|
||||
struct dh_ctx *ctx = dh_get_ctx(tfm);
|
||||
struct dh params;
|
||||
|
||||
/* Free the old MPI key if any */
|
||||
dh_clear_ctx(ctx);
|
||||
|
||||
if (crypto_dh_decode_key(buf, len, ¶ms) < 0)
|
||||
return -EINVAL;
|
||||
goto err_clear_ctx;
|
||||
|
||||
if (dh_set_params(ctx, ¶ms) < 0)
|
||||
return -EINVAL;
|
||||
goto err_clear_ctx;
|
||||
|
||||
ctx->xa = mpi_read_raw_data(params.key, params.key_size);
|
||||
if (!ctx->xa) {
|
||||
dh_clear_params(ctx);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!ctx->xa)
|
||||
goto err_clear_ctx;
|
||||
|
||||
return 0;
|
||||
|
||||
err_clear_ctx:
|
||||
dh_clear_ctx(ctx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int dh_compute_value(struct kpp_request *req)
|
||||
@@ -154,7 +150,7 @@ static void dh_exit_tfm(struct crypto_kpp *tfm)
|
||||
{
|
||||
struct dh_ctx *ctx = dh_get_ctx(tfm);
|
||||
|
||||
dh_free_ctx(ctx);
|
||||
dh_clear_ctx(ctx);
|
||||
}
|
||||
|
||||
static struct kpp_alg dh = {
|
||||
|
||||
@@ -83,6 +83,14 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params)
|
||||
if (secret.len != crypto_dh_key_len(params))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Don't permit the buffer for 'key' or 'g' to be larger than 'p', since
|
||||
* some drivers assume otherwise.
|
||||
*/
|
||||
if (params->key_size > params->p_size ||
|
||||
params->g_size > params->p_size)
|
||||
return -EINVAL;
|
||||
|
||||
/* Don't allocate memory. Set pointers to data within
|
||||
* the given buffer
|
||||
*/
|
||||
@@ -90,6 +98,14 @@ int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params)
|
||||
params->p = (void *)(ptr + params->key_size);
|
||||
params->g = (void *)(ptr + params->key_size + params->p_size);
|
||||
|
||||
/*
|
||||
* Don't permit 'p' to be 0. It's not a prime number, and it's subject
|
||||
* to corner cases such as 'mod 0' being undefined or
|
||||
* crypto_kpp_maxsize() returning 0.
|
||||
*/
|
||||
if (memchr_inv(params->p, 0, params->p_size) == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(crypto_dh_decode_key);
|
||||
|
||||
+33
-36
@@ -465,9 +465,8 @@ struct binder_ref {
|
||||
};
|
||||
|
||||
enum binder_deferred_state {
|
||||
BINDER_DEFERRED_PUT_FILES = 0x01,
|
||||
BINDER_DEFERRED_FLUSH = 0x02,
|
||||
BINDER_DEFERRED_RELEASE = 0x04,
|
||||
BINDER_DEFERRED_FLUSH = 0x01,
|
||||
BINDER_DEFERRED_RELEASE = 0x02,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -504,8 +503,6 @@ struct binder_priority {
|
||||
* (invariant after initialized)
|
||||
* @tsk task_struct for group_leader of process
|
||||
* (invariant after initialized)
|
||||
* @files files_struct for process
|
||||
* (invariant after initialized)
|
||||
* @deferred_work_node: element for binder_deferred_list
|
||||
* (protected by binder_deferred_lock)
|
||||
* @deferred_work: bitmap of deferred work to perform
|
||||
@@ -552,7 +549,6 @@ struct binder_proc {
|
||||
struct list_head waiting_threads;
|
||||
int pid;
|
||||
struct task_struct *tsk;
|
||||
struct files_struct *files;
|
||||
struct hlist_node deferred_work_node;
|
||||
int deferred_work;
|
||||
bool is_dead;
|
||||
@@ -948,22 +944,34 @@ static void binder_free_thread(struct binder_thread *thread);
|
||||
static void binder_free_proc(struct binder_proc *proc);
|
||||
static void binder_inc_node_tmpref_ilocked(struct binder_node *node);
|
||||
|
||||
struct files_struct *binder_get_files_struct(struct binder_proc *proc)
|
||||
{
|
||||
return get_files_struct(proc->tsk);
|
||||
}
|
||||
|
||||
static int task_get_unused_fd_flags(struct binder_proc *proc, int flags)
|
||||
{
|
||||
struct files_struct *files = proc->files;
|
||||
struct files_struct *files;
|
||||
unsigned long rlim_cur;
|
||||
unsigned long irqs;
|
||||
int ret;
|
||||
|
||||
files = binder_get_files_struct(proc);
|
||||
if (files == NULL)
|
||||
return -ESRCH;
|
||||
|
||||
if (!lock_task_sighand(proc->tsk, &irqs))
|
||||
return -EMFILE;
|
||||
if (!lock_task_sighand(proc->tsk, &irqs)) {
|
||||
ret = -EMFILE;
|
||||
goto err;
|
||||
}
|
||||
|
||||
rlim_cur = task_rlimit(proc->tsk, RLIMIT_NOFILE);
|
||||
unlock_task_sighand(proc->tsk, &irqs);
|
||||
|
||||
return __alloc_fd(files, 0, rlim_cur, flags);
|
||||
ret = __alloc_fd(files, 0, rlim_cur, flags);
|
||||
err:
|
||||
put_files_struct(files);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -972,8 +980,12 @@ static int task_get_unused_fd_flags(struct binder_proc *proc, int flags)
|
||||
static void task_fd_install(
|
||||
struct binder_proc *proc, unsigned int fd, struct file *file)
|
||||
{
|
||||
if (proc->files)
|
||||
__fd_install(proc->files, fd, file);
|
||||
struct files_struct *files = binder_get_files_struct(proc);
|
||||
|
||||
if (files) {
|
||||
__fd_install(files, fd, file);
|
||||
put_files_struct(files);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -981,18 +993,20 @@ static void task_fd_install(
|
||||
*/
|
||||
static long task_close_fd(struct binder_proc *proc, unsigned int fd)
|
||||
{
|
||||
struct files_struct *files = binder_get_files_struct(proc);
|
||||
int retval;
|
||||
|
||||
if (proc->files == NULL)
|
||||
if (files == NULL)
|
||||
return -ESRCH;
|
||||
|
||||
retval = __close_fd(proc->files, fd);
|
||||
retval = __close_fd(files, fd);
|
||||
/* can't restart close syscall because file table entry was cleared */
|
||||
if (unlikely(retval == -ERESTARTSYS ||
|
||||
retval == -ERESTARTNOINTR ||
|
||||
retval == -ERESTARTNOHAND ||
|
||||
retval == -ERESTART_RESTARTBLOCK))
|
||||
retval = -EINTR;
|
||||
put_files_struct(files);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@@ -2453,7 +2467,7 @@ static void binder_transaction_buffer_release(struct binder_proc *proc,
|
||||
debug_id, (u64)fda->num_fds);
|
||||
continue;
|
||||
}
|
||||
fd_array = (u32 *)(parent_buffer + fda->parent_offset);
|
||||
fd_array = (u32 *)(parent_buffer + (uintptr_t)fda->parent_offset);
|
||||
for (fd_index = 0; fd_index < fda->num_fds; fd_index++)
|
||||
task_close_fd(proc, fd_array[fd_index]);
|
||||
} break;
|
||||
@@ -2677,7 +2691,7 @@ static int binder_translate_fd_array(struct binder_fd_array_object *fda,
|
||||
*/
|
||||
parent_buffer = parent->buffer -
|
||||
binder_alloc_get_user_buffer_offset(&target_proc->alloc);
|
||||
fd_array = (u32 *)(parent_buffer + fda->parent_offset);
|
||||
fd_array = (u32 *)(parent_buffer + (uintptr_t)fda->parent_offset);
|
||||
if (!IS_ALIGNED((unsigned long)fd_array, sizeof(u32))) {
|
||||
binder_user_error("%d:%d parent offset not aligned correctly.\n",
|
||||
proc->pid, thread->pid);
|
||||
@@ -2743,7 +2757,7 @@ static int binder_fixup_parent(struct binder_transaction *t,
|
||||
proc->pid, thread->pid);
|
||||
return -EINVAL;
|
||||
}
|
||||
parent_buffer = (u8 *)(parent->buffer -
|
||||
parent_buffer = (u8 *)((uintptr_t)parent->buffer -
|
||||
binder_alloc_get_user_buffer_offset(
|
||||
&target_proc->alloc));
|
||||
*(binder_uintptr_t *)(parent_buffer + bp->parent_offset) = bp->buffer;
|
||||
@@ -4817,7 +4831,6 @@ static void binder_vma_close(struct vm_area_struct *vma)
|
||||
(vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags,
|
||||
(unsigned long)pgprot_val(vma->vm_page_prot));
|
||||
binder_alloc_vma_close(&proc->alloc);
|
||||
binder_defer_work(proc, BINDER_DEFERRED_PUT_FILES);
|
||||
}
|
||||
|
||||
static int binder_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
@@ -4859,10 +4872,8 @@ static int binder_mmap(struct file *filp, struct vm_area_struct *vma)
|
||||
vma->vm_private_data = proc;
|
||||
|
||||
ret = binder_alloc_mmap_handler(&proc->alloc, vma);
|
||||
if (ret)
|
||||
return ret;
|
||||
proc->files = get_files_struct(current);
|
||||
return 0;
|
||||
|
||||
return ret;
|
||||
|
||||
err_bad_arg:
|
||||
pr_err("binder_mmap: %d %lx-%lx %s failed %d\n",
|
||||
@@ -5041,8 +5052,6 @@ static void binder_deferred_release(struct binder_proc *proc)
|
||||
struct rb_node *n;
|
||||
int threads, nodes, incoming_refs, outgoing_refs, active_transactions;
|
||||
|
||||
BUG_ON(proc->files);
|
||||
|
||||
mutex_lock(&binder_procs_lock);
|
||||
hlist_del(&proc->proc_node);
|
||||
mutex_unlock(&binder_procs_lock);
|
||||
@@ -5124,8 +5133,6 @@ static void binder_deferred_release(struct binder_proc *proc)
|
||||
static void binder_deferred_func(struct work_struct *work)
|
||||
{
|
||||
struct binder_proc *proc;
|
||||
struct files_struct *files;
|
||||
|
||||
int defer;
|
||||
|
||||
do {
|
||||
@@ -5142,21 +5149,11 @@ static void binder_deferred_func(struct work_struct *work)
|
||||
}
|
||||
mutex_unlock(&binder_deferred_lock);
|
||||
|
||||
files = NULL;
|
||||
if (defer & BINDER_DEFERRED_PUT_FILES) {
|
||||
files = proc->files;
|
||||
if (files)
|
||||
proc->files = NULL;
|
||||
}
|
||||
|
||||
if (defer & BINDER_DEFERRED_FLUSH)
|
||||
binder_deferred_flush(proc);
|
||||
|
||||
if (defer & BINDER_DEFERRED_RELEASE)
|
||||
binder_deferred_release(proc); /* frees proc */
|
||||
|
||||
if (files)
|
||||
put_files_struct(files);
|
||||
} while (proc);
|
||||
}
|
||||
static DECLARE_WORK(binder_deferred_work, binder_deferred_func);
|
||||
|
||||
@@ -289,6 +289,7 @@ config SATA_SX4
|
||||
|
||||
config ATA_BMDMA
|
||||
bool "ATA BMDMA support"
|
||||
depends on HAS_DMA
|
||||
default y
|
||||
help
|
||||
This option adds support for SFF ATA controllers with BMDMA
|
||||
@@ -344,6 +345,7 @@ config SATA_DWC_VDEBUG
|
||||
|
||||
config SATA_HIGHBANK
|
||||
tristate "Calxeda Highbank SATA support"
|
||||
depends on HAS_DMA
|
||||
depends on ARCH_HIGHBANK || COMPILE_TEST
|
||||
help
|
||||
This option enables support for the Calxeda Highbank SoC's
|
||||
@@ -353,6 +355,7 @@ config SATA_HIGHBANK
|
||||
|
||||
config SATA_MV
|
||||
tristate "Marvell SATA support"
|
||||
depends on HAS_DMA
|
||||
depends on PCI || ARCH_DOVE || ARCH_MV78XX0 || \
|
||||
ARCH_MVEBU || ARCH_ORION5X || COMPILE_TEST
|
||||
select GENERIC_PHY
|
||||
|
||||
@@ -2925,6 +2925,12 @@ static int btusb_probe(struct usb_interface *intf,
|
||||
if (id->driver_info & BTUSB_QCA_ROME) {
|
||||
data->setup_on_usb = btusb_setup_qca;
|
||||
hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
|
||||
|
||||
/* QCA Rome devices lose their updated firmware over suspend,
|
||||
* but the USB hub doesn't notice any status change.
|
||||
* Explicitly request a device reset on resume.
|
||||
*/
|
||||
set_bit(BTUSB_RESET_RESUME, &data->flags);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BT_HCIBTUSB_RTL
|
||||
|
||||
@@ -4029,7 +4029,8 @@ smi_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg *recv_msg,
|
||||
}
|
||||
|
||||
static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent,
|
||||
struct list_head *timeouts, long timeout_period,
|
||||
struct list_head *timeouts,
|
||||
unsigned long timeout_period,
|
||||
int slot, unsigned long *flags,
|
||||
unsigned int *waiting_msgs)
|
||||
{
|
||||
@@ -4042,8 +4043,8 @@ static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent,
|
||||
if (!ent->inuse)
|
||||
return;
|
||||
|
||||
ent->timeout -= timeout_period;
|
||||
if (ent->timeout > 0) {
|
||||
if (timeout_period < ent->timeout) {
|
||||
ent->timeout -= timeout_period;
|
||||
(*waiting_msgs)++;
|
||||
return;
|
||||
}
|
||||
@@ -4109,7 +4110,8 @@ static void check_msg_timeout(ipmi_smi_t intf, struct seq_table *ent,
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int ipmi_timeout_handler(ipmi_smi_t intf, long timeout_period)
|
||||
static unsigned int ipmi_timeout_handler(ipmi_smi_t intf,
|
||||
unsigned long timeout_period)
|
||||
{
|
||||
struct list_head timeouts;
|
||||
struct ipmi_recv_msg *msg, *msg2;
|
||||
|
||||
@@ -666,6 +666,7 @@ static int dmatest_func(void *data)
|
||||
* free it this time?" dancing. For now, just
|
||||
* leave it dangling.
|
||||
*/
|
||||
WARN(1, "dmatest: Kernel stack may be corrupted!!\n");
|
||||
dmaengine_unmap_put(um);
|
||||
result("test timed out", total_tests, src_off, dst_off,
|
||||
len, 0);
|
||||
|
||||
@@ -190,6 +190,11 @@ static int palmas_usb_probe(struct platform_device *pdev)
|
||||
struct palmas_usb *palmas_usb;
|
||||
int status;
|
||||
|
||||
if (!palmas) {
|
||||
dev_err(&pdev->dev, "failed to get valid parent\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
palmas_usb = devm_kzalloc(&pdev->dev, sizeof(*palmas_usb), GFP_KERNEL);
|
||||
if (!palmas_usb)
|
||||
return -ENOMEM;
|
||||
|
||||
+7
-26
@@ -906,35 +906,16 @@ int extcon_register_notifier(struct extcon_dev *edev, unsigned int id,
|
||||
unsigned long flags;
|
||||
int ret, idx = -EINVAL;
|
||||
|
||||
if (!nb)
|
||||
if (!edev || !nb)
|
||||
return -EINVAL;
|
||||
|
||||
if (edev) {
|
||||
idx = find_cable_index_by_id(edev, id);
|
||||
if (idx < 0)
|
||||
return idx;
|
||||
idx = find_cable_index_by_id(edev, id);
|
||||
if (idx < 0)
|
||||
return idx;
|
||||
|
||||
spin_lock_irqsave(&edev->lock, flags);
|
||||
ret = raw_notifier_chain_register(&edev->nh[idx], nb);
|
||||
spin_unlock_irqrestore(&edev->lock, flags);
|
||||
} else {
|
||||
struct extcon_dev *extd;
|
||||
|
||||
mutex_lock(&extcon_dev_list_lock);
|
||||
list_for_each_entry(extd, &extcon_dev_list, entry) {
|
||||
idx = find_cable_index_by_id(extd, id);
|
||||
if (idx >= 0)
|
||||
break;
|
||||
}
|
||||
mutex_unlock(&extcon_dev_list_lock);
|
||||
|
||||
if (idx >= 0) {
|
||||
edev = extd;
|
||||
return extcon_register_notifier(extd, id, nb);
|
||||
} else {
|
||||
ret = -ENODEV;
|
||||
}
|
||||
}
|
||||
spin_lock_irqsave(&edev->lock, flags);
|
||||
ret = raw_notifier_chain_register(&edev->nh[idx], nb);
|
||||
spin_unlock_irqrestore(&edev->lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -145,6 +145,8 @@ static int mga_vram_init(struct mga_device *mdev)
|
||||
}
|
||||
|
||||
mem = pci_iomap(mdev->dev->pdev, 0, 0);
|
||||
if (!mem)
|
||||
return -ENOMEM;
|
||||
|
||||
mdev->mc.vram_size = mga_probe_vram(mdev, mem);
|
||||
|
||||
|
||||
@@ -912,6 +912,7 @@ static struct spi_driver acx565akm_driver = {
|
||||
|
||||
module_spi_driver(acx565akm_driver);
|
||||
|
||||
MODULE_ALIAS("spi:sony,acx565akm");
|
||||
MODULE_AUTHOR("Nokia Corporation");
|
||||
MODULE_DESCRIPTION("acx565akm LCD Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -429,6 +429,10 @@ static int vtg_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
vtg->regs = devm_ioremap_nocache(dev, res->start, resource_size(res));
|
||||
if (!vtg->regs) {
|
||||
DRM_ERROR("failed to remap I/O memory\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
np = of_parse_phandle(pdev->dev.of_node, "st,slave", 0);
|
||||
if (np) {
|
||||
|
||||
@@ -1635,13 +1635,25 @@ ims_pcu_get_cdc_union_desc(struct usb_interface *intf)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (buflen > 0) {
|
||||
while (buflen >= sizeof(*union_desc)) {
|
||||
union_desc = (struct usb_cdc_union_desc *)buf;
|
||||
|
||||
if (union_desc->bLength > buflen) {
|
||||
dev_err(&intf->dev, "Too large descriptor\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (union_desc->bDescriptorType == USB_DT_CS_INTERFACE &&
|
||||
union_desc->bDescriptorSubType == USB_CDC_UNION_TYPE) {
|
||||
dev_dbg(&intf->dev, "Found union header\n");
|
||||
return union_desc;
|
||||
|
||||
if (union_desc->bLength >= sizeof(*union_desc))
|
||||
return union_desc;
|
||||
|
||||
dev_err(&intf->dev,
|
||||
"Union descriptor to short (%d vs %zd\n)",
|
||||
union_desc->bLength, sizeof(*union_desc));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buflen -= union_desc->bLength;
|
||||
|
||||
@@ -2412,6 +2412,11 @@ static int imon_probe(struct usb_interface *interface,
|
||||
mutex_lock(&driver_lock);
|
||||
|
||||
first_if = usb_ifnum_to_if(usbdev, 0);
|
||||
if (!first_if) {
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
first_if_ctx = usb_get_intfdata(first_if);
|
||||
|
||||
if (ifnum == 0) {
|
||||
|
||||
@@ -292,7 +292,7 @@ static int stk7700P2_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
stk7700d_dib7000p_mt2266_config)
|
||||
!= 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
@@ -326,7 +326,7 @@ static int stk7700d_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
stk7700d_dib7000p_mt2266_config)
|
||||
!= 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
@@ -479,7 +479,7 @@ static int stk7700ph_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
&stk7700ph_dib7700_xc3028_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -1011,7 +1011,7 @@ static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
&dib7070p_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -1069,7 +1069,7 @@ static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
&dib7770p_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -3056,7 +3056,7 @@ static int nim7090_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
|
||||
if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x10, &nim7090_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80, &nim7090_dib7000p_config);
|
||||
@@ -3109,7 +3109,7 @@ static int tfe7090pvr_frontend0_attach(struct dvb_usb_adapter *adap)
|
||||
/* initialize IC 0 */
|
||||
if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 0x20, &tfe7090pvr_dib7000p_config[0]) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -3139,7 +3139,7 @@ static int tfe7090pvr_frontend1_attach(struct dvb_usb_adapter *adap)
|
||||
i2c = state->dib7000p_ops.get_i2c_master(adap->dev->adapter[0].fe_adap[0].fe, DIBX000_I2C_INTERFACE_GPIO_6_7, 1);
|
||||
if (state->dib7000p_ops.i2c_enumeration(i2c, 1, 0x10, &tfe7090pvr_dib7000p_config[1]) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n", __func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -3214,7 +3214,7 @@ static int tfe7790p_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
1, 0x10, &tfe7790p_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap,
|
||||
@@ -3309,7 +3309,7 @@ static int stk7070pd_frontend_attach0(struct dvb_usb_adapter *adap)
|
||||
stk7070pd_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -3384,7 +3384,7 @@ static int novatd_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
stk7070pd_dib7000p_config) != 0) {
|
||||
err("%s: state->dib7000p_ops.i2c_enumeration failed. Cannot continue\n",
|
||||
__func__);
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
@@ -3620,7 +3620,7 @@ static int pctv340e_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
|
||||
if (state->dib7000p_ops.dib7000pc_detection(&adap->dev->i2c_adap) == 0) {
|
||||
/* Demodulator not found for some reason? */
|
||||
dvb_detach(&state->dib7000p_ops);
|
||||
dvb_detach(state->dib7000p_ops.set_wbd_ref);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
||||
+21
-6
@@ -1423,17 +1423,25 @@ static ssize_t lcd_write(struct file *file,
|
||||
|
||||
static int lcd_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (!atomic_dec_and_test(&lcd_available))
|
||||
return -EBUSY; /* open only once at a time */
|
||||
int ret;
|
||||
|
||||
ret = -EBUSY;
|
||||
if (!atomic_dec_and_test(&lcd_available))
|
||||
goto fail; /* open only once at a time */
|
||||
|
||||
ret = -EPERM;
|
||||
if (file->f_mode & FMODE_READ) /* device is write-only */
|
||||
return -EPERM;
|
||||
goto fail;
|
||||
|
||||
if (lcd.must_clear) {
|
||||
lcd_clear_display();
|
||||
lcd.must_clear = false;
|
||||
}
|
||||
return nonseekable_open(inode, file);
|
||||
|
||||
fail:
|
||||
atomic_inc(&lcd_available);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int lcd_release(struct inode *inode, struct file *file)
|
||||
@@ -1696,14 +1704,21 @@ static ssize_t keypad_read(struct file *file,
|
||||
|
||||
static int keypad_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (!atomic_dec_and_test(&keypad_available))
|
||||
return -EBUSY; /* open only once at a time */
|
||||
int ret;
|
||||
|
||||
ret = -EBUSY;
|
||||
if (!atomic_dec_and_test(&keypad_available))
|
||||
goto fail; /* open only once at a time */
|
||||
|
||||
ret = -EPERM;
|
||||
if (file->f_mode & FMODE_WRITE) /* device is read-only */
|
||||
return -EPERM;
|
||||
goto fail;
|
||||
|
||||
keypad_buflen = 0; /* flush the buffer on opening */
|
||||
return 0;
|
||||
fail:
|
||||
atomic_inc(&keypad_available);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int keypad_release(struct inode *inode, struct file *file)
|
||||
|
||||
@@ -3217,7 +3217,7 @@ u32 bond_xmit_hash(struct bonding *bond, struct sk_buff *skb)
|
||||
hash ^= (hash >> 16);
|
||||
hash ^= (hash >> 8);
|
||||
|
||||
return hash;
|
||||
return hash >> 1;
|
||||
}
|
||||
|
||||
/*-------------------------- Device entry points ----------------------------*/
|
||||
|
||||
@@ -257,8 +257,8 @@ enum rx_desc_status_bits {
|
||||
RXFSD = 0x00000800, /* first descriptor */
|
||||
RXLSD = 0x00000400, /* last descriptor */
|
||||
ErrorSummary = 0x80, /* error summary */
|
||||
RUNT = 0x40, /* runt packet received */
|
||||
LONG = 0x20, /* long packet received */
|
||||
RUNTPKT = 0x40, /* runt packet received */
|
||||
LONGPKT = 0x20, /* long packet received */
|
||||
FAE = 0x10, /* frame align error */
|
||||
CRC = 0x08, /* crc error */
|
||||
RXER = 0x04, /* receive error */
|
||||
@@ -1633,7 +1633,7 @@ static int netdev_rx(struct net_device *dev)
|
||||
dev->name, rx_status);
|
||||
|
||||
dev->stats.rx_errors++; /* end of a packet. */
|
||||
if (rx_status & (LONG | RUNT))
|
||||
if (rx_status & (LONGPKT | RUNTPKT))
|
||||
dev->stats.rx_length_errors++;
|
||||
if (rx_status & RXER)
|
||||
dev->stats.rx_frame_errors++;
|
||||
|
||||
@@ -2011,9 +2011,10 @@ static void fm10k_sm_mbx_create_reply(struct fm10k_hw *hw,
|
||||
* function can also be used to respond to an error as the connection
|
||||
* resetting would also be a means of dealing with errors.
|
||||
**/
|
||||
static void fm10k_sm_mbx_process_reset(struct fm10k_hw *hw,
|
||||
struct fm10k_mbx_info *mbx)
|
||||
static s32 fm10k_sm_mbx_process_reset(struct fm10k_hw *hw,
|
||||
struct fm10k_mbx_info *mbx)
|
||||
{
|
||||
s32 err = 0;
|
||||
const enum fm10k_mbx_state state = mbx->state;
|
||||
|
||||
switch (state) {
|
||||
@@ -2026,6 +2027,7 @@ static void fm10k_sm_mbx_process_reset(struct fm10k_hw *hw,
|
||||
case FM10K_STATE_OPEN:
|
||||
/* flush any incomplete work */
|
||||
fm10k_sm_mbx_connect_reset(mbx);
|
||||
err = FM10K_ERR_RESET_REQUESTED;
|
||||
break;
|
||||
case FM10K_STATE_CONNECT:
|
||||
/* Update remote value to match local value */
|
||||
@@ -2035,6 +2037,8 @@ static void fm10k_sm_mbx_process_reset(struct fm10k_hw *hw,
|
||||
}
|
||||
|
||||
fm10k_sm_mbx_create_reply(hw, mbx, mbx->tail);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2115,7 +2119,7 @@ static s32 fm10k_sm_mbx_process(struct fm10k_hw *hw,
|
||||
|
||||
switch (FM10K_MSG_HDR_FIELD_GET(mbx->mbx_hdr, SM_VER)) {
|
||||
case 0:
|
||||
fm10k_sm_mbx_process_reset(hw, mbx);
|
||||
err = fm10k_sm_mbx_process_reset(hw, mbx);
|
||||
break;
|
||||
case FM10K_SM_MBX_VERSION:
|
||||
err = fm10k_sm_mbx_process_version_1(hw, mbx);
|
||||
|
||||
@@ -1144,6 +1144,7 @@ static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data)
|
||||
struct fm10k_hw *hw = &interface->hw;
|
||||
struct fm10k_mbx_info *mbx = &hw->mbx;
|
||||
u32 eicr;
|
||||
s32 err = 0;
|
||||
|
||||
/* unmask any set bits related to this interrupt */
|
||||
eicr = fm10k_read_reg(hw, FM10K_EICR);
|
||||
@@ -1159,12 +1160,15 @@ static irqreturn_t fm10k_msix_mbx_pf(int __always_unused irq, void *data)
|
||||
|
||||
/* service mailboxes */
|
||||
if (fm10k_mbx_trylock(interface)) {
|
||||
mbx->ops.process(hw, mbx);
|
||||
err = mbx->ops.process(hw, mbx);
|
||||
/* handle VFLRE events */
|
||||
fm10k_iov_event(interface);
|
||||
fm10k_mbx_unlock(interface);
|
||||
}
|
||||
|
||||
if (err == FM10K_ERR_RESET_REQUESTED)
|
||||
interface->flags |= FM10K_FLAG_RESET_REQUESTED;
|
||||
|
||||
/* if switch toggled state we should reset GLORTs */
|
||||
if (eicr & FM10K_EICR_SWITCHNOTREADY) {
|
||||
/* force link down for at least 4 seconds */
|
||||
|
||||
@@ -245,6 +245,17 @@ static s32 igb_init_phy_params_82575(struct e1000_hw *hw)
|
||||
hw->bus.func = (rd32(E1000_STATUS) & E1000_STATUS_FUNC_MASK) >>
|
||||
E1000_STATUS_FUNC_SHIFT;
|
||||
|
||||
/* Make sure the PHY is in a good state. Several people have reported
|
||||
* firmware leaving the PHY's page select register set to something
|
||||
* other than the default of zero, which causes the PHY ID read to
|
||||
* access something other than the intended register.
|
||||
*/
|
||||
ret_val = hw->phy.ops.reset(hw);
|
||||
if (ret_val) {
|
||||
hw_dbg("Error resetting the PHY.\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Set phy->phy_addr and phy->id. */
|
||||
igb_write_phy_reg_82580(hw, I347AT4_PAGE_SELECT, 0);
|
||||
ret_val = igb_get_phy_id_82575(hw);
|
||||
|
||||
@@ -699,9 +699,9 @@ static s32 igb_update_flash_i210(struct e1000_hw *hw)
|
||||
|
||||
ret_val = igb_pool_flash_update_done_i210(hw);
|
||||
if (ret_val)
|
||||
hw_dbg("Flash update complete\n");
|
||||
else
|
||||
hw_dbg("Flash update time out\n");
|
||||
else
|
||||
hw_dbg("Flash update complete\n");
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
|
||||
@@ -3271,7 +3271,9 @@ static int __igb_close(struct net_device *netdev, bool suspending)
|
||||
|
||||
int igb_close(struct net_device *netdev)
|
||||
{
|
||||
return __igb_close(netdev, false);
|
||||
if (netif_device_present(netdev))
|
||||
return __igb_close(netdev, false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -7548,6 +7550,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake,
|
||||
int retval = 0;
|
||||
#endif
|
||||
|
||||
rtnl_lock();
|
||||
netif_device_detach(netdev);
|
||||
|
||||
if (netif_running(netdev))
|
||||
@@ -7556,6 +7559,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake,
|
||||
igb_ptp_suspend(adapter);
|
||||
|
||||
igb_clear_interrupt_scheme(adapter);
|
||||
rtnl_unlock();
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
retval = pci_save_state(pdev);
|
||||
@@ -7674,16 +7678,15 @@ static int igb_resume(struct device *dev)
|
||||
|
||||
wr32(E1000_WUS, ~0);
|
||||
|
||||
if (netdev->flags & IFF_UP) {
|
||||
rtnl_lock();
|
||||
rtnl_lock();
|
||||
if (!err && netif_running(netdev))
|
||||
err = __igb_open(netdev, true);
|
||||
rtnl_unlock();
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
netif_device_attach(netdev);
|
||||
return 0;
|
||||
if (!err)
|
||||
netif_device_attach(netdev);
|
||||
rtnl_unlock();
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int igb_runtime_idle(struct device *dev)
|
||||
|
||||
@@ -199,7 +199,7 @@ static int ixgbe_get_settings(struct net_device *netdev,
|
||||
if (supported_link & IXGBE_LINK_SPEED_100_FULL)
|
||||
ecmd->supported |= ixgbe_isbackplane(hw->phy.media_type) ?
|
||||
SUPPORTED_1000baseKX_Full :
|
||||
SUPPORTED_1000baseT_Full;
|
||||
SUPPORTED_100baseT_Full;
|
||||
|
||||
/* default advertised speed if phy.autoneg_advertised isn't set */
|
||||
ecmd->advertising = ecmd->supported;
|
||||
|
||||
@@ -308,6 +308,7 @@ static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter)
|
||||
ixgbe_cache_ring_rss(adapter);
|
||||
}
|
||||
|
||||
#define IXGBE_RSS_64Q_MASK 0x3F
|
||||
#define IXGBE_RSS_16Q_MASK 0xF
|
||||
#define IXGBE_RSS_8Q_MASK 0x7
|
||||
#define IXGBE_RSS_4Q_MASK 0x3
|
||||
@@ -604,6 +605,7 @@ static bool ixgbe_set_sriov_queues(struct ixgbe_adapter *adapter)
|
||||
**/
|
||||
static bool ixgbe_set_rss_queues(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
struct ixgbe_ring_feature *f;
|
||||
u16 rss_i;
|
||||
|
||||
@@ -612,7 +614,11 @@ static bool ixgbe_set_rss_queues(struct ixgbe_adapter *adapter)
|
||||
rss_i = f->limit;
|
||||
|
||||
f->indices = rss_i;
|
||||
f->mask = IXGBE_RSS_16Q_MASK;
|
||||
|
||||
if (hw->mac.type < ixgbe_mac_X550)
|
||||
f->mask = IXGBE_RSS_16Q_MASK;
|
||||
else
|
||||
f->mask = IXGBE_RSS_64Q_MASK;
|
||||
|
||||
/* disable ATR by default, it will be configured below */
|
||||
adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
|
||||
|
||||
@@ -6194,7 +6194,8 @@ int ixgbe_close(struct net_device *netdev)
|
||||
|
||||
ixgbe_ptp_stop(adapter);
|
||||
|
||||
ixgbe_close_suspend(adapter);
|
||||
if (netif_device_present(netdev))
|
||||
ixgbe_close_suspend(adapter);
|
||||
|
||||
ixgbe_fdir_filter_exit(adapter);
|
||||
|
||||
@@ -6239,14 +6240,12 @@ static int ixgbe_resume(struct pci_dev *pdev)
|
||||
if (!err && netif_running(netdev))
|
||||
err = ixgbe_open(netdev);
|
||||
|
||||
|
||||
if (!err)
|
||||
netif_device_attach(netdev);
|
||||
rtnl_unlock();
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
netif_device_attach(netdev);
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
@@ -6261,14 +6260,14 @@ static int __ixgbe_shutdown(struct pci_dev *pdev, bool *enable_wake)
|
||||
int retval = 0;
|
||||
#endif
|
||||
|
||||
rtnl_lock();
|
||||
netif_device_detach(netdev);
|
||||
|
||||
rtnl_lock();
|
||||
if (netif_running(netdev))
|
||||
ixgbe_close_suspend(adapter);
|
||||
rtnl_unlock();
|
||||
|
||||
ixgbe_clear_interrupt_scheme(adapter);
|
||||
rtnl_unlock();
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
retval = pci_save_state(pdev);
|
||||
@@ -10027,7 +10026,7 @@ skip_bad_vf_detection:
|
||||
}
|
||||
|
||||
if (netif_running(netdev))
|
||||
ixgbe_down(adapter);
|
||||
ixgbe_close_suspend(adapter);
|
||||
|
||||
if (!test_and_set_bit(__IXGBE_DISABLED, &adapter->state))
|
||||
pci_disable_device(pdev);
|
||||
@@ -10097,10 +10096,12 @@ static void ixgbe_io_resume(struct pci_dev *pdev)
|
||||
}
|
||||
|
||||
#endif
|
||||
rtnl_lock();
|
||||
if (netif_running(netdev))
|
||||
ixgbe_up(adapter);
|
||||
ixgbe_open(netdev);
|
||||
|
||||
netif_device_attach(netdev);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
static const struct pci_error_handlers ixgbe_err_handler = {
|
||||
|
||||
@@ -113,7 +113,7 @@ static s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr,
|
||||
u16 reg, u16 *val, bool lock)
|
||||
{
|
||||
u32 swfw_mask = hw->phy.phy_semaphore_mask;
|
||||
int max_retry = 10;
|
||||
int max_retry = 3;
|
||||
int retry = 0;
|
||||
u8 csum_byte;
|
||||
u8 high_bits;
|
||||
@@ -1764,6 +1764,8 @@ static s32 ixgbe_read_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
|
||||
u32 swfw_mask = hw->phy.phy_semaphore_mask;
|
||||
bool nack = true;
|
||||
|
||||
if (hw->mac.type >= ixgbe_mac_X550)
|
||||
max_retry = 3;
|
||||
if (ixgbe_is_sfp_probe(hw, byte_offset, dev_addr))
|
||||
max_retry = IXGBE_SFP_DETECT_RETRIES;
|
||||
|
||||
|
||||
@@ -1932,8 +1932,6 @@ static s32 ixgbe_setup_kr_speed_x550em(struct ixgbe_hw *hw,
|
||||
return status;
|
||||
|
||||
reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
|
||||
reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_FEC_REQ |
|
||||
IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_FEC);
|
||||
reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR |
|
||||
IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX);
|
||||
|
||||
@@ -1995,12 +1993,11 @@ static s32 ixgbe_setup_kx4_x550em(struct ixgbe_hw *hw)
|
||||
/**
|
||||
* ixgbe_setup_kr_x550em - Configure the KR PHY
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Configures the integrated KR PHY for X550EM_x.
|
||||
**/
|
||||
static s32 ixgbe_setup_kr_x550em(struct ixgbe_hw *hw)
|
||||
{
|
||||
if (hw->mac.type != ixgbe_mac_X550EM_x)
|
||||
/* leave link alone for 2.5G */
|
||||
if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_2_5GB_FULL)
|
||||
return 0;
|
||||
|
||||
return ixgbe_setup_kr_speed_x550em(hw, hw->phy.autoneg_advertised);
|
||||
|
||||
+11
-9
@@ -559,6 +559,10 @@ static int macvtap_open(struct inode *inode, struct file *file)
|
||||
&macvtap_proto, 0);
|
||||
if (!q)
|
||||
goto err;
|
||||
if (skb_array_init(&q->skb_array, dev->tx_queue_len, GFP_KERNEL)) {
|
||||
sk_free(&q->sk);
|
||||
goto err;
|
||||
}
|
||||
|
||||
RCU_INIT_POINTER(q->sock.wq, &q->wq);
|
||||
init_waitqueue_head(&q->wq.wait);
|
||||
@@ -582,22 +586,18 @@ static int macvtap_open(struct inode *inode, struct file *file)
|
||||
if ((dev->features & NETIF_F_HIGHDMA) && (dev->features & NETIF_F_SG))
|
||||
sock_set_flag(&q->sk, SOCK_ZEROCOPY);
|
||||
|
||||
err = -ENOMEM;
|
||||
if (skb_array_init(&q->skb_array, dev->tx_queue_len, GFP_KERNEL))
|
||||
goto err_array;
|
||||
|
||||
err = macvtap_set_queue(dev, file, q);
|
||||
if (err)
|
||||
goto err_queue;
|
||||
if (err) {
|
||||
/* macvtap_sock_destruct() will take care of freeing skb_array */
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
dev_put(dev);
|
||||
|
||||
rtnl_unlock();
|
||||
return err;
|
||||
|
||||
err_queue:
|
||||
skb_array_cleanup(&q->skb_array);
|
||||
err_array:
|
||||
err_put:
|
||||
sock_put(&q->sk);
|
||||
err:
|
||||
if (dev)
|
||||
@@ -1077,6 +1077,8 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
|
||||
case TUNSETSNDBUF:
|
||||
if (get_user(s, sp))
|
||||
return -EFAULT;
|
||||
if (s <= 0)
|
||||
return -EINVAL;
|
||||
|
||||
q->sk.sk_sndbuf = s;
|
||||
return 0;
|
||||
|
||||
@@ -1338,7 +1338,17 @@ ppp_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats64)
|
||||
|
||||
static int ppp_dev_init(struct net_device *dev)
|
||||
{
|
||||
struct ppp *ppp;
|
||||
|
||||
netdev_lockdep_set_classes(dev);
|
||||
|
||||
ppp = netdev_priv(dev);
|
||||
/* Let the netdevice take a reference on the ppp file. This ensures
|
||||
* that ppp_destroy_interface() won't run before the device gets
|
||||
* unregistered.
|
||||
*/
|
||||
atomic_inc(&ppp->file.refcnt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1361,6 +1371,15 @@ static void ppp_dev_uninit(struct net_device *dev)
|
||||
wake_up_interruptible(&ppp->file.rwait);
|
||||
}
|
||||
|
||||
static void ppp_dev_priv_destructor(struct net_device *dev)
|
||||
{
|
||||
struct ppp *ppp;
|
||||
|
||||
ppp = netdev_priv(dev);
|
||||
if (atomic_dec_and_test(&ppp->file.refcnt))
|
||||
ppp_destroy_interface(ppp);
|
||||
}
|
||||
|
||||
static const struct net_device_ops ppp_netdev_ops = {
|
||||
.ndo_init = ppp_dev_init,
|
||||
.ndo_uninit = ppp_dev_uninit,
|
||||
@@ -1386,6 +1405,7 @@ static void ppp_setup(struct net_device *dev)
|
||||
dev->tx_queue_len = 3;
|
||||
dev->type = ARPHRD_PPP;
|
||||
dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
|
||||
dev->destructor = ppp_dev_priv_destructor;
|
||||
netif_keep_dst(dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -1787,6 +1787,9 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
||||
|
||||
if (!dev)
|
||||
return -ENOMEM;
|
||||
err = dev_get_valid_name(net, dev, name);
|
||||
if (err < 0)
|
||||
goto err_free_dev;
|
||||
|
||||
dev_net_set(dev, net);
|
||||
dev->rtnl_link_ops = &tun_link_ops;
|
||||
@@ -2186,6 +2189,10 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
||||
ret = -EFAULT;
|
||||
break;
|
||||
}
|
||||
if (sndbuf <= 0) {
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
tun->sndbuf = sndbuf;
|
||||
tun_set_sndbuf(tun);
|
||||
|
||||
@@ -624,7 +624,7 @@ static int asix_suspend(struct usb_interface *intf, pm_message_t message)
|
||||
struct usbnet *dev = usb_get_intfdata(intf);
|
||||
struct asix_common_private *priv = dev->driver_priv;
|
||||
|
||||
if (priv->suspend)
|
||||
if (priv && priv->suspend)
|
||||
priv->suspend(dev);
|
||||
|
||||
return usbnet_suspend(intf, message);
|
||||
@@ -676,7 +676,7 @@ static int asix_resume(struct usb_interface *intf)
|
||||
struct usbnet *dev = usb_get_intfdata(intf);
|
||||
struct asix_common_private *priv = dev->driver_priv;
|
||||
|
||||
if (priv->resume)
|
||||
if (priv && priv->resume)
|
||||
priv->resume(dev);
|
||||
|
||||
return usbnet_resume(intf);
|
||||
|
||||
@@ -221,7 +221,7 @@ skip:
|
||||
goto bad_desc;
|
||||
}
|
||||
|
||||
if (header.usb_cdc_ether_desc) {
|
||||
if (header.usb_cdc_ether_desc && info->ether->wMaxSegmentSize) {
|
||||
dev->hard_mtu = le16_to_cpu(info->ether->wMaxSegmentSize);
|
||||
/* because of Zaurus, we may be ignoring the host
|
||||
* side link address we were given.
|
||||
|
||||
@@ -205,6 +205,7 @@ static int qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
||||
return 1;
|
||||
}
|
||||
if (rawip) {
|
||||
skb_reset_mac_header(skb);
|
||||
skb->dev = dev->net; /* normally set by eth_type_trans */
|
||||
skb->protocol = proto;
|
||||
return 1;
|
||||
@@ -386,7 +387,7 @@ static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
}
|
||||
|
||||
/* errors aren't fatal - we can live with the dynamic address */
|
||||
if (cdc_ether) {
|
||||
if (cdc_ether && cdc_ether->wMaxSegmentSize) {
|
||||
dev->hard_mtu = le16_to_cpu(cdc_ether->wMaxSegmentSize);
|
||||
usbnet_get_ethernet_addr(dev, cdc_ether->iMACAddress);
|
||||
}
|
||||
|
||||
+1
-1
@@ -1129,7 +1129,7 @@ static int vrf_fib_rule(const struct net_device *dev, __u8 family, bool add_it)
|
||||
frh->family = family;
|
||||
frh->action = FR_ACT_TO_TBL;
|
||||
|
||||
if (nla_put_u32(skb, FRA_L3MDEV, 1))
|
||||
if (nla_put_u8(skb, FRA_L3MDEV, 1))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (nla_put_u32(skb, FRA_PRIORITY, FIB_RULE_PREF))
|
||||
|
||||
@@ -147,7 +147,6 @@ static struct ieee80211_rate __wl_rates[] = {
|
||||
.band = NL80211_BAND_2GHZ, \
|
||||
.center_freq = (_freq), \
|
||||
.hw_value = (_channel), \
|
||||
.flags = IEEE80211_CHAN_DISABLED, \
|
||||
.max_antenna_gain = 0, \
|
||||
.max_power = 30, \
|
||||
}
|
||||
@@ -156,7 +155,6 @@ static struct ieee80211_rate __wl_rates[] = {
|
||||
.band = NL80211_BAND_5GHZ, \
|
||||
.center_freq = 5000 + (5 * (_channel)), \
|
||||
.hw_value = (_channel), \
|
||||
.flags = IEEE80211_CHAN_DISABLED, \
|
||||
.max_antenna_gain = 0, \
|
||||
.max_power = 30, \
|
||||
}
|
||||
@@ -4754,9 +4752,6 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
|
||||
err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_AP, 0);
|
||||
if (err < 0)
|
||||
brcmf_err("setting AP mode failed %d\n", err);
|
||||
err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_INFRA, 0);
|
||||
if (err < 0)
|
||||
brcmf_err("setting INFRA mode failed %d\n", err);
|
||||
if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MBSS))
|
||||
brcmf_fil_iovar_int_set(ifp, "mbss", 0);
|
||||
brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_REGULATORY,
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <linux/iio/consumer.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#define CHRG_STAT_BAT_SAFE_MODE (1 << 3)
|
||||
#define CHRG_STAT_BAT_VALID (1 << 4)
|
||||
@@ -73,17 +74,15 @@
|
||||
#define FG_CNTL_CC_EN (1 << 6)
|
||||
#define FG_CNTL_GAUGE_EN (1 << 7)
|
||||
|
||||
#define FG_15BIT_WORD_VALID (1 << 15)
|
||||
#define FG_15BIT_VAL_MASK 0x7fff
|
||||
|
||||
#define FG_REP_CAP_VALID (1 << 7)
|
||||
#define FG_REP_CAP_VAL_MASK 0x7F
|
||||
|
||||
#define FG_DES_CAP1_VALID (1 << 7)
|
||||
#define FG_DES_CAP1_VAL_MASK 0x7F
|
||||
#define FG_DES_CAP0_VAL_MASK 0xFF
|
||||
#define FG_DES_CAP_RES_LSB 1456 /* 1.456mAhr */
|
||||
|
||||
#define FG_CC_MTR1_VALID (1 << 7)
|
||||
#define FG_CC_MTR1_VAL_MASK 0x7F
|
||||
#define FG_CC_MTR0_VAL_MASK 0xFF
|
||||
#define FG_DES_CC_RES_LSB 1456 /* 1.456mAhr */
|
||||
|
||||
#define FG_OCV_CAP_VALID (1 << 7)
|
||||
@@ -189,6 +188,44 @@ static int fuel_gauge_reg_writeb(struct axp288_fg_info *info, int reg, u8 val)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int fuel_gauge_read_15bit_word(struct axp288_fg_info *info, int reg)
|
||||
{
|
||||
unsigned char buf[2];
|
||||
int ret;
|
||||
|
||||
ret = regmap_bulk_read(info->regmap, reg, buf, 2);
|
||||
if (ret < 0) {
|
||||
dev_err(&info->pdev->dev, "Error reading reg 0x%02x err: %d\n",
|
||||
reg, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = get_unaligned_be16(buf);
|
||||
if (!(ret & FG_15BIT_WORD_VALID)) {
|
||||
dev_err(&info->pdev->dev, "Error reg 0x%02x contents not valid\n",
|
||||
reg);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
return ret & FG_15BIT_VAL_MASK;
|
||||
}
|
||||
|
||||
static int fuel_gauge_read_12bit_word(struct axp288_fg_info *info, int reg)
|
||||
{
|
||||
unsigned char buf[2];
|
||||
int ret;
|
||||
|
||||
ret = regmap_bulk_read(info->regmap, reg, buf, 2);
|
||||
if (ret < 0) {
|
||||
dev_err(&info->pdev->dev, "Error reading reg 0x%02x err: %d\n",
|
||||
reg, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* 12-bit data values have upper 8 bits in buf[0], lower 4 in buf[1] */
|
||||
return (buf[0] << 4) | ((buf[1] >> 4) & 0x0f);
|
||||
}
|
||||
|
||||
static int pmic_read_adc_val(const char *name, int *raw_val,
|
||||
struct axp288_fg_info *info)
|
||||
{
|
||||
@@ -249,24 +286,15 @@ static int fuel_gauge_debug_show(struct seq_file *s, void *data)
|
||||
seq_printf(s, " FG_RDC0[%02x] : %02x\n",
|
||||
AXP288_FG_RDC0_REG,
|
||||
fuel_gauge_reg_readb(info, AXP288_FG_RDC0_REG));
|
||||
seq_printf(s, " FG_OCVH[%02x] : %02x\n",
|
||||
seq_printf(s, " FG_OCV[%02x] : %04x\n",
|
||||
AXP288_FG_OCVH_REG,
|
||||
fuel_gauge_reg_readb(info, AXP288_FG_OCVH_REG));
|
||||
seq_printf(s, " FG_OCVL[%02x] : %02x\n",
|
||||
AXP288_FG_OCVL_REG,
|
||||
fuel_gauge_reg_readb(info, AXP288_FG_OCVL_REG));
|
||||
seq_printf(s, "FG_DES_CAP1[%02x] : %02x\n",
|
||||
fuel_gauge_read_12bit_word(info, AXP288_FG_OCVH_REG));
|
||||
seq_printf(s, " FG_DES_CAP[%02x] : %04x\n",
|
||||
AXP288_FG_DES_CAP1_REG,
|
||||
fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP1_REG));
|
||||
seq_printf(s, "FG_DES_CAP0[%02x] : %02x\n",
|
||||
AXP288_FG_DES_CAP0_REG,
|
||||
fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP0_REG));
|
||||
seq_printf(s, " FG_CC_MTR1[%02x] : %02x\n",
|
||||
fuel_gauge_read_15bit_word(info, AXP288_FG_DES_CAP1_REG));
|
||||
seq_printf(s, " FG_CC_MTR[%02x] : %04x\n",
|
||||
AXP288_FG_CC_MTR1_REG,
|
||||
fuel_gauge_reg_readb(info, AXP288_FG_CC_MTR1_REG));
|
||||
seq_printf(s, " FG_CC_MTR0[%02x] : %02x\n",
|
||||
AXP288_FG_CC_MTR0_REG,
|
||||
fuel_gauge_reg_readb(info, AXP288_FG_CC_MTR0_REG));
|
||||
fuel_gauge_read_15bit_word(info, AXP288_FG_CC_MTR1_REG));
|
||||
seq_printf(s, " FG_OCV_CAP[%02x] : %02x\n",
|
||||
AXP288_FG_OCV_CAP_REG,
|
||||
fuel_gauge_reg_readb(info, AXP288_FG_OCV_CAP_REG));
|
||||
@@ -517,21 +545,12 @@ temp_read_fail:
|
||||
|
||||
static int fuel_gauge_get_vocv(struct axp288_fg_info *info, int *vocv)
|
||||
{
|
||||
int ret, value;
|
||||
int ret;
|
||||
|
||||
/* 12-bit data value, upper 8 in OCVH, lower 4 in OCVL */
|
||||
ret = fuel_gauge_reg_readb(info, AXP288_FG_OCVH_REG);
|
||||
if (ret < 0)
|
||||
goto vocv_read_fail;
|
||||
value = ret << 4;
|
||||
ret = fuel_gauge_read_12bit_word(info, AXP288_FG_OCVH_REG);
|
||||
if (ret >= 0)
|
||||
*vocv = VOLTAGE_FROM_ADC(ret);
|
||||
|
||||
ret = fuel_gauge_reg_readb(info, AXP288_FG_OCVL_REG);
|
||||
if (ret < 0)
|
||||
goto vocv_read_fail;
|
||||
value |= (ret & 0xf);
|
||||
|
||||
*vocv = VOLTAGE_FROM_ADC(value);
|
||||
vocv_read_fail:
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -663,28 +682,18 @@ static int fuel_gauge_get_property(struct power_supply *ps,
|
||||
val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CHARGE_NOW:
|
||||
ret = fuel_gauge_reg_readb(info, AXP288_FG_CC_MTR1_REG);
|
||||
ret = fuel_gauge_read_15bit_word(info, AXP288_FG_CC_MTR1_REG);
|
||||
if (ret < 0)
|
||||
goto fuel_gauge_read_err;
|
||||
|
||||
value = (ret & FG_CC_MTR1_VAL_MASK) << 8;
|
||||
ret = fuel_gauge_reg_readb(info, AXP288_FG_CC_MTR0_REG);
|
||||
if (ret < 0)
|
||||
goto fuel_gauge_read_err;
|
||||
value |= (ret & FG_CC_MTR0_VAL_MASK);
|
||||
val->intval = value * FG_DES_CAP_RES_LSB;
|
||||
val->intval = ret * FG_DES_CAP_RES_LSB;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CHARGE_FULL:
|
||||
ret = fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP1_REG);
|
||||
ret = fuel_gauge_read_15bit_word(info, AXP288_FG_DES_CAP1_REG);
|
||||
if (ret < 0)
|
||||
goto fuel_gauge_read_err;
|
||||
|
||||
value = (ret & FG_DES_CAP1_VAL_MASK) << 8;
|
||||
ret = fuel_gauge_reg_readb(info, AXP288_FG_DES_CAP0_REG);
|
||||
if (ret < 0)
|
||||
goto fuel_gauge_read_err;
|
||||
value |= (ret & FG_DES_CAP0_VAL_MASK);
|
||||
val->intval = value * FG_DES_CAP_RES_LSB;
|
||||
val->intval = ret * FG_DES_CAP_RES_LSB;
|
||||
break;
|
||||
case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
|
||||
val->intval = PROP_CURR(info->pdata->design_cap);
|
||||
|
||||
@@ -63,7 +63,6 @@ struct rx8010_data {
|
||||
struct i2c_client *client;
|
||||
struct rtc_device *rtc;
|
||||
u8 ctrlreg;
|
||||
spinlock_t flags_lock;
|
||||
};
|
||||
|
||||
static irqreturn_t rx8010_irq_1_handler(int irq, void *dev_id)
|
||||
@@ -72,12 +71,12 @@ static irqreturn_t rx8010_irq_1_handler(int irq, void *dev_id)
|
||||
struct rx8010_data *rx8010 = i2c_get_clientdata(client);
|
||||
int flagreg;
|
||||
|
||||
spin_lock(&rx8010->flags_lock);
|
||||
mutex_lock(&rx8010->rtc->ops_lock);
|
||||
|
||||
flagreg = i2c_smbus_read_byte_data(client, RX8010_FLAG);
|
||||
|
||||
if (flagreg <= 0) {
|
||||
spin_unlock(&rx8010->flags_lock);
|
||||
mutex_unlock(&rx8010->rtc->ops_lock);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
@@ -101,7 +100,7 @@ static irqreturn_t rx8010_irq_1_handler(int irq, void *dev_id)
|
||||
|
||||
i2c_smbus_write_byte_data(client, RX8010_FLAG, flagreg);
|
||||
|
||||
spin_unlock(&rx8010->flags_lock);
|
||||
mutex_unlock(&rx8010->rtc->ops_lock);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -143,7 +142,6 @@ static int rx8010_set_time(struct device *dev, struct rtc_time *dt)
|
||||
u8 date[7];
|
||||
int ctrl, flagreg;
|
||||
int ret;
|
||||
unsigned long irqflags;
|
||||
|
||||
if ((dt->tm_year < 100) || (dt->tm_year > 199))
|
||||
return -EINVAL;
|
||||
@@ -181,11 +179,8 @@ static int rx8010_set_time(struct device *dev, struct rtc_time *dt)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
spin_lock_irqsave(&rx8010->flags_lock, irqflags);
|
||||
|
||||
flagreg = i2c_smbus_read_byte_data(rx8010->client, RX8010_FLAG);
|
||||
if (flagreg < 0) {
|
||||
spin_unlock_irqrestore(&rx8010->flags_lock, irqflags);
|
||||
return flagreg;
|
||||
}
|
||||
|
||||
@@ -193,8 +188,6 @@ static int rx8010_set_time(struct device *dev, struct rtc_time *dt)
|
||||
ret = i2c_smbus_write_byte_data(rx8010->client, RX8010_FLAG,
|
||||
flagreg & ~RX8010_FLAG_VLF);
|
||||
|
||||
spin_unlock_irqrestore(&rx8010->flags_lock, irqflags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -288,12 +281,9 @@ static int rx8010_set_alarm(struct device *dev, struct rtc_wkalrm *t)
|
||||
u8 alarmvals[3];
|
||||
int extreg, flagreg;
|
||||
int err;
|
||||
unsigned long irqflags;
|
||||
|
||||
spin_lock_irqsave(&rx8010->flags_lock, irqflags);
|
||||
flagreg = i2c_smbus_read_byte_data(client, RX8010_FLAG);
|
||||
if (flagreg < 0) {
|
||||
spin_unlock_irqrestore(&rx8010->flags_lock, irqflags);
|
||||
return flagreg;
|
||||
}
|
||||
|
||||
@@ -302,14 +292,12 @@ static int rx8010_set_alarm(struct device *dev, struct rtc_wkalrm *t)
|
||||
err = i2c_smbus_write_byte_data(rx8010->client, RX8010_CTRL,
|
||||
rx8010->ctrlreg);
|
||||
if (err < 0) {
|
||||
spin_unlock_irqrestore(&rx8010->flags_lock, irqflags);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
flagreg &= ~RX8010_FLAG_AF;
|
||||
err = i2c_smbus_write_byte_data(rx8010->client, RX8010_FLAG, flagreg);
|
||||
spin_unlock_irqrestore(&rx8010->flags_lock, irqflags);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
@@ -404,7 +392,6 @@ static int rx8010_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
|
||||
struct rx8010_data *rx8010 = dev_get_drvdata(dev);
|
||||
int ret, tmp;
|
||||
int flagreg;
|
||||
unsigned long irqflags;
|
||||
|
||||
switch (cmd) {
|
||||
case RTC_VL_READ:
|
||||
@@ -419,16 +406,13 @@ static int rx8010_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
|
||||
return 0;
|
||||
|
||||
case RTC_VL_CLR:
|
||||
spin_lock_irqsave(&rx8010->flags_lock, irqflags);
|
||||
flagreg = i2c_smbus_read_byte_data(rx8010->client, RX8010_FLAG);
|
||||
if (flagreg < 0) {
|
||||
spin_unlock_irqrestore(&rx8010->flags_lock, irqflags);
|
||||
return flagreg;
|
||||
}
|
||||
|
||||
flagreg &= ~RX8010_FLAG_VLF;
|
||||
ret = i2c_smbus_write_byte_data(client, RX8010_FLAG, flagreg);
|
||||
spin_unlock_irqrestore(&rx8010->flags_lock, irqflags);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -466,8 +450,6 @@ static int rx8010_probe(struct i2c_client *client,
|
||||
rx8010->client = client;
|
||||
i2c_set_clientdata(client, rx8010);
|
||||
|
||||
spin_lock_init(&rx8010->flags_lock);
|
||||
|
||||
err = rx8010_init_client(client);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -5130,6 +5130,19 @@ lpfc_free_sysfs_attr(struct lpfc_vport *vport)
|
||||
* Dynamic FC Host Attributes Support
|
||||
*/
|
||||
|
||||
/**
|
||||
* lpfc_get_host_symbolic_name - Copy symbolic name into the scsi host
|
||||
* @shost: kernel scsi host pointer.
|
||||
**/
|
||||
static void
|
||||
lpfc_get_host_symbolic_name(struct Scsi_Host *shost)
|
||||
{
|
||||
struct lpfc_vport *vport = (struct lpfc_vport *)shost->hostdata;
|
||||
|
||||
lpfc_vport_symbolic_node_name(vport, fc_host_symbolic_name(shost),
|
||||
sizeof fc_host_symbolic_name(shost));
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_get_host_port_id - Copy the vport DID into the scsi host port id
|
||||
* @shost: kernel scsi host pointer.
|
||||
@@ -5667,6 +5680,8 @@ struct fc_function_template lpfc_transport_functions = {
|
||||
.show_host_supported_fc4s = 1,
|
||||
.show_host_supported_speeds = 1,
|
||||
.show_host_maxframe_size = 1,
|
||||
|
||||
.get_host_symbolic_name = lpfc_get_host_symbolic_name,
|
||||
.show_host_symbolic_name = 1,
|
||||
|
||||
/* dynamic attributes the driver supports */
|
||||
@@ -5734,6 +5749,8 @@ struct fc_function_template lpfc_vport_transport_functions = {
|
||||
.show_host_supported_fc4s = 1,
|
||||
.show_host_supported_speeds = 1,
|
||||
.show_host_maxframe_size = 1,
|
||||
|
||||
.get_host_symbolic_name = lpfc_get_host_symbolic_name,
|
||||
.show_host_symbolic_name = 1,
|
||||
|
||||
/* dynamic attributes the driver supports */
|
||||
|
||||
@@ -1999,6 +1999,9 @@ lpfc_issue_els_plogi(struct lpfc_vport *vport, uint32_t did, uint8_t retry)
|
||||
if (sp->cmn.fcphHigh < FC_PH3)
|
||||
sp->cmn.fcphHigh = FC_PH3;
|
||||
|
||||
sp->cmn.valid_vendor_ver_level = 0;
|
||||
memset(sp->vendorVersion, 0, sizeof(sp->vendorVersion));
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_CMD,
|
||||
"Issue PLOGI: did:x%x",
|
||||
did, 0, 0);
|
||||
@@ -3990,6 +3993,9 @@ lpfc_els_rsp_acc(struct lpfc_vport *vport, uint32_t flag,
|
||||
} else {
|
||||
memcpy(pcmd, &vport->fc_sparam,
|
||||
sizeof(struct serv_parm));
|
||||
|
||||
sp->cmn.valid_vendor_ver_level = 0;
|
||||
memset(sp->vendorVersion, 0, sizeof(sp->vendorVersion));
|
||||
}
|
||||
|
||||
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_RSP,
|
||||
|
||||
@@ -360,6 +360,12 @@ struct csp {
|
||||
* Word 1 Bit 30 in PLOGI request is random offset
|
||||
*/
|
||||
#define virtual_fabric_support randomOffset /* Word 1, bit 30 */
|
||||
/*
|
||||
* Word 1 Bit 29 in common service parameter is overloaded.
|
||||
* Word 1 Bit 29 in FLOGI response is multiple NPort assignment
|
||||
* Word 1 Bit 29 in FLOGI/PLOGI request is Valid Vendor Version Level
|
||||
*/
|
||||
#define valid_vendor_ver_level response_multiple_NPort /* Word 1, bit 29 */
|
||||
#ifdef __BIG_ENDIAN_BITFIELD
|
||||
uint16_t request_multiple_Nport:1; /* FC Word 1, bit 31 */
|
||||
uint16_t randomOffset:1; /* FC Word 1, bit 30 */
|
||||
|
||||
@@ -119,6 +119,8 @@ lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe *wqe)
|
||||
if (q->phba->sli3_options & LPFC_SLI4_PHWQ_ENABLED)
|
||||
bf_set(wqe_wqid, &wqe->generic.wqe_com, q->queue_id);
|
||||
lpfc_sli_pcimem_bcopy(wqe, temp_wqe, q->entry_size);
|
||||
/* ensure WQE bcopy flushed before doorbell write */
|
||||
wmb();
|
||||
|
||||
/* Update the host index before invoking device */
|
||||
host_index = q->host_index;
|
||||
@@ -10004,6 +10006,7 @@ lpfc_sli_abort_iotag_issue(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
|
||||
iabt->ulpCommand = CMD_CLOSE_XRI_CN;
|
||||
|
||||
abtsiocbp->iocb_cmpl = lpfc_sli_abort_els_cmpl;
|
||||
abtsiocbp->vport = vport;
|
||||
|
||||
lpfc_printf_vlog(vport, KERN_INFO, LOG_SLI,
|
||||
"0339 Abort xri x%x, original iotag x%x, "
|
||||
|
||||
@@ -537,6 +537,12 @@ enable_vport(struct fc_vport *fc_vport)
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
vport->load_flag |= FC_LOADING;
|
||||
if (vport->fc_flag & FC_VPORT_NEEDS_INIT_VPI) {
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
lpfc_issue_init_vpi(vport);
|
||||
goto out;
|
||||
}
|
||||
|
||||
vport->fc_flag |= FC_VPORT_NEEDS_REG_VPI;
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
@@ -557,6 +563,8 @@ enable_vport(struct fc_vport *fc_vport)
|
||||
} else {
|
||||
lpfc_vport_set_state(vport, FC_VPORT_FAILED);
|
||||
}
|
||||
|
||||
out:
|
||||
lpfc_printf_vlog(vport, KERN_ERR, LOG_VPORT,
|
||||
"1827 Vport Enabled.\n");
|
||||
return VPORT_OK;
|
||||
|
||||
@@ -484,7 +484,6 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, struct qla_tgt_cmd *cmd,
|
||||
static void tcm_qla2xxx_handle_data_work(struct work_struct *work)
|
||||
{
|
||||
struct qla_tgt_cmd *cmd = container_of(work, struct qla_tgt_cmd, work);
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* Ensure that the complete FCP WRITE payload has been received.
|
||||
@@ -492,17 +491,6 @@ static void tcm_qla2xxx_handle_data_work(struct work_struct *work)
|
||||
*/
|
||||
cmd->cmd_in_wq = 0;
|
||||
|
||||
spin_lock_irqsave(&cmd->cmd_lock, flags);
|
||||
cmd->cmd_flags |= CMD_FLAG_DATA_WORK;
|
||||
if (cmd->aborted) {
|
||||
cmd->cmd_flags |= CMD_FLAG_DATA_WORK_FREE;
|
||||
spin_unlock_irqrestore(&cmd->cmd_lock, flags);
|
||||
|
||||
tcm_qla2xxx_free_cmd(cmd);
|
||||
return;
|
||||
}
|
||||
spin_unlock_irqrestore(&cmd->cmd_lock, flags);
|
||||
|
||||
cmd->vha->tgt_counters.qla_core_ret_ctio++;
|
||||
if (!cmd->write_data_transferred) {
|
||||
/*
|
||||
@@ -682,34 +670,13 @@ static void tcm_qla2xxx_queue_tm_rsp(struct se_cmd *se_cmd)
|
||||
qlt_xmit_tm_rsp(mcmd);
|
||||
}
|
||||
|
||||
|
||||
#define DATA_WORK_NOT_FREE(_flags) \
|
||||
(( _flags & (CMD_FLAG_DATA_WORK|CMD_FLAG_DATA_WORK_FREE)) == \
|
||||
CMD_FLAG_DATA_WORK)
|
||||
static void tcm_qla2xxx_aborted_task(struct se_cmd *se_cmd)
|
||||
{
|
||||
struct qla_tgt_cmd *cmd = container_of(se_cmd,
|
||||
struct qla_tgt_cmd, se_cmd);
|
||||
unsigned long flags;
|
||||
|
||||
if (qlt_abort_cmd(cmd))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&cmd->cmd_lock, flags);
|
||||
if ((cmd->state == QLA_TGT_STATE_NEW)||
|
||||
((cmd->state == QLA_TGT_STATE_DATA_IN) &&
|
||||
DATA_WORK_NOT_FREE(cmd->cmd_flags)) ) {
|
||||
|
||||
cmd->cmd_flags |= CMD_FLAG_DATA_WORK_FREE;
|
||||
spin_unlock_irqrestore(&cmd->cmd_lock, flags);
|
||||
/* Cmd have not reached firmware.
|
||||
* Use this trigger to free it. */
|
||||
tcm_qla2xxx_free_cmd(cmd);
|
||||
return;
|
||||
}
|
||||
spin_unlock_irqrestore(&cmd->cmd_lock, flags);
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
static void tcm_qla2xxx_clear_sess_lookup(struct tcm_qla2xxx_lport *,
|
||||
|
||||
@@ -1689,6 +1689,7 @@ static const struct of_device_id ufs_qcom_of_match[] = {
|
||||
{ .compatible = "qcom,ufshc"},
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ufs_qcom_of_match);
|
||||
|
||||
static const struct dev_pm_ops ufs_qcom_pm_ops = {
|
||||
.suspend = ufshcd_pltfrm_suspend,
|
||||
|
||||
+22
-11
@@ -3810,18 +3810,25 @@ out:
|
||||
}
|
||||
|
||||
/**
|
||||
* ufshcd_force_reset_auto_bkops - force enable of auto bkops
|
||||
* ufshcd_force_reset_auto_bkops - force reset auto bkops state
|
||||
* @hba: per adapter instance
|
||||
*
|
||||
* After a device reset the device may toggle the BKOPS_EN flag
|
||||
* to default value. The s/w tracking variables should be updated
|
||||
* as well. Do this by forcing enable of auto bkops.
|
||||
* as well. This function would change the auto-bkops state based on
|
||||
* UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND.
|
||||
*/
|
||||
static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba)
|
||||
static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba)
|
||||
{
|
||||
hba->auto_bkops_enabled = false;
|
||||
hba->ee_ctrl_mask |= MASK_EE_URGENT_BKOPS;
|
||||
ufshcd_enable_auto_bkops(hba);
|
||||
if (ufshcd_keep_autobkops_enabled_except_suspend(hba)) {
|
||||
hba->auto_bkops_enabled = false;
|
||||
hba->ee_ctrl_mask |= MASK_EE_URGENT_BKOPS;
|
||||
ufshcd_enable_auto_bkops(hba);
|
||||
} else {
|
||||
hba->auto_bkops_enabled = true;
|
||||
hba->ee_ctrl_mask &= ~MASK_EE_URGENT_BKOPS;
|
||||
ufshcd_disable_auto_bkops(hba);
|
||||
}
|
||||
}
|
||||
|
||||
static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status)
|
||||
@@ -6167,11 +6174,15 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
|
||||
goto set_old_link_state;
|
||||
}
|
||||
|
||||
/*
|
||||
* If BKOPs operations are urgently needed at this moment then
|
||||
* keep auto-bkops enabled or else disable it.
|
||||
*/
|
||||
ufshcd_urgent_bkops(hba);
|
||||
if (ufshcd_keep_autobkops_enabled_except_suspend(hba))
|
||||
ufshcd_enable_auto_bkops(hba);
|
||||
else
|
||||
/*
|
||||
* If BKOPs operations are urgently needed at this moment then
|
||||
* keep auto-bkops enabled or else disable it.
|
||||
*/
|
||||
ufshcd_urgent_bkops(hba);
|
||||
|
||||
hba->clk_gating.is_suspended = false;
|
||||
|
||||
if (ufshcd_is_clkscaling_enabled(hba))
|
||||
|
||||
@@ -548,6 +548,14 @@ struct ufs_hba {
|
||||
* CAUTION: Enabling this might reduce overall UFS throughput.
|
||||
*/
|
||||
#define UFSHCD_CAP_INTR_AGGR (1 << 4)
|
||||
/*
|
||||
* This capability allows the device auto-bkops to be always enabled
|
||||
* except during suspend (both runtime and suspend).
|
||||
* Enabling this capability means that device will always be allowed
|
||||
* to do background operation when it's active but it might degrade
|
||||
* the performance of ongoing read/write operations.
|
||||
*/
|
||||
#define UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND (1 << 5)
|
||||
|
||||
struct devfreq *devfreq;
|
||||
struct ufs_clk_scaling clk_scaling;
|
||||
@@ -647,6 +655,11 @@ static inline void *ufshcd_get_variant(struct ufs_hba *hba)
|
||||
BUG_ON(!hba);
|
||||
return hba->priv;
|
||||
}
|
||||
static inline bool ufshcd_keep_autobkops_enabled_except_suspend(
|
||||
struct ufs_hba *hba)
|
||||
{
|
||||
return hba->caps & UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND;
|
||||
}
|
||||
|
||||
extern int ufshcd_runtime_suspend(struct ufs_hba *hba);
|
||||
extern int ufshcd_runtime_resume(struct ufs_hba *hba);
|
||||
|
||||
@@ -357,6 +357,9 @@ static int gb_connection_hd_cport_quiesce(struct gb_connection *connection)
|
||||
size_t peer_space;
|
||||
int ret;
|
||||
|
||||
if (!hd->driver->cport_quiesce)
|
||||
return 0;
|
||||
|
||||
peer_space = sizeof(struct gb_operation_msg_hdr) +
|
||||
sizeof(struct gb_cport_shutdown_request);
|
||||
|
||||
@@ -380,6 +383,9 @@ static int gb_connection_hd_cport_clear(struct gb_connection *connection)
|
||||
struct gb_host_device *hd = connection->hd;
|
||||
int ret;
|
||||
|
||||
if (!hd->driver->cport_clear)
|
||||
return 0;
|
||||
|
||||
ret = hd->driver->cport_clear(hd, connection->hd_cport_id);
|
||||
if (ret) {
|
||||
dev_err(&hd->dev, "%s: failed to clear host cport: %d\n",
|
||||
|
||||
@@ -544,11 +544,14 @@ int gb_spilib_master_init(struct gb_connection *connection, struct device *dev,
|
||||
|
||||
return 0;
|
||||
|
||||
exit_spi_unregister:
|
||||
spi_unregister_master(master);
|
||||
exit_spi_put:
|
||||
spi_master_put(master);
|
||||
|
||||
return ret;
|
||||
|
||||
exit_spi_unregister:
|
||||
spi_unregister_master(master);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gb_spilib_master_init);
|
||||
@@ -558,7 +561,6 @@ void gb_spilib_master_exit(struct gb_connection *connection)
|
||||
struct spi_master *master = gb_connection_get_data(connection);
|
||||
|
||||
spi_unregister_master(master);
|
||||
spi_master_put(master);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gb_spilib_master_exit);
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ extern u32 GlobalDebugLevel;
|
||||
#define DBG_88E_LEVEL(_level, fmt, arg...) \
|
||||
do { \
|
||||
if (_level <= GlobalDebugLevel) \
|
||||
pr_info(DRIVER_PREFIX"ERROR " fmt, ##arg); \
|
||||
pr_info(DRIVER_PREFIX fmt, ##arg); \
|
||||
} while (0)
|
||||
|
||||
#define DBG_88E(...) \
|
||||
|
||||
@@ -199,7 +199,7 @@ static noinline_for_stack char *translate_scan(struct _adapter *padapter,
|
||||
iwe.cmd = SIOCGIWMODE;
|
||||
memcpy((u8 *)&cap, r8712_get_capability_from_ie(pnetwork->network.IEs),
|
||||
2);
|
||||
cap = le16_to_cpu(cap);
|
||||
le16_to_cpus(&cap);
|
||||
if (cap & (WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_BSS)) {
|
||||
if (cap & WLAN_CAPABILITY_BSS)
|
||||
iwe.u.mode = (u32)IW_MODE_MASTER;
|
||||
|
||||
@@ -1001,7 +1001,7 @@ int wilc_mac_xmit(struct sk_buff *skb, struct net_device *ndev)
|
||||
tx_data->skb = skb;
|
||||
|
||||
eth_h = (struct ethhdr *)(skb->data);
|
||||
if (eth_h->h_proto == 0x8e88)
|
||||
if (eth_h->h_proto == cpu_to_be16(0x8e88))
|
||||
netdev_dbg(ndev, "EAPOL transmitted\n");
|
||||
|
||||
ih = (struct iphdr *)(skb->data + sizeof(struct ethhdr));
|
||||
|
||||
@@ -1940,7 +1940,7 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
||||
struct iscsi_tm *hdr;
|
||||
int out_of_order_cmdsn = 0, ret;
|
||||
bool sess_ref = false;
|
||||
u8 function;
|
||||
u8 function, tcm_function = TMR_UNKNOWN;
|
||||
|
||||
hdr = (struct iscsi_tm *) buf;
|
||||
hdr->flags &= ~ISCSI_FLAG_CMD_FINAL;
|
||||
@@ -1986,10 +1986,6 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
||||
* LIO-Target $FABRIC_MOD
|
||||
*/
|
||||
if (function != ISCSI_TM_FUNC_TASK_REASSIGN) {
|
||||
|
||||
u8 tcm_function;
|
||||
int ret;
|
||||
|
||||
transport_init_se_cmd(&cmd->se_cmd, &iscsi_ops,
|
||||
conn->sess->se_sess, 0, DMA_NONE,
|
||||
TCM_SIMPLE_TAG, cmd->sense_buffer + 2);
|
||||
@@ -2025,15 +2021,14 @@ iscsit_handle_task_mgt_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,
|
||||
return iscsit_add_reject_cmd(cmd,
|
||||
ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
|
||||
}
|
||||
|
||||
ret = core_tmr_alloc_req(&cmd->se_cmd, cmd->tmr_req,
|
||||
tcm_function, GFP_KERNEL);
|
||||
if (ret < 0)
|
||||
return iscsit_add_reject_cmd(cmd,
|
||||
}
|
||||
ret = core_tmr_alloc_req(&cmd->se_cmd, cmd->tmr_req, tcm_function,
|
||||
GFP_KERNEL);
|
||||
if (ret < 0)
|
||||
return iscsit_add_reject_cmd(cmd,
|
||||
ISCSI_REASON_BOOKMARK_NO_RESOURCES, buf);
|
||||
|
||||
cmd->tmr_req->se_tmr_req = cmd->se_cmd.se_tmr_req;
|
||||
}
|
||||
cmd->tmr_req->se_tmr_req = cmd->se_cmd.se_tmr_req;
|
||||
|
||||
cmd->iscsi_opcode = ISCSI_OP_SCSI_TMFUNC;
|
||||
cmd->i_state = ISTATE_SEND_TASKMGTRSP;
|
||||
|
||||
@@ -54,6 +54,9 @@ static int fintek_8250_enter_key(u16 base_port, u8 key)
|
||||
if (!request_muxed_region(base_port, 2, "8250_fintek"))
|
||||
return -EBUSY;
|
||||
|
||||
/* Force to deactive all SuperIO in this base_port */
|
||||
outb(EXIT_KEY, base_port + ADDR_PORT);
|
||||
|
||||
outb(key, base_port + ADDR_PORT);
|
||||
outb(key, base_port + ADDR_PORT);
|
||||
return 0;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user