Merge 4.14.163 into android-4.14
Changes in 4.14.163 nvme_fc: add module to ops template to allow module references iio: adc: max9611: Fix too short conversion time delay PM / devfreq: Don't fail devfreq_dev_release if not in list RDMA/cma: add missed unregister_pernet_subsys in init failure rxe: correctly calculate iCRC for unaligned payloads scsi: lpfc: Fix memory leak on lpfc_bsg_write_ebuf_set func scsi: qla2xxx: Don't call qlt_async_event twice scsi: iscsi: qla4xxx: fix double free in probe scsi: libsas: stop discovering if oob mode is disconnected drm/nouveau: Move the declaration of struct nouveau_conn_atom up a bit usb: gadget: fix wrong endpoint desc net: make socket read/write_iter() honor IOCB_NOWAIT md: raid1: check rdev before reference in raid1_sync_request func s390/cpum_sf: Adjust sampling interval to avoid hitting sample limits s390/cpum_sf: Avoid SBD overflow condition in irq handler IB/mlx4: Follow mirror sequence of device add during device removal xen-blkback: prevent premature module unload xen/balloon: fix ballooned page accounting without hotplug enabled PM / hibernate: memory_bm_find_bit(): Tighten node optimisation xfs: fix mount failure crash on invalid iclog memory access taskstats: fix data-race drm: limit to INT_MAX in create_blob ioctl ALSA: ice1724: Fix sleep-in-atomic in Infrasonic Quartet support code drm/sun4i: hdmi: Remove duplicate cleanup calls MIPS: Avoid VDSO ABI breakage due to global register variable media: pulse8-cec: fix lost cec_transmit_attempt_done() call media: cec: CEC 2.0-only bcast messages were ignored media: cec: avoid decrementing transmit_queue_sz if it is 0 mm/zsmalloc.c: fix the migrated zspage statistics. memcg: account security cred as well to kmemcg pstore/ram: Write new dumps to start of recycled zones locks: print unsigned ino in /proc/locks dmaengine: Fix access to uninitialized dma_slave_caps compat_ioctl: block: handle Persistent Reservations compat_ioctl: block: handle BLKREPORTZONE/BLKRESETZONE ata: libahci_platform: Export again ahci_platform_<en/dis>able_phys() ata: ahci_brcm: Allow optional reset controller to be used ata: ahci_brcm: Fix AHCI resources management gpiolib: fix up emulated open drain outputs tracing: Fix lock inversion in trace_event_enable_tgid_record() tracing: Have the histogram compare functions convert to u64 first ALSA: cs4236: fix error return comparison of an unsigned integer ALSA: firewire-motu: Correct a typo in the clock proc string exit: panic before exit_mm() on global init exit ftrace: Avoid potential division by zero in function profiler arm64: Revert support for execute-only user mappings PM / devfreq: Check NULL governor in available_governors_show nfsd4: fix up replay_matches_cache() scsi: qla2xxx: Drop superfluous INIT_WORK of del_work xfs: don't check for AG deadlock for realtime files in bunmapi platform/x86: pmc_atom: Add Siemens CONNECT X300 to critclk_systems DMI table Bluetooth: btusb: fix PM leak in error case of setup Bluetooth: delete a stray unlock Bluetooth: Fix memory leak in hci_connect_le_scan media: flexcop-usb: ensure -EIO is returned on error condition regulator: ab8500: Remove AB8505 USB regulator media: usb: fix memory leak in af9005_identify_state dt-bindings: clock: renesas: rcar-usb2-clock-sel: Fix typo in example tty: serial: msm_serial: Fix lockup for sysrq and oops fix compat handling of FICLONERANGE, FIDEDUPERANGE and FS_IOC_FIEMAP scsi: qedf: Do not retry ELS request if qedf_alloc_cmd fails drm/mst: Fix MST sideband up-reply failure handling powerpc/pseries/hvconsole: Fix stack overread via udbg selftests: rtnetlink: add addresses with fixed life time rxrpc: Fix possible NULL pointer access in ICMP handling ath9k_htc: Modify byte order for an error message ath9k_htc: Discard undersized packets arm64: dts: meson: odroid-c2: Disable usb_otg bus to avoid power failed warning net: add annotations on hh->hh_len lockless accesses s390/smp: fix physical to logical CPU map for SMT xen/blkback: Avoid unmapping unmapped grant pages perf/x86/intel/bts: Fix the use of page_private() Linux 4.14.163 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -46,7 +46,7 @@ Required properties:
|
|||||||
Example (R-Car H3):
|
Example (R-Car H3):
|
||||||
|
|
||||||
usb2_clksel: clock-controller@e6590630 {
|
usb2_clksel: clock-controller@e6590630 {
|
||||||
compatible = "renesas,r8a77950-rcar-usb2-clock-sel",
|
compatible = "renesas,r8a7795-rcar-usb2-clock-sel",
|
||||||
"renesas,rcar-gen3-usb2-clock-sel";
|
"renesas,rcar-gen3-usb2-clock-sel";
|
||||||
reg = <0 0xe6590630 0 0x02>;
|
reg = <0 0xe6590630 0 0x02>;
|
||||||
clocks = <&cpg CPG_MOD 703>, <&usb_extal>, <&usb_xtal>;
|
clocks = <&cpg CPG_MOD 703>, <&usb_extal>, <&usb_xtal>;
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 14
|
PATCHLEVEL = 14
|
||||||
SUBLEVEL = 162
|
SUBLEVEL = 163
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Petit Gorille
|
NAME = Petit Gorille
|
||||||
|
|
||||||
|
|||||||
@@ -295,7 +295,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&usb0_phy {
|
&usb0_phy {
|
||||||
status = "okay";
|
status = "disabled";
|
||||||
phy-supply = <&usb_otg_pwr>;
|
phy-supply = <&usb_otg_pwr>;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -305,7 +305,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
&usb0 {
|
&usb0 {
|
||||||
status = "okay";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
&usb1 {
|
&usb1 {
|
||||||
|
|||||||
@@ -76,13 +76,12 @@
|
|||||||
#define PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_WRITE)
|
#define PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_WRITE)
|
||||||
#define PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
|
#define PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN | PTE_UXN)
|
||||||
#define PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN)
|
#define PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_RDONLY | PTE_NG | PTE_PXN)
|
||||||
#define PAGE_EXECONLY __pgprot(_PAGE_DEFAULT | PTE_RDONLY | PTE_NG | PTE_PXN)
|
|
||||||
|
|
||||||
#define __P000 PAGE_NONE
|
#define __P000 PAGE_NONE
|
||||||
#define __P001 PAGE_READONLY
|
#define __P001 PAGE_READONLY
|
||||||
#define __P010 PAGE_READONLY
|
#define __P010 PAGE_READONLY
|
||||||
#define __P011 PAGE_READONLY
|
#define __P011 PAGE_READONLY
|
||||||
#define __P100 PAGE_EXECONLY
|
#define __P100 PAGE_READONLY_EXEC
|
||||||
#define __P101 PAGE_READONLY_EXEC
|
#define __P101 PAGE_READONLY_EXEC
|
||||||
#define __P110 PAGE_READONLY_EXEC
|
#define __P110 PAGE_READONLY_EXEC
|
||||||
#define __P111 PAGE_READONLY_EXEC
|
#define __P111 PAGE_READONLY_EXEC
|
||||||
@@ -91,7 +90,7 @@
|
|||||||
#define __S001 PAGE_READONLY
|
#define __S001 PAGE_READONLY
|
||||||
#define __S010 PAGE_SHARED
|
#define __S010 PAGE_SHARED
|
||||||
#define __S011 PAGE_SHARED
|
#define __S011 PAGE_SHARED
|
||||||
#define __S100 PAGE_EXECONLY
|
#define __S100 PAGE_READONLY_EXEC
|
||||||
#define __S101 PAGE_READONLY_EXEC
|
#define __S101 PAGE_READONLY_EXEC
|
||||||
#define __S110 PAGE_SHARED_EXEC
|
#define __S110 PAGE_SHARED_EXEC
|
||||||
#define __S111 PAGE_SHARED_EXEC
|
#define __S111 PAGE_SHARED_EXEC
|
||||||
|
|||||||
@@ -90,12 +90,8 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
|
|||||||
#define pte_dirty(pte) (pte_sw_dirty(pte) || pte_hw_dirty(pte))
|
#define pte_dirty(pte) (pte_sw_dirty(pte) || pte_hw_dirty(pte))
|
||||||
|
|
||||||
#define pte_valid(pte) (!!(pte_val(pte) & PTE_VALID))
|
#define pte_valid(pte) (!!(pte_val(pte) & PTE_VALID))
|
||||||
/*
|
|
||||||
* Execute-only user mappings do not have the PTE_USER bit set. All valid
|
|
||||||
* kernel mappings have the PTE_UXN bit set.
|
|
||||||
*/
|
|
||||||
#define pte_valid_not_user(pte) \
|
#define pte_valid_not_user(pte) \
|
||||||
((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_UXN)) == (PTE_VALID | PTE_UXN))
|
((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID)
|
||||||
#define pte_valid_young(pte) \
|
#define pte_valid_young(pte) \
|
||||||
((pte_val(pte) & (PTE_VALID | PTE_AF)) == (PTE_VALID | PTE_AF))
|
((pte_val(pte) & (PTE_VALID | PTE_AF)) == (PTE_VALID | PTE_AF))
|
||||||
#define pte_valid_user(pte) \
|
#define pte_valid_user(pte) \
|
||||||
@@ -111,8 +107,8 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* p??_access_permitted() is true for valid user mappings (subject to the
|
* p??_access_permitted() is true for valid user mappings (subject to the
|
||||||
* write permission check) other than user execute-only which do not have the
|
* write permission check). PROT_NONE mappings do not have the PTE_VALID bit
|
||||||
* PTE_USER bit set. PROT_NONE mappings do not have the PTE_VALID bit set.
|
* set.
|
||||||
*/
|
*/
|
||||||
#define pte_access_permitted(pte, write) \
|
#define pte_access_permitted(pte, write) \
|
||||||
(pte_valid_user(pte) && (!(write) || pte_write(pte)))
|
(pte_valid_user(pte) && (!(write) || pte_write(pte)))
|
||||||
|
|||||||
@@ -413,7 +413,7 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
|
|||||||
struct task_struct *tsk;
|
struct task_struct *tsk;
|
||||||
struct mm_struct *mm;
|
struct mm_struct *mm;
|
||||||
int fault, sig, code, major = 0;
|
int fault, sig, code, major = 0;
|
||||||
unsigned long vm_flags = VM_READ | VM_WRITE;
|
unsigned long vm_flags = VM_READ | VM_WRITE | VM_EXEC;
|
||||||
unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
|
unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
|
||||||
|
|
||||||
if (notify_page_fault(regs, esr))
|
if (notify_page_fault(regs, esr))
|
||||||
|
|||||||
@@ -52,8 +52,26 @@ struct thread_info {
|
|||||||
#define init_thread_info (init_thread_union.thread_info)
|
#define init_thread_info (init_thread_union.thread_info)
|
||||||
#define init_stack (init_thread_union.stack)
|
#define init_stack (init_thread_union.stack)
|
||||||
|
|
||||||
/* How to get the thread information struct from C. */
|
/*
|
||||||
|
* A pointer to the struct thread_info for the currently executing thread is
|
||||||
|
* held in register $28/$gp.
|
||||||
|
*
|
||||||
|
* We declare __current_thread_info as a global register variable rather than a
|
||||||
|
* local register variable within current_thread_info() because clang doesn't
|
||||||
|
* support explicit local register variables.
|
||||||
|
*
|
||||||
|
* When building the VDSO we take care not to declare the global register
|
||||||
|
* variable because this causes GCC to not preserve the value of $28/$gp in
|
||||||
|
* functions that change its value (which is common in the PIC VDSO when
|
||||||
|
* accessing the GOT). Since the VDSO shouldn't be accessing
|
||||||
|
* __current_thread_info anyway we declare it extern in order to cause a link
|
||||||
|
* failure if it's referenced.
|
||||||
|
*/
|
||||||
|
#ifdef __VDSO__
|
||||||
|
extern struct thread_info *__current_thread_info;
|
||||||
|
#else
|
||||||
register struct thread_info *__current_thread_info __asm__("$28");
|
register struct thread_info *__current_thread_info __asm__("$28");
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline struct thread_info *current_thread_info(void)
|
static inline struct thread_info *current_thread_info(void)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ EXPORT_SYMBOL(hvc_get_chars);
|
|||||||
* @vtermno: The vtermno or unit_address of the adapter from which the data
|
* @vtermno: The vtermno or unit_address of the adapter from which the data
|
||||||
* originated.
|
* originated.
|
||||||
* @buf: The character buffer that contains the character data to send to
|
* @buf: The character buffer that contains the character data to send to
|
||||||
* firmware.
|
* firmware. Must be at least 16 bytes, even if count is less than 16.
|
||||||
* @count: Send this number of characters.
|
* @count: Send this number of characters.
|
||||||
*/
|
*/
|
||||||
int hvc_put_chars(uint32_t vtermno, const char *buf, int count)
|
int hvc_put_chars(uint32_t vtermno, const char *buf, int count)
|
||||||
|
|||||||
@@ -1294,18 +1294,28 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)
|
|||||||
*/
|
*/
|
||||||
if (flush_all && done)
|
if (flush_all && done)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* If an event overflow happened, discard samples by
|
|
||||||
* processing any remaining sample-data-blocks.
|
|
||||||
*/
|
|
||||||
if (event_overflow)
|
|
||||||
flush_all = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Account sample overflows in the event hardware structure */
|
/* Account sample overflows in the event hardware structure */
|
||||||
if (sampl_overflow)
|
if (sampl_overflow)
|
||||||
OVERFLOW_REG(hwc) = DIV_ROUND_UP(OVERFLOW_REG(hwc) +
|
OVERFLOW_REG(hwc) = DIV_ROUND_UP(OVERFLOW_REG(hwc) +
|
||||||
sampl_overflow, 1 + num_sdb);
|
sampl_overflow, 1 + num_sdb);
|
||||||
|
|
||||||
|
/* Perf_event_overflow() and perf_event_account_interrupt() limit
|
||||||
|
* the interrupt rate to an upper limit. Roughly 1000 samples per
|
||||||
|
* task tick.
|
||||||
|
* Hitting this limit results in a large number
|
||||||
|
* of throttled REF_REPORT_THROTTLE entries and the samples
|
||||||
|
* are dropped.
|
||||||
|
* Slightly increase the interval to avoid hitting this limit.
|
||||||
|
*/
|
||||||
|
if (event_overflow) {
|
||||||
|
SAMPL_RATE(hwc) += DIV_ROUND_UP(SAMPL_RATE(hwc), 10);
|
||||||
|
debug_sprintf_event(sfdbg, 1, "%s: rate adjustment %ld\n",
|
||||||
|
__func__,
|
||||||
|
DIV_ROUND_UP(SAMPL_RATE(hwc), 10));
|
||||||
|
}
|
||||||
|
|
||||||
if (sampl_overflow || event_overflow)
|
if (sampl_overflow || event_overflow)
|
||||||
debug_sprintf_event(sfdbg, 4, "hw_perf_event_update: "
|
debug_sprintf_event(sfdbg, 4, "hw_perf_event_update: "
|
||||||
"overflow stats: sample=%llu event=%llu\n",
|
"overflow stats: sample=%llu event=%llu\n",
|
||||||
|
|||||||
@@ -725,39 +725,67 @@ static void __ref smp_get_core_info(struct sclp_core_info *info, int early)
|
|||||||
|
|
||||||
static int smp_add_present_cpu(int cpu);
|
static int smp_add_present_cpu(int cpu);
|
||||||
|
|
||||||
static int __smp_rescan_cpus(struct sclp_core_info *info, int sysfs_add)
|
static int smp_add_core(struct sclp_core_entry *core, cpumask_t *avail,
|
||||||
|
bool configured, bool early)
|
||||||
{
|
{
|
||||||
struct pcpu *pcpu;
|
struct pcpu *pcpu;
|
||||||
cpumask_t avail;
|
int cpu, nr, i;
|
||||||
int cpu, nr, i, j;
|
|
||||||
u16 address;
|
u16 address;
|
||||||
|
|
||||||
nr = 0;
|
nr = 0;
|
||||||
cpumask_xor(&avail, cpu_possible_mask, cpu_present_mask);
|
if (sclp.has_core_type && core->type != boot_core_type)
|
||||||
cpu = cpumask_first(&avail);
|
return nr;
|
||||||
for (i = 0; (i < info->combined) && (cpu < nr_cpu_ids); i++) {
|
cpu = cpumask_first(avail);
|
||||||
if (sclp.has_core_type && info->core[i].type != boot_core_type)
|
address = core->core_id << smp_cpu_mt_shift;
|
||||||
|
for (i = 0; (i <= smp_cpu_mtid) && (cpu < nr_cpu_ids); i++) {
|
||||||
|
if (pcpu_find_address(cpu_present_mask, address + i))
|
||||||
continue;
|
continue;
|
||||||
address = info->core[i].core_id << smp_cpu_mt_shift;
|
pcpu = pcpu_devices + cpu;
|
||||||
for (j = 0; j <= smp_cpu_mtid; j++) {
|
pcpu->address = address + i;
|
||||||
if (pcpu_find_address(cpu_present_mask, address + j))
|
if (configured)
|
||||||
continue;
|
pcpu->state = CPU_STATE_CONFIGURED;
|
||||||
pcpu = pcpu_devices + cpu;
|
else
|
||||||
pcpu->address = address + j;
|
pcpu->state = CPU_STATE_STANDBY;
|
||||||
pcpu->state =
|
smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
|
||||||
(cpu >= info->configured*(smp_cpu_mtid + 1)) ?
|
set_cpu_present(cpu, true);
|
||||||
CPU_STATE_STANDBY : CPU_STATE_CONFIGURED;
|
if (!early && smp_add_present_cpu(cpu) != 0)
|
||||||
smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
|
set_cpu_present(cpu, false);
|
||||||
set_cpu_present(cpu, true);
|
else
|
||||||
if (sysfs_add && smp_add_present_cpu(cpu) != 0)
|
nr++;
|
||||||
set_cpu_present(cpu, false);
|
cpumask_clear_cpu(cpu, avail);
|
||||||
else
|
cpu = cpumask_next(cpu, avail);
|
||||||
nr++;
|
}
|
||||||
cpu = cpumask_next(cpu, &avail);
|
return nr;
|
||||||
if (cpu >= nr_cpu_ids)
|
}
|
||||||
|
|
||||||
|
static int __smp_rescan_cpus(struct sclp_core_info *info, bool early)
|
||||||
|
{
|
||||||
|
struct sclp_core_entry *core;
|
||||||
|
cpumask_t avail;
|
||||||
|
bool configured;
|
||||||
|
u16 core_id;
|
||||||
|
int nr, i;
|
||||||
|
|
||||||
|
nr = 0;
|
||||||
|
cpumask_xor(&avail, cpu_possible_mask, cpu_present_mask);
|
||||||
|
/*
|
||||||
|
* Add IPL core first (which got logical CPU number 0) to make sure
|
||||||
|
* that all SMT threads get subsequent logical CPU numbers.
|
||||||
|
*/
|
||||||
|
if (early) {
|
||||||
|
core_id = pcpu_devices[0].address >> smp_cpu_mt_shift;
|
||||||
|
for (i = 0; i < info->configured; i++) {
|
||||||
|
core = &info->core[i];
|
||||||
|
if (core->core_id == core_id) {
|
||||||
|
nr += smp_add_core(core, &avail, true, early);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (i = 0; i < info->combined; i++) {
|
||||||
|
configured = i < info->configured;
|
||||||
|
nr += smp_add_core(&info->core[i], &avail, configured, early);
|
||||||
|
}
|
||||||
return nr;
|
return nr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -803,7 +831,7 @@ void __init smp_detect_cpus(void)
|
|||||||
|
|
||||||
/* Add CPUs present at boot */
|
/* Add CPUs present at boot */
|
||||||
get_online_cpus();
|
get_online_cpus();
|
||||||
__smp_rescan_cpus(info, 0);
|
__smp_rescan_cpus(info, true);
|
||||||
put_online_cpus();
|
put_online_cpus();
|
||||||
memblock_free_early((unsigned long)info, sizeof(*info));
|
memblock_free_early((unsigned long)info, sizeof(*info));
|
||||||
}
|
}
|
||||||
@@ -1156,7 +1184,7 @@ int __ref smp_rescan_cpus(void)
|
|||||||
smp_get_core_info(info, 0);
|
smp_get_core_info(info, 0);
|
||||||
get_online_cpus();
|
get_online_cpus();
|
||||||
mutex_lock(&smp_cpu_state_mutex);
|
mutex_lock(&smp_cpu_state_mutex);
|
||||||
nr = __smp_rescan_cpus(info, 1);
|
nr = __smp_rescan_cpus(info, false);
|
||||||
mutex_unlock(&smp_cpu_state_mutex);
|
mutex_unlock(&smp_cpu_state_mutex);
|
||||||
put_online_cpus();
|
put_online_cpus();
|
||||||
kfree(info);
|
kfree(info);
|
||||||
|
|||||||
@@ -71,9 +71,17 @@ struct bts_buffer {
|
|||||||
|
|
||||||
static struct pmu bts_pmu;
|
static struct pmu bts_pmu;
|
||||||
|
|
||||||
|
static int buf_nr_pages(struct page *page)
|
||||||
|
{
|
||||||
|
if (!PagePrivate(page))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
return 1 << page_private(page);
|
||||||
|
}
|
||||||
|
|
||||||
static size_t buf_size(struct page *page)
|
static size_t buf_size(struct page *page)
|
||||||
{
|
{
|
||||||
return 1 << (PAGE_SHIFT + page_private(page));
|
return buf_nr_pages(page) * PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
@@ -91,9 +99,7 @@ bts_buffer_setup_aux(struct perf_event *event, void **pages,
|
|||||||
/* count all the high order buffers */
|
/* count all the high order buffers */
|
||||||
for (pg = 0, nbuf = 0; pg < nr_pages;) {
|
for (pg = 0, nbuf = 0; pg < nr_pages;) {
|
||||||
page = virt_to_page(pages[pg]);
|
page = virt_to_page(pages[pg]);
|
||||||
if (WARN_ON_ONCE(!PagePrivate(page) && nr_pages > 1))
|
pg += buf_nr_pages(page);
|
||||||
return NULL;
|
|
||||||
pg += 1 << page_private(page);
|
|
||||||
nbuf++;
|
nbuf++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,7 +123,7 @@ bts_buffer_setup_aux(struct perf_event *event, void **pages,
|
|||||||
unsigned int __nr_pages;
|
unsigned int __nr_pages;
|
||||||
|
|
||||||
page = virt_to_page(pages[pg]);
|
page = virt_to_page(pages[pg]);
|
||||||
__nr_pages = PagePrivate(page) ? 1 << page_private(page) : 1;
|
__nr_pages = buf_nr_pages(page);
|
||||||
buf->buf[nbuf].page = page;
|
buf->buf[nbuf].page = page;
|
||||||
buf->buf[nbuf].offset = offset;
|
buf->buf[nbuf].offset = offset;
|
||||||
buf->buf[nbuf].displacement = (pad ? BTS_RECORD_SIZE - pad : 0);
|
buf->buf[nbuf].displacement = (pad ? BTS_RECORD_SIZE - pad : 0);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
#include <linux/elevator.h>
|
#include <linux/elevator.h>
|
||||||
#include <linux/hdreg.h>
|
#include <linux/hdreg.h>
|
||||||
|
#include <linux/pr.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
@@ -354,6 +355,8 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
|||||||
* but we call blkdev_ioctl, which gets the lock for us
|
* but we call blkdev_ioctl, which gets the lock for us
|
||||||
*/
|
*/
|
||||||
case BLKRRPART:
|
case BLKRRPART:
|
||||||
|
case BLKREPORTZONE:
|
||||||
|
case BLKRESETZONE:
|
||||||
return blkdev_ioctl(bdev, mode, cmd,
|
return blkdev_ioctl(bdev, mode, cmd,
|
||||||
(unsigned long)compat_ptr(arg));
|
(unsigned long)compat_ptr(arg));
|
||||||
case BLKBSZSET_32:
|
case BLKBSZSET_32:
|
||||||
@@ -401,6 +404,14 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
|||||||
case BLKTRACETEARDOWN: /* compatible */
|
case BLKTRACETEARDOWN: /* compatible */
|
||||||
ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg));
|
ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg));
|
||||||
return ret;
|
return ret;
|
||||||
|
case IOC_PR_REGISTER:
|
||||||
|
case IOC_PR_RESERVE:
|
||||||
|
case IOC_PR_RELEASE:
|
||||||
|
case IOC_PR_PREEMPT:
|
||||||
|
case IOC_PR_PREEMPT_ABORT:
|
||||||
|
case IOC_PR_CLEAR:
|
||||||
|
return blkdev_ioctl(bdev, mode, cmd,
|
||||||
|
(unsigned long)compat_ptr(arg));
|
||||||
default:
|
default:
|
||||||
if (disk->fops->compat_ioctl)
|
if (disk->fops->compat_ioctl)
|
||||||
ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg);
|
ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg);
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/reset.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
|
||||||
#include "ahci.h"
|
#include "ahci.h"
|
||||||
@@ -87,6 +88,7 @@ struct brcm_ahci_priv {
|
|||||||
u32 port_mask;
|
u32 port_mask;
|
||||||
u32 quirks;
|
u32 quirks;
|
||||||
enum brcm_ahci_version version;
|
enum brcm_ahci_version version;
|
||||||
|
struct reset_control *rcdev;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ata_port_info ahci_brcm_port_info = {
|
static const struct ata_port_info ahci_brcm_port_info = {
|
||||||
@@ -221,19 +223,12 @@ static void brcm_sata_phys_disable(struct brcm_ahci_priv *priv)
|
|||||||
brcm_sata_phy_disable(priv, i);
|
brcm_sata_phy_disable(priv, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 brcm_ahci_get_portmask(struct platform_device *pdev,
|
static u32 brcm_ahci_get_portmask(struct ahci_host_priv *hpriv,
|
||||||
struct brcm_ahci_priv *priv)
|
struct brcm_ahci_priv *priv)
|
||||||
{
|
{
|
||||||
void __iomem *ahci;
|
|
||||||
struct resource *res;
|
|
||||||
u32 impl;
|
u32 impl;
|
||||||
|
|
||||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ahci");
|
impl = readl(hpriv->mmio + HOST_PORTS_IMPL);
|
||||||
ahci = devm_ioremap_resource(&pdev->dev, res);
|
|
||||||
if (IS_ERR(ahci))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
impl = readl(ahci + HOST_PORTS_IMPL);
|
|
||||||
|
|
||||||
if (fls(impl) > SATA_TOP_MAX_PHYS)
|
if (fls(impl) > SATA_TOP_MAX_PHYS)
|
||||||
dev_warn(priv->dev, "warning: more ports than PHYs (%#x)\n",
|
dev_warn(priv->dev, "warning: more ports than PHYs (%#x)\n",
|
||||||
@@ -241,9 +236,6 @@ static u32 brcm_ahci_get_portmask(struct platform_device *pdev,
|
|||||||
else if (!impl)
|
else if (!impl)
|
||||||
dev_info(priv->dev, "no ports found\n");
|
dev_info(priv->dev, "no ports found\n");
|
||||||
|
|
||||||
devm_iounmap(&pdev->dev, ahci);
|
|
||||||
devm_release_mem_region(&pdev->dev, res->start, resource_size(res));
|
|
||||||
|
|
||||||
return impl;
|
return impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,11 +262,10 @@ static int brcm_ahci_suspend(struct device *dev)
|
|||||||
struct ata_host *host = dev_get_drvdata(dev);
|
struct ata_host *host = dev_get_drvdata(dev);
|
||||||
struct ahci_host_priv *hpriv = host->private_data;
|
struct ahci_host_priv *hpriv = host->private_data;
|
||||||
struct brcm_ahci_priv *priv = hpriv->plat_data;
|
struct brcm_ahci_priv *priv = hpriv->plat_data;
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = ahci_platform_suspend(dev);
|
|
||||||
brcm_sata_phys_disable(priv);
|
brcm_sata_phys_disable(priv);
|
||||||
return ret;
|
|
||||||
|
return ahci_platform_suspend(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int brcm_ahci_resume(struct device *dev)
|
static int brcm_ahci_resume(struct device *dev)
|
||||||
@@ -282,11 +273,44 @@ static int brcm_ahci_resume(struct device *dev)
|
|||||||
struct ata_host *host = dev_get_drvdata(dev);
|
struct ata_host *host = dev_get_drvdata(dev);
|
||||||
struct ahci_host_priv *hpriv = host->private_data;
|
struct ahci_host_priv *hpriv = host->private_data;
|
||||||
struct brcm_ahci_priv *priv = hpriv->plat_data;
|
struct brcm_ahci_priv *priv = hpriv->plat_data;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Make sure clocks are turned on before re-configuration */
|
||||||
|
ret = ahci_platform_enable_clks(hpriv);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
brcm_sata_init(priv);
|
brcm_sata_init(priv);
|
||||||
brcm_sata_phys_enable(priv);
|
brcm_sata_phys_enable(priv);
|
||||||
brcm_sata_alpm_init(hpriv);
|
brcm_sata_alpm_init(hpriv);
|
||||||
return ahci_platform_resume(dev);
|
|
||||||
|
/* Since we had to enable clocks earlier on, we cannot use
|
||||||
|
* ahci_platform_resume() as-is since a second call to
|
||||||
|
* ahci_platform_enable_resources() would bump up the resources
|
||||||
|
* (regulators, clocks, PHYs) count artificially so we copy the part
|
||||||
|
* after ahci_platform_enable_resources().
|
||||||
|
*/
|
||||||
|
ret = ahci_platform_enable_phys(hpriv);
|
||||||
|
if (ret)
|
||||||
|
goto out_disable_phys;
|
||||||
|
|
||||||
|
ret = ahci_platform_resume_host(dev);
|
||||||
|
if (ret)
|
||||||
|
goto out_disable_platform_phys;
|
||||||
|
|
||||||
|
/* We resumed so update PM runtime state */
|
||||||
|
pm_runtime_disable(dev);
|
||||||
|
pm_runtime_set_active(dev);
|
||||||
|
pm_runtime_enable(dev);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
out_disable_platform_phys:
|
||||||
|
ahci_platform_disable_phys(hpriv);
|
||||||
|
out_disable_phys:
|
||||||
|
brcm_sata_phys_disable(priv);
|
||||||
|
ahci_platform_disable_clks(hpriv);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -327,44 +351,74 @@ static int brcm_ahci_probe(struct platform_device *pdev)
|
|||||||
if (IS_ERR(priv->top_ctrl))
|
if (IS_ERR(priv->top_ctrl))
|
||||||
return PTR_ERR(priv->top_ctrl);
|
return PTR_ERR(priv->top_ctrl);
|
||||||
|
|
||||||
|
/* Reset is optional depending on platform */
|
||||||
|
priv->rcdev = devm_reset_control_get(&pdev->dev, "ahci");
|
||||||
|
if (!IS_ERR_OR_NULL(priv->rcdev))
|
||||||
|
reset_control_deassert(priv->rcdev);
|
||||||
|
|
||||||
if ((priv->version == BRCM_SATA_BCM7425) ||
|
if ((priv->version == BRCM_SATA_BCM7425) ||
|
||||||
(priv->version == BRCM_SATA_NSP)) {
|
(priv->version == BRCM_SATA_NSP)) {
|
||||||
priv->quirks |= BRCM_AHCI_QUIRK_NO_NCQ;
|
priv->quirks |= BRCM_AHCI_QUIRK_NO_NCQ;
|
||||||
priv->quirks |= BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE;
|
priv->quirks |= BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hpriv = ahci_platform_get_resources(pdev);
|
||||||
|
if (IS_ERR(hpriv)) {
|
||||||
|
ret = PTR_ERR(hpriv);
|
||||||
|
goto out_reset;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ahci_platform_enable_clks(hpriv);
|
||||||
|
if (ret)
|
||||||
|
goto out_reset;
|
||||||
|
|
||||||
|
/* Must be first so as to configure endianness including that
|
||||||
|
* of the standard AHCI register space.
|
||||||
|
*/
|
||||||
brcm_sata_init(priv);
|
brcm_sata_init(priv);
|
||||||
|
|
||||||
priv->port_mask = brcm_ahci_get_portmask(pdev, priv);
|
/* Initializes priv->port_mask which is used below */
|
||||||
if (!priv->port_mask)
|
priv->port_mask = brcm_ahci_get_portmask(hpriv, priv);
|
||||||
return -ENODEV;
|
if (!priv->port_mask) {
|
||||||
|
ret = -ENODEV;
|
||||||
|
goto out_disable_clks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Must be done before ahci_platform_enable_phys() */
|
||||||
brcm_sata_phys_enable(priv);
|
brcm_sata_phys_enable(priv);
|
||||||
|
|
||||||
hpriv = ahci_platform_get_resources(pdev);
|
|
||||||
if (IS_ERR(hpriv))
|
|
||||||
return PTR_ERR(hpriv);
|
|
||||||
hpriv->plat_data = priv;
|
hpriv->plat_data = priv;
|
||||||
hpriv->flags = AHCI_HFLAG_WAKE_BEFORE_STOP;
|
hpriv->flags = AHCI_HFLAG_WAKE_BEFORE_STOP;
|
||||||
|
|
||||||
brcm_sata_alpm_init(hpriv);
|
brcm_sata_alpm_init(hpriv);
|
||||||
|
|
||||||
ret = ahci_platform_enable_resources(hpriv);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
if (priv->quirks & BRCM_AHCI_QUIRK_NO_NCQ)
|
if (priv->quirks & BRCM_AHCI_QUIRK_NO_NCQ)
|
||||||
hpriv->flags |= AHCI_HFLAG_NO_NCQ;
|
hpriv->flags |= AHCI_HFLAG_NO_NCQ;
|
||||||
hpriv->flags |= AHCI_HFLAG_NO_WRITE_TO_RO;
|
hpriv->flags |= AHCI_HFLAG_NO_WRITE_TO_RO;
|
||||||
|
|
||||||
|
ret = ahci_platform_enable_phys(hpriv);
|
||||||
|
if (ret)
|
||||||
|
goto out_disable_phys;
|
||||||
|
|
||||||
ret = ahci_platform_init_host(pdev, hpriv, &ahci_brcm_port_info,
|
ret = ahci_platform_init_host(pdev, hpriv, &ahci_brcm_port_info,
|
||||||
&ahci_platform_sht);
|
&ahci_platform_sht);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto out_disable_platform_phys;
|
||||||
|
|
||||||
dev_info(dev, "Broadcom AHCI SATA3 registered\n");
|
dev_info(dev, "Broadcom AHCI SATA3 registered\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_disable_platform_phys:
|
||||||
|
ahci_platform_disable_phys(hpriv);
|
||||||
|
out_disable_phys:
|
||||||
|
brcm_sata_phys_disable(priv);
|
||||||
|
out_disable_clks:
|
||||||
|
ahci_platform_disable_clks(hpriv);
|
||||||
|
out_reset:
|
||||||
|
if (!IS_ERR_OR_NULL(priv->rcdev))
|
||||||
|
reset_control_assert(priv->rcdev);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int brcm_ahci_remove(struct platform_device *pdev)
|
static int brcm_ahci_remove(struct platform_device *pdev)
|
||||||
@@ -374,12 +428,12 @@ static int brcm_ahci_remove(struct platform_device *pdev)
|
|||||||
struct brcm_ahci_priv *priv = hpriv->plat_data;
|
struct brcm_ahci_priv *priv = hpriv->plat_data;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
brcm_sata_phys_disable(priv);
|
||||||
|
|
||||||
ret = ata_platform_remove_one(pdev);
|
ret = ata_platform_remove_one(pdev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
brcm_sata_phys_disable(priv);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ EXPORT_SYMBOL_GPL(ahci_platform_ops);
|
|||||||
* RETURNS:
|
* RETURNS:
|
||||||
* 0 on success otherwise a negative error code
|
* 0 on success otherwise a negative error code
|
||||||
*/
|
*/
|
||||||
static int ahci_platform_enable_phys(struct ahci_host_priv *hpriv)
|
int ahci_platform_enable_phys(struct ahci_host_priv *hpriv)
|
||||||
{
|
{
|
||||||
int rc, i;
|
int rc, i;
|
||||||
|
|
||||||
@@ -71,6 +71,7 @@ disable_phys:
|
|||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ahci_platform_enable_phys);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ahci_platform_disable_phys - Disable PHYs
|
* ahci_platform_disable_phys - Disable PHYs
|
||||||
@@ -78,7 +79,7 @@ disable_phys:
|
|||||||
*
|
*
|
||||||
* This function disables all PHYs found in hpriv->phys.
|
* This function disables all PHYs found in hpriv->phys.
|
||||||
*/
|
*/
|
||||||
static void ahci_platform_disable_phys(struct ahci_host_priv *hpriv)
|
void ahci_platform_disable_phys(struct ahci_host_priv *hpriv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@@ -87,6 +88,7 @@ static void ahci_platform_disable_phys(struct ahci_host_priv *hpriv)
|
|||||||
phy_exit(hpriv->phys[i]);
|
phy_exit(hpriv->phys[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ahci_platform_disable_phys);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ahci_platform_enable_clks - Enable platform clocks
|
* ahci_platform_enable_clks - Enable platform clocks
|
||||||
|
|||||||
@@ -929,6 +929,8 @@ next:
|
|||||||
out_of_memory:
|
out_of_memory:
|
||||||
pr_alert("%s: out of memory\n", __func__);
|
pr_alert("%s: out of memory\n", __func__);
|
||||||
put_free_pages(ring, pages_to_gnt, segs_to_map);
|
put_free_pages(ring, pages_to_gnt, segs_to_map);
|
||||||
|
for (i = last_map; i < num; i++)
|
||||||
|
pages[i]->handle = BLKBACK_INVALID_HANDLE;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -178,6 +178,15 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
|
|||||||
blkif->domid = domid;
|
blkif->domid = domid;
|
||||||
atomic_set(&blkif->refcnt, 1);
|
atomic_set(&blkif->refcnt, 1);
|
||||||
init_completion(&blkif->drain_complete);
|
init_completion(&blkif->drain_complete);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Because freeing back to the cache may be deferred, it is not
|
||||||
|
* safe to unload the module (and hence destroy the cache) until
|
||||||
|
* this has completed. To prevent premature unloading, take an
|
||||||
|
* extra module reference here and release only when the object
|
||||||
|
* has been freed back to the cache.
|
||||||
|
*/
|
||||||
|
__module_get(THIS_MODULE);
|
||||||
INIT_WORK(&blkif->free_work, xen_blkif_deferred_free);
|
INIT_WORK(&blkif->free_work, xen_blkif_deferred_free);
|
||||||
|
|
||||||
return blkif;
|
return blkif;
|
||||||
@@ -327,6 +336,7 @@ static void xen_blkif_free(struct xen_blkif *blkif)
|
|||||||
|
|
||||||
/* Make sure everything is drained before shutting down */
|
/* Make sure everything is drained before shutting down */
|
||||||
kmem_cache_free(xen_blkif_cachep, blkif);
|
kmem_cache_free(xen_blkif_cachep, blkif);
|
||||||
|
module_put(THIS_MODULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init xen_blkif_interface_init(void)
|
int __init xen_blkif_interface_init(void)
|
||||||
|
|||||||
@@ -1123,7 +1123,7 @@ static int btusb_open(struct hci_dev *hdev)
|
|||||||
if (data->setup_on_usb) {
|
if (data->setup_on_usb) {
|
||||||
err = data->setup_on_usb(hdev);
|
err = data->setup_on_usb(hdev);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
goto setup_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
data->intf->needs_remote_wakeup = 1;
|
data->intf->needs_remote_wakeup = 1;
|
||||||
@@ -1155,6 +1155,7 @@ done:
|
|||||||
|
|
||||||
failed:
|
failed:
|
||||||
clear_bit(BTUSB_INTR_RUNNING, &data->flags);
|
clear_bit(BTUSB_INTR_RUNNING, &data->flags);
|
||||||
|
setup_fail:
|
||||||
usb_autopm_put_interface(data->intf);
|
usb_autopm_put_interface(data->intf);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -484,11 +484,6 @@ static void devfreq_dev_release(struct device *dev)
|
|||||||
struct devfreq *devfreq = to_devfreq(dev);
|
struct devfreq *devfreq = to_devfreq(dev);
|
||||||
|
|
||||||
mutex_lock(&devfreq_list_lock);
|
mutex_lock(&devfreq_list_lock);
|
||||||
if (IS_ERR(find_device_devfreq(devfreq->dev.parent))) {
|
|
||||||
mutex_unlock(&devfreq_list_lock);
|
|
||||||
dev_warn(&devfreq->dev, "releasing devfreq which doesn't exist\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
list_del(&devfreq->node);
|
list_del(&devfreq->node);
|
||||||
mutex_unlock(&devfreq_list_lock);
|
mutex_unlock(&devfreq_list_lock);
|
||||||
|
|
||||||
@@ -547,6 +542,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
|||||||
devfreq->dev.parent = dev;
|
devfreq->dev.parent = dev;
|
||||||
devfreq->dev.class = devfreq_class;
|
devfreq->dev.class = devfreq_class;
|
||||||
devfreq->dev.release = devfreq_dev_release;
|
devfreq->dev.release = devfreq_dev_release;
|
||||||
|
INIT_LIST_HEAD(&devfreq->node);
|
||||||
devfreq->profile = profile;
|
devfreq->profile = profile;
|
||||||
strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN);
|
strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN);
|
||||||
devfreq->previous_freq = profile->initial_freq;
|
devfreq->previous_freq = profile->initial_freq;
|
||||||
@@ -978,7 +974,7 @@ static ssize_t available_governors_show(struct device *d,
|
|||||||
* The devfreq with immutable governor (e.g., passive) shows
|
* The devfreq with immutable governor (e.g., passive) shows
|
||||||
* only own governor.
|
* only own governor.
|
||||||
*/
|
*/
|
||||||
if (df->governor->immutable) {
|
if (df->governor && df->governor->immutable) {
|
||||||
count = scnprintf(&buf[count], DEVFREQ_NAME_LEN,
|
count = scnprintf(&buf[count], DEVFREQ_NAME_LEN,
|
||||||
"%s ", df->governor_name);
|
"%s ", df->governor_name);
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -249,7 +249,11 @@ static int fwnet_header_cache(const struct neighbour *neigh,
|
|||||||
h = (struct fwnet_header *)((u8 *)hh->hh_data + HH_DATA_OFF(sizeof(*h)));
|
h = (struct fwnet_header *)((u8 *)hh->hh_data + HH_DATA_OFF(sizeof(*h)));
|
||||||
h->h_proto = type;
|
h->h_proto = type;
|
||||||
memcpy(h->h_dest, neigh->ha, net->addr_len);
|
memcpy(h->h_dest, neigh->ha, net->addr_len);
|
||||||
hh->hh_len = FWNET_HLEN;
|
|
||||||
|
/* Pairs with the READ_ONCE() in neigh_resolve_output(),
|
||||||
|
* neigh_hh_output() and neigh_update_hhs().
|
||||||
|
*/
|
||||||
|
smp_store_release(&hh->hh_len, FWNET_HLEN);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -206,6 +206,14 @@ int gpiod_get_direction(struct gpio_desc *desc)
|
|||||||
chip = gpiod_to_chip(desc);
|
chip = gpiod_to_chip(desc);
|
||||||
offset = gpio_chip_hwgpio(desc);
|
offset = gpio_chip_hwgpio(desc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Open drain emulation using input mode may incorrectly report
|
||||||
|
* input here, fix that up.
|
||||||
|
*/
|
||||||
|
if (test_bit(FLAG_OPEN_DRAIN, &desc->flags) &&
|
||||||
|
test_bit(FLAG_IS_OUT, &desc->flags))
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (!chip->get_direction)
|
if (!chip->get_direction)
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
|
|||||||
@@ -1540,7 +1540,11 @@ static void process_single_up_tx_qlock(struct drm_dp_mst_topology_mgr *mgr,
|
|||||||
if (ret != 1)
|
if (ret != 1)
|
||||||
DRM_DEBUG_KMS("failed to send msg in q %d\n", ret);
|
DRM_DEBUG_KMS("failed to send msg in q %d\n", ret);
|
||||||
|
|
||||||
txmsg->dst->tx_slots[txmsg->seqno] = NULL;
|
if (txmsg->seqno != -1) {
|
||||||
|
WARN_ON((unsigned int)txmsg->seqno >
|
||||||
|
ARRAY_SIZE(txmsg->dst->tx_slots));
|
||||||
|
txmsg->dst->tx_slots[txmsg->seqno] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr,
|
static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr,
|
||||||
|
|||||||
@@ -540,7 +540,7 @@ drm_property_create_blob(struct drm_device *dev, size_t length,
|
|||||||
struct drm_property_blob *blob;
|
struct drm_property_blob *blob;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!length || length > ULONG_MAX - sizeof(struct drm_property_blob))
|
if (!length || length > INT_MAX - sizeof(struct drm_property_blob))
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
blob = kvzalloc(sizeof(struct drm_property_blob)+length, GFP_KERNEL);
|
blob = kvzalloc(sizeof(struct drm_property_blob)+length, GFP_KERNEL);
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include <nvif/notify.h>
|
#include <nvif/notify.h>
|
||||||
|
|
||||||
|
#include <drm/drm_crtc.h>
|
||||||
#include <drm/drm_edid.h>
|
#include <drm/drm_edid.h>
|
||||||
#include <drm/drm_encoder.h>
|
#include <drm/drm_encoder.h>
|
||||||
#include <drm/drm_dp_helper.h>
|
#include <drm/drm_dp_helper.h>
|
||||||
@@ -37,6 +38,60 @@
|
|||||||
|
|
||||||
struct nvkm_i2c_port;
|
struct nvkm_i2c_port;
|
||||||
|
|
||||||
|
#define nouveau_conn_atom(p) \
|
||||||
|
container_of((p), struct nouveau_conn_atom, state)
|
||||||
|
|
||||||
|
struct nouveau_conn_atom {
|
||||||
|
struct drm_connector_state state;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
/* The enum values specifically defined here match nv50/gf119
|
||||||
|
* hw values, and the code relies on this.
|
||||||
|
*/
|
||||||
|
enum {
|
||||||
|
DITHERING_MODE_OFF = 0x00,
|
||||||
|
DITHERING_MODE_ON = 0x01,
|
||||||
|
DITHERING_MODE_DYNAMIC2X2 = 0x10 | DITHERING_MODE_ON,
|
||||||
|
DITHERING_MODE_STATIC2X2 = 0x18 | DITHERING_MODE_ON,
|
||||||
|
DITHERING_MODE_TEMPORAL = 0x20 | DITHERING_MODE_ON,
|
||||||
|
DITHERING_MODE_AUTO
|
||||||
|
} mode;
|
||||||
|
enum {
|
||||||
|
DITHERING_DEPTH_6BPC = 0x00,
|
||||||
|
DITHERING_DEPTH_8BPC = 0x02,
|
||||||
|
DITHERING_DEPTH_AUTO
|
||||||
|
} depth;
|
||||||
|
} dither;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int mode; /* DRM_MODE_SCALE_* */
|
||||||
|
struct {
|
||||||
|
enum {
|
||||||
|
UNDERSCAN_OFF,
|
||||||
|
UNDERSCAN_ON,
|
||||||
|
UNDERSCAN_AUTO,
|
||||||
|
} mode;
|
||||||
|
u32 hborder;
|
||||||
|
u32 vborder;
|
||||||
|
} underscan;
|
||||||
|
bool full;
|
||||||
|
} scaler;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int color_vibrance;
|
||||||
|
int vibrant_hue;
|
||||||
|
} procamp;
|
||||||
|
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
bool dither:1;
|
||||||
|
bool scaler:1;
|
||||||
|
bool procamp:1;
|
||||||
|
};
|
||||||
|
u8 mask;
|
||||||
|
} set;
|
||||||
|
};
|
||||||
|
|
||||||
struct nouveau_connector {
|
struct nouveau_connector {
|
||||||
struct drm_connector base;
|
struct drm_connector base;
|
||||||
enum dcb_connector_type type;
|
enum dcb_connector_type type;
|
||||||
@@ -111,61 +166,6 @@ extern int nouveau_ignorelid;
|
|||||||
extern int nouveau_duallink;
|
extern int nouveau_duallink;
|
||||||
extern int nouveau_hdmimhz;
|
extern int nouveau_hdmimhz;
|
||||||
|
|
||||||
#include <drm/drm_crtc.h>
|
|
||||||
#define nouveau_conn_atom(p) \
|
|
||||||
container_of((p), struct nouveau_conn_atom, state)
|
|
||||||
|
|
||||||
struct nouveau_conn_atom {
|
|
||||||
struct drm_connector_state state;
|
|
||||||
|
|
||||||
struct {
|
|
||||||
/* The enum values specifically defined here match nv50/gf119
|
|
||||||
* hw values, and the code relies on this.
|
|
||||||
*/
|
|
||||||
enum {
|
|
||||||
DITHERING_MODE_OFF = 0x00,
|
|
||||||
DITHERING_MODE_ON = 0x01,
|
|
||||||
DITHERING_MODE_DYNAMIC2X2 = 0x10 | DITHERING_MODE_ON,
|
|
||||||
DITHERING_MODE_STATIC2X2 = 0x18 | DITHERING_MODE_ON,
|
|
||||||
DITHERING_MODE_TEMPORAL = 0x20 | DITHERING_MODE_ON,
|
|
||||||
DITHERING_MODE_AUTO
|
|
||||||
} mode;
|
|
||||||
enum {
|
|
||||||
DITHERING_DEPTH_6BPC = 0x00,
|
|
||||||
DITHERING_DEPTH_8BPC = 0x02,
|
|
||||||
DITHERING_DEPTH_AUTO
|
|
||||||
} depth;
|
|
||||||
} dither;
|
|
||||||
|
|
||||||
struct {
|
|
||||||
int mode; /* DRM_MODE_SCALE_* */
|
|
||||||
struct {
|
|
||||||
enum {
|
|
||||||
UNDERSCAN_OFF,
|
|
||||||
UNDERSCAN_ON,
|
|
||||||
UNDERSCAN_AUTO,
|
|
||||||
} mode;
|
|
||||||
u32 hborder;
|
|
||||||
u32 vborder;
|
|
||||||
} underscan;
|
|
||||||
bool full;
|
|
||||||
} scaler;
|
|
||||||
|
|
||||||
struct {
|
|
||||||
int color_vibrance;
|
|
||||||
int vibrant_hue;
|
|
||||||
} procamp;
|
|
||||||
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
bool dither:1;
|
|
||||||
bool scaler:1;
|
|
||||||
bool procamp:1;
|
|
||||||
};
|
|
||||||
u8 mask;
|
|
||||||
} set;
|
|
||||||
};
|
|
||||||
|
|
||||||
void nouveau_conn_attach_properties(struct drm_connector *);
|
void nouveau_conn_attach_properties(struct drm_connector *);
|
||||||
void nouveau_conn_reset(struct drm_connector *);
|
void nouveau_conn_reset(struct drm_connector *);
|
||||||
struct drm_connector_state *
|
struct drm_connector_state *
|
||||||
|
|||||||
@@ -438,8 +438,6 @@ static void sun4i_hdmi_unbind(struct device *dev, struct device *master,
|
|||||||
struct sun4i_hdmi *hdmi = dev_get_drvdata(dev);
|
struct sun4i_hdmi *hdmi = dev_get_drvdata(dev);
|
||||||
|
|
||||||
cec_unregister_adapter(hdmi->cec_adap);
|
cec_unregister_adapter(hdmi->cec_adap);
|
||||||
drm_connector_cleanup(&hdmi->connector);
|
|
||||||
drm_encoder_cleanup(&hdmi->encoder);
|
|
||||||
i2c_del_adapter(hdmi->i2c);
|
i2c_del_adapter(hdmi->i2c);
|
||||||
clk_disable_unprepare(hdmi->mod_clk);
|
clk_disable_unprepare(hdmi->mod_clk);
|
||||||
clk_disable_unprepare(hdmi->bus_clk);
|
clk_disable_unprepare(hdmi->bus_clk);
|
||||||
|
|||||||
@@ -92,6 +92,12 @@
|
|||||||
#define MAX9611_TEMP_SCALE_NUM 1000000
|
#define MAX9611_TEMP_SCALE_NUM 1000000
|
||||||
#define MAX9611_TEMP_SCALE_DIV 2083
|
#define MAX9611_TEMP_SCALE_DIV 2083
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Conversion time is 2 ms (typically) at Ta=25 degreeC
|
||||||
|
* No maximum value is known, so play it safe.
|
||||||
|
*/
|
||||||
|
#define MAX9611_CONV_TIME_US_RANGE 3000, 3300
|
||||||
|
|
||||||
struct max9611_dev {
|
struct max9611_dev {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct i2c_client *i2c_client;
|
struct i2c_client *i2c_client;
|
||||||
@@ -239,11 +245,9 @@ static int max9611_read_single(struct max9611_dev *max9611,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* need a delay here to make register configuration stabilize. */
|
||||||
* need a delay here to make register configuration
|
|
||||||
* stabilize. 1 msec at least, from empirical testing.
|
usleep_range(MAX9611_CONV_TIME_US_RANGE);
|
||||||
*/
|
|
||||||
usleep_range(1000, 2000);
|
|
||||||
|
|
||||||
ret = i2c_smbus_read_word_swapped(max9611->i2c_client, reg_addr);
|
ret = i2c_smbus_read_word_swapped(max9611->i2c_client, reg_addr);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@@ -511,7 +515,7 @@ static int max9611_init(struct max9611_dev *max9611)
|
|||||||
MAX9611_REG_CTRL2, 0);
|
MAX9611_REG_CTRL2, 0);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
usleep_range(1000, 2000);
|
usleep_range(MAX9611_CONV_TIME_US_RANGE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4568,6 +4568,7 @@ err:
|
|||||||
unregister_netdevice_notifier(&cma_nb);
|
unregister_netdevice_notifier(&cma_nb);
|
||||||
rdma_addr_unregister_client(&addr_client);
|
rdma_addr_unregister_client(&addr_client);
|
||||||
ib_sa_unregister_client(&sa_client);
|
ib_sa_unregister_client(&sa_client);
|
||||||
|
unregister_pernet_subsys(&cma_pernet_operations);
|
||||||
err_wq:
|
err_wq:
|
||||||
destroy_workqueue(cma_wq);
|
destroy_workqueue(cma_wq);
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -3073,16 +3073,17 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr)
|
|||||||
ibdev->ib_active = false;
|
ibdev->ib_active = false;
|
||||||
flush_workqueue(wq);
|
flush_workqueue(wq);
|
||||||
|
|
||||||
mlx4_ib_close_sriov(ibdev);
|
|
||||||
mlx4_ib_mad_cleanup(ibdev);
|
|
||||||
ib_unregister_device(&ibdev->ib_dev);
|
|
||||||
mlx4_ib_diag_cleanup(ibdev);
|
|
||||||
if (ibdev->iboe.nb.notifier_call) {
|
if (ibdev->iboe.nb.notifier_call) {
|
||||||
if (unregister_netdevice_notifier(&ibdev->iboe.nb))
|
if (unregister_netdevice_notifier(&ibdev->iboe.nb))
|
||||||
pr_warn("failure unregistering notifier\n");
|
pr_warn("failure unregistering notifier\n");
|
||||||
ibdev->iboe.nb.notifier_call = NULL;
|
ibdev->iboe.nb.notifier_call = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mlx4_ib_close_sriov(ibdev);
|
||||||
|
mlx4_ib_mad_cleanup(ibdev);
|
||||||
|
ib_unregister_device(&ibdev->ib_dev);
|
||||||
|
mlx4_ib_diag_cleanup(ibdev);
|
||||||
|
|
||||||
mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
|
mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
|
||||||
ibdev->steer_qpn_count);
|
ibdev->steer_qpn_count);
|
||||||
kfree(ibdev->ib_uc_qpns_bitmap);
|
kfree(ibdev->ib_uc_qpns_bitmap);
|
||||||
|
|||||||
@@ -393,7 +393,7 @@ int rxe_rcv(struct sk_buff *skb)
|
|||||||
|
|
||||||
calc_icrc = rxe_icrc_hdr(pkt, skb);
|
calc_icrc = rxe_icrc_hdr(pkt, skb);
|
||||||
calc_icrc = rxe_crc32(rxe, calc_icrc, (u8 *)payload_addr(pkt),
|
calc_icrc = rxe_crc32(rxe, calc_icrc, (u8 *)payload_addr(pkt),
|
||||||
payload_size(pkt));
|
payload_size(pkt) + bth_pad(pkt));
|
||||||
calc_icrc = (__force u32)cpu_to_be32(~calc_icrc);
|
calc_icrc = (__force u32)cpu_to_be32(~calc_icrc);
|
||||||
if (unlikely(calc_icrc != pack_icrc)) {
|
if (unlikely(calc_icrc != pack_icrc)) {
|
||||||
if (skb->protocol == htons(ETH_P_IPV6))
|
if (skb->protocol == htons(ETH_P_IPV6))
|
||||||
|
|||||||
@@ -500,6 +500,12 @@ static int fill_packet(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
if (bth_pad(pkt)) {
|
||||||
|
u8 *pad = payload_addr(pkt) + paylen;
|
||||||
|
|
||||||
|
memset(pad, 0, bth_pad(pkt));
|
||||||
|
crc = rxe_crc32(rxe, crc, pad, bth_pad(pkt));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
p = payload_addr(pkt) + paylen + bth_pad(pkt);
|
p = payload_addr(pkt) + paylen + bth_pad(pkt);
|
||||||
|
|
||||||
|
|||||||
@@ -738,6 +738,13 @@ static enum resp_states read_reply(struct rxe_qp *qp,
|
|||||||
if (err)
|
if (err)
|
||||||
pr_err("Failed copying memory\n");
|
pr_err("Failed copying memory\n");
|
||||||
|
|
||||||
|
if (bth_pad(&ack_pkt)) {
|
||||||
|
struct rxe_dev *rxe = to_rdev(qp->ibqp.device);
|
||||||
|
u8 *pad = payload_addr(&ack_pkt) + payload;
|
||||||
|
|
||||||
|
memset(pad, 0, bth_pad(&ack_pkt));
|
||||||
|
icrc = rxe_crc32(rxe, icrc, pad, bth_pad(&ack_pkt));
|
||||||
|
}
|
||||||
p = payload_addr(&ack_pkt) + payload + bth_pad(&ack_pkt);
|
p = payload_addr(&ack_pkt) + payload + bth_pad(&ack_pkt);
|
||||||
*p = ~icrc;
|
*p = ~icrc;
|
||||||
|
|
||||||
|
|||||||
@@ -2749,7 +2749,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr,
|
|||||||
write_targets++;
|
write_targets++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (bio->bi_end_io) {
|
if (rdev && bio->bi_end_io) {
|
||||||
atomic_inc(&rdev->nr_pending);
|
atomic_inc(&rdev->nr_pending);
|
||||||
bio->bi_iter.bi_sector = sector_nr + rdev->data_offset;
|
bio->bi_iter.bi_sector = sector_nr + rdev->data_offset;
|
||||||
bio_set_dev(bio, rdev->bdev);
|
bio_set_dev(bio, rdev->bdev);
|
||||||
|
|||||||
@@ -330,7 +330,8 @@ static void cec_data_cancel(struct cec_data *data)
|
|||||||
} else {
|
} else {
|
||||||
list_del_init(&data->list);
|
list_del_init(&data->list);
|
||||||
if (!(data->msg.tx_status & CEC_TX_STATUS_OK))
|
if (!(data->msg.tx_status & CEC_TX_STATUS_OK))
|
||||||
data->adap->transmit_queue_sz--;
|
if (!WARN_ON(!data->adap->transmit_queue_sz))
|
||||||
|
data->adap->transmit_queue_sz--;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mark it as an error */
|
/* Mark it as an error */
|
||||||
@@ -377,6 +378,14 @@ static void cec_flush(struct cec_adapter *adap)
|
|||||||
* need to do anything special in that case.
|
* need to do anything special in that case.
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* If something went wrong and this counter isn't what it should
|
||||||
|
* be, then this will reset it back to 0. Warn if it is not 0,
|
||||||
|
* since it indicates a bug, either in this framework or in a
|
||||||
|
* CEC driver.
|
||||||
|
*/
|
||||||
|
if (WARN_ON(adap->transmit_queue_sz))
|
||||||
|
adap->transmit_queue_sz = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -465,7 +474,8 @@ int cec_thread_func(void *_adap)
|
|||||||
data = list_first_entry(&adap->transmit_queue,
|
data = list_first_entry(&adap->transmit_queue,
|
||||||
struct cec_data, list);
|
struct cec_data, list);
|
||||||
list_del_init(&data->list);
|
list_del_init(&data->list);
|
||||||
adap->transmit_queue_sz--;
|
if (!WARN_ON(!data->adap->transmit_queue_sz))
|
||||||
|
adap->transmit_queue_sz--;
|
||||||
|
|
||||||
/* Make this the current transmitting message */
|
/* Make this the current transmitting message */
|
||||||
adap->transmitting = data;
|
adap->transmitting = data;
|
||||||
@@ -1031,11 +1041,11 @@ void cec_received_msg_ts(struct cec_adapter *adap,
|
|||||||
valid_la = false;
|
valid_la = false;
|
||||||
else if (!cec_msg_is_broadcast(msg) && !(dir_fl & DIRECTED))
|
else if (!cec_msg_is_broadcast(msg) && !(dir_fl & DIRECTED))
|
||||||
valid_la = false;
|
valid_la = false;
|
||||||
else if (cec_msg_is_broadcast(msg) && !(dir_fl & BCAST1_4))
|
else if (cec_msg_is_broadcast(msg) && !(dir_fl & BCAST))
|
||||||
valid_la = false;
|
valid_la = false;
|
||||||
else if (cec_msg_is_broadcast(msg) &&
|
else if (cec_msg_is_broadcast(msg) &&
|
||||||
adap->log_addrs.cec_version >= CEC_OP_CEC_VERSION_2_0 &&
|
adap->log_addrs.cec_version < CEC_OP_CEC_VERSION_2_0 &&
|
||||||
!(dir_fl & BCAST2_0))
|
!(dir_fl & BCAST1_4))
|
||||||
valid_la = false;
|
valid_la = false;
|
||||||
}
|
}
|
||||||
if (valid_la && min_len) {
|
if (valid_la && min_len) {
|
||||||
|
|||||||
@@ -294,7 +294,7 @@ static int flexcop_usb_i2c_req(struct flexcop_i2c_adapter *i2c,
|
|||||||
|
|
||||||
mutex_unlock(&fc_usb->data_mutex);
|
mutex_unlock(&fc_usb->data_mutex);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* actual bus specific access functions,
|
/* actual bus specific access functions,
|
||||||
|
|||||||
@@ -985,8 +985,9 @@ static int af9005_identify_state(struct usb_device *udev,
|
|||||||
else if (reply == 0x02)
|
else if (reply == 0x02)
|
||||||
*cold = 0;
|
*cold = 0;
|
||||||
else
|
else
|
||||||
return -EIO;
|
ret = -EIO;
|
||||||
deb_info("Identify state cold = %d\n", *cold);
|
if (!ret)
|
||||||
|
deb_info("Identify state cold = %d\n", *cold);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
kfree(buf);
|
kfree(buf);
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ struct pulse8 {
|
|||||||
unsigned int vers;
|
unsigned int vers;
|
||||||
struct completion cmd_done;
|
struct completion cmd_done;
|
||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
|
u8 work_result;
|
||||||
struct delayed_work ping_eeprom_work;
|
struct delayed_work ping_eeprom_work;
|
||||||
struct cec_msg rx_msg;
|
struct cec_msg rx_msg;
|
||||||
u8 data[DATA_SIZE];
|
u8 data[DATA_SIZE];
|
||||||
@@ -142,8 +143,10 @@ static void pulse8_irq_work_handler(struct work_struct *work)
|
|||||||
{
|
{
|
||||||
struct pulse8 *pulse8 =
|
struct pulse8 *pulse8 =
|
||||||
container_of(work, struct pulse8, work);
|
container_of(work, struct pulse8, work);
|
||||||
|
u8 result = pulse8->work_result;
|
||||||
|
|
||||||
switch (pulse8->data[0] & 0x3f) {
|
pulse8->work_result = 0;
|
||||||
|
switch (result & 0x3f) {
|
||||||
case MSGCODE_FRAME_DATA:
|
case MSGCODE_FRAME_DATA:
|
||||||
cec_received_msg(pulse8->adap, &pulse8->rx_msg);
|
cec_received_msg(pulse8->adap, &pulse8->rx_msg);
|
||||||
break;
|
break;
|
||||||
@@ -177,12 +180,12 @@ static irqreturn_t pulse8_interrupt(struct serio *serio, unsigned char data,
|
|||||||
pulse8->escape = false;
|
pulse8->escape = false;
|
||||||
} else if (data == MSGEND) {
|
} else if (data == MSGEND) {
|
||||||
struct cec_msg *msg = &pulse8->rx_msg;
|
struct cec_msg *msg = &pulse8->rx_msg;
|
||||||
|
u8 msgcode = pulse8->buf[0];
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
dev_info(pulse8->dev, "received: %*ph\n",
|
dev_info(pulse8->dev, "received: %*ph\n",
|
||||||
pulse8->idx, pulse8->buf);
|
pulse8->idx, pulse8->buf);
|
||||||
pulse8->data[0] = pulse8->buf[0];
|
switch (msgcode & 0x3f) {
|
||||||
switch (pulse8->buf[0] & 0x3f) {
|
|
||||||
case MSGCODE_FRAME_START:
|
case MSGCODE_FRAME_START:
|
||||||
msg->len = 1;
|
msg->len = 1;
|
||||||
msg->msg[0] = pulse8->buf[1];
|
msg->msg[0] = pulse8->buf[1];
|
||||||
@@ -191,14 +194,20 @@ static irqreturn_t pulse8_interrupt(struct serio *serio, unsigned char data,
|
|||||||
if (msg->len == CEC_MAX_MSG_SIZE)
|
if (msg->len == CEC_MAX_MSG_SIZE)
|
||||||
break;
|
break;
|
||||||
msg->msg[msg->len++] = pulse8->buf[1];
|
msg->msg[msg->len++] = pulse8->buf[1];
|
||||||
if (pulse8->buf[0] & MSGCODE_FRAME_EOM)
|
if (msgcode & MSGCODE_FRAME_EOM) {
|
||||||
|
WARN_ON(pulse8->work_result);
|
||||||
|
pulse8->work_result = msgcode;
|
||||||
schedule_work(&pulse8->work);
|
schedule_work(&pulse8->work);
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MSGCODE_TRANSMIT_SUCCEEDED:
|
case MSGCODE_TRANSMIT_SUCCEEDED:
|
||||||
case MSGCODE_TRANSMIT_FAILED_LINE:
|
case MSGCODE_TRANSMIT_FAILED_LINE:
|
||||||
case MSGCODE_TRANSMIT_FAILED_ACK:
|
case MSGCODE_TRANSMIT_FAILED_ACK:
|
||||||
case MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA:
|
case MSGCODE_TRANSMIT_FAILED_TIMEOUT_DATA:
|
||||||
case MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE:
|
case MSGCODE_TRANSMIT_FAILED_TIMEOUT_LINE:
|
||||||
|
WARN_ON(pulse8->work_result);
|
||||||
|
pulse8->work_result = msgcode;
|
||||||
schedule_work(&pulse8->work);
|
schedule_work(&pulse8->work);
|
||||||
break;
|
break;
|
||||||
case MSGCODE_HIGH_ERROR:
|
case MSGCODE_HIGH_ERROR:
|
||||||
|
|||||||
@@ -973,6 +973,8 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
|
|||||||
struct ath_htc_rx_status *rxstatus;
|
struct ath_htc_rx_status *rxstatus;
|
||||||
struct ath_rx_status rx_stats;
|
struct ath_rx_status rx_stats;
|
||||||
bool decrypt_error = false;
|
bool decrypt_error = false;
|
||||||
|
__be16 rs_datalen;
|
||||||
|
bool is_phyerr;
|
||||||
|
|
||||||
if (skb->len < HTC_RX_FRAME_HEADER_SIZE) {
|
if (skb->len < HTC_RX_FRAME_HEADER_SIZE) {
|
||||||
ath_err(common, "Corrupted RX frame, dropping (len: %d)\n",
|
ath_err(common, "Corrupted RX frame, dropping (len: %d)\n",
|
||||||
@@ -982,11 +984,24 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
|
|||||||
|
|
||||||
rxstatus = (struct ath_htc_rx_status *)skb->data;
|
rxstatus = (struct ath_htc_rx_status *)skb->data;
|
||||||
|
|
||||||
if (be16_to_cpu(rxstatus->rs_datalen) -
|
rs_datalen = be16_to_cpu(rxstatus->rs_datalen);
|
||||||
(skb->len - HTC_RX_FRAME_HEADER_SIZE) != 0) {
|
if (unlikely(rs_datalen -
|
||||||
|
(skb->len - HTC_RX_FRAME_HEADER_SIZE) != 0)) {
|
||||||
ath_err(common,
|
ath_err(common,
|
||||||
"Corrupted RX data len, dropping (dlen: %d, skblen: %d)\n",
|
"Corrupted RX data len, dropping (dlen: %d, skblen: %d)\n",
|
||||||
rxstatus->rs_datalen, skb->len);
|
rs_datalen, skb->len);
|
||||||
|
goto rx_next;
|
||||||
|
}
|
||||||
|
|
||||||
|
is_phyerr = rxstatus->rs_status & ATH9K_RXERR_PHY;
|
||||||
|
/*
|
||||||
|
* Discard zero-length packets and packets smaller than an ACK
|
||||||
|
* which are not PHY_ERROR (short radar pulses have a length of 3)
|
||||||
|
*/
|
||||||
|
if (unlikely(!rs_datalen || (rs_datalen < 10 && !is_phyerr))) {
|
||||||
|
ath_warn(common,
|
||||||
|
"Short RX data len, dropping (dlen: %d)\n",
|
||||||
|
rs_datalen);
|
||||||
goto rx_next;
|
goto rx_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1011,7 +1026,7 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
|
|||||||
* Process PHY errors and return so that the packet
|
* Process PHY errors and return so that the packet
|
||||||
* can be dropped.
|
* can be dropped.
|
||||||
*/
|
*/
|
||||||
if (rx_stats.rs_status & ATH9K_RXERR_PHY) {
|
if (unlikely(is_phyerr)) {
|
||||||
/* TODO: Not using DFS processing now. */
|
/* TODO: Not using DFS processing now. */
|
||||||
if (ath_cmn_process_fft(&priv->spec_priv, hdr,
|
if (ath_cmn_process_fft(&priv->spec_priv, hdr,
|
||||||
&rx_stats, rx_status->mactime)) {
|
&rx_stats, rx_status->mactime)) {
|
||||||
|
|||||||
@@ -337,7 +337,8 @@ nvme_fc_register_localport(struct nvme_fc_port_info *pinfo,
|
|||||||
!template->ls_req || !template->fcp_io ||
|
!template->ls_req || !template->fcp_io ||
|
||||||
!template->ls_abort || !template->fcp_abort ||
|
!template->ls_abort || !template->fcp_abort ||
|
||||||
!template->max_hw_queues || !template->max_sgl_segments ||
|
!template->max_hw_queues || !template->max_sgl_segments ||
|
||||||
!template->max_dif_sgl_segments || !template->dma_boundary) {
|
!template->max_dif_sgl_segments || !template->dma_boundary ||
|
||||||
|
!template->module) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto out_reghost_failed;
|
goto out_reghost_failed;
|
||||||
}
|
}
|
||||||
@@ -1762,6 +1763,7 @@ nvme_fc_ctrl_free(struct kref *ref)
|
|||||||
{
|
{
|
||||||
struct nvme_fc_ctrl *ctrl =
|
struct nvme_fc_ctrl *ctrl =
|
||||||
container_of(ref, struct nvme_fc_ctrl, ref);
|
container_of(ref, struct nvme_fc_ctrl, ref);
|
||||||
|
struct nvme_fc_lport *lport = ctrl->lport;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
if (ctrl->ctrl.tagset) {
|
if (ctrl->ctrl.tagset) {
|
||||||
@@ -1787,6 +1789,7 @@ nvme_fc_ctrl_free(struct kref *ref)
|
|||||||
if (ctrl->ctrl.opts)
|
if (ctrl->ctrl.opts)
|
||||||
nvmf_free_options(ctrl->ctrl.opts);
|
nvmf_free_options(ctrl->ctrl.opts);
|
||||||
kfree(ctrl);
|
kfree(ctrl);
|
||||||
|
module_put(lport->ops->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -2765,10 +2768,15 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
|
|||||||
goto out_fail;
|
goto out_fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!try_module_get(lport->ops->module)) {
|
||||||
|
ret = -EUNATCH;
|
||||||
|
goto out_free_ctrl;
|
||||||
|
}
|
||||||
|
|
||||||
idx = ida_simple_get(&nvme_fc_ctrl_cnt, 0, 0, GFP_KERNEL);
|
idx = ida_simple_get(&nvme_fc_ctrl_cnt, 0, 0, GFP_KERNEL);
|
||||||
if (idx < 0) {
|
if (idx < 0) {
|
||||||
ret = -ENOSPC;
|
ret = -ENOSPC;
|
||||||
goto out_free_ctrl;
|
goto out_mod_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctrl->ctrl.opts = opts;
|
ctrl->ctrl.opts = opts;
|
||||||
@@ -2915,6 +2923,8 @@ out_free_queues:
|
|||||||
out_free_ida:
|
out_free_ida:
|
||||||
put_device(ctrl->dev);
|
put_device(ctrl->dev);
|
||||||
ida_simple_remove(&nvme_fc_ctrl_cnt, ctrl->cnum);
|
ida_simple_remove(&nvme_fc_ctrl_cnt, ctrl->cnum);
|
||||||
|
out_mod_put:
|
||||||
|
module_put(lport->ops->module);
|
||||||
out_free_ctrl:
|
out_free_ctrl:
|
||||||
kfree(ctrl);
|
kfree(ctrl);
|
||||||
out_fail:
|
out_fail:
|
||||||
|
|||||||
@@ -693,6 +693,7 @@ fcloop_targetport_delete(struct nvmet_fc_target_port *targetport)
|
|||||||
#define FCLOOP_DMABOUND_4G 0xFFFFFFFF
|
#define FCLOOP_DMABOUND_4G 0xFFFFFFFF
|
||||||
|
|
||||||
static struct nvme_fc_port_template fctemplate = {
|
static struct nvme_fc_port_template fctemplate = {
|
||||||
|
.module = THIS_MODULE,
|
||||||
.localport_delete = fcloop_localport_delete,
|
.localport_delete = fcloop_localport_delete,
|
||||||
.remoteport_delete = fcloop_remoteport_delete,
|
.remoteport_delete = fcloop_remoteport_delete,
|
||||||
.create_queue = fcloop_create_queue,
|
.create_queue = fcloop_create_queue,
|
||||||
|
|||||||
@@ -482,6 +482,14 @@ static const struct dmi_system_id critclk_systems[] = {
|
|||||||
DMI_MATCH(DMI_PRODUCT_VERSION, "6ES7647-8B"),
|
DMI_MATCH(DMI_PRODUCT_VERSION, "6ES7647-8B"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.ident = "CONNECT X300",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "SIEMENS AG"),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_VERSION, "A5E45074588"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
{ /*sentinel*/ }
|
{ /*sentinel*/ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1099,23 +1099,6 @@ static struct ab8500_regulator_info
|
|||||||
.update_val_idle = 0x82,
|
.update_val_idle = 0x82,
|
||||||
.update_val_normal = 0x02,
|
.update_val_normal = 0x02,
|
||||||
},
|
},
|
||||||
[AB8505_LDO_USB] = {
|
|
||||||
.desc = {
|
|
||||||
.name = "LDO-USB",
|
|
||||||
.ops = &ab8500_regulator_mode_ops,
|
|
||||||
.type = REGULATOR_VOLTAGE,
|
|
||||||
.id = AB8505_LDO_USB,
|
|
||||||
.owner = THIS_MODULE,
|
|
||||||
.n_voltages = 1,
|
|
||||||
.volt_table = fixed_3300000_voltage,
|
|
||||||
},
|
|
||||||
.update_bank = 0x03,
|
|
||||||
.update_reg = 0x82,
|
|
||||||
.update_mask = 0x03,
|
|
||||||
.update_val = 0x01,
|
|
||||||
.update_val_idle = 0x03,
|
|
||||||
.update_val_normal = 0x01,
|
|
||||||
},
|
|
||||||
[AB8505_LDO_AUDIO] = {
|
[AB8505_LDO_AUDIO] = {
|
||||||
.desc = {
|
.desc = {
|
||||||
.name = "LDO-AUDIO",
|
.name = "LDO-AUDIO",
|
||||||
|
|||||||
@@ -97,12 +97,21 @@ static int sas_get_port_device(struct asd_sas_port *port)
|
|||||||
else
|
else
|
||||||
dev->dev_type = SAS_SATA_DEV;
|
dev->dev_type = SAS_SATA_DEV;
|
||||||
dev->tproto = SAS_PROTOCOL_SATA;
|
dev->tproto = SAS_PROTOCOL_SATA;
|
||||||
} else {
|
} else if (port->oob_mode == SAS_OOB_MODE) {
|
||||||
struct sas_identify_frame *id =
|
struct sas_identify_frame *id =
|
||||||
(struct sas_identify_frame *) dev->frame_rcvd;
|
(struct sas_identify_frame *) dev->frame_rcvd;
|
||||||
dev->dev_type = id->dev_type;
|
dev->dev_type = id->dev_type;
|
||||||
dev->iproto = id->initiator_bits;
|
dev->iproto = id->initiator_bits;
|
||||||
dev->tproto = id->target_bits;
|
dev->tproto = id->target_bits;
|
||||||
|
} else {
|
||||||
|
/* If the oob mode is OOB_NOT_CONNECTED, the port is
|
||||||
|
* disconnected due to race with PHY down. We cannot
|
||||||
|
* continue to discover this port
|
||||||
|
*/
|
||||||
|
sas_put_device(dev);
|
||||||
|
pr_warn("Port %016llx is disconnected when discovering\n",
|
||||||
|
SAS_ADDR(port->attached_sas_addr));
|
||||||
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
sas_init_dev(dev);
|
sas_init_dev(dev);
|
||||||
|
|||||||
@@ -4419,12 +4419,6 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
|
|||||||
phba->mbox_ext_buf_ctx.seqNum++;
|
phba->mbox_ext_buf_ctx.seqNum++;
|
||||||
nemb_tp = phba->mbox_ext_buf_ctx.nembType;
|
nemb_tp = phba->mbox_ext_buf_ctx.nembType;
|
||||||
|
|
||||||
dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
|
|
||||||
if (!dd_data) {
|
|
||||||
rc = -ENOMEM;
|
|
||||||
goto job_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
pbuf = (uint8_t *)dmabuf->virt;
|
pbuf = (uint8_t *)dmabuf->virt;
|
||||||
size = job->request_payload.payload_len;
|
size = job->request_payload.payload_len;
|
||||||
sg_copy_to_buffer(job->request_payload.sg_list,
|
sg_copy_to_buffer(job->request_payload.sg_list,
|
||||||
@@ -4461,6 +4455,13 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
|
|||||||
"2968 SLI_CONFIG ext-buffer wr all %d "
|
"2968 SLI_CONFIG ext-buffer wr all %d "
|
||||||
"ebuffers received\n",
|
"ebuffers received\n",
|
||||||
phba->mbox_ext_buf_ctx.numBuf);
|
phba->mbox_ext_buf_ctx.numBuf);
|
||||||
|
|
||||||
|
dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
|
||||||
|
if (!dd_data) {
|
||||||
|
rc = -ENOMEM;
|
||||||
|
goto job_error;
|
||||||
|
}
|
||||||
|
|
||||||
/* mailbox command structure for base driver */
|
/* mailbox command structure for base driver */
|
||||||
pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||||
if (!pmboxq) {
|
if (!pmboxq) {
|
||||||
@@ -4509,6 +4510,8 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct bsg_job *job,
|
|||||||
return SLI_CONFIG_HANDLED;
|
return SLI_CONFIG_HANDLED;
|
||||||
|
|
||||||
job_error:
|
job_error:
|
||||||
|
if (pmboxq)
|
||||||
|
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||||
lpfc_bsg_dma_page_free(phba, dmabuf);
|
lpfc_bsg_dma_page_free(phba, dmabuf);
|
||||||
kfree(dd_data);
|
kfree(dd_data);
|
||||||
|
|
||||||
|
|||||||
@@ -1591,6 +1591,8 @@ lpfc_nvme_fcp_abort(struct nvme_fc_local_port *pnvme_lport,
|
|||||||
|
|
||||||
/* Declare and initialization an instance of the FC NVME template. */
|
/* Declare and initialization an instance of the FC NVME template. */
|
||||||
static struct nvme_fc_port_template lpfc_nvme_template = {
|
static struct nvme_fc_port_template lpfc_nvme_template = {
|
||||||
|
.module = THIS_MODULE,
|
||||||
|
|
||||||
/* initiator-based functions */
|
/* initiator-based functions */
|
||||||
.localport_delete = lpfc_nvme_localport_delete,
|
.localport_delete = lpfc_nvme_localport_delete,
|
||||||
.remoteport_delete = lpfc_nvme_remoteport_delete,
|
.remoteport_delete = lpfc_nvme_remoteport_delete,
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ static int qedf_initiate_els(struct qedf_rport *fcport, unsigned int op,
|
|||||||
int rc = 0;
|
int rc = 0;
|
||||||
uint32_t did, sid;
|
uint32_t did, sid;
|
||||||
uint16_t xid;
|
uint16_t xid;
|
||||||
uint32_t start_time = jiffies / HZ;
|
|
||||||
uint32_t current_time;
|
|
||||||
struct fcoe_wqe *sqe;
|
struct fcoe_wqe *sqe;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u16 sqe_idx;
|
u16 sqe_idx;
|
||||||
@@ -50,18 +48,12 @@ static int qedf_initiate_els(struct qedf_rport *fcport, unsigned int op,
|
|||||||
goto els_err;
|
goto els_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
retry_els:
|
|
||||||
els_req = qedf_alloc_cmd(fcport, QEDF_ELS);
|
els_req = qedf_alloc_cmd(fcport, QEDF_ELS);
|
||||||
if (!els_req) {
|
if (!els_req) {
|
||||||
current_time = jiffies / HZ;
|
QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_ELS,
|
||||||
if ((current_time - start_time) > 10) {
|
"Failed to alloc ELS request 0x%x\n", op);
|
||||||
QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_ELS,
|
rc = -ENOMEM;
|
||||||
"els: Failed els 0x%x\n", op);
|
goto els_err;
|
||||||
rc = -ENOMEM;
|
|
||||||
goto els_err;
|
|
||||||
}
|
|
||||||
mdelay(20 * USEC_PER_MSEC);
|
|
||||||
goto retry_els;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_ELS, "initiate_els els_req = "
|
QEDF_INFO(&(qedf->dbg_ctx), QEDF_LOG_ELS, "initiate_els els_req = "
|
||||||
|
|||||||
@@ -1046,8 +1046,6 @@ global_port_update:
|
|||||||
ql_dbg(ql_dbg_async, vha, 0x5011,
|
ql_dbg(ql_dbg_async, vha, 0x5011,
|
||||||
"Asynchronous PORT UPDATE ignored %04x/%04x/%04x.\n",
|
"Asynchronous PORT UPDATE ignored %04x/%04x/%04x.\n",
|
||||||
mb[1], mb[2], mb[3]);
|
mb[1], mb[2], mb[3]);
|
||||||
|
|
||||||
qlt_async_event(mb[0], vha, mb);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1065,8 +1063,6 @@ global_port_update:
|
|||||||
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
||||||
set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
||||||
set_bit(VP_CONFIG_OK, &vha->vp_flags);
|
set_bit(VP_CONFIG_OK, &vha->vp_flags);
|
||||||
|
|
||||||
qlt_async_event(mb[0], vha, mb);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MBA_RSCN_UPDATE: /* State Change Registration */
|
case MBA_RSCN_UPDATE: /* State Change Registration */
|
||||||
|
|||||||
@@ -578,6 +578,7 @@ static void qla_nvme_remoteport_delete(struct nvme_fc_remote_port *rport)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct nvme_fc_port_template qla_nvme_fc_transport = {
|
static struct nvme_fc_port_template qla_nvme_fc_transport = {
|
||||||
|
.module = THIS_MODULE,
|
||||||
.localport_delete = qla_nvme_localport_delete,
|
.localport_delete = qla_nvme_localport_delete,
|
||||||
.remoteport_delete = qla_nvme_remoteport_delete,
|
.remoteport_delete = qla_nvme_remoteport_delete,
|
||||||
.create_queue = qla_nvme_alloc_queue,
|
.create_queue = qla_nvme_alloc_queue,
|
||||||
|
|||||||
@@ -1210,7 +1210,6 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess,
|
|||||||
"Scheduling sess %p for deletion %8phC\n",
|
"Scheduling sess %p for deletion %8phC\n",
|
||||||
sess, sess->port_name);
|
sess, sess->port_name);
|
||||||
|
|
||||||
INIT_WORK(&sess->del_work, qla24xx_delete_sess_fn);
|
|
||||||
queue_work(sess->vha->hw->wq, &sess->del_work);
|
queue_work(sess->vha->hw->wq, &sess->del_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4285,7 +4285,6 @@ static int qla4xxx_mem_alloc(struct scsi_qla_host *ha)
|
|||||||
return QLA_SUCCESS;
|
return QLA_SUCCESS;
|
||||||
|
|
||||||
mem_alloc_error_exit:
|
mem_alloc_error_exit:
|
||||||
qla4xxx_mem_free(ha);
|
|
||||||
return QLA_ERROR;
|
return QLA_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -120,6 +120,14 @@ static int hvterm_raw_get_chars(uint32_t vtermno, char *buf, int count)
|
|||||||
return got;
|
return got;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hvterm_raw_put_chars: send characters to firmware for given vterm adapter
|
||||||
|
* @vtermno: The virtual terminal number.
|
||||||
|
* @buf: The characters to send. Because of the underlying hypercall in
|
||||||
|
* hvc_put_chars(), this buffer must be at least 16 bytes long, even if
|
||||||
|
* you are sending fewer chars.
|
||||||
|
* @count: number of chars to send.
|
||||||
|
*/
|
||||||
static int hvterm_raw_put_chars(uint32_t vtermno, const char *buf, int count)
|
static int hvterm_raw_put_chars(uint32_t vtermno, const char *buf, int count)
|
||||||
{
|
{
|
||||||
struct hvterm_priv *pv = hvterm_privs[vtermno];
|
struct hvterm_priv *pv = hvterm_privs[vtermno];
|
||||||
@@ -232,6 +240,7 @@ static const struct hv_ops hvterm_hvsi_ops = {
|
|||||||
static void udbg_hvc_putc(char c)
|
static void udbg_hvc_putc(char c)
|
||||||
{
|
{
|
||||||
int count = -1;
|
int count = -1;
|
||||||
|
unsigned char bounce_buffer[16];
|
||||||
|
|
||||||
if (!hvterm_privs[0])
|
if (!hvterm_privs[0])
|
||||||
return;
|
return;
|
||||||
@@ -242,7 +251,12 @@ static void udbg_hvc_putc(char c)
|
|||||||
do {
|
do {
|
||||||
switch(hvterm_privs[0]->proto) {
|
switch(hvterm_privs[0]->proto) {
|
||||||
case HV_PROTOCOL_RAW:
|
case HV_PROTOCOL_RAW:
|
||||||
count = hvterm_raw_put_chars(0, &c, 1);
|
/*
|
||||||
|
* hvterm_raw_put_chars requires at least a 16-byte
|
||||||
|
* buffer, so go via the bounce buffer
|
||||||
|
*/
|
||||||
|
bounce_buffer[0] = c;
|
||||||
|
count = hvterm_raw_put_chars(0, bounce_buffer, 1);
|
||||||
break;
|
break;
|
||||||
case HV_PROTOCOL_HVSI:
|
case HV_PROTOCOL_HVSI:
|
||||||
count = hvterm_hvsi_put_chars(0, &c, 1);
|
count = hvterm_hvsi_put_chars(0, &c, 1);
|
||||||
|
|||||||
@@ -1588,6 +1588,7 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
|||||||
int num_newlines = 0;
|
int num_newlines = 0;
|
||||||
bool replaced = false;
|
bool replaced = false;
|
||||||
void __iomem *tf;
|
void __iomem *tf;
|
||||||
|
int locked = 1;
|
||||||
|
|
||||||
if (is_uartdm)
|
if (is_uartdm)
|
||||||
tf = port->membase + UARTDM_TF;
|
tf = port->membase + UARTDM_TF;
|
||||||
@@ -1600,7 +1601,13 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
|||||||
num_newlines++;
|
num_newlines++;
|
||||||
count += num_newlines;
|
count += num_newlines;
|
||||||
|
|
||||||
spin_lock(&port->lock);
|
if (port->sysrq)
|
||||||
|
locked = 0;
|
||||||
|
else if (oops_in_progress)
|
||||||
|
locked = spin_trylock(&port->lock);
|
||||||
|
else
|
||||||
|
spin_lock(&port->lock);
|
||||||
|
|
||||||
if (is_uartdm)
|
if (is_uartdm)
|
||||||
msm_reset_dm_count(port, count);
|
msm_reset_dm_count(port, count);
|
||||||
|
|
||||||
@@ -1636,7 +1643,9 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
|||||||
iowrite32_rep(tf, buf, 1);
|
iowrite32_rep(tf, buf, 1);
|
||||||
i += num_chars;
|
i += num_chars;
|
||||||
}
|
}
|
||||||
spin_unlock(&port->lock);
|
|
||||||
|
if (locked)
|
||||||
|
spin_unlock(&port->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void msm_console_write(struct console *co, const char *s,
|
static void msm_console_write(struct console *co, const char *s,
|
||||||
|
|||||||
@@ -625,8 +625,12 @@ static void ecm_disable(struct usb_function *f)
|
|||||||
|
|
||||||
DBG(cdev, "ecm deactivated\n");
|
DBG(cdev, "ecm deactivated\n");
|
||||||
|
|
||||||
if (ecm->port.in_ep->enabled)
|
if (ecm->port.in_ep->enabled) {
|
||||||
gether_disconnect(&ecm->port);
|
gether_disconnect(&ecm->port);
|
||||||
|
} else {
|
||||||
|
ecm->port.in_ep->desc = NULL;
|
||||||
|
ecm->port.out_ep->desc = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
usb_ep_disable(ecm->notify);
|
usb_ep_disable(ecm->notify);
|
||||||
ecm->notify->desc = NULL;
|
ecm->notify->desc = NULL;
|
||||||
|
|||||||
@@ -622,6 +622,7 @@ static void rndis_disable(struct usb_function *f)
|
|||||||
gether_disconnect(&rndis->port);
|
gether_disconnect(&rndis->port);
|
||||||
|
|
||||||
usb_ep_disable(rndis->notify);
|
usb_ep_disable(rndis->notify);
|
||||||
|
rndis->notify->desc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|||||||
@@ -401,7 +401,8 @@ static struct notifier_block xen_memory_nb = {
|
|||||||
#else
|
#else
|
||||||
static enum bp_state reserve_additional_memory(void)
|
static enum bp_state reserve_additional_memory(void)
|
||||||
{
|
{
|
||||||
balloon_stats.target_pages = balloon_stats.current_pages;
|
balloon_stats.target_pages = balloon_stats.current_pages +
|
||||||
|
balloon_stats.target_unpopulated;
|
||||||
return BP_ECANCELED;
|
return BP_ECANCELED;
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
|
#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
|
||||||
|
|||||||
@@ -1577,9 +1577,10 @@ COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
case FICLONE:
|
case FICLONE:
|
||||||
|
goto do_ioctl;
|
||||||
case FICLONERANGE:
|
case FICLONERANGE:
|
||||||
case FIDEDUPERANGE:
|
case FIDEDUPERANGE:
|
||||||
goto do_ioctl;
|
goto found_handler;
|
||||||
|
|
||||||
case FIBMAP:
|
case FIBMAP:
|
||||||
case FIGETBSZ:
|
case FIGETBSZ:
|
||||||
|
|||||||
@@ -2691,7 +2691,7 @@ static void lock_get_status(struct seq_file *f, struct file_lock *fl,
|
|||||||
}
|
}
|
||||||
if (inode) {
|
if (inode) {
|
||||||
/* userspace relies on this representation of dev_t */
|
/* userspace relies on this representation of dev_t */
|
||||||
seq_printf(f, "%d %02x:%02x:%ld ", fl_pid,
|
seq_printf(f, "%d %02x:%02x:%lu ", fl_pid,
|
||||||
MAJOR(inode->i_sb->s_dev),
|
MAJOR(inode->i_sb->s_dev),
|
||||||
MINOR(inode->i_sb->s_dev), inode->i_ino);
|
MINOR(inode->i_sb->s_dev), inode->i_ino);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -3058,12 +3058,17 @@ static bool replay_matches_cache(struct svc_rqst *rqstp,
|
|||||||
(bool)seq->cachethis)
|
(bool)seq->cachethis)
|
||||||
return false;
|
return false;
|
||||||
/*
|
/*
|
||||||
* If there's an error than the reply can have fewer ops than
|
* If there's an error then the reply can have fewer ops than
|
||||||
* the call. But if we cached a reply with *more* ops than the
|
* the call.
|
||||||
* call you're sending us now, then this new call is clearly not
|
|
||||||
* really a replay of the old one:
|
|
||||||
*/
|
*/
|
||||||
if (slot->sl_opcnt < argp->opcnt)
|
if (slot->sl_opcnt < argp->opcnt && !slot->sl_status)
|
||||||
|
return false;
|
||||||
|
/*
|
||||||
|
* But if we cached a reply with *more* ops than the call you're
|
||||||
|
* sending us now, then this new call is clearly not really a
|
||||||
|
* replay of the old one:
|
||||||
|
*/
|
||||||
|
if (slot->sl_opcnt > argp->opcnt)
|
||||||
return false;
|
return false;
|
||||||
/* This is the only check explicitly called by spec: */
|
/* This is the only check explicitly called by spec: */
|
||||||
if (!same_creds(&rqstp->rq_cred, &slot->sl_cred))
|
if (!same_creds(&rqstp->rq_cred, &slot->sl_cred))
|
||||||
|
|||||||
@@ -433,6 +433,17 @@ static int notrace ramoops_pstore_write(struct pstore_record *record)
|
|||||||
|
|
||||||
prz = cxt->dprzs[cxt->dump_write_cnt];
|
prz = cxt->dprzs[cxt->dump_write_cnt];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Since this is a new crash dump, we need to reset the buffer in
|
||||||
|
* case it still has an old dump present. Without this, the new dump
|
||||||
|
* will get appended, which would seriously confuse anything trying
|
||||||
|
* to check dump file contents. Specifically, ramoops_read_kmsg_hdr()
|
||||||
|
* expects to find a dump header in the beginning of buffer data, so
|
||||||
|
* we must to reset the buffer values, in order to ensure that the
|
||||||
|
* header will be written to the beginning of the buffer.
|
||||||
|
*/
|
||||||
|
persistent_ram_zap(prz);
|
||||||
|
|
||||||
/* Build header and append record contents. */
|
/* Build header and append record contents. */
|
||||||
hlen = ramoops_write_kmsg_hdr(prz, record);
|
hlen = ramoops_write_kmsg_hdr(prz, record);
|
||||||
size = record->size;
|
size = record->size;
|
||||||
|
|||||||
@@ -5556,7 +5556,7 @@ __xfs_bunmapi(
|
|||||||
* Make sure we don't touch multiple AGF headers out of order
|
* Make sure we don't touch multiple AGF headers out of order
|
||||||
* in a single transaction, as that could cause AB-BA deadlocks.
|
* in a single transaction, as that could cause AB-BA deadlocks.
|
||||||
*/
|
*/
|
||||||
if (!wasdel) {
|
if (!wasdel && !isrt) {
|
||||||
agno = XFS_FSB_TO_AGNO(mp, del.br_startblock);
|
agno = XFS_FSB_TO_AGNO(mp, del.br_startblock);
|
||||||
if (prev_agno != NULLAGNUMBER && prev_agno > agno)
|
if (prev_agno != NULLAGNUMBER && prev_agno > agno)
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1539,6 +1539,8 @@ out_free_iclog:
|
|||||||
if (iclog->ic_bp)
|
if (iclog->ic_bp)
|
||||||
xfs_buf_free(iclog->ic_bp);
|
xfs_buf_free(iclog->ic_bp);
|
||||||
kmem_free(iclog);
|
kmem_free(iclog);
|
||||||
|
if (prev_iclog == log->l_iclog)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
spinlock_destroy(&log->l_icloglock);
|
spinlock_destroy(&log->l_icloglock);
|
||||||
xfs_buf_free(log->l_xbuf);
|
xfs_buf_free(log->l_xbuf);
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ struct ahci_host_priv;
|
|||||||
struct platform_device;
|
struct platform_device;
|
||||||
struct scsi_host_template;
|
struct scsi_host_template;
|
||||||
|
|
||||||
|
int ahci_platform_enable_phys(struct ahci_host_priv *hpriv);
|
||||||
|
void ahci_platform_disable_phys(struct ahci_host_priv *hpriv);
|
||||||
int ahci_platform_enable_clks(struct ahci_host_priv *hpriv);
|
int ahci_platform_enable_clks(struct ahci_host_priv *hpriv);
|
||||||
void ahci_platform_disable_clks(struct ahci_host_priv *hpriv);
|
void ahci_platform_disable_clks(struct ahci_host_priv *hpriv);
|
||||||
int ahci_platform_enable_regulators(struct ahci_host_priv *hpriv);
|
int ahci_platform_enable_regulators(struct ahci_host_priv *hpriv);
|
||||||
|
|||||||
@@ -1362,8 +1362,11 @@ static inline int dma_get_slave_caps(struct dma_chan *chan,
|
|||||||
static inline int dmaengine_desc_set_reuse(struct dma_async_tx_descriptor *tx)
|
static inline int dmaengine_desc_set_reuse(struct dma_async_tx_descriptor *tx)
|
||||||
{
|
{
|
||||||
struct dma_slave_caps caps;
|
struct dma_slave_caps caps;
|
||||||
|
int ret;
|
||||||
|
|
||||||
dma_get_slave_caps(tx->chan, &caps);
|
ret = dma_get_slave_caps(tx->chan, &caps);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if (caps.descriptor_reuse) {
|
if (caps.descriptor_reuse) {
|
||||||
tx->flags |= DMA_CTRL_REUSE;
|
tx->flags |= DMA_CTRL_REUSE;
|
||||||
|
|||||||
@@ -279,6 +279,8 @@ struct nvme_fc_remote_port {
|
|||||||
*
|
*
|
||||||
* Host/Initiator Transport Entrypoints/Parameters:
|
* Host/Initiator Transport Entrypoints/Parameters:
|
||||||
*
|
*
|
||||||
|
* @module: The LLDD module using the interface
|
||||||
|
*
|
||||||
* @localport_delete: The LLDD initiates deletion of a localport via
|
* @localport_delete: The LLDD initiates deletion of a localport via
|
||||||
* nvme_fc_deregister_localport(). However, the teardown is
|
* nvme_fc_deregister_localport(). However, the teardown is
|
||||||
* asynchronous. This routine is called upon the completion of the
|
* asynchronous. This routine is called upon the completion of the
|
||||||
@@ -392,6 +394,8 @@ struct nvme_fc_remote_port {
|
|||||||
* Value is Mandatory. Allowed to be zero.
|
* Value is Mandatory. Allowed to be zero.
|
||||||
*/
|
*/
|
||||||
struct nvme_fc_port_template {
|
struct nvme_fc_port_template {
|
||||||
|
struct module *module;
|
||||||
|
|
||||||
/* initiator-based functions */
|
/* initiator-based functions */
|
||||||
void (*localport_delete)(struct nvme_fc_local_port *);
|
void (*localport_delete)(struct nvme_fc_local_port *);
|
||||||
void (*remoteport_delete)(struct nvme_fc_remote_port *);
|
void (*remoteport_delete)(struct nvme_fc_remote_port *);
|
||||||
|
|||||||
@@ -38,7 +38,6 @@ enum ab8505_regulator_id {
|
|||||||
AB8505_LDO_AUX6,
|
AB8505_LDO_AUX6,
|
||||||
AB8505_LDO_INTCORE,
|
AB8505_LDO_INTCORE,
|
||||||
AB8505_LDO_ADC,
|
AB8505_LDO_ADC,
|
||||||
AB8505_LDO_USB,
|
|
||||||
AB8505_LDO_AUDIO,
|
AB8505_LDO_AUDIO,
|
||||||
AB8505_LDO_ANAMIC1,
|
AB8505_LDO_ANAMIC1,
|
||||||
AB8505_LDO_ANAMIC2,
|
AB8505_LDO_ANAMIC2,
|
||||||
|
|||||||
@@ -458,7 +458,7 @@ static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb
|
|||||||
|
|
||||||
do {
|
do {
|
||||||
seq = read_seqbegin(&hh->hh_lock);
|
seq = read_seqbegin(&hh->hh_lock);
|
||||||
hh_len = hh->hh_len;
|
hh_len = READ_ONCE(hh->hh_len);
|
||||||
if (likely(hh_len <= HH_DATA_MOD)) {
|
if (likely(hh_len <= HH_DATA_MOD)) {
|
||||||
hh_alen = HH_DATA_MOD;
|
hh_alen = HH_DATA_MOD;
|
||||||
|
|
||||||
|
|||||||
@@ -220,7 +220,7 @@ struct cred *cred_alloc_blank(void)
|
|||||||
new->magic = CRED_MAGIC;
|
new->magic = CRED_MAGIC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (security_cred_alloc_blank(new, GFP_KERNEL) < 0)
|
if (security_cred_alloc_blank(new, GFP_KERNEL_ACCOUNT) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
@@ -279,7 +279,7 @@ struct cred *prepare_creds(void)
|
|||||||
new->security = NULL;
|
new->security = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (security_prepare_creds(new, old, GFP_KERNEL) < 0)
|
if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
validate_creds(new);
|
validate_creds(new);
|
||||||
return new;
|
return new;
|
||||||
@@ -654,7 +654,7 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon)
|
|||||||
#ifdef CONFIG_SECURITY
|
#ifdef CONFIG_SECURITY
|
||||||
new->security = NULL;
|
new->security = NULL;
|
||||||
#endif
|
#endif
|
||||||
if (security_prepare_creds(new, old, GFP_KERNEL) < 0)
|
if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
put_cred(old);
|
put_cred(old);
|
||||||
|
|||||||
@@ -734,8 +734,15 @@ zone_found:
|
|||||||
* We have found the zone. Now walk the radix tree to find the leaf node
|
* We have found the zone. Now walk the radix tree to find the leaf node
|
||||||
* for our PFN.
|
* for our PFN.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the zone we wish to scan is the the current zone and the
|
||||||
|
* pfn falls into the current node then we do not need to walk
|
||||||
|
* the tree.
|
||||||
|
*/
|
||||||
node = bm->cur.node;
|
node = bm->cur.node;
|
||||||
if (((pfn - zone->start_pfn) & ~BM_BLOCK_MASK) == bm->cur.node_pfn)
|
if (zone == bm->cur.zone &&
|
||||||
|
((pfn - zone->start_pfn) & ~BM_BLOCK_MASK) == bm->cur.node_pfn)
|
||||||
goto node_found;
|
goto node_found;
|
||||||
|
|
||||||
node = zone->rtree;
|
node = zone->rtree;
|
||||||
|
|||||||
@@ -568,25 +568,33 @@ static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
|
|||||||
static struct taskstats *taskstats_tgid_alloc(struct task_struct *tsk)
|
static struct taskstats *taskstats_tgid_alloc(struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
struct signal_struct *sig = tsk->signal;
|
struct signal_struct *sig = tsk->signal;
|
||||||
struct taskstats *stats;
|
struct taskstats *stats_new, *stats;
|
||||||
|
|
||||||
if (sig->stats || thread_group_empty(tsk))
|
/* Pairs with smp_store_release() below. */
|
||||||
goto ret;
|
stats = smp_load_acquire(&sig->stats);
|
||||||
|
if (stats || thread_group_empty(tsk))
|
||||||
|
return stats;
|
||||||
|
|
||||||
/* No problem if kmem_cache_zalloc() fails */
|
/* No problem if kmem_cache_zalloc() fails */
|
||||||
stats = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);
|
stats_new = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);
|
||||||
|
|
||||||
spin_lock_irq(&tsk->sighand->siglock);
|
spin_lock_irq(&tsk->sighand->siglock);
|
||||||
if (!sig->stats) {
|
stats = sig->stats;
|
||||||
sig->stats = stats;
|
if (!stats) {
|
||||||
stats = NULL;
|
/*
|
||||||
|
* Pairs with smp_store_release() above and order the
|
||||||
|
* kmem_cache_zalloc().
|
||||||
|
*/
|
||||||
|
smp_store_release(&sig->stats, stats_new);
|
||||||
|
stats = stats_new;
|
||||||
|
stats_new = NULL;
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&tsk->sighand->siglock);
|
spin_unlock_irq(&tsk->sighand->siglock);
|
||||||
|
|
||||||
if (stats)
|
if (stats_new)
|
||||||
kmem_cache_free(taskstats_cache, stats);
|
kmem_cache_free(taskstats_cache, stats_new);
|
||||||
ret:
|
|
||||||
return sig->stats;
|
return stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send pid data out on exit */
|
/* Send pid data out on exit */
|
||||||
|
|||||||
@@ -623,8 +623,7 @@ static int function_stat_show(struct seq_file *m, void *v)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||||
avg = rec->time;
|
avg = div64_ul(rec->time, rec->counter);
|
||||||
do_div(avg, rec->counter);
|
|
||||||
if (tracing_thresh && (avg < tracing_thresh))
|
if (tracing_thresh && (avg < tracing_thresh))
|
||||||
goto out;
|
goto out;
|
||||||
#endif
|
#endif
|
||||||
@@ -650,7 +649,8 @@ static int function_stat_show(struct seq_file *m, void *v)
|
|||||||
* Divide only 1000 for ns^2 -> us^2 conversion.
|
* Divide only 1000 for ns^2 -> us^2 conversion.
|
||||||
* trace_print_graph_duration will divide 1000 again.
|
* trace_print_graph_duration will divide 1000 again.
|
||||||
*/
|
*/
|
||||||
do_div(stddev, rec->counter * (rec->counter - 1) * 1000);
|
stddev = div64_ul(stddev,
|
||||||
|
rec->counter * (rec->counter - 1) * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_seq_init(&s);
|
trace_seq_init(&s);
|
||||||
|
|||||||
@@ -4368,6 +4368,10 @@ int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set)
|
|||||||
|
|
||||||
int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled)
|
int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled)
|
||||||
{
|
{
|
||||||
|
if ((mask == TRACE_ITER_RECORD_TGID) ||
|
||||||
|
(mask == TRACE_ITER_RECORD_CMD))
|
||||||
|
lockdep_assert_held(&event_mutex);
|
||||||
|
|
||||||
/* do nothing if flag is already set */
|
/* do nothing if flag is already set */
|
||||||
if (!!(tr->trace_flags & mask) == !!enabled)
|
if (!!(tr->trace_flags & mask) == !!enabled)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -4433,6 +4437,7 @@ static int trace_set_options(struct trace_array *tr, char *option)
|
|||||||
cmp += 2;
|
cmp += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex_lock(&event_mutex);
|
||||||
mutex_lock(&trace_types_lock);
|
mutex_lock(&trace_types_lock);
|
||||||
|
|
||||||
for (i = 0; trace_options[i]; i++) {
|
for (i = 0; trace_options[i]; i++) {
|
||||||
@@ -4447,6 +4452,7 @@ static int trace_set_options(struct trace_array *tr, char *option)
|
|||||||
ret = set_tracer_option(tr, cmp, neg);
|
ret = set_tracer_option(tr, cmp, neg);
|
||||||
|
|
||||||
mutex_unlock(&trace_types_lock);
|
mutex_unlock(&trace_types_lock);
|
||||||
|
mutex_unlock(&event_mutex);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the first trailing whitespace is replaced with '\0' by strstrip,
|
* If the first trailing whitespace is replaced with '\0' by strstrip,
|
||||||
@@ -7373,9 +7379,11 @@ trace_options_core_write(struct file *filp, const char __user *ubuf, size_t cnt,
|
|||||||
if (val != 0 && val != 1)
|
if (val != 0 && val != 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
mutex_lock(&event_mutex);
|
||||||
mutex_lock(&trace_types_lock);
|
mutex_lock(&trace_types_lock);
|
||||||
ret = set_tracer_flag(tr, 1 << index, val);
|
ret = set_tracer_flag(tr, 1 << index, val);
|
||||||
mutex_unlock(&trace_types_lock);
|
mutex_unlock(&trace_types_lock);
|
||||||
|
mutex_unlock(&event_mutex);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -326,7 +326,8 @@ void trace_event_enable_cmd_record(bool enable)
|
|||||||
struct trace_event_file *file;
|
struct trace_event_file *file;
|
||||||
struct trace_array *tr;
|
struct trace_array *tr;
|
||||||
|
|
||||||
mutex_lock(&event_mutex);
|
lockdep_assert_held(&event_mutex);
|
||||||
|
|
||||||
do_for_each_event_file(tr, file) {
|
do_for_each_event_file(tr, file) {
|
||||||
|
|
||||||
if (!(file->flags & EVENT_FILE_FL_ENABLED))
|
if (!(file->flags & EVENT_FILE_FL_ENABLED))
|
||||||
@@ -340,7 +341,6 @@ void trace_event_enable_cmd_record(bool enable)
|
|||||||
clear_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags);
|
clear_bit(EVENT_FILE_FL_RECORDED_CMD_BIT, &file->flags);
|
||||||
}
|
}
|
||||||
} while_for_each_event_file();
|
} while_for_each_event_file();
|
||||||
mutex_unlock(&event_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void trace_event_enable_tgid_record(bool enable)
|
void trace_event_enable_tgid_record(bool enable)
|
||||||
@@ -348,7 +348,8 @@ void trace_event_enable_tgid_record(bool enable)
|
|||||||
struct trace_event_file *file;
|
struct trace_event_file *file;
|
||||||
struct trace_array *tr;
|
struct trace_array *tr;
|
||||||
|
|
||||||
mutex_lock(&event_mutex);
|
lockdep_assert_held(&event_mutex);
|
||||||
|
|
||||||
do_for_each_event_file(tr, file) {
|
do_for_each_event_file(tr, file) {
|
||||||
if (!(file->flags & EVENT_FILE_FL_ENABLED))
|
if (!(file->flags & EVENT_FILE_FL_ENABLED))
|
||||||
continue;
|
continue;
|
||||||
@@ -362,7 +363,6 @@ void trace_event_enable_tgid_record(bool enable)
|
|||||||
&file->flags);
|
&file->flags);
|
||||||
}
|
}
|
||||||
} while_for_each_event_file();
|
} while_for_each_event_file();
|
||||||
mutex_unlock(&event_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __ftrace_event_enable_disable(struct trace_event_file *file,
|
static int __ftrace_event_enable_disable(struct trace_event_file *file,
|
||||||
|
|||||||
@@ -90,8 +90,8 @@ static int tracing_map_cmp_atomic64(void *val_a, void *val_b)
|
|||||||
#define DEFINE_TRACING_MAP_CMP_FN(type) \
|
#define DEFINE_TRACING_MAP_CMP_FN(type) \
|
||||||
static int tracing_map_cmp_##type(void *val_a, void *val_b) \
|
static int tracing_map_cmp_##type(void *val_a, void *val_b) \
|
||||||
{ \
|
{ \
|
||||||
type a = *(type *)val_a; \
|
type a = (type)(*(u64 *)val_a); \
|
||||||
type b = *(type *)val_b; \
|
type b = (type)(*(u64 *)val_b); \
|
||||||
\
|
\
|
||||||
return (a > b) ? 1 : ((a < b) ? -1 : 0); \
|
return (a > b) ? 1 : ((a < b) ? -1 : 0); \
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,12 +89,6 @@ static void unmap_region(struct mm_struct *mm,
|
|||||||
* MAP_PRIVATE r: (no) no r: (yes) yes r: (no) yes r: (no) yes
|
* MAP_PRIVATE r: (no) no r: (yes) yes r: (no) yes r: (no) yes
|
||||||
* w: (no) no w: (no) no w: (copy) copy w: (no) no
|
* w: (no) no w: (no) no w: (copy) copy w: (no) no
|
||||||
* x: (no) no x: (no) yes x: (no) yes x: (yes) yes
|
* x: (no) no x: (no) yes x: (no) yes x: (yes) yes
|
||||||
*
|
|
||||||
* On arm64, PROT_EXEC has the following behaviour for both MAP_SHARED and
|
|
||||||
* MAP_PRIVATE:
|
|
||||||
* r: (no) no
|
|
||||||
* w: (no) no
|
|
||||||
* x: (yes) yes
|
|
||||||
*/
|
*/
|
||||||
pgprot_t protection_map[16] __ro_after_init = {
|
pgprot_t protection_map[16] __ro_after_init = {
|
||||||
__P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
|
__P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
|
||||||
|
|||||||
@@ -2108,6 +2108,11 @@ int zs_page_migrate(struct address_space *mapping, struct page *newpage,
|
|||||||
zs_pool_dec_isolated(pool);
|
zs_pool_dec_isolated(pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (page_zone(newpage) != page_zone(page)) {
|
||||||
|
dec_zone_page_state(page, NR_ZSPAGES);
|
||||||
|
inc_zone_page_state(newpage, NR_ZSPAGES);
|
||||||
|
}
|
||||||
|
|
||||||
reset_page(page);
|
reset_page(page);
|
||||||
put_page(page);
|
put_page(page);
|
||||||
page = newpage;
|
page = newpage;
|
||||||
|
|||||||
@@ -1054,8 +1054,10 @@ struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,
|
|||||||
if (!conn)
|
if (!conn)
|
||||||
return ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
if (hci_explicit_conn_params_set(hdev, dst, dst_type) < 0)
|
if (hci_explicit_conn_params_set(hdev, dst, dst_type) < 0) {
|
||||||
|
hci_conn_del(conn);
|
||||||
return ERR_PTR(-EBUSY);
|
return ERR_PTR(-EBUSY);
|
||||||
|
}
|
||||||
|
|
||||||
conn->state = BT_CONNECT;
|
conn->state = BT_CONNECT;
|
||||||
set_bit(HCI_CONN_SCANNING, &conn->flags);
|
set_bit(HCI_CONN_SCANNING, &conn->flags);
|
||||||
|
|||||||
@@ -4918,10 +4918,8 @@ void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
|
|||||||
BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
|
BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
|
||||||
chan, result, local_amp_id, remote_amp_id);
|
chan, result, local_amp_id, remote_amp_id);
|
||||||
|
|
||||||
if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
|
if (chan->state == BT_DISCONN || chan->state == BT_CLOSED)
|
||||||
l2cap_chan_unlock(chan);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (chan->state != BT_CONNECTED) {
|
if (chan->state != BT_CONNECTED) {
|
||||||
l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
|
l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
|
||||||
|
|||||||
@@ -1094,7 +1094,7 @@ static void neigh_update_hhs(struct neighbour *neigh)
|
|||||||
|
|
||||||
if (update) {
|
if (update) {
|
||||||
hh = &neigh->hh;
|
hh = &neigh->hh;
|
||||||
if (hh->hh_len) {
|
if (READ_ONCE(hh->hh_len)) {
|
||||||
write_seqlock_bh(&hh->hh_lock);
|
write_seqlock_bh(&hh->hh_lock);
|
||||||
update(hh, neigh->dev, neigh->ha);
|
update(hh, neigh->dev, neigh->ha);
|
||||||
write_sequnlock_bh(&hh->hh_lock);
|
write_sequnlock_bh(&hh->hh_lock);
|
||||||
@@ -1355,7 +1355,7 @@ int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb)
|
|||||||
struct net_device *dev = neigh->dev;
|
struct net_device *dev = neigh->dev;
|
||||||
unsigned int seq;
|
unsigned int seq;
|
||||||
|
|
||||||
if (dev->header_ops->cache && !neigh->hh.hh_len)
|
if (dev->header_ops->cache && !READ_ONCE(neigh->hh.hh_len))
|
||||||
neigh_hh_init(neigh);
|
neigh_hh_init(neigh);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|||||||
@@ -239,7 +239,12 @@ int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh, __be16
|
|||||||
eth->h_proto = type;
|
eth->h_proto = type;
|
||||||
memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
|
memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
|
||||||
memcpy(eth->h_dest, neigh->ha, ETH_ALEN);
|
memcpy(eth->h_dest, neigh->ha, ETH_ALEN);
|
||||||
hh->hh_len = ETH_HLEN;
|
|
||||||
|
/* Pairs with READ_ONCE() in neigh_resolve_output(),
|
||||||
|
* neigh_hh_output() and neigh_update_hhs().
|
||||||
|
*/
|
||||||
|
smp_store_release(&hh->hh_len, ETH_HLEN);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(eth_header_cache);
|
EXPORT_SYMBOL(eth_header_cache);
|
||||||
|
|||||||
@@ -150,6 +150,9 @@ void rxrpc_error_report(struct sock *sk)
|
|||||||
struct rxrpc_peer *peer;
|
struct rxrpc_peer *peer;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
|
if (unlikely(!local))
|
||||||
|
return;
|
||||||
|
|
||||||
_enter("%p{%d}", sk, local->debug_id);
|
_enter("%p{%d}", sk, local->debug_id);
|
||||||
|
|
||||||
skb = sock_dequeue_err_skb(sk);
|
skb = sock_dequeue_err_skb(sk);
|
||||||
|
|||||||
@@ -891,7 +891,7 @@ static ssize_t sock_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
|||||||
.msg_iocb = iocb};
|
.msg_iocb = iocb};
|
||||||
ssize_t res;
|
ssize_t res;
|
||||||
|
|
||||||
if (file->f_flags & O_NONBLOCK)
|
if (file->f_flags & O_NONBLOCK || (iocb->ki_flags & IOCB_NOWAIT))
|
||||||
msg.msg_flags = MSG_DONTWAIT;
|
msg.msg_flags = MSG_DONTWAIT;
|
||||||
|
|
||||||
if (iocb->ki_pos != 0)
|
if (iocb->ki_pos != 0)
|
||||||
@@ -916,7 +916,7 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
|||||||
if (iocb->ki_pos != 0)
|
if (iocb->ki_pos != 0)
|
||||||
return -ESPIPE;
|
return -ESPIPE;
|
||||||
|
|
||||||
if (file->f_flags & O_NONBLOCK)
|
if (file->f_flags & O_NONBLOCK || (iocb->ki_flags & IOCB_NOWAIT))
|
||||||
msg.msg_flags = MSG_DONTWAIT;
|
msg.msg_flags = MSG_DONTWAIT;
|
||||||
|
|
||||||
if (sock->type == SOCK_SEQPACKET)
|
if (sock->type == SOCK_SEQPACKET)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ static const char *const clock_names[] = {
|
|||||||
[SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT] = "S/PDIF on optical interface",
|
[SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT] = "S/PDIF on optical interface",
|
||||||
[SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_A] = "S/PDIF on optical interface A",
|
[SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_A] = "S/PDIF on optical interface A",
|
||||||
[SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_B] = "S/PDIF on optical interface B",
|
[SND_MOTU_CLOCK_SOURCE_SPDIF_ON_OPT_B] = "S/PDIF on optical interface B",
|
||||||
[SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX] = "S/PCIF on coaxial interface",
|
[SND_MOTU_CLOCK_SOURCE_SPDIF_ON_COAX] = "S/PDIF on coaxial interface",
|
||||||
[SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR] = "AESEBU on XLR interface",
|
[SND_MOTU_CLOCK_SOURCE_AESEBU_ON_XLR] = "AESEBU on XLR interface",
|
||||||
[SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC] = "Word clock on BNC interface",
|
[SND_MOTU_CLOCK_SOURCE_WORD_ON_BNC] = "Word clock on BNC interface",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -293,7 +293,8 @@ static int snd_cs423x_pnp_init_mpu(int dev, struct pnp_dev *pdev)
|
|||||||
} else {
|
} else {
|
||||||
mpu_port[dev] = pnp_port_start(pdev, 0);
|
mpu_port[dev] = pnp_port_start(pdev, 0);
|
||||||
if (mpu_irq[dev] >= 0 &&
|
if (mpu_irq[dev] >= 0 &&
|
||||||
pnp_irq_valid(pdev, 0) && pnp_irq(pdev, 0) >= 0) {
|
pnp_irq_valid(pdev, 0) &&
|
||||||
|
pnp_irq(pdev, 0) != (resource_size_t)-1) {
|
||||||
mpu_irq[dev] = pnp_irq(pdev, 0);
|
mpu_irq[dev] = pnp_irq(pdev, 0);
|
||||||
} else {
|
} else {
|
||||||
mpu_irq[dev] = -1; /* disable interrupt */
|
mpu_irq[dev] = -1; /* disable interrupt */
|
||||||
|
|||||||
@@ -661,6 +661,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned char mclk_change;
|
unsigned char mclk_change;
|
||||||
unsigned int i, old_rate;
|
unsigned int i, old_rate;
|
||||||
|
bool call_set_rate = false;
|
||||||
|
|
||||||
if (rate > ice->hw_rates->list[ice->hw_rates->count - 1])
|
if (rate > ice->hw_rates->list[ice->hw_rates->count - 1])
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -684,7 +685,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
|||||||
* setting clock rate for internal clock mode */
|
* setting clock rate for internal clock mode */
|
||||||
old_rate = ice->get_rate(ice);
|
old_rate = ice->get_rate(ice);
|
||||||
if (force || (old_rate != rate))
|
if (force || (old_rate != rate))
|
||||||
ice->set_rate(ice, rate);
|
call_set_rate = true;
|
||||||
else if (rate == ice->cur_rate) {
|
else if (rate == ice->cur_rate) {
|
||||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -692,12 +693,14 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ice->cur_rate = rate;
|
ice->cur_rate = rate;
|
||||||
|
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||||
|
|
||||||
|
if (call_set_rate)
|
||||||
|
ice->set_rate(ice, rate);
|
||||||
|
|
||||||
/* setting master clock */
|
/* setting master clock */
|
||||||
mclk_change = ice->set_mclk(ice, rate);
|
mclk_change = ice->set_mclk(ice, rate);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
|
||||||
|
|
||||||
if (mclk_change && ice->gpio.i2s_mclk_changed)
|
if (mclk_change && ice->gpio.i2s_mclk_changed)
|
||||||
ice->gpio.i2s_mclk_changed(ice);
|
ice->gpio.i2s_mclk_changed(ice);
|
||||||
if (ice->gpio.set_pro_rate)
|
if (ice->gpio.set_pro_rate)
|
||||||
|
|||||||
@@ -195,6 +195,26 @@ kci_test_route_get()
|
|||||||
echo "PASS: route get"
|
echo "PASS: route get"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kci_test_addrlft()
|
||||||
|
{
|
||||||
|
for i in $(seq 10 100) ;do
|
||||||
|
lft=$(((RANDOM%3) + 1))
|
||||||
|
ip addr add 10.23.11.$i/32 dev "$devdummy" preferred_lft $lft valid_lft $((lft+1))
|
||||||
|
check_err $?
|
||||||
|
done
|
||||||
|
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
ip addr show dev "$devdummy" | grep "10.23.11."
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "FAIL: preferred_lft addresses remaining"
|
||||||
|
check_err 1
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "PASS: preferred_lft addresses have expired"
|
||||||
|
}
|
||||||
|
|
||||||
kci_test_addrlabel()
|
kci_test_addrlabel()
|
||||||
{
|
{
|
||||||
ret=0
|
ret=0
|
||||||
@@ -245,6 +265,7 @@ kci_test_rtnl()
|
|||||||
|
|
||||||
kci_test_polrouting
|
kci_test_polrouting
|
||||||
kci_test_route_get
|
kci_test_route_get
|
||||||
|
kci_test_addrlft
|
||||||
kci_test_tc
|
kci_test_tc
|
||||||
kci_test_gre
|
kci_test_gre
|
||||||
kci_test_bridge
|
kci_test_bridge
|
||||||
|
|||||||
Reference in New Issue
Block a user