Linux 5.15-rc3
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAmFQ4UMeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGKU4H/A6ZUiVxCRmpGptk v99jNv51EZYMMSF5afVh9uYtk3LdIS3koSajpNA5SZzU9Zuf0C+z3fDmTYMRnMPt JyUz4CW6jIUbYlim10YuFTnfyOiYq6I54h71tbK6CS0rT/Rd42o8cpT4v0US0hjq cKmxBT8fdqBcpctwJmAx7mt9DBdTYVn9e/SK1p5A9SeF5239G7ZTrabCoN9vE08+ J/3zZzpvWA80zWj8P6/Unhnp6cFeguPQBCgDHi3Ou5i/LlK9yroA5czzyUySg6jP fRAMFUuTHpUJVbYl28ZnYF3XJMAHlEeixOodMApJWm9SGJui1WSLJzCpNzfrhgvn eyjhQRw= =4hOP -----END PGP SIGNATURE----- Merge tag 'v5.15-rc3' into 'android-mainline' Linux 5.15-rc3 Resolves merge issue with: drivers/scsi/ufs/ufshcd.c Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I1f712bc222c47c2229df00deeddaf5233c69034d
This commit is contained in:
commit
2de4b10131
@ -175,9 +175,10 @@ for IRQ numbers that are passed to struct device registrations. In that
|
||||
case the Linux IRQ numbers cannot be dynamically assigned and the legacy
|
||||
mapping should be used.
|
||||
|
||||
As the name implies, the *_legacy() functions are deprecated and only
|
||||
As the name implies, the \*_legacy() functions are deprecated and only
|
||||
exist to ease the support of ancient platforms. No new users should be
|
||||
added.
|
||||
added. Same goes for the \*_simple() functions when their use results
|
||||
in the legacy behaviour.
|
||||
|
||||
The legacy map assumes a contiguous range of IRQ numbers has already
|
||||
been allocated for the controller and that the IRQ number can be
|
||||
|
12
MAINTAINERS
12
MAINTAINERS
@ -16663,13 +16663,6 @@ M: Lubomir Rintel <lkundrak@v3.sk>
|
||||
S: Supported
|
||||
F: drivers/char/pcmcia/scr24x_cs.c
|
||||
|
||||
SCSI CDROM DRIVER
|
||||
M: Jens Axboe <axboe@kernel.dk>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://www.kernel.dk
|
||||
F: drivers/scsi/sr*
|
||||
|
||||
SCSI RDMA PROTOCOL (SRP) INITIATOR
|
||||
M: Bart Van Assche <bvanassche@acm.org>
|
||||
L: linux-rdma@vger.kernel.org
|
||||
@ -19301,13 +19294,12 @@ S: Maintained
|
||||
F: drivers/usb/misc/chaoskey.c
|
||||
|
||||
USB CYPRESS C67X00 DRIVER
|
||||
M: Peter Korsgaard <jacmet@sunsite.dk>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
F: drivers/usb/c67x00/
|
||||
|
||||
USB DAVICOM DM9601 DRIVER
|
||||
M: Peter Korsgaard <jacmet@sunsite.dk>
|
||||
M: Peter Korsgaard <peter@korsgaard.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://www.linux-usb.org/usbnet
|
||||
|
2
Makefile
2
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 15
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc3
|
||||
NAME = Opossums on Parade
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -487,7 +487,6 @@ dwc_0: dwc3@8a00000 {
|
||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&qusb_phy_0>, <&usb0_ssphy>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
tx-fifo-resize;
|
||||
snps,is-utmi-l1-suspend;
|
||||
snps,hird-threshold = /bits/ 8 <0x0>;
|
||||
snps,dis_u2_susphy_quirk;
|
||||
@ -528,7 +527,6 @@ dwc_1: dwc3@8c00000 {
|
||||
interrupts = <GIC_SPI 99 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&qusb_phy_1>, <&usb1_ssphy>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
tx-fifo-resize;
|
||||
snps,is-utmi-l1-suspend;
|
||||
snps,hird-threshold = /bits/ 8 <0x0>;
|
||||
snps,dis_u2_susphy_quirk;
|
||||
|
@ -34,7 +34,7 @@ typedef struct { unsigned long long pmd; } pmd_t;
|
||||
|
||||
static inline pmd_t *pud_pgtable(pud_t pud)
|
||||
{
|
||||
return (pmd_t *)pud_val(pud);
|
||||
return (pmd_t *)(unsigned long)pud_val(pud);
|
||||
}
|
||||
|
||||
/* only used by the stubbed out hugetlb gup code, should never be called */
|
||||
|
@ -2610,7 +2610,6 @@ config PCI_OLPC
|
||||
config PCI_XEN
|
||||
def_bool y
|
||||
depends on PCI && XEN
|
||||
select SWIOTLB_XEN
|
||||
|
||||
config MMCONF_FAM10H
|
||||
def_bool y
|
||||
|
@ -2,8 +2,6 @@
|
||||
#ifndef _ASM_X86_PKEYS_H
|
||||
#define _ASM_X86_PKEYS_H
|
||||
|
||||
#define ARCH_DEFAULT_PKEY 0
|
||||
|
||||
/*
|
||||
* If more than 16 keys are ever supported, a thorough audit
|
||||
* will be necessary to ensure that the types that store key
|
||||
|
@ -275,7 +275,7 @@ static inline int enqcmds(void __iomem *dst, const void *src)
|
||||
{
|
||||
const struct { char _[64]; } *__src = src;
|
||||
struct { char _[64]; } __iomem *__dst = dst;
|
||||
int zf;
|
||||
bool zf;
|
||||
|
||||
/*
|
||||
* ENQCMDS %(rdx), rax
|
||||
|
@ -3,14 +3,10 @@
|
||||
#define _ASM_X86_SWIOTLB_XEN_H
|
||||
|
||||
#ifdef CONFIG_SWIOTLB_XEN
|
||||
extern int xen_swiotlb;
|
||||
extern int __init pci_xen_swiotlb_detect(void);
|
||||
extern void __init pci_xen_swiotlb_init(void);
|
||||
extern int pci_xen_swiotlb_init_late(void);
|
||||
#else
|
||||
#define xen_swiotlb (0)
|
||||
static inline int __init pci_xen_swiotlb_detect(void) { return 0; }
|
||||
static inline void __init pci_xen_swiotlb_init(void) { }
|
||||
#define pci_xen_swiotlb_detect NULL
|
||||
static inline int pci_xen_swiotlb_init_late(void) { return -ENXIO; }
|
||||
#endif
|
||||
|
||||
|
@ -830,6 +830,20 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
x86_init.oem.arch_setup();
|
||||
|
||||
/*
|
||||
* Do some memory reservations *before* memory is added to memblock, so
|
||||
* memblock allocations won't overwrite it.
|
||||
*
|
||||
* After this point, everything still needed from the boot loader or
|
||||
* firmware or kernel text should be early reserved or marked not RAM in
|
||||
* e820. All other memory is free game.
|
||||
*
|
||||
* This call needs to happen before e820__memory_setup() which calls the
|
||||
* xen_memory_setup() on Xen dom0 which relies on the fact that those
|
||||
* early reservations have happened already.
|
||||
*/
|
||||
early_reserve_memory();
|
||||
|
||||
iomem_resource.end = (1ULL << boot_cpu_data.x86_phys_bits) - 1;
|
||||
e820__memory_setup();
|
||||
parse_setup_data();
|
||||
@ -876,18 +890,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
parse_early_param();
|
||||
|
||||
/*
|
||||
* Do some memory reservations *before* memory is added to
|
||||
* memblock, so memblock allocations won't overwrite it.
|
||||
* Do it after early param, so we could get (unlikely) panic from
|
||||
* serial.
|
||||
*
|
||||
* After this point everything still needed from the boot loader or
|
||||
* firmware or kernel text should be early reserved or marked not
|
||||
* RAM in e820. All other memory is free game.
|
||||
*/
|
||||
early_reserve_memory();
|
||||
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
/*
|
||||
* Memory used by the kernel cannot be hot-removed because Linux
|
||||
|
@ -37,10 +37,10 @@
|
||||
((insn)->next_byte + sizeof(t) + n <= (insn)->end_kaddr)
|
||||
|
||||
#define __get_next(t, insn) \
|
||||
({ t r = *(t*)insn->next_byte; insn->next_byte += sizeof(t); leXX_to_cpu(t, r); })
|
||||
({ t r; memcpy(&r, insn->next_byte, sizeof(t)); insn->next_byte += sizeof(t); leXX_to_cpu(t, r); })
|
||||
|
||||
#define __peek_nbyte_next(t, insn, n) \
|
||||
({ t r = *(t*)((insn)->next_byte + n); leXX_to_cpu(t, r); })
|
||||
({ t r; memcpy(&r, (insn)->next_byte + n, sizeof(t)); leXX_to_cpu(t, r); })
|
||||
|
||||
#define get_next(t, insn) \
|
||||
({ if (unlikely(!validate_next(t, insn, 0))) goto err_out; __get_next(t, insn); })
|
||||
|
@ -710,7 +710,8 @@ page_fault_oops(struct pt_regs *regs, unsigned long error_code,
|
||||
|
||||
static noinline void
|
||||
kernelmode_fixup_or_oops(struct pt_regs *regs, unsigned long error_code,
|
||||
unsigned long address, int signal, int si_code)
|
||||
unsigned long address, int signal, int si_code,
|
||||
u32 pkey)
|
||||
{
|
||||
WARN_ON_ONCE(user_mode(regs));
|
||||
|
||||
@ -735,8 +736,12 @@ kernelmode_fixup_or_oops(struct pt_regs *regs, unsigned long error_code,
|
||||
|
||||
set_signal_archinfo(address, error_code);
|
||||
|
||||
/* XXX: hwpoison faults will set the wrong code. */
|
||||
force_sig_fault(signal, si_code, (void __user *)address);
|
||||
if (si_code == SEGV_PKUERR) {
|
||||
force_sig_pkuerr((void __user *)address, pkey);
|
||||
} else {
|
||||
/* XXX: hwpoison faults will set the wrong code. */
|
||||
force_sig_fault(signal, si_code, (void __user *)address);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -798,7 +803,8 @@ __bad_area_nosemaphore(struct pt_regs *regs, unsigned long error_code,
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
if (!user_mode(regs)) {
|
||||
kernelmode_fixup_or_oops(regs, error_code, address, pkey, si_code);
|
||||
kernelmode_fixup_or_oops(regs, error_code, address,
|
||||
SIGSEGV, si_code, pkey);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -930,7 +936,8 @@ do_sigbus(struct pt_regs *regs, unsigned long error_code, unsigned long address,
|
||||
{
|
||||
/* Kernel mode? Handle exceptions or die: */
|
||||
if (!user_mode(regs)) {
|
||||
kernelmode_fixup_or_oops(regs, error_code, address, SIGBUS, BUS_ADRERR);
|
||||
kernelmode_fixup_or_oops(regs, error_code, address,
|
||||
SIGBUS, BUS_ADRERR, ARCH_DEFAULT_PKEY);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1396,7 +1403,8 @@ void do_user_addr_fault(struct pt_regs *regs,
|
||||
*/
|
||||
if (!user_mode(regs))
|
||||
kernelmode_fixup_or_oops(regs, error_code, address,
|
||||
SIGBUS, BUS_ADRERR);
|
||||
SIGBUS, BUS_ADRERR,
|
||||
ARCH_DEFAULT_PKEY);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1416,7 +1424,8 @@ void do_user_addr_fault(struct pt_regs *regs,
|
||||
return;
|
||||
|
||||
if (fatal_signal_pending(current) && !user_mode(regs)) {
|
||||
kernelmode_fixup_or_oops(regs, error_code, address, 0, 0);
|
||||
kernelmode_fixup_or_oops(regs, error_code, address,
|
||||
0, 0, ARCH_DEFAULT_PKEY);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1424,7 +1433,8 @@ void do_user_addr_fault(struct pt_regs *regs,
|
||||
/* Kernel mode? Handle exceptions or die: */
|
||||
if (!user_mode(regs)) {
|
||||
kernelmode_fixup_or_oops(regs, error_code, address,
|
||||
SIGSEGV, SEGV_MAPERR);
|
||||
SIGSEGV, SEGV_MAPERR,
|
||||
ARCH_DEFAULT_PKEY);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -755,8 +755,8 @@ static void xen_write_idt_entry(gate_desc *dt, int entrynum, const gate_desc *g)
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static void xen_convert_trap_info(const struct desc_ptr *desc,
|
||||
struct trap_info *traps)
|
||||
static unsigned xen_convert_trap_info(const struct desc_ptr *desc,
|
||||
struct trap_info *traps, bool full)
|
||||
{
|
||||
unsigned in, out, count;
|
||||
|
||||
@ -766,17 +766,18 @@ static void xen_convert_trap_info(const struct desc_ptr *desc,
|
||||
for (in = out = 0; in < count; in++) {
|
||||
gate_desc *entry = (gate_desc *)(desc->address) + in;
|
||||
|
||||
if (cvt_gate_to_trap(in, entry, &traps[out]))
|
||||
if (cvt_gate_to_trap(in, entry, &traps[out]) || full)
|
||||
out++;
|
||||
}
|
||||
traps[out].address = 0;
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
void xen_copy_trap_info(struct trap_info *traps)
|
||||
{
|
||||
const struct desc_ptr *desc = this_cpu_ptr(&idt_desc);
|
||||
|
||||
xen_convert_trap_info(desc, traps);
|
||||
xen_convert_trap_info(desc, traps, true);
|
||||
}
|
||||
|
||||
/* Load a new IDT into Xen. In principle this can be per-CPU, so we
|
||||
@ -786,6 +787,7 @@ static void xen_load_idt(const struct desc_ptr *desc)
|
||||
{
|
||||
static DEFINE_SPINLOCK(lock);
|
||||
static struct trap_info traps[257];
|
||||
unsigned out;
|
||||
|
||||
trace_xen_cpu_load_idt(desc);
|
||||
|
||||
@ -793,7 +795,8 @@ static void xen_load_idt(const struct desc_ptr *desc)
|
||||
|
||||
memcpy(this_cpu_ptr(&idt_desc), desc, sizeof(idt_desc));
|
||||
|
||||
xen_convert_trap_info(desc, traps);
|
||||
out = xen_convert_trap_info(desc, traps, false);
|
||||
memset(&traps[out], 0, sizeof(traps[0]));
|
||||
|
||||
xen_mc_flush();
|
||||
if (HYPERVISOR_set_trap_table(traps))
|
||||
|
@ -18,7 +18,7 @@
|
||||
#endif
|
||||
#include <linux/export.h>
|
||||
|
||||
int xen_swiotlb __read_mostly;
|
||||
static int xen_swiotlb __read_mostly;
|
||||
|
||||
/*
|
||||
* pci_xen_swiotlb_detect - set xen_swiotlb to 1 if necessary
|
||||
@ -56,7 +56,7 @@ int __init pci_xen_swiotlb_detect(void)
|
||||
return xen_swiotlb;
|
||||
}
|
||||
|
||||
void __init pci_xen_swiotlb_init(void)
|
||||
static void __init pci_xen_swiotlb_init(void)
|
||||
{
|
||||
if (xen_swiotlb) {
|
||||
xen_swiotlb_init_early();
|
||||
|
@ -290,8 +290,6 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle)
|
||||
|
||||
gdt = get_cpu_gdt_rw(cpu);
|
||||
|
||||
memset(&ctxt->fpu_ctxt, 0, sizeof(ctxt->fpu_ctxt));
|
||||
|
||||
/*
|
||||
* Bring up the CPU in cpu_bringup_and_idle() with the stack
|
||||
* pointing just below where pt_regs would be if it were a normal
|
||||
@ -308,8 +306,6 @@ cpu_initialize_context(unsigned int cpu, struct task_struct *idle)
|
||||
|
||||
xen_copy_trap_info(ctxt->trap_ctxt);
|
||||
|
||||
ctxt->ldt_ents = 0;
|
||||
|
||||
BUG_ON((unsigned long)gdt & ~PAGE_MASK);
|
||||
|
||||
gdt_mfn = arbitrary_virt_to_mfn(gdt);
|
||||
|
@ -1469,7 +1469,7 @@ void bio_endio(struct bio *bio)
|
||||
if (!bio_integrity_endio(bio))
|
||||
return;
|
||||
|
||||
if (bio->bi_bdev)
|
||||
if (bio->bi_bdev && bio_flagged(bio, BIO_TRACKED))
|
||||
rq_qos_done_bio(bio->bi_bdev->bd_disk->queue, bio);
|
||||
|
||||
if (bio->bi_bdev && bio_flagged(bio, BIO_TRACE_COMPLETION)) {
|
||||
|
23
block/bsg.c
23
block/bsg.c
@ -165,13 +165,20 @@ static const struct file_operations bsg_fops = {
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static void bsg_device_release(struct device *dev)
|
||||
{
|
||||
struct bsg_device *bd = container_of(dev, struct bsg_device, device);
|
||||
|
||||
ida_simple_remove(&bsg_minor_ida, MINOR(bd->device.devt));
|
||||
kfree(bd);
|
||||
}
|
||||
|
||||
void bsg_unregister_queue(struct bsg_device *bd)
|
||||
{
|
||||
if (bd->queue->kobj.sd)
|
||||
sysfs_remove_link(&bd->queue->kobj, "bsg");
|
||||
cdev_device_del(&bd->cdev, &bd->device);
|
||||
ida_simple_remove(&bsg_minor_ida, MINOR(bd->device.devt));
|
||||
kfree(bd);
|
||||
put_device(&bd->device);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bsg_unregister_queue);
|
||||
|
||||
@ -193,11 +200,13 @@ struct bsg_device *bsg_register_queue(struct request_queue *q,
|
||||
if (ret < 0) {
|
||||
if (ret == -ENOSPC)
|
||||
dev_err(parent, "bsg: too many bsg devices\n");
|
||||
goto out_kfree;
|
||||
kfree(bd);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
bd->device.devt = MKDEV(bsg_major, ret);
|
||||
bd->device.class = bsg_class;
|
||||
bd->device.parent = parent;
|
||||
bd->device.release = bsg_device_release;
|
||||
dev_set_name(&bd->device, "%s", name);
|
||||
device_initialize(&bd->device);
|
||||
|
||||
@ -205,7 +214,7 @@ struct bsg_device *bsg_register_queue(struct request_queue *q,
|
||||
bd->cdev.owner = THIS_MODULE;
|
||||
ret = cdev_device_add(&bd->cdev, &bd->device);
|
||||
if (ret)
|
||||
goto out_ida_remove;
|
||||
goto out_put_device;
|
||||
|
||||
if (q->kobj.sd) {
|
||||
ret = sysfs_create_link(&q->kobj, &bd->device.kobj, "bsg");
|
||||
@ -217,10 +226,8 @@ struct bsg_device *bsg_register_queue(struct request_queue *q,
|
||||
|
||||
out_device_del:
|
||||
cdev_device_del(&bd->cdev, &bd->device);
|
||||
out_ida_remove:
|
||||
ida_simple_remove(&bsg_minor_ida, MINOR(bd->device.devt));
|
||||
out_kfree:
|
||||
kfree(bd);
|
||||
out_put_device:
|
||||
put_device(&bd->device);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bsg_register_queue);
|
||||
|
21
block/fops.c
21
block/fops.c
@ -14,6 +14,7 @@
|
||||
#include <linux/task_io_accounting_ops.h>
|
||||
#include <linux/falloc.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/fs.h>
|
||||
#include "blk.h"
|
||||
|
||||
static struct inode *bdev_file_inode(struct file *file)
|
||||
@ -553,7 +554,8 @@ static ssize_t blkdev_read_iter(struct kiocb *iocb, struct iov_iter *to)
|
||||
static long blkdev_fallocate(struct file *file, int mode, loff_t start,
|
||||
loff_t len)
|
||||
{
|
||||
struct block_device *bdev = I_BDEV(bdev_file_inode(file));
|
||||
struct inode *inode = bdev_file_inode(file);
|
||||
struct block_device *bdev = I_BDEV(inode);
|
||||
loff_t end = start + len - 1;
|
||||
loff_t isize;
|
||||
int error;
|
||||
@ -580,10 +582,12 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
|
||||
if ((start | len) & (bdev_logical_block_size(bdev) - 1))
|
||||
return -EINVAL;
|
||||
|
||||
filemap_invalidate_lock(inode->i_mapping);
|
||||
|
||||
/* Invalidate the page cache, including dirty pages. */
|
||||
error = truncate_bdev_range(bdev, file->f_mode, start, end);
|
||||
if (error)
|
||||
return error;
|
||||
goto fail;
|
||||
|
||||
switch (mode) {
|
||||
case FALLOC_FL_ZERO_RANGE:
|
||||
@ -600,17 +604,12 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
|
||||
GFP_KERNEL, 0);
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
error = -EOPNOTSUPP;
|
||||
}
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/*
|
||||
* Invalidate the page cache again; if someone wandered in and dirtied
|
||||
* a page, we just discard it - userspace has no way of knowing whether
|
||||
* the write happened before or after discard completing...
|
||||
*/
|
||||
return truncate_bdev_range(bdev, file->f_mode, start, end);
|
||||
fail:
|
||||
filemap_invalidate_unlock(inode->i_mapping);
|
||||
return error;
|
||||
}
|
||||
|
||||
const struct file_operations def_blk_fops = {
|
||||
|
@ -1986,6 +1986,7 @@ static void binder_deferred_fd_close(int fd)
|
||||
}
|
||||
|
||||
static void binder_transaction_buffer_release(struct binder_proc *proc,
|
||||
struct binder_thread *thread,
|
||||
struct binder_buffer *buffer,
|
||||
binder_size_t failed_at,
|
||||
bool is_failure)
|
||||
@ -2145,8 +2146,16 @@ static void binder_transaction_buffer_release(struct binder_proc *proc,
|
||||
&proc->alloc, &fd, buffer,
|
||||
offset, sizeof(fd));
|
||||
WARN_ON(err);
|
||||
if (!err)
|
||||
if (!err) {
|
||||
binder_deferred_fd_close(fd);
|
||||
/*
|
||||
* Need to make sure the thread goes
|
||||
* back to userspace to complete the
|
||||
* deferred close
|
||||
*/
|
||||
if (thread)
|
||||
thread->looper_need_return = true;
|
||||
}
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
@ -3187,9 +3196,8 @@ static void binder_transaction(struct binder_proc *proc,
|
||||
if (reply) {
|
||||
binder_enqueue_thread_work(thread, tcomplete);
|
||||
binder_inner_proc_lock(target_proc);
|
||||
if (target_thread->is_dead || target_proc->is_frozen) {
|
||||
return_error = target_thread->is_dead ?
|
||||
BR_DEAD_REPLY : BR_FROZEN_REPLY;
|
||||
if (target_thread->is_dead) {
|
||||
return_error = BR_DEAD_REPLY;
|
||||
binder_inner_proc_unlock(target_proc);
|
||||
goto err_dead_proc_or_thread;
|
||||
}
|
||||
@ -3256,7 +3264,7 @@ static void binder_transaction(struct binder_proc *proc,
|
||||
err_copy_data_failed:
|
||||
binder_free_txn_fixups(t);
|
||||
trace_binder_transaction_failed_buffer_release(t->buffer);
|
||||
binder_transaction_buffer_release(target_proc, t->buffer,
|
||||
binder_transaction_buffer_release(target_proc, NULL, t->buffer,
|
||||
buffer_offset, true);
|
||||
if (target_node)
|
||||
binder_dec_node_tmpref(target_node);
|
||||
@ -3337,7 +3345,9 @@ static void binder_transaction(struct binder_proc *proc,
|
||||
* Cleanup buffer and free it.
|
||||
*/
|
||||
static void
|
||||
binder_free_buf(struct binder_proc *proc, struct binder_buffer *buffer)
|
||||
binder_free_buf(struct binder_proc *proc,
|
||||
struct binder_thread *thread,
|
||||
struct binder_buffer *buffer)
|
||||
{
|
||||
binder_inner_proc_lock(proc);
|
||||
if (buffer->transaction) {
|
||||
@ -3365,7 +3375,7 @@ binder_free_buf(struct binder_proc *proc, struct binder_buffer *buffer)
|
||||
binder_node_inner_unlock(buf_node);
|
||||
}
|
||||
trace_binder_transaction_buffer_release(buffer);
|
||||
binder_transaction_buffer_release(proc, buffer, 0, false);
|
||||
binder_transaction_buffer_release(proc, thread, buffer, 0, false);
|
||||
binder_alloc_free_buf(&proc->alloc, buffer);
|
||||
}
|
||||
|
||||
@ -3567,7 +3577,7 @@ static int binder_thread_write(struct binder_proc *proc,
|
||||
proc->pid, thread->pid, (u64)data_ptr,
|
||||
buffer->debug_id,
|
||||
buffer->transaction ? "active" : "finished");
|
||||
binder_free_buf(proc, buffer);
|
||||
binder_free_buf(proc, thread, buffer);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -4259,7 +4269,7 @@ static int binder_thread_read(struct binder_proc *proc,
|
||||
buffer->transaction = NULL;
|
||||
binder_cleanup_transaction(t, "fd fixups failed",
|
||||
BR_FAILED_REPLY);
|
||||
binder_free_buf(proc, buffer);
|
||||
binder_free_buf(proc, thread, buffer);
|
||||
binder_debug(BINDER_DEBUG_FAILED_TRANSACTION,
|
||||
"%d:%d %stransaction %d fd fixups failed %d/%d, line %d\n",
|
||||
proc->pid, thread->pid,
|
||||
@ -4803,6 +4813,22 @@ static int binder_ioctl_get_node_debug_info(struct binder_proc *proc,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool binder_txns_pending_ilocked(struct binder_proc *proc)
|
||||
{
|
||||
struct rb_node *n;
|
||||
struct binder_thread *thread;
|
||||
|
||||
if (proc->outstanding_txns > 0)
|
||||
return true;
|
||||
|
||||
for (n = rb_first(&proc->threads); n; n = rb_next(n)) {
|
||||
thread = rb_entry(n, struct binder_thread, rb_node);
|
||||
if (thread->transaction_stack)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int binder_ioctl_freeze(struct binder_freeze_info *info,
|
||||
struct binder_proc *target_proc)
|
||||
{
|
||||
@ -4834,8 +4860,13 @@ static int binder_ioctl_freeze(struct binder_freeze_info *info,
|
||||
(!target_proc->outstanding_txns),
|
||||
msecs_to_jiffies(info->timeout_ms));
|
||||
|
||||
if (!ret && target_proc->outstanding_txns)
|
||||
ret = -EAGAIN;
|
||||
/* Check pending transactions that wait for reply */
|
||||
if (ret >= 0) {
|
||||
binder_inner_proc_lock(target_proc);
|
||||
if (binder_txns_pending_ilocked(target_proc))
|
||||
ret = -EAGAIN;
|
||||
binder_inner_proc_unlock(target_proc);
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
binder_inner_proc_lock(target_proc);
|
||||
@ -4851,6 +4882,7 @@ static int binder_ioctl_get_freezer_info(
|
||||
{
|
||||
struct binder_proc *target_proc;
|
||||
bool found = false;
|
||||
__u32 txns_pending;
|
||||
|
||||
info->sync_recv = 0;
|
||||
info->async_recv = 0;
|
||||
@ -4860,7 +4892,9 @@ static int binder_ioctl_get_freezer_info(
|
||||
if (target_proc->pid == info->pid) {
|
||||
found = true;
|
||||
binder_inner_proc_lock(target_proc);
|
||||
info->sync_recv |= target_proc->sync_recv;
|
||||
txns_pending = binder_txns_pending_ilocked(target_proc);
|
||||
info->sync_recv |= target_proc->sync_recv |
|
||||
(txns_pending << 1);
|
||||
info->async_recv |= target_proc->async_recv;
|
||||
binder_inner_proc_unlock(target_proc);
|
||||
}
|
||||
|
@ -399,6 +399,8 @@ struct binder_priority {
|
||||
* binder transactions
|
||||
* (protected by @inner_lock)
|
||||
* @sync_recv: process received sync transactions since last frozen
|
||||
* bit 0: received sync transaction after being frozen
|
||||
* bit 1: new pending sync transaction during freezing
|
||||
* (protected by @inner_lock)
|
||||
* @async_recv: process received async transactions since last frozen
|
||||
* (protected by @inner_lock)
|
||||
|
@ -3090,6 +3090,7 @@ static int compat_insnlist(struct file *file, unsigned long arg)
|
||||
mutex_lock(&dev->mutex);
|
||||
rc = do_insnlist_ioctl(dev, insns, insnlist32.n_insns, file);
|
||||
mutex_unlock(&dev->mutex);
|
||||
kfree(insns);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -464,7 +464,7 @@ static void dmc520_init_csrow(struct mem_ctl_info *mci)
|
||||
dimm->grain = pvt->mem_width_in_bytes;
|
||||
dimm->dtype = dt;
|
||||
dimm->mtype = mt;
|
||||
dimm->edac_mode = EDAC_FLAG_SECDED;
|
||||
dimm->edac_mode = EDAC_SECDED;
|
||||
dimm->nr_pages = pages_per_rank / csi->nr_channels;
|
||||
}
|
||||
}
|
||||
|
@ -782,7 +782,7 @@ static void init_csrows(struct mem_ctl_info *mci)
|
||||
|
||||
for (j = 0; j < csi->nr_channels; j++) {
|
||||
dimm = csi->channels[j]->dimm;
|
||||
dimm->edac_mode = EDAC_FLAG_SECDED;
|
||||
dimm->edac_mode = EDAC_SECDED;
|
||||
dimm->mtype = p_data->get_mtype(priv->baseaddr);
|
||||
dimm->nr_pages = (size >> PAGE_SHIFT) / csi->nr_channels;
|
||||
dimm->grain = SYNPS_EDAC_ERR_GRAIN;
|
||||
|
@ -1019,16 +1019,18 @@ create_feature_instance(struct build_feature_devs_info *binfo,
|
||||
{
|
||||
unsigned int irq_base, nr_irqs;
|
||||
struct dfl_feature_info *finfo;
|
||||
u8 revision = 0;
|
||||
int ret;
|
||||
u8 revision;
|
||||
u64 v;
|
||||
|
||||
v = readq(binfo->ioaddr + ofst);
|
||||
revision = FIELD_GET(DFH_REVISION, v);
|
||||
if (fid != FEATURE_ID_AFU) {
|
||||
v = readq(binfo->ioaddr + ofst);
|
||||
revision = FIELD_GET(DFH_REVISION, v);
|
||||
|
||||
/* read feature size and id if inputs are invalid */
|
||||
size = size ? size : feature_size(v);
|
||||
fid = fid ? fid : feature_id(v);
|
||||
/* read feature size and id if inputs are invalid */
|
||||
size = size ? size : feature_size(v);
|
||||
fid = fid ? fid : feature_id(v);
|
||||
}
|
||||
|
||||
if (binfo->len - ofst < size)
|
||||
return -EINVAL;
|
||||
|
@ -225,8 +225,10 @@ static int machxo2_write_init(struct fpga_manager *mgr,
|
||||
goto fail;
|
||||
|
||||
get_status(spi, &status);
|
||||
if (test_bit(FAIL, &status))
|
||||
if (test_bit(FAIL, &status)) {
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
dump_status_reg(&status);
|
||||
|
||||
spi_message_init(&msg);
|
||||
@ -313,6 +315,7 @@ static int machxo2_write_complete(struct fpga_manager *mgr,
|
||||
dump_status_reg(&status);
|
||||
if (!test_bit(DONE, &status)) {
|
||||
machxo2_cleanup(mgr);
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@ -335,6 +338,7 @@ static int machxo2_write_complete(struct fpga_manager *mgr,
|
||||
break;
|
||||
if (++refreshloop == MACHXO2_MAX_REFRESH_LOOP) {
|
||||
machxo2_cleanup(mgr);
|
||||
ret = -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
} while (1);
|
||||
|
@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "coresight-config.h"
|
||||
#include "coresight-etm-perf.h"
|
||||
|
@ -410,6 +410,7 @@ config MESON_IRQ_GPIO
|
||||
config GOLDFISH_PIC
|
||||
bool "Goldfish programmable interrupt controller"
|
||||
depends on MIPS && (GOLDFISH || COMPILE_TEST)
|
||||
select GENERIC_IRQ_CHIP
|
||||
select IRQ_DOMAIN
|
||||
help
|
||||
Say yes here to enable Goldfish interrupt controller driver used
|
||||
|
@ -359,16 +359,16 @@ static void armada_370_xp_ipi_send_mask(struct irq_data *d,
|
||||
ARMADA_370_XP_SW_TRIG_INT_OFFS);
|
||||
}
|
||||
|
||||
static void armada_370_xp_ipi_eoi(struct irq_data *d)
|
||||
static void armada_370_xp_ipi_ack(struct irq_data *d)
|
||||
{
|
||||
writel(~BIT(d->hwirq), per_cpu_int_base + ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS);
|
||||
}
|
||||
|
||||
static struct irq_chip ipi_irqchip = {
|
||||
.name = "IPI",
|
||||
.irq_ack = armada_370_xp_ipi_ack,
|
||||
.irq_mask = armada_370_xp_ipi_mask,
|
||||
.irq_unmask = armada_370_xp_ipi_unmask,
|
||||
.irq_eoi = armada_370_xp_ipi_eoi,
|
||||
.ipi_send_mask = armada_370_xp_ipi_send_mask,
|
||||
};
|
||||
|
||||
|
@ -4501,7 +4501,7 @@ static int its_vpe_irq_domain_alloc(struct irq_domain *domain, unsigned int virq
|
||||
|
||||
if (err) {
|
||||
if (i > 0)
|
||||
its_vpe_irq_domain_free(domain, virq, i - 1);
|
||||
its_vpe_irq_domain_free(domain, virq, i);
|
||||
|
||||
its_lpi_free(bitmap, base, nr_ids);
|
||||
its_free_prop_table(vprop_page);
|
||||
|
@ -107,6 +107,8 @@ static DEFINE_RAW_SPINLOCK(cpu_map_lock);
|
||||
|
||||
#endif
|
||||
|
||||
static DEFINE_STATIC_KEY_FALSE(needs_rmw_access);
|
||||
|
||||
/*
|
||||
* The GIC mapping of CPU interfaces does not necessarily match
|
||||
* the logical CPU numbering. Let's use a mapping as returned
|
||||
@ -774,6 +776,25 @@ static int gic_pm_init(struct gic_chip_data *gic)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void rmw_writeb(u8 bval, void __iomem *addr)
|
||||
{
|
||||
static DEFINE_RAW_SPINLOCK(rmw_lock);
|
||||
unsigned long offset = (unsigned long)addr & 3UL;
|
||||
unsigned long shift = offset * 8;
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
|
||||
raw_spin_lock_irqsave(&rmw_lock, flags);
|
||||
|
||||
addr -= offset;
|
||||
val = readl_relaxed(addr);
|
||||
val &= ~GENMASK(shift + 7, shift);
|
||||
val |= bval << shift;
|
||||
writel_relaxed(val, addr);
|
||||
|
||||
raw_spin_unlock_irqrestore(&rmw_lock, flags);
|
||||
}
|
||||
|
||||
static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
|
||||
bool force)
|
||||
{
|
||||
@ -788,7 +809,10 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
|
||||
if (cpu >= NR_GIC_CPU_IF || cpu >= nr_cpu_ids)
|
||||
return -EINVAL;
|
||||
|
||||
writeb_relaxed(gic_cpu_map[cpu], reg);
|
||||
if (static_branch_unlikely(&needs_rmw_access))
|
||||
rmw_writeb(gic_cpu_map[cpu], reg);
|
||||
else
|
||||
writeb_relaxed(gic_cpu_map[cpu], reg);
|
||||
irq_data_update_effective_affinity(d, cpumask_of(cpu));
|
||||
|
||||
return IRQ_SET_MASK_OK_DONE;
|
||||
@ -1375,6 +1399,30 @@ static bool gic_check_eoimode(struct device_node *node, void __iomem **base)
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool gic_enable_rmw_access(void *data)
|
||||
{
|
||||
/*
|
||||
* The EMEV2 class of machines has a broken interconnect, and
|
||||
* locks up on accesses that are less than 32bit. So far, only
|
||||
* the affinity setting requires it.
|
||||
*/
|
||||
if (of_machine_is_compatible("renesas,emev2")) {
|
||||
static_branch_enable(&needs_rmw_access);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static const struct gic_quirk gic_quirks[] = {
|
||||
{
|
||||
.desc = "broken byte access",
|
||||
.compatible = "arm,pl390",
|
||||
.init = gic_enable_rmw_access,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static int gic_of_setup(struct gic_chip_data *gic, struct device_node *node)
|
||||
{
|
||||
if (!gic || !node)
|
||||
@ -1391,6 +1439,8 @@ static int gic_of_setup(struct gic_chip_data *gic, struct device_node *node)
|
||||
if (of_property_read_u32(node, "cpu-offset", &gic->percpu_offset))
|
||||
gic->percpu_offset = 0;
|
||||
|
||||
gic_enable_of_quirks(node, gic_quirks, gic);
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
|
@ -25,7 +25,7 @@
|
||||
/* The maximum IRQ pin number of mbigen chip(start from 0) */
|
||||
#define MAXIMUM_IRQ_PIN_NUM 1407
|
||||
|
||||
/**
|
||||
/*
|
||||
* In mbigen vector register
|
||||
* bit[21:12]: event id value
|
||||
* bit[11:0]: device id
|
||||
@ -39,14 +39,14 @@
|
||||
/* offset of vector register in mbigen node */
|
||||
#define REG_MBIGEN_VEC_OFFSET 0x200
|
||||
|
||||
/**
|
||||
/*
|
||||
* offset of clear register in mbigen node
|
||||
* This register is used to clear the status
|
||||
* of interrupt
|
||||
*/
|
||||
#define REG_MBIGEN_CLEAR_OFFSET 0xa000
|
||||
|
||||
/**
|
||||
/*
|
||||
* offset of interrupt type register
|
||||
* This register is used to configure interrupt
|
||||
* trigger type
|
||||
|
@ -223,12 +223,12 @@ static int rza1_irqc_probe(struct platform_device *pdev)
|
||||
goto out_put_node;
|
||||
}
|
||||
|
||||
priv->chip.name = "rza1-irqc",
|
||||
priv->chip.irq_mask = irq_chip_mask_parent,
|
||||
priv->chip.irq_unmask = irq_chip_unmask_parent,
|
||||
priv->chip.irq_eoi = rza1_irqc_eoi,
|
||||
priv->chip.irq_retrigger = irq_chip_retrigger_hierarchy,
|
||||
priv->chip.irq_set_type = rza1_irqc_set_type,
|
||||
priv->chip.name = "rza1-irqc";
|
||||
priv->chip.irq_mask = irq_chip_mask_parent;
|
||||
priv->chip.irq_unmask = irq_chip_unmask_parent;
|
||||
priv->chip.irq_eoi = rza1_irqc_eoi;
|
||||
priv->chip.irq_retrigger = irq_chip_retrigger_hierarchy;
|
||||
priv->chip.irq_set_type = rza1_irqc_set_type;
|
||||
priv->chip.flags = IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE;
|
||||
|
||||
priv->irq_domain = irq_domain_add_hierarchy(parent, 0, IRQC_NUM_IRQ,
|
||||
|
@ -275,8 +275,8 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)
|
||||
|
||||
bus_nr = ida_simple_get(&mcb_ida, 0, 0, GFP_KERNEL);
|
||||
if (bus_nr < 0) {
|
||||
rc = bus_nr;
|
||||
goto err_free;
|
||||
kfree(bus);
|
||||
return ERR_PTR(bus_nr);
|
||||
}
|
||||
|
||||
bus->bus_nr = bus_nr;
|
||||
@ -291,12 +291,12 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)
|
||||
dev_set_name(&bus->dev, "mcb:%d", bus_nr);
|
||||
rc = device_add(&bus->dev);
|
||||
if (rc)
|
||||
goto err_free;
|
||||
goto err_put;
|
||||
|
||||
return bus;
|
||||
err_free:
|
||||
put_device(carrier);
|
||||
kfree(bus);
|
||||
|
||||
err_put:
|
||||
put_device(&bus->dev);
|
||||
return ERR_PTR(rc);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(mcb_alloc_bus, MCB);
|
||||
|
@ -5700,10 +5700,6 @@ static int md_alloc(dev_t dev, char *name)
|
||||
disk->flags |= GENHD_FL_EXT_DEVT;
|
||||
disk->events |= DISK_EVENT_MEDIA_CHANGE;
|
||||
mddev->gendisk = disk;
|
||||
/* As soon as we call add_disk(), another thread could get
|
||||
* through to md_open, so make sure it doesn't get too far
|
||||
*/
|
||||
mutex_lock(&mddev->open_mutex);
|
||||
add_disk(disk);
|
||||
|
||||
error = kobject_add(&mddev->kobj, &disk_to_dev(disk)->kobj, "%s", "md");
|
||||
@ -5718,7 +5714,6 @@ static int md_alloc(dev_t dev, char *name)
|
||||
if (mddev->kobj.sd &&
|
||||
sysfs_create_group(&mddev->kobj, &md_bitmap_group))
|
||||
pr_debug("pointless warning\n");
|
||||
mutex_unlock(&mddev->open_mutex);
|
||||
abort:
|
||||
mutex_unlock(&disks_mutex);
|
||||
if (!error && mddev->kobj.sd) {
|
||||
|
@ -267,13 +267,13 @@ int bcm_vk_tty_init(struct bcm_vk *vk, char *name)
|
||||
struct device *tty_dev;
|
||||
|
||||
tty_port_init(&vk->tty[i].port);
|
||||
tty_dev = tty_port_register_device(&vk->tty[i].port, tty_drv,
|
||||
i, dev);
|
||||
tty_dev = tty_port_register_device_attr(&vk->tty[i].port,
|
||||
tty_drv, i, dev, vk,
|
||||
NULL);
|
||||
if (IS_ERR(tty_dev)) {
|
||||
err = PTR_ERR(tty_dev);
|
||||
goto unwind;
|
||||
}
|
||||
dev_set_drvdata(tty_dev, vk);
|
||||
vk->tty[i].is_opened = false;
|
||||
}
|
||||
|
||||
|
@ -1090,7 +1090,7 @@ static int genwqe_pci_setup(struct genwqe_dev *cd)
|
||||
|
||||
/* check for 64-bit DMA address supported (DAC) */
|
||||
/* check for 32-bit DMA address supported (SAC) */
|
||||
if (dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64)) ||
|
||||
if (dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64)) &&
|
||||
dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32))) {
|
||||
dev_err(&pci_dev->dev,
|
||||
"err: neither DMA32 nor DMA64 supported\n");
|
||||
|
@ -405,7 +405,7 @@ static void staged_cs_put(struct hl_device *hdev, struct hl_cs *cs)
|
||||
static void cs_handle_tdr(struct hl_device *hdev, struct hl_cs *cs)
|
||||
{
|
||||
bool next_entry_found = false;
|
||||
struct hl_cs *next;
|
||||
struct hl_cs *next, *first_cs;
|
||||
|
||||
if (!cs_needs_timeout(cs))
|
||||
return;
|
||||
@ -415,9 +415,16 @@ static void cs_handle_tdr(struct hl_device *hdev, struct hl_cs *cs)
|
||||
/* We need to handle tdr only once for the complete staged submission.
|
||||
* Hence, we choose the CS that reaches this function first which is
|
||||
* the CS marked as 'staged_last'.
|
||||
* In case single staged cs was submitted which has both first and last
|
||||
* indications, then "cs_find_first" below will return NULL, since we
|
||||
* removed the cs node from the list before getting here,
|
||||
* in such cases just continue with the cs to cancel it's TDR work.
|
||||
*/
|
||||
if (cs->staged_cs && cs->staged_last)
|
||||
cs = hl_staged_cs_find_first(hdev, cs->staged_sequence);
|
||||
if (cs->staged_cs && cs->staged_last) {
|
||||
first_cs = hl_staged_cs_find_first(hdev, cs->staged_sequence);
|
||||
if (first_cs)
|
||||
cs = first_cs;
|
||||
}
|
||||
|
||||
spin_unlock(&hdev->cs_mirror_lock);
|
||||
|
||||
@ -1288,6 +1295,12 @@ static int cs_ioctl_default(struct hl_fpriv *hpriv, void __user *chunks,
|
||||
if (rc)
|
||||
goto free_cs_object;
|
||||
|
||||
/* If this is a staged submission we must return the staged sequence
|
||||
* rather than the internal CS sequence
|
||||
*/
|
||||
if (cs->staged_cs)
|
||||
*cs_seq = cs->staged_sequence;
|
||||
|
||||
/* Validate ALL the CS chunks before submitting the CS */
|
||||
for (i = 0 ; i < num_chunks ; i++) {
|
||||
struct hl_cs_chunk *chunk = &cs_chunk_array[i];
|
||||
@ -1988,6 +2001,15 @@ static int cs_ioctl_signal_wait(struct hl_fpriv *hpriv, enum hl_cs_type cs_type,
|
||||
goto free_cs_chunk_array;
|
||||
}
|
||||
|
||||
if (!hdev->nic_ports_mask) {
|
||||
atomic64_inc(&ctx->cs_counters.validation_drop_cnt);
|
||||
atomic64_inc(&cntr->validation_drop_cnt);
|
||||
dev_err(hdev->dev,
|
||||
"Collective operations not supported when NIC ports are disabled");
|
||||
rc = -EINVAL;
|
||||
goto free_cs_chunk_array;
|
||||
}
|
||||
|
||||
collective_engine_id = chunk->collective_engine_id;
|
||||
}
|
||||
|
||||
@ -2026,9 +2048,10 @@ static int cs_ioctl_signal_wait(struct hl_fpriv *hpriv, enum hl_cs_type cs_type,
|
||||
spin_unlock(&ctx->sig_mgr.lock);
|
||||
|
||||
if (!handle_found) {
|
||||
dev_err(hdev->dev, "Cannot find encapsulated signals handle for seq 0x%llx\n",
|
||||
/* treat as signal CS already finished */
|
||||
dev_dbg(hdev->dev, "Cannot find encapsulated signals handle for seq 0x%llx\n",
|
||||
signal_seq);
|
||||
rc = -EINVAL;
|
||||
rc = 0;
|
||||
goto free_cs_chunk_array;
|
||||
}
|
||||
|
||||
@ -2613,7 +2636,8 @@ static int hl_multi_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data)
|
||||
* completed after the poll function.
|
||||
*/
|
||||
if (!mcs_data.completion_bitmap) {
|
||||
dev_err(hdev->dev, "Multi-CS got completion on wait but no CS completed\n");
|
||||
dev_warn_ratelimited(hdev->dev,
|
||||
"Multi-CS got completion on wait but no CS completed\n");
|
||||
rc = -EFAULT;
|
||||
}
|
||||
}
|
||||
@ -2740,10 +2764,20 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
|
||||
else
|
||||
interrupt = &hdev->user_interrupt[interrupt_offset];
|
||||
|
||||
/* Add pending user interrupt to relevant list for the interrupt
|
||||
* handler to monitor
|
||||
*/
|
||||
spin_lock_irqsave(&interrupt->wait_list_lock, flags);
|
||||
list_add_tail(&pend->wait_list_node, &interrupt->wait_list_head);
|
||||
spin_unlock_irqrestore(&interrupt->wait_list_lock, flags);
|
||||
|
||||
/* We check for completion value as interrupt could have been received
|
||||
* before we added the node to the wait list
|
||||
*/
|
||||
if (copy_from_user(&completion_value, u64_to_user_ptr(user_address), 4)) {
|
||||
dev_err(hdev->dev, "Failed to copy completion value from user\n");
|
||||
rc = -EFAULT;
|
||||
goto free_fence;
|
||||
goto remove_pending_user_interrupt;
|
||||
}
|
||||
|
||||
if (completion_value >= target_value)
|
||||
@ -2752,14 +2786,7 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
|
||||
*status = CS_WAIT_STATUS_BUSY;
|
||||
|
||||
if (!timeout_us || (*status == CS_WAIT_STATUS_COMPLETED))
|
||||
goto free_fence;
|
||||
|
||||
/* Add pending user interrupt to relevant list for the interrupt
|
||||
* handler to monitor
|
||||
*/
|
||||
spin_lock_irqsave(&interrupt->wait_list_lock, flags);
|
||||
list_add_tail(&pend->wait_list_node, &interrupt->wait_list_head);
|
||||
spin_unlock_irqrestore(&interrupt->wait_list_lock, flags);
|
||||
goto remove_pending_user_interrupt;
|
||||
|
||||
wait_again:
|
||||
/* Wait for interrupt handler to signal completion */
|
||||
@ -2770,6 +2797,15 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
|
||||
* If comparison fails, keep waiting until timeout expires
|
||||
*/
|
||||
if (completion_rc > 0) {
|
||||
spin_lock_irqsave(&interrupt->wait_list_lock, flags);
|
||||
/* reinit_completion must be called before we check for user
|
||||
* completion value, otherwise, if interrupt is received after
|
||||
* the comparison and before the next wait_for_completion,
|
||||
* we will reach timeout and fail
|
||||
*/
|
||||
reinit_completion(&pend->fence.completion);
|
||||
spin_unlock_irqrestore(&interrupt->wait_list_lock, flags);
|
||||
|
||||
if (copy_from_user(&completion_value, u64_to_user_ptr(user_address), 4)) {
|
||||
dev_err(hdev->dev, "Failed to copy completion value from user\n");
|
||||
rc = -EFAULT;
|
||||
@ -2780,11 +2816,7 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
|
||||
if (completion_value >= target_value) {
|
||||
*status = CS_WAIT_STATUS_COMPLETED;
|
||||
} else {
|
||||
spin_lock_irqsave(&interrupt->wait_list_lock, flags);
|
||||
reinit_completion(&pend->fence.completion);
|
||||
timeout = completion_rc;
|
||||
|
||||
spin_unlock_irqrestore(&interrupt->wait_list_lock, flags);
|
||||
goto wait_again;
|
||||
}
|
||||
} else if (completion_rc == -ERESTARTSYS) {
|
||||
@ -2802,7 +2834,6 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
|
||||
list_del(&pend->wait_list_node);
|
||||
spin_unlock_irqrestore(&interrupt->wait_list_lock, flags);
|
||||
|
||||
free_fence:
|
||||
kfree(pend);
|
||||
hl_ctx_put(ctx);
|
||||
|
||||
|
@ -437,6 +437,7 @@ void hl_hw_queue_encaps_sig_set_sob_info(struct hl_device *hdev,
|
||||
struct hl_cs_compl *cs_cmpl)
|
||||
{
|
||||
struct hl_cs_encaps_sig_handle *handle = cs->encaps_sig_hdl;
|
||||
u32 offset = 0;
|
||||
|
||||
cs_cmpl->hw_sob = handle->hw_sob;
|
||||
|
||||
@ -446,9 +447,13 @@ void hl_hw_queue_encaps_sig_set_sob_info(struct hl_device *hdev,
|
||||
* set offset 1 for example he mean to wait only for the first
|
||||
* signal only, which will be pre_sob_val, and if he set offset 2
|
||||
* then the value required is (pre_sob_val + 1) and so on...
|
||||
* if user set wait offset to 0, then treat it as legacy wait cs,
|
||||
* wait for the next signal.
|
||||
*/
|
||||
cs_cmpl->sob_val = handle->pre_sob_val +
|
||||
(job->encaps_sig_wait_offset - 1);
|
||||
if (job->encaps_sig_wait_offset)
|
||||
offset = job->encaps_sig_wait_offset - 1;
|
||||
|
||||
cs_cmpl->sob_val = handle->pre_sob_val + offset;
|
||||
}
|
||||
|
||||
static int init_wait_cs(struct hl_device *hdev, struct hl_cs *cs,
|
||||
|
@ -395,7 +395,7 @@ static struct hl_hw_obj_name_entry gaudi_so_id_to_str[] = {
|
||||
|
||||
static struct hl_hw_obj_name_entry gaudi_monitor_id_to_str[] = {
|
||||
{ .id = 200, .name = "MON_OBJ_DMA_DOWN_FEEDBACK_RESET" },
|
||||
{ .id = 201, .name = "MON_OBJ_DMA_UP_FEADBACK_RESET" },
|
||||
{ .id = 201, .name = "MON_OBJ_DMA_UP_FEEDBACK_RESET" },
|
||||
{ .id = 203, .name = "MON_OBJ_DRAM_TO_SRAM_QUEUE_FENCE" },
|
||||
{ .id = 204, .name = "MON_OBJ_TPC_0_CLK_GATE" },
|
||||
{ .id = 205, .name = "MON_OBJ_TPC_1_CLK_GATE" },
|
||||
@ -5802,6 +5802,7 @@ static void gaudi_add_end_of_cb_packets(struct hl_device *hdev,
|
||||
{
|
||||
struct gaudi_device *gaudi = hdev->asic_specific;
|
||||
struct packet_msg_prot *cq_pkt;
|
||||
u64 msi_addr;
|
||||
u32 tmp;
|
||||
|
||||
cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
|
||||
@ -5823,10 +5824,12 @@ static void gaudi_add_end_of_cb_packets(struct hl_device *hdev,
|
||||
cq_pkt->ctl = cpu_to_le32(tmp);
|
||||
cq_pkt->value = cpu_to_le32(1);
|
||||
|
||||
if (!gaudi->multi_msi_mode)
|
||||
msi_vec = 0;
|
||||
if (gaudi->multi_msi_mode)
|
||||
msi_addr = mmPCIE_MSI_INTR_0 + msi_vec * 4;
|
||||
else
|
||||
msi_addr = mmPCIE_CORE_MSI_REQ;
|
||||
|
||||
cq_pkt->addr = cpu_to_le64(CFG_BASE + mmPCIE_MSI_INTR_0 + msi_vec * 4);
|
||||
cq_pkt->addr = cpu_to_le64(CFG_BASE + msi_addr);
|
||||
}
|
||||
|
||||
static void gaudi_update_eq_ci(struct hl_device *hdev, u32 val)
|
||||
|
@ -8,16 +8,21 @@
|
||||
#include "gaudiP.h"
|
||||
#include "../include/gaudi/asic_reg/gaudi_regs.h"
|
||||
|
||||
#define GAUDI_NUMBER_OF_RR_REGS 24
|
||||
#define GAUDI_NUMBER_OF_LBW_RANGES 12
|
||||
#define GAUDI_NUMBER_OF_LBW_RR_REGS 28
|
||||
#define GAUDI_NUMBER_OF_HBW_RR_REGS 24
|
||||
#define GAUDI_NUMBER_OF_LBW_RANGES 10
|
||||
|
||||
static u64 gaudi_rr_lbw_hit_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_lbw_hit_aw_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_SOB_HIT_WPROT,
|
||||
mmDMA_IF_W_S_DMA0_HIT_WPROT,
|
||||
mmDMA_IF_W_S_DMA1_HIT_WPROT,
|
||||
mmDMA_IF_E_S_SOB_HIT_WPROT,
|
||||
mmDMA_IF_E_S_DMA0_HIT_WPROT,
|
||||
mmDMA_IF_E_S_DMA1_HIT_WPROT,
|
||||
mmDMA_IF_W_N_SOB_HIT_WPROT,
|
||||
mmDMA_IF_W_N_DMA0_HIT_WPROT,
|
||||
mmDMA_IF_W_N_DMA1_HIT_WPROT,
|
||||
mmDMA_IF_E_N_SOB_HIT_WPROT,
|
||||
mmDMA_IF_E_N_DMA0_HIT_WPROT,
|
||||
mmDMA_IF_E_N_DMA1_HIT_WPROT,
|
||||
mmSIF_RTR_0_LBW_RANGE_PROT_HIT_AW,
|
||||
@ -38,13 +43,17 @@ static u64 gaudi_rr_lbw_hit_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_7_LBW_RANGE_PROT_HIT_AW,
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_lbw_hit_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_lbw_hit_ar_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_SOB_HIT_RPROT,
|
||||
mmDMA_IF_W_S_DMA0_HIT_RPROT,
|
||||
mmDMA_IF_W_S_DMA1_HIT_RPROT,
|
||||
mmDMA_IF_E_S_SOB_HIT_RPROT,
|
||||
mmDMA_IF_E_S_DMA0_HIT_RPROT,
|
||||
mmDMA_IF_E_S_DMA1_HIT_RPROT,
|
||||
mmDMA_IF_W_N_SOB_HIT_RPROT,
|
||||
mmDMA_IF_W_N_DMA0_HIT_RPROT,
|
||||
mmDMA_IF_W_N_DMA1_HIT_RPROT,
|
||||
mmDMA_IF_E_N_SOB_HIT_RPROT,
|
||||
mmDMA_IF_E_N_DMA0_HIT_RPROT,
|
||||
mmDMA_IF_E_N_DMA1_HIT_RPROT,
|
||||
mmSIF_RTR_0_LBW_RANGE_PROT_HIT_AR,
|
||||
@ -65,13 +74,17 @@ static u64 gaudi_rr_lbw_hit_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_7_LBW_RANGE_PROT_HIT_AR,
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_lbw_min_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_lbw_min_aw_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_SOB_MIN_WPROT_0,
|
||||
mmDMA_IF_W_S_DMA0_MIN_WPROT_0,
|
||||
mmDMA_IF_W_S_DMA1_MIN_WPROT_0,
|
||||
mmDMA_IF_E_S_SOB_MIN_WPROT_0,
|
||||
mmDMA_IF_E_S_DMA0_MIN_WPROT_0,
|
||||
mmDMA_IF_E_S_DMA1_MIN_WPROT_0,
|
||||
mmDMA_IF_W_N_SOB_MIN_WPROT_0,
|
||||
mmDMA_IF_W_N_DMA0_MIN_WPROT_0,
|
||||
mmDMA_IF_W_N_DMA1_MIN_WPROT_0,
|
||||
mmDMA_IF_E_N_SOB_MIN_WPROT_0,
|
||||
mmDMA_IF_E_N_DMA0_MIN_WPROT_0,
|
||||
mmDMA_IF_E_N_DMA1_MIN_WPROT_0,
|
||||
mmSIF_RTR_0_LBW_RANGE_PROT_MIN_AW_0,
|
||||
@ -92,13 +105,17 @@ static u64 gaudi_rr_lbw_min_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_7_LBW_RANGE_PROT_MIN_AW_0,
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_lbw_max_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_lbw_max_aw_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_SOB_MAX_WPROT_0,
|
||||
mmDMA_IF_W_S_DMA0_MAX_WPROT_0,
|
||||
mmDMA_IF_W_S_DMA1_MAX_WPROT_0,
|
||||
mmDMA_IF_E_S_SOB_MAX_WPROT_0,
|
||||
mmDMA_IF_E_S_DMA0_MAX_WPROT_0,
|
||||
mmDMA_IF_E_S_DMA1_MAX_WPROT_0,
|
||||
mmDMA_IF_W_N_SOB_MAX_WPROT_0,
|
||||
mmDMA_IF_W_N_DMA0_MAX_WPROT_0,
|
||||
mmDMA_IF_W_N_DMA1_MAX_WPROT_0,
|
||||
mmDMA_IF_E_N_SOB_MAX_WPROT_0,
|
||||
mmDMA_IF_E_N_DMA0_MAX_WPROT_0,
|
||||
mmDMA_IF_E_N_DMA1_MAX_WPROT_0,
|
||||
mmSIF_RTR_0_LBW_RANGE_PROT_MAX_AW_0,
|
||||
@ -119,13 +136,17 @@ static u64 gaudi_rr_lbw_max_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_7_LBW_RANGE_PROT_MAX_AW_0,
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_lbw_min_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_lbw_min_ar_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_SOB_MIN_RPROT_0,
|
||||
mmDMA_IF_W_S_DMA0_MIN_RPROT_0,
|
||||
mmDMA_IF_W_S_DMA1_MIN_RPROT_0,
|
||||
mmDMA_IF_E_S_SOB_MIN_RPROT_0,
|
||||
mmDMA_IF_E_S_DMA0_MIN_RPROT_0,
|
||||
mmDMA_IF_E_S_DMA1_MIN_RPROT_0,
|
||||
mmDMA_IF_W_N_SOB_MIN_RPROT_0,
|
||||
mmDMA_IF_W_N_DMA0_MIN_RPROT_0,
|
||||
mmDMA_IF_W_N_DMA1_MIN_RPROT_0,
|
||||
mmDMA_IF_E_N_SOB_MIN_RPROT_0,
|
||||
mmDMA_IF_E_N_DMA0_MIN_RPROT_0,
|
||||
mmDMA_IF_E_N_DMA1_MIN_RPROT_0,
|
||||
mmSIF_RTR_0_LBW_RANGE_PROT_MIN_AR_0,
|
||||
@ -146,13 +167,17 @@ static u64 gaudi_rr_lbw_min_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_7_LBW_RANGE_PROT_MIN_AR_0,
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_lbw_max_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_lbw_max_ar_regs[GAUDI_NUMBER_OF_LBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_SOB_MAX_RPROT_0,
|
||||
mmDMA_IF_W_S_DMA0_MAX_RPROT_0,
|
||||
mmDMA_IF_W_S_DMA1_MAX_RPROT_0,
|
||||
mmDMA_IF_E_S_SOB_MAX_RPROT_0,
|
||||
mmDMA_IF_E_S_DMA0_MAX_RPROT_0,
|
||||
mmDMA_IF_E_S_DMA1_MAX_RPROT_0,
|
||||
mmDMA_IF_W_N_SOB_MAX_RPROT_0,
|
||||
mmDMA_IF_W_N_DMA0_MAX_RPROT_0,
|
||||
mmDMA_IF_W_N_DMA1_MAX_RPROT_0,
|
||||
mmDMA_IF_E_N_SOB_MAX_RPROT_0,
|
||||
mmDMA_IF_E_N_DMA0_MAX_RPROT_0,
|
||||
mmDMA_IF_E_N_DMA1_MAX_RPROT_0,
|
||||
mmSIF_RTR_0_LBW_RANGE_PROT_MAX_AR_0,
|
||||
@ -173,7 +198,7 @@ static u64 gaudi_rr_lbw_max_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_7_LBW_RANGE_PROT_MAX_AR_0,
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_hit_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_hit_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_HIT_AW,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_HIT_AW,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_HIT_AW,
|
||||
@ -200,7 +225,7 @@ static u64 gaudi_rr_hbw_hit_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_CTRL_7_RANGE_SEC_HIT_AW
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_hit_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_hit_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_HIT_AR,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_HIT_AR,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_HIT_AR,
|
||||
@ -227,7 +252,7 @@ static u64 gaudi_rr_hbw_hit_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_CTRL_7_RANGE_SEC_HIT_AR
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_base_low_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_base_low_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_BASE_LOW_AW_0,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_BASE_LOW_AW_0,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_BASE_LOW_AW_0,
|
||||
@ -254,7 +279,7 @@ static u64 gaudi_rr_hbw_base_low_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_CTRL_7_RANGE_SEC_BASE_LOW_AW_0
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_base_high_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_base_high_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_BASE_HIGH_AW_0,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_BASE_HIGH_AW_0,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_BASE_HIGH_AW_0,
|
||||
@ -281,7 +306,7 @@ static u64 gaudi_rr_hbw_base_high_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_CTRL_7_RANGE_SEC_BASE_HIGH_AW_0
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_mask_low_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_mask_low_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_MASK_LOW_AW_0,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_MASK_LOW_AW_0,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_MASK_LOW_AW_0,
|
||||
@ -308,7 +333,7 @@ static u64 gaudi_rr_hbw_mask_low_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_CTRL_7_RANGE_SEC_MASK_LOW_AW_0
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_mask_high_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_mask_high_aw_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_MASK_HIGH_AW_0,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_MASK_HIGH_AW_0,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_MASK_HIGH_AW_0,
|
||||
@ -335,7 +360,7 @@ static u64 gaudi_rr_hbw_mask_high_aw_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_CTRL_7_RANGE_SEC_MASK_HIGH_AW_0
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_base_low_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_base_low_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_BASE_LOW_AR_0,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_BASE_LOW_AR_0,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_BASE_LOW_AR_0,
|
||||
@ -362,7 +387,7 @@ static u64 gaudi_rr_hbw_base_low_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_CTRL_7_RANGE_SEC_BASE_LOW_AR_0
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_base_high_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_base_high_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_BASE_HIGH_AR_0,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_BASE_HIGH_AR_0,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_BASE_HIGH_AR_0,
|
||||
@ -389,7 +414,7 @@ static u64 gaudi_rr_hbw_base_high_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_CTRL_7_RANGE_SEC_BASE_HIGH_AR_0
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_mask_low_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_mask_low_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_MASK_LOW_AR_0,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_MASK_LOW_AR_0,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_MASK_LOW_AR_0,
|
||||
@ -416,7 +441,7 @@ static u64 gaudi_rr_hbw_mask_low_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
mmNIF_RTR_CTRL_7_RANGE_SEC_MASK_LOW_AR_0
|
||||
};
|
||||
|
||||
static u64 gaudi_rr_hbw_mask_high_ar_regs[GAUDI_NUMBER_OF_RR_REGS] = {
|
||||
static u64 gaudi_rr_hbw_mask_high_ar_regs[GAUDI_NUMBER_OF_HBW_RR_REGS] = {
|
||||
mmDMA_IF_W_S_DOWN_CH0_RANGE_SEC_MASK_HIGH_AR_0,
|
||||
mmDMA_IF_W_S_DOWN_CH1_RANGE_SEC_MASK_HIGH_AR_0,
|
||||
mmDMA_IF_E_S_DOWN_CH0_RANGE_SEC_MASK_HIGH_AR_0,
|
||||
@ -12849,50 +12874,44 @@ static void gaudi_init_range_registers_lbw(struct hl_device *hdev)
|
||||
u32 lbw_rng_end[GAUDI_NUMBER_OF_LBW_RANGES];
|
||||
int i, j;
|
||||
|
||||
lbw_rng_start[0] = (0xFBFE0000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[0] = (0xFBFFF000 & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[0] = (0xFC0E8000 & 0x3FFFFFF) - 1; /* 0x000E7FFF */
|
||||
lbw_rng_end[0] = (0xFC11FFFF & 0x3FFFFFF) + 1; /* 0x00120000 */
|
||||
|
||||
lbw_rng_start[1] = (0xFC0E8000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[1] = (0xFC120000 & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[1] = (0xFC1E8000 & 0x3FFFFFF) - 1; /* 0x001E7FFF */
|
||||
lbw_rng_end[1] = (0xFC48FFFF & 0x3FFFFFF) + 1; /* 0x00490000 */
|
||||
|
||||
lbw_rng_start[2] = (0xFC1E8000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[2] = (0xFC48FFFF & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[2] = (0xFC600000 & 0x3FFFFFF) - 1; /* 0x005FFFFF */
|
||||
lbw_rng_end[2] = (0xFCC48FFF & 0x3FFFFFF) + 1; /* 0x00C49000 */
|
||||
|
||||
lbw_rng_start[3] = (0xFC600000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[3] = (0xFCC48FFF & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[3] = (0xFCC4A000 & 0x3FFFFFF) - 1; /* 0x00C49FFF */
|
||||
lbw_rng_end[3] = (0xFCCDFFFF & 0x3FFFFFF) + 1; /* 0x00CE0000 */
|
||||
|
||||
lbw_rng_start[4] = (0xFCC4A000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[4] = (0xFCCDFFFF & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[4] = (0xFCCE4000 & 0x3FFFFFF) - 1; /* 0x00CE3FFF */
|
||||
lbw_rng_end[4] = (0xFCD1FFFF & 0x3FFFFFF) + 1; /* 0x00D20000 */
|
||||
|
||||
lbw_rng_start[5] = (0xFCCE4000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[5] = (0xFCD1FFFF & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[5] = (0xFCD24000 & 0x3FFFFFF) - 1; /* 0x00D23FFF */
|
||||
lbw_rng_end[5] = (0xFCD5FFFF & 0x3FFFFFF) + 1; /* 0x00D60000 */
|
||||
|
||||
lbw_rng_start[6] = (0xFCD24000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[6] = (0xFCD5FFFF & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[6] = (0xFCD64000 & 0x3FFFFFF) - 1; /* 0x00D63FFF */
|
||||
lbw_rng_end[6] = (0xFCD9FFFF & 0x3FFFFFF) + 1; /* 0x00DA0000 */
|
||||
|
||||
lbw_rng_start[7] = (0xFCD64000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[7] = (0xFCD9FFFF & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[7] = (0xFCDA4000 & 0x3FFFFFF) - 1; /* 0x00DA3FFF */
|
||||
lbw_rng_end[7] = (0xFCDDFFFF & 0x3FFFFFF) + 1; /* 0x00DE0000 */
|
||||
|
||||
lbw_rng_start[8] = (0xFCDA4000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[8] = (0xFCDDFFFF & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[8] = (0xFCDE4000 & 0x3FFFFFF) - 1; /* 0x00DE3FFF */
|
||||
lbw_rng_end[8] = (0xFCE05FFF & 0x3FFFFFF) + 1; /* 0x00E06000 */
|
||||
|
||||
lbw_rng_start[9] = (0xFCDE4000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[9] = (0xFCE05FFF & 0x3FFFFFF) + 1;
|
||||
lbw_rng_start[9] = (0xFCFC9000 & 0x3FFFFFF) - 1; /* 0x00FC8FFF */
|
||||
lbw_rng_end[9] = (0xFFFFFFFE & 0x3FFFFFF) + 1; /* 0x03FFFFFF */
|
||||
|
||||
lbw_rng_start[10] = (0xFEC43000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[10] = (0xFEC43FFF & 0x3FFFFFF) + 1;
|
||||
|
||||
lbw_rng_start[11] = (0xFE484000 & 0x3FFFFFF) - 1;
|
||||
lbw_rng_end[11] = (0xFE484FFF & 0x3FFFFFF) + 1;
|
||||
|
||||
for (i = 0 ; i < GAUDI_NUMBER_OF_RR_REGS ; i++) {
|
||||
for (i = 0 ; i < GAUDI_NUMBER_OF_LBW_RR_REGS ; i++) {
|
||||
WREG32(gaudi_rr_lbw_hit_aw_regs[i],
|
||||
(1 << GAUDI_NUMBER_OF_LBW_RANGES) - 1);
|
||||
WREG32(gaudi_rr_lbw_hit_ar_regs[i],
|
||||
(1 << GAUDI_NUMBER_OF_LBW_RANGES) - 1);
|
||||
}
|
||||
|
||||
for (i = 0 ; i < GAUDI_NUMBER_OF_RR_REGS ; i++)
|
||||
for (i = 0 ; i < GAUDI_NUMBER_OF_LBW_RR_REGS ; i++)
|
||||
for (j = 0 ; j < GAUDI_NUMBER_OF_LBW_RANGES ; j++) {
|
||||
WREG32(gaudi_rr_lbw_min_aw_regs[i] + (j << 2),
|
||||
lbw_rng_start[j]);
|
||||
@ -12939,12 +12958,12 @@ static void gaudi_init_range_registers_hbw(struct hl_device *hdev)
|
||||
* 6th range is the host
|
||||
*/
|
||||
|
||||
for (i = 0 ; i < GAUDI_NUMBER_OF_RR_REGS ; i++) {
|
||||
for (i = 0 ; i < GAUDI_NUMBER_OF_HBW_RR_REGS ; i++) {
|
||||
WREG32(gaudi_rr_hbw_hit_aw_regs[i], 0x1F);
|
||||
WREG32(gaudi_rr_hbw_hit_ar_regs[i], 0x1D);
|
||||
}
|
||||
|
||||
for (i = 0 ; i < GAUDI_NUMBER_OF_RR_REGS ; i++) {
|
||||
for (i = 0 ; i < GAUDI_NUMBER_OF_HBW_RR_REGS ; i++) {
|
||||
WREG32(gaudi_rr_hbw_base_low_aw_regs[i], dram_addr_lo);
|
||||
WREG32(gaudi_rr_hbw_base_low_ar_regs[i], dram_addr_lo);
|
||||
|
||||
|
@ -308,6 +308,8 @@
|
||||
#define mmPCIE_AUX_FLR_CTRL 0xC07394
|
||||
#define mmPCIE_AUX_DBI 0xC07490
|
||||
|
||||
#define mmPCIE_CORE_MSI_REQ 0xC04100
|
||||
|
||||
#define mmPSOC_PCI_PLL_NR 0xC72100
|
||||
#define mmSRAM_W_PLL_NR 0x4C8100
|
||||
#define mmPSOC_HBM_PLL_NR 0xC74100
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/backing-dev.h>
|
||||
#include <linux/list_sort.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/pr.h>
|
||||
@ -3716,15 +3715,6 @@ static int nvme_init_ns_head(struct nvme_ns *ns, unsigned nsid,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ns_cmp(void *priv, const struct list_head *a,
|
||||
const struct list_head *b)
|
||||
{
|
||||
struct nvme_ns *nsa = container_of(a, struct nvme_ns, list);
|
||||
struct nvme_ns *nsb = container_of(b, struct nvme_ns, list);
|
||||
|
||||
return nsa->head->ns_id - nsb->head->ns_id;
|
||||
}
|
||||
|
||||
struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
||||
{
|
||||
struct nvme_ns *ns, *ret = NULL;
|
||||
@ -3745,6 +3735,22 @@ struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid)
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(nvme_find_get_ns, NVME_TARGET_PASSTHRU);
|
||||
|
||||
/*
|
||||
* Add the namespace to the controller list while keeping the list ordered.
|
||||
*/
|
||||
static void nvme_ns_add_to_ctrl_list(struct nvme_ns *ns)
|
||||
{
|
||||
struct nvme_ns *tmp;
|
||||
|
||||
list_for_each_entry_reverse(tmp, &ns->ctrl->namespaces, list) {
|
||||
if (tmp->head->ns_id < ns->head->ns_id) {
|
||||
list_add(&ns->list, &tmp->list);
|
||||
return;
|
||||
}
|
||||
}
|
||||
list_add(&ns->list, &ns->ctrl->namespaces);
|
||||
}
|
||||
|
||||
static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid,
|
||||
struct nvme_ns_ids *ids)
|
||||
{
|
||||
@ -3795,9 +3801,8 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid,
|
||||
goto out_unlink_ns;
|
||||
|
||||
down_write(&ctrl->namespaces_rwsem);
|
||||
list_add_tail(&ns->list, &ctrl->namespaces);
|
||||
nvme_ns_add_to_ctrl_list(ns);
|
||||
up_write(&ctrl->namespaces_rwsem);
|
||||
|
||||
nvme_get_ctrl(ctrl);
|
||||
|
||||
if (device_add_disk(ctrl->device, ns->disk, nvme_ns_id_attr_groups))
|
||||
@ -4080,10 +4085,6 @@ static void nvme_scan_work(struct work_struct *work)
|
||||
if (nvme_scan_ns_list(ctrl) != 0)
|
||||
nvme_scan_ns_sequential(ctrl);
|
||||
mutex_unlock(&ctrl->scan_lock);
|
||||
|
||||
down_write(&ctrl->namespaces_rwsem);
|
||||
list_sort(NULL, &ctrl->namespaces, ns_cmp);
|
||||
up_write(&ctrl->namespaces_rwsem);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2487,6 +2487,7 @@ __nvme_fc_abort_outstanding_ios(struct nvme_fc_ctrl *ctrl, bool start_queues)
|
||||
*/
|
||||
if (ctrl->ctrl.queue_count > 1) {
|
||||
nvme_stop_queues(&ctrl->ctrl);
|
||||
nvme_sync_io_queues(&ctrl->ctrl);
|
||||
blk_mq_tagset_busy_iter(&ctrl->tag_set,
|
||||
nvme_fc_terminate_exchange, &ctrl->ctrl);
|
||||
blk_mq_tagset_wait_completed_request(&ctrl->tag_set);
|
||||
@ -2510,6 +2511,7 @@ __nvme_fc_abort_outstanding_ios(struct nvme_fc_ctrl *ctrl, bool start_queues)
|
||||
* clean up the admin queue. Same thing as above.
|
||||
*/
|
||||
blk_mq_quiesce_queue(ctrl->ctrl.admin_q);
|
||||
blk_sync_queue(ctrl->ctrl.admin_q);
|
||||
blk_mq_tagset_busy_iter(&ctrl->admin_tag_set,
|
||||
nvme_fc_terminate_exchange, &ctrl->ctrl);
|
||||
blk_mq_tagset_wait_completed_request(&ctrl->admin_tag_set);
|
||||
@ -2951,6 +2953,13 @@ nvme_fc_recreate_io_queues(struct nvme_fc_ctrl *ctrl)
|
||||
if (ctrl->ctrl.queue_count == 1)
|
||||
return 0;
|
||||
|
||||
if (prior_ioq_cnt != nr_io_queues) {
|
||||
dev_info(ctrl->ctrl.device,
|
||||
"reconnect: revising io queue count from %d to %d\n",
|
||||
prior_ioq_cnt, nr_io_queues);
|
||||
blk_mq_update_nr_hw_queues(&ctrl->tag_set, nr_io_queues);
|
||||
}
|
||||
|
||||
ret = nvme_fc_create_hw_io_queues(ctrl, ctrl->ctrl.sqsize + 1);
|
||||
if (ret)
|
||||
goto out_free_io_queues;
|
||||
@ -2959,15 +2968,6 @@ nvme_fc_recreate_io_queues(struct nvme_fc_ctrl *ctrl)
|
||||
if (ret)
|
||||
goto out_delete_hw_queues;
|
||||
|
||||
if (prior_ioq_cnt != nr_io_queues) {
|
||||
dev_info(ctrl->ctrl.device,
|
||||
"reconnect: revising io queue count from %d to %d\n",
|
||||
prior_ioq_cnt, nr_io_queues);
|
||||
nvme_wait_freeze(&ctrl->ctrl);
|
||||
blk_mq_update_nr_hw_queues(&ctrl->tag_set, nr_io_queues);
|
||||
nvme_unfreeze(&ctrl->ctrl);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
out_delete_hw_queues:
|
||||
|
@ -620,7 +620,7 @@ static int nvme_tcp_setup_h2c_data_pdu(struct nvme_tcp_request *req,
|
||||
cpu_to_le32(data->hdr.hlen + hdgst + req->pdu_len + ddgst);
|
||||
data->ttag = pdu->ttag;
|
||||
data->command_id = nvme_cid(rq);
|
||||
data->data_offset = cpu_to_le32(req->data_sent);
|
||||
data->data_offset = pdu->r2t_offset;
|
||||
data->data_length = cpu_to_le32(req->pdu_len);
|
||||
return 0;
|
||||
}
|
||||
@ -953,7 +953,15 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req)
|
||||
nvme_tcp_ddgst_update(queue->snd_hash, page,
|
||||
offset, ret);
|
||||
|
||||
/* fully successful last write*/
|
||||
/*
|
||||
* update the request iterator except for the last payload send
|
||||
* in the request where we don't want to modify it as we may
|
||||
* compete with the RX path completing the request.
|
||||
*/
|
||||
if (req->data_sent + ret < req->data_len)
|
||||
nvme_tcp_advance_req(req, ret);
|
||||
|
||||
/* fully successful last send in current PDU */
|
||||
if (last && ret == len) {
|
||||
if (queue->data_digest) {
|
||||
nvme_tcp_ddgst_final(queue->snd_hash,
|
||||
@ -965,7 +973,6 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req)
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
nvme_tcp_advance_req(req, ret);
|
||||
}
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
@ -109,6 +109,7 @@ config MTK_EFUSE
|
||||
|
||||
config NVMEM_NINTENDO_OTP
|
||||
tristate "Nintendo Wii and Wii U OTP Support"
|
||||
depends on WII || COMPILE_TEST
|
||||
help
|
||||
This is a driver exposing the OTP of a Nintendo Wii or Wii U console.
|
||||
|
||||
|
@ -110,7 +110,7 @@ config PCI_PF_STUB
|
||||
|
||||
config XEN_PCIDEV_FRONTEND
|
||||
tristate "Xen PCI Frontend"
|
||||
depends on X86 && XEN
|
||||
depends on XEN_PV
|
||||
select PCI_XEN
|
||||
select XEN_XENBUS_FRONTEND
|
||||
default y
|
||||
|
@ -10,17 +10,6 @@ config SCSI_ACORNSCSI_3
|
||||
This enables support for the Acorn SCSI card (aka30). If you have an
|
||||
Acorn system with one of these, say Y. If unsure, say N.
|
||||
|
||||
config SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
bool "Support SCSI 2 Tagged queueing"
|
||||
depends on SCSI_ACORNSCSI_3
|
||||
help
|
||||
Say Y here to enable tagged queuing support on the Acorn SCSI card.
|
||||
|
||||
This is a feature of SCSI-2 which improves performance: the host
|
||||
adapter can send several SCSI commands to a device's queue even if
|
||||
previous commands haven't finished yet. Some SCSI devices don't
|
||||
implement this properly, so the safe answer is N.
|
||||
|
||||
config SCSI_ACORNSCSI_SYNC
|
||||
bool "Support SCSI 2 Synchronous Transfers"
|
||||
depends on SCSI_ACORNSCSI_3
|
||||
|
@ -52,12 +52,8 @@
|
||||
* You can tell if you have a device that supports tagged queueing my
|
||||
* cating (eg) /proc/scsi/acornscsi/0 and see if the SCSI revision is reported
|
||||
* as '2 TAG'.
|
||||
*
|
||||
* Also note that CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE is normally set in the config
|
||||
* scripts, but disabled here. Once debugged, remove the #undef, otherwise to debug,
|
||||
* comment out the undef.
|
||||
*/
|
||||
#undef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
|
||||
/*
|
||||
* SCSI-II Synchronous transfer support.
|
||||
*
|
||||
@ -171,7 +167,7 @@ static void acornscsi_done(AS_Host *host, struct scsi_cmnd **SCpntp,
|
||||
unsigned int result);
|
||||
static int acornscsi_reconnect_finish(AS_Host *host);
|
||||
static void acornscsi_dma_cleanup(AS_Host *host);
|
||||
static void acornscsi_abortcmd(AS_Host *host, unsigned char tag);
|
||||
static void acornscsi_abortcmd(AS_Host *host);
|
||||
|
||||
/* ====================================================================================
|
||||
* Miscellaneous
|
||||
@ -741,17 +737,6 @@ intr_ret_t acornscsi_kick(AS_Host *host)
|
||||
#endif
|
||||
|
||||
if (from_queue) {
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
/*
|
||||
* tagged queueing - allocate a new tag to this command
|
||||
*/
|
||||
if (SCpnt->device->simple_tags) {
|
||||
SCpnt->device->current_tag += 1;
|
||||
if (SCpnt->device->current_tag == 0)
|
||||
SCpnt->device->current_tag = 1;
|
||||
SCpnt->tag = SCpnt->device->current_tag;
|
||||
} else
|
||||
#endif
|
||||
set_bit(SCpnt->device->id * 8 +
|
||||
(u8)(SCpnt->device->lun & 0x07), host->busyluns);
|
||||
|
||||
@ -1192,7 +1177,7 @@ void acornscsi_dma_intr(AS_Host *host)
|
||||
* the device recognises the attention.
|
||||
*/
|
||||
if (dmac_read(host, DMAC_STATUS) & STATUS_RQ0) {
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
|
||||
dmac_write(host, DMAC_TXCNTLO, 0);
|
||||
dmac_write(host, DMAC_TXCNTHI, 0);
|
||||
@ -1560,23 +1545,6 @@ void acornscsi_message(AS_Host *host)
|
||||
acornscsi_sbic_issuecmd(host, CMND_ASSERTATN);
|
||||
|
||||
switch (host->scsi.last_message) {
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
case HEAD_OF_QUEUE_TAG:
|
||||
case ORDERED_QUEUE_TAG:
|
||||
case SIMPLE_QUEUE_TAG:
|
||||
/*
|
||||
* ANSI standard says: (Section SCSI-2 Rev. 10c Sect 5.6.17)
|
||||
* If a target does not implement tagged queuing and a queue tag
|
||||
* message is received, it shall respond with a MESSAGE REJECT
|
||||
* message and accept the I/O process as if it were untagged.
|
||||
*/
|
||||
printk(KERN_NOTICE "scsi%d.%c: disabling tagged queueing\n",
|
||||
host->host->host_no, acornscsi_target(host));
|
||||
host->SCpnt->device->simple_tags = 0;
|
||||
set_bit(host->SCpnt->device->id * 8 +
|
||||
(u8)(host->SCpnt->device->lun & 0x7), host->busyluns);
|
||||
break;
|
||||
#endif
|
||||
case EXTENDED_MESSAGE | (EXTENDED_SDTR << 8):
|
||||
/*
|
||||
* Target can't handle synchronous transfers
|
||||
@ -1687,24 +1655,11 @@ void acornscsi_buildmessages(AS_Host *host)
|
||||
#if 0
|
||||
/* does the device need the current command aborted */
|
||||
if (cmd_aborted) {
|
||||
acornscsi_abortcmd(host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
if (host->SCpnt->tag) {
|
||||
unsigned int tag_type;
|
||||
|
||||
if (host->SCpnt->cmnd[0] == REQUEST_SENSE ||
|
||||
host->SCpnt->cmnd[0] == TEST_UNIT_READY ||
|
||||
host->SCpnt->cmnd[0] == INQUIRY)
|
||||
tag_type = HEAD_OF_QUEUE_TAG;
|
||||
else
|
||||
tag_type = SIMPLE_QUEUE_TAG;
|
||||
msgqueue_addmsg(&host->scsi.msgs, 2, tag_type, host->SCpnt->tag);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC
|
||||
if (host->device[host->SCpnt->device->id].sync_state == SYNC_NEGOCIATE) {
|
||||
@ -1798,7 +1753,7 @@ int acornscsi_reconnect(AS_Host *host)
|
||||
"to reconnect with\n",
|
||||
host->host->host_no, '0' + target);
|
||||
acornscsi_dumplog(host, target);
|
||||
acornscsi_abortcmd(host, 0);
|
||||
acornscsi_abortcmd(host);
|
||||
if (host->SCpnt) {
|
||||
queue_add_cmd_tail(&host->queues.disconnected, host->SCpnt);
|
||||
host->SCpnt = NULL;
|
||||
@ -1821,7 +1776,7 @@ int acornscsi_reconnect_finish(AS_Host *host)
|
||||
host->scsi.disconnectable = 0;
|
||||
if (host->SCpnt->device->id == host->scsi.reconnected.target &&
|
||||
host->SCpnt->device->lun == host->scsi.reconnected.lun &&
|
||||
host->SCpnt->tag == host->scsi.reconnected.tag) {
|
||||
scsi_cmd_to_tag(host->SCpnt) == host->scsi.reconnected.tag) {
|
||||
#if (DEBUG & (DEBUG_QUEUES|DEBUG_DISCON))
|
||||
DBG(host->SCpnt, printk("scsi%d.%c: reconnected",
|
||||
host->host->host_no, acornscsi_target(host)));
|
||||
@ -1848,7 +1803,7 @@ int acornscsi_reconnect_finish(AS_Host *host)
|
||||
}
|
||||
|
||||
if (!host->SCpnt)
|
||||
acornscsi_abortcmd(host, host->scsi.reconnected.tag);
|
||||
acornscsi_abortcmd(host);
|
||||
else {
|
||||
/*
|
||||
* Restore data pointer from SAVED pointers.
|
||||
@ -1889,21 +1844,15 @@ void acornscsi_disconnect_unexpected(AS_Host *host)
|
||||
* Function: void acornscsi_abortcmd(AS_host *host, unsigned char tag)
|
||||
* Purpose : abort a currently executing command
|
||||
* Params : host - host with connected command to abort
|
||||
* tag - tag to abort
|
||||
*/
|
||||
static
|
||||
void acornscsi_abortcmd(AS_Host *host, unsigned char tag)
|
||||
void acornscsi_abortcmd(AS_Host *host)
|
||||
{
|
||||
host->scsi.phase = PHASE_ABORTED;
|
||||
sbic_arm_write(host, SBIC_CMND, CMND_ASSERTATN);
|
||||
|
||||
msgqueue_flush(&host->scsi.msgs);
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
if (tag)
|
||||
msgqueue_addmsg(&host->scsi.msgs, 2, ABORT_TAG, tag);
|
||||
else
|
||||
#endif
|
||||
msgqueue_addmsg(&host->scsi.msgs, 1, ABORT);
|
||||
msgqueue_addmsg(&host->scsi.msgs, 1, ABORT);
|
||||
}
|
||||
|
||||
/* ==========================================================================================
|
||||
@ -1993,7 +1942,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTING, SSR %02X?\n",
|
||||
host->host->host_no, acornscsi_target(host), ssr);
|
||||
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
}
|
||||
return INTR_PROCESSING;
|
||||
|
||||
@ -2029,7 +1978,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTED, SSR %02X?\n",
|
||||
host->host->host_no, acornscsi_target(host), ssr);
|
||||
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
}
|
||||
return INTR_PROCESSING;
|
||||
|
||||
@ -2075,20 +2024,20 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
case 0x18: /* -> PHASE_DATAOUT */
|
||||
/* COMMAND -> DATA OUT */
|
||||
if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len)
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
acornscsi_dma_setup(host, DMA_OUT);
|
||||
if (!acornscsi_starttransfer(host))
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
host->scsi.phase = PHASE_DATAOUT;
|
||||
return INTR_IDLE;
|
||||
|
||||
case 0x19: /* -> PHASE_DATAIN */
|
||||
/* COMMAND -> DATA IN */
|
||||
if (host->scsi.SCp.sent_command != host->SCpnt->cmd_len)
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
acornscsi_dma_setup(host, DMA_IN);
|
||||
if (!acornscsi_starttransfer(host))
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
host->scsi.phase = PHASE_DATAIN;
|
||||
return INTR_IDLE;
|
||||
|
||||
@ -2156,7 +2105,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
/* MESSAGE IN -> DATA OUT */
|
||||
acornscsi_dma_setup(host, DMA_OUT);
|
||||
if (!acornscsi_starttransfer(host))
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
host->scsi.phase = PHASE_DATAOUT;
|
||||
return INTR_IDLE;
|
||||
|
||||
@ -2165,7 +2114,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
/* MESSAGE IN -> DATA IN */
|
||||
acornscsi_dma_setup(host, DMA_IN);
|
||||
if (!acornscsi_starttransfer(host))
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
host->scsi.phase = PHASE_DATAIN;
|
||||
return INTR_IDLE;
|
||||
|
||||
@ -2206,7 +2155,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
switch (ssr) {
|
||||
case 0x19: /* -> PHASE_DATAIN */
|
||||
case 0x89: /* -> PHASE_DATAIN */
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
return INTR_IDLE;
|
||||
|
||||
case 0x1b: /* -> PHASE_STATUSIN */
|
||||
@ -2255,7 +2204,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
|
||||
switch (ssr) {
|
||||
case 0x18: /* -> PHASE_DATAOUT */
|
||||
case 0x88: /* -> PHASE_DATAOUT */
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
return INTR_IDLE;
|
||||
|
||||
case 0x1b: /* -> PHASE_STATUSIN */
|
||||
@ -2482,7 +2431,6 @@ static int acornscsi_queuecmd_lck(struct scsi_cmnd *SCpnt,
|
||||
SCpnt->scsi_done = done;
|
||||
SCpnt->host_scribble = NULL;
|
||||
SCpnt->result = 0;
|
||||
SCpnt->tag = 0;
|
||||
SCpnt->SCp.phase = (int)acornscsi_datadirection(SCpnt->cmnd[0]);
|
||||
SCpnt->SCp.sent_command = 0;
|
||||
SCpnt->SCp.scsi_xferred = 0;
|
||||
@ -2581,7 +2529,7 @@ static enum res_abort acornscsi_do_abort(AS_Host *host, struct scsi_cmnd *SCpnt)
|
||||
break;
|
||||
|
||||
default:
|
||||
acornscsi_abortcmd(host, host->SCpnt->tag);
|
||||
acornscsi_abortcmd(host);
|
||||
res = res_snooze;
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
@ -2747,9 +2695,6 @@ char *acornscsi_info(struct Scsi_Host *host)
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC
|
||||
" SYNC"
|
||||
#endif
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
" TAG"
|
||||
#endif
|
||||
#if (DEBUG & DEBUG_NO_WRITE)
|
||||
" NOWRITE (" __stringify(NO_WRITE) ")"
|
||||
#endif
|
||||
@ -2770,9 +2715,6 @@ static int acornscsi_show_info(struct seq_file *m, struct Scsi_Host *instance)
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC
|
||||
" SYNC"
|
||||
#endif
|
||||
#ifdef CONFIG_SCSI_ACORNSCSI_TAGGED_QUEUE
|
||||
" TAG"
|
||||
#endif
|
||||
#if (DEBUG & DEBUG_NO_WRITE)
|
||||
" NOWRITE (" __stringify(NO_WRITE) ")"
|
||||
#endif
|
||||
@ -2827,9 +2769,8 @@ static int acornscsi_show_info(struct seq_file *m, struct Scsi_Host *instance)
|
||||
seq_printf(m, "Device/Lun TaggedQ Sync\n");
|
||||
seq_printf(m, " %d/%llu ", scd->id, scd->lun);
|
||||
if (scd->tagged_supported)
|
||||
seq_printf(m, "%3sabled(%3d) ",
|
||||
scd->simple_tags ? "en" : "dis",
|
||||
scd->current_tag);
|
||||
seq_printf(m, "%3sabled ",
|
||||
scd->simple_tags ? "en" : "dis");
|
||||
else
|
||||
seq_printf(m, "unsupported ");
|
||||
|
||||
|
@ -77,7 +77,6 @@
|
||||
* I was thinking that this was a good chip until I found this restriction ;(
|
||||
*/
|
||||
#define SCSI2_SYNC
|
||||
#undef SCSI2_TAG
|
||||
|
||||
#undef DEBUG_CONNECT
|
||||
#undef DEBUG_MESSAGES
|
||||
@ -990,7 +989,7 @@ fas216_reselected_intr(FAS216_Info *info)
|
||||
info->scsi.disconnectable = 0;
|
||||
if (info->SCpnt->device->id == target &&
|
||||
info->SCpnt->device->lun == lun &&
|
||||
info->SCpnt->tag == tag) {
|
||||
scsi_cmd_to_rq(info->SCpnt)->tag == tag) {
|
||||
fas216_log(info, LOG_CONNECT, "reconnected previously executing command");
|
||||
} else {
|
||||
queue_add_cmd_tail(&info->queues.disconnected, info->SCpnt);
|
||||
@ -1791,8 +1790,9 @@ static void fas216_start_command(FAS216_Info *info, struct scsi_cmnd *SCpnt)
|
||||
/*
|
||||
* add tag message if required
|
||||
*/
|
||||
if (SCpnt->tag)
|
||||
msgqueue_addmsg(&info->scsi.msgs, 2, SIMPLE_QUEUE_TAG, SCpnt->tag);
|
||||
if (SCpnt->device->simple_tags)
|
||||
msgqueue_addmsg(&info->scsi.msgs, 2, SIMPLE_QUEUE_TAG,
|
||||
scsi_cmd_to_rq(SCpnt)->tag);
|
||||
|
||||
do {
|
||||
#ifdef SCSI2_SYNC
|
||||
@ -1815,20 +1815,8 @@ static void fas216_start_command(FAS216_Info *info, struct scsi_cmnd *SCpnt)
|
||||
|
||||
static void fas216_allocate_tag(FAS216_Info *info, struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
#ifdef SCSI2_TAG
|
||||
/*
|
||||
* tagged queuing - allocate a new tag to this command
|
||||
*/
|
||||
if (SCpnt->device->simple_tags && SCpnt->cmnd[0] != REQUEST_SENSE &&
|
||||
SCpnt->cmnd[0] != INQUIRY) {
|
||||
SCpnt->device->current_tag += 1;
|
||||
if (SCpnt->device->current_tag == 0)
|
||||
SCpnt->device->current_tag = 1;
|
||||
SCpnt->tag = SCpnt->device->current_tag;
|
||||
} else
|
||||
#endif
|
||||
set_bit(SCpnt->device->id * 8 +
|
||||
(u8)(SCpnt->device->lun & 0x7), info->busyluns);
|
||||
set_bit(SCpnt->device->id * 8 +
|
||||
(u8)(SCpnt->device->lun & 0x7), info->busyluns);
|
||||
|
||||
info->stats.removes += 1;
|
||||
switch (SCpnt->cmnd[0]) {
|
||||
@ -2117,7 +2105,6 @@ fas216_std_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, unsigned int result)
|
||||
init_SCp(SCpnt);
|
||||
SCpnt->SCp.Message = 0;
|
||||
SCpnt->SCp.Status = 0;
|
||||
SCpnt->tag = 0;
|
||||
SCpnt->host_scribble = (void *)fas216_rq_sns_done;
|
||||
|
||||
/*
|
||||
@ -2223,7 +2210,6 @@ static int fas216_queue_command_lck(struct scsi_cmnd *SCpnt,
|
||||
init_SCp(SCpnt);
|
||||
|
||||
info->stats.queues += 1;
|
||||
SCpnt->tag = 0;
|
||||
|
||||
spin_lock(&info->host_lock);
|
||||
|
||||
@ -3003,9 +2989,8 @@ void fas216_print_devices(FAS216_Info *info, struct seq_file *m)
|
||||
dev = &info->device[scd->id];
|
||||
seq_printf(m, " %d/%llu ", scd->id, scd->lun);
|
||||
if (scd->tagged_supported)
|
||||
seq_printf(m, "%3sabled(%3d) ",
|
||||
scd->simple_tags ? "en" : "dis",
|
||||
scd->current_tag);
|
||||
seq_printf(m, "%3sabled ",
|
||||
scd->simple_tags ? "en" : "dis");
|
||||
else
|
||||
seq_puts(m, "unsupported ");
|
||||
|
||||
|
@ -214,7 +214,7 @@ struct scsi_cmnd *queue_remove_tgtluntag(Queue_t *queue, int target, int lun,
|
||||
list_for_each(l, &queue->head) {
|
||||
QE_t *q = list_entry(l, QE_t, list);
|
||||
if (q->SCpnt->device->id == target && q->SCpnt->device->lun == lun &&
|
||||
q->SCpnt->tag == tag) {
|
||||
scsi_cmd_to_rq(q->SCpnt)->tag == tag) {
|
||||
SCpnt = __queue_remove(queue, l);
|
||||
break;
|
||||
}
|
||||
|
@ -880,11 +880,11 @@ efct_lio_npiv_drop_nport(struct se_wwn *wwn)
|
||||
struct efct *efct = lio_vport->efct;
|
||||
unsigned long flags = 0;
|
||||
|
||||
spin_lock_irqsave(&efct->tgt_efct.efct_lio_lock, flags);
|
||||
|
||||
if (lio_vport->fc_vport)
|
||||
fc_vport_terminate(lio_vport->fc_vport);
|
||||
|
||||
spin_lock_irqsave(&efct->tgt_efct.efct_lio_lock, flags);
|
||||
|
||||
list_for_each_entry_safe(vport, next_vport, &efct->tgt_efct.vport_list,
|
||||
list_entry) {
|
||||
if (vport->lio_vport == lio_vport) {
|
||||
|
@ -928,22 +928,21 @@ __efc_d_wait_topology_notify(struct efc_sm_ctx *ctx,
|
||||
break;
|
||||
|
||||
case EFC_EVT_NPORT_TOPOLOGY_NOTIFY: {
|
||||
enum efc_nport_topology topology =
|
||||
(enum efc_nport_topology)arg;
|
||||
enum efc_nport_topology *topology = arg;
|
||||
|
||||
WARN_ON(node->nport->domain->attached);
|
||||
|
||||
WARN_ON(node->send_ls_acc != EFC_NODE_SEND_LS_ACC_PLOGI);
|
||||
|
||||
node_printf(node, "topology notification, topology=%d\n",
|
||||
topology);
|
||||
*topology);
|
||||
|
||||
/* At the time the PLOGI was received, the topology was unknown,
|
||||
* so we didn't know which node would perform the domain attach:
|
||||
* 1. The node from which the PLOGI was sent (p2p) or
|
||||
* 2. The node to which the FLOGI was sent (fabric).
|
||||
*/
|
||||
if (topology == EFC_NPORT_TOPO_P2P) {
|
||||
if (*topology == EFC_NPORT_TOPO_P2P) {
|
||||
/* if this is p2p, need to attach to the domain using
|
||||
* the d_id from the PLOGI received
|
||||
*/
|
||||
|
@ -107,7 +107,6 @@ void
|
||||
efc_fabric_notify_topology(struct efc_node *node)
|
||||
{
|
||||
struct efc_node *tmp_node;
|
||||
enum efc_nport_topology topology = node->nport->topology;
|
||||
unsigned long index;
|
||||
|
||||
/*
|
||||
@ -118,7 +117,7 @@ efc_fabric_notify_topology(struct efc_node *node)
|
||||
if (tmp_node != node) {
|
||||
efc_node_post_event(tmp_node,
|
||||
EFC_EVT_NPORT_TOPOLOGY_NOTIFY,
|
||||
(void *)topology);
|
||||
&node->nport->topology);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -285,11 +285,8 @@ lpfc_cmf_info_show(struct device *dev, struct device_attribute *attr,
|
||||
"6312 Catching potential buffer "
|
||||
"overflow > PAGE_SIZE = %lu bytes\n",
|
||||
PAGE_SIZE);
|
||||
strscpy(buf + PAGE_SIZE - 1 -
|
||||
strnlen(LPFC_INFO_MORE_STR, PAGE_SIZE - 1),
|
||||
LPFC_INFO_MORE_STR,
|
||||
strnlen(LPFC_INFO_MORE_STR, PAGE_SIZE - 1)
|
||||
+ 1);
|
||||
strscpy(buf + PAGE_SIZE - 1 - sizeof(LPFC_INFO_MORE_STR),
|
||||
LPFC_INFO_MORE_STR, sizeof(LPFC_INFO_MORE_STR) + 1);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
@ -6204,7 +6201,8 @@ lpfc_sg_seg_cnt_show(struct device *dev, struct device_attribute *attr,
|
||||
len = scnprintf(buf, PAGE_SIZE, "SGL sz: %d total SGEs: %d\n",
|
||||
phba->cfg_sg_dma_buf_size, phba->cfg_total_seg_cnt);
|
||||
|
||||
len += scnprintf(buf + len, PAGE_SIZE, "Cfg: %d SCSI: %d NVME: %d\n",
|
||||
len += scnprintf(buf + len, PAGE_SIZE - len,
|
||||
"Cfg: %d SCSI: %d NVME: %d\n",
|
||||
phba->cfg_sg_seg_cnt, phba->cfg_scsi_seg_cnt,
|
||||
phba->cfg_nvme_seg_cnt);
|
||||
return len;
|
||||
|
@ -4015,11 +4015,11 @@ lpfc_cmpl_els_edc(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||
be32_to_cpu(pcgd->desc_tag),
|
||||
be32_to_cpu(pcgd->desc_len),
|
||||
be32_to_cpu(pcgd->xmt_signal_capability),
|
||||
be32_to_cpu(pcgd->xmt_signal_frequency.count),
|
||||
be32_to_cpu(pcgd->xmt_signal_frequency.units),
|
||||
be16_to_cpu(pcgd->xmt_signal_frequency.count),
|
||||
be16_to_cpu(pcgd->xmt_signal_frequency.units),
|
||||
be32_to_cpu(pcgd->rcv_signal_capability),
|
||||
be32_to_cpu(pcgd->rcv_signal_frequency.count),
|
||||
be32_to_cpu(pcgd->rcv_signal_frequency.units));
|
||||
be16_to_cpu(pcgd->rcv_signal_frequency.count),
|
||||
be16_to_cpu(pcgd->rcv_signal_frequency.units));
|
||||
|
||||
/* Compare driver and Fport capabilities and choose
|
||||
* least common.
|
||||
@ -9387,7 +9387,7 @@ lpfc_display_fpin_wwpn(struct lpfc_hba *phba, __be64 *wwnlist, u32 cnt)
|
||||
/* Extract the next WWPN from the payload */
|
||||
wwn = *wwnlist++;
|
||||
wwpn = be64_to_cpu(wwn);
|
||||
len += scnprintf(buf + len, LPFC_FPIN_WWPN_LINE_SZ,
|
||||
len += scnprintf(buf + len, LPFC_FPIN_WWPN_LINE_SZ - len,
|
||||
" %016llx", wwpn);
|
||||
|
||||
/* Log a message if we are on the last WWPN
|
||||
|
@ -1167,7 +1167,7 @@ struct lpfc_mbx_read_object { /* Version 0 */
|
||||
#define lpfc_mbx_rd_object_rlen_MASK 0x00FFFFFF
|
||||
#define lpfc_mbx_rd_object_rlen_WORD word0
|
||||
uint32_t rd_object_offset;
|
||||
uint32_t rd_object_name[LPFC_MBX_OBJECT_NAME_LEN_DW];
|
||||
__le32 rd_object_name[LPFC_MBX_OBJECT_NAME_LEN_DW];
|
||||
#define LPFC_OBJ_NAME_SZ 104 /* 26 x sizeof(uint32_t) is 104. */
|
||||
uint32_t rd_object_cnt;
|
||||
struct lpfc_mbx_host_buf rd_object_hbuf[4];
|
||||
|
@ -5518,7 +5518,7 @@ lpfc_cgn_update_stat(struct lpfc_hba *phba, uint32_t dtag)
|
||||
if (phba->cgn_fpin_frequency &&
|
||||
phba->cgn_fpin_frequency != LPFC_FPIN_INIT_FREQ) {
|
||||
value = LPFC_CGN_TIMER_TO_MIN / phba->cgn_fpin_frequency;
|
||||
cp->cgn_stat_npm = cpu_to_le32(value);
|
||||
cp->cgn_stat_npm = value;
|
||||
}
|
||||
value = lpfc_cgn_calc_crc32(cp, LPFC_CGN_INFO_SZ,
|
||||
LPFC_CGN_CRC32_SEED);
|
||||
@ -5547,9 +5547,9 @@ lpfc_cgn_save_evt_cnt(struct lpfc_hba *phba)
|
||||
uint32_t mbps;
|
||||
uint32_t dvalue, wvalue, lvalue, avalue;
|
||||
uint64_t latsum;
|
||||
uint16_t *ptr;
|
||||
uint32_t *lptr;
|
||||
uint16_t *mptr;
|
||||
__le16 *ptr;
|
||||
__le32 *lptr;
|
||||
__le16 *mptr;
|
||||
|
||||
/* Make sure we have a congestion info buffer */
|
||||
if (!phba->cgn_i)
|
||||
@ -5570,7 +5570,7 @@ lpfc_cgn_save_evt_cnt(struct lpfc_hba *phba)
|
||||
if (phba->cgn_fpin_frequency &&
|
||||
phba->cgn_fpin_frequency != LPFC_FPIN_INIT_FREQ) {
|
||||
value = LPFC_CGN_TIMER_TO_MIN / phba->cgn_fpin_frequency;
|
||||
cp->cgn_stat_npm = cpu_to_le32(value);
|
||||
cp->cgn_stat_npm = value;
|
||||
}
|
||||
|
||||
/* Read and clear the latency counters for this minute */
|
||||
@ -5753,7 +5753,7 @@ lpfc_cgn_save_evt_cnt(struct lpfc_hba *phba)
|
||||
dvalue += le32_to_cpu(cp->cgn_drvr_hr[i]);
|
||||
wvalue += le32_to_cpu(cp->cgn_warn_hr[i]);
|
||||
lvalue += le32_to_cpu(cp->cgn_latency_hr[i]);
|
||||
mbps += le32_to_cpu(cp->cgn_bw_hr[i]);
|
||||
mbps += le16_to_cpu(cp->cgn_bw_hr[i]);
|
||||
avalue += le32_to_cpu(cp->cgn_alarm_hr[i]);
|
||||
}
|
||||
if (lvalue) /* Avg of latency averages */
|
||||
@ -8277,11 +8277,11 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
|
||||
return 0;
|
||||
|
||||
out_free_hba_hdwq_info:
|
||||
free_percpu(phba->sli4_hba.c_stat);
|
||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||
free_percpu(phba->sli4_hba.c_stat);
|
||||
out_free_hba_idle_stat:
|
||||
kfree(phba->sli4_hba.idle_stat);
|
||||
#endif
|
||||
kfree(phba->sli4_hba.idle_stat);
|
||||
out_free_hba_eq_info:
|
||||
free_percpu(phba->sli4_hba.eq_info);
|
||||
out_free_hba_cpu_map:
|
||||
@ -13411,8 +13411,8 @@ lpfc_init_congestion_buf(struct lpfc_hba *phba)
|
||||
|
||||
/* last used Index initialized to 0xff already */
|
||||
|
||||
cp->cgn_warn_freq = LPFC_FPIN_INIT_FREQ;
|
||||
cp->cgn_alarm_freq = LPFC_FPIN_INIT_FREQ;
|
||||
cp->cgn_warn_freq = cpu_to_le16(LPFC_FPIN_INIT_FREQ);
|
||||
cp->cgn_alarm_freq = cpu_to_le16(LPFC_FPIN_INIT_FREQ);
|
||||
crc = lpfc_cgn_calc_crc32(cp, LPFC_CGN_INFO_SZ, LPFC_CGN_CRC32_SEED);
|
||||
cp->cgn_info_crc = cpu_to_le32(crc);
|
||||
|
||||
|
@ -1489,9 +1489,7 @@ lpfc_nvme_fcp_io_submit(struct nvme_fc_local_port *pnvme_lport,
|
||||
struct lpfc_nvme_qhandle *lpfc_queue_info;
|
||||
struct lpfc_nvme_fcpreq_priv *freqpriv;
|
||||
struct nvme_common_command *sqe;
|
||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||
uint64_t start = 0;
|
||||
#endif
|
||||
|
||||
/* Validate pointers. LLDD fault handling with transport does
|
||||
* have timing races.
|
||||
|
@ -1495,7 +1495,6 @@ static int
|
||||
lpfc_bg_err_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||
uint8_t *txop, uint8_t *rxop)
|
||||
{
|
||||
uint8_t ret = 0;
|
||||
|
||||
if (sc->prot_flags & SCSI_PROT_IP_CHECKSUM) {
|
||||
switch (scsi_get_prot_op(sc)) {
|
||||
@ -1548,7 +1547,7 @@ lpfc_bg_err_opcodes(struct lpfc_hba *phba, struct scsi_cmnd *sc,
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -5578,12 +5577,8 @@ lpfc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *cmnd)
|
||||
struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
|
||||
int err, idx;
|
||||
u8 *uuid = NULL;
|
||||
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
|
||||
uint64_t start = 0L;
|
||||
uint64_t start;
|
||||
|
||||
if (phba->ktime_on)
|
||||
start = ktime_get_ns();
|
||||
#endif
|
||||
start = ktime_get_ns();
|
||||
rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
|
||||
|
||||
|
@ -22090,6 +22090,7 @@ lpfc_read_object(struct lpfc_hba *phba, char *rdobject, uint32_t *datap,
|
||||
uint32_t shdr_status, shdr_add_status;
|
||||
union lpfc_sli4_cfg_shdr *shdr;
|
||||
struct lpfc_dmabuf *pcmd;
|
||||
u32 rd_object_name[LPFC_MBX_OBJECT_NAME_LEN_DW] = {0};
|
||||
|
||||
/* sanity check on queue memory */
|
||||
if (!datap)
|
||||
@ -22113,10 +22114,10 @@ lpfc_read_object(struct lpfc_hba *phba, char *rdobject, uint32_t *datap,
|
||||
|
||||
memset((void *)read_object->u.request.rd_object_name, 0,
|
||||
LPFC_OBJ_NAME_SZ);
|
||||
sprintf((uint8_t *)read_object->u.request.rd_object_name, rdobject);
|
||||
scnprintf((char *)rd_object_name, sizeof(rd_object_name), rdobject);
|
||||
for (j = 0; j < strlen(rdobject); j++)
|
||||
read_object->u.request.rd_object_name[j] =
|
||||
cpu_to_le32(read_object->u.request.rd_object_name[j]);
|
||||
cpu_to_le32(rd_object_name[j]);
|
||||
|
||||
pcmd = kmalloc(sizeof(*pcmd), GFP_KERNEL);
|
||||
if (pcmd)
|
||||
|
@ -1916,7 +1916,7 @@ void megasas_set_dynamic_target_properties(struct scsi_device *sdev,
|
||||
raid = MR_LdRaidGet(ld, local_map_ptr);
|
||||
|
||||
if (raid->capability.ldPiMode == MR_PROT_INFO_TYPE_CONTROLLER)
|
||||
blk_queue_update_dma_alignment(sdev->request_queue, 0x7);
|
||||
blk_queue_update_dma_alignment(sdev->request_queue, 0x7);
|
||||
|
||||
mr_device_priv_data->is_tm_capable =
|
||||
raid->capability.tmCapable;
|
||||
@ -8033,7 +8033,7 @@ static void megasas_detach_one(struct pci_dev *pdev)
|
||||
|
||||
if (instance->adapter_type != MFI_SERIES) {
|
||||
megasas_release_fusion(instance);
|
||||
pd_seq_map_sz = sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC) +
|
||||
pd_seq_map_sz = sizeof(struct MR_PD_CFG_SEQ_NUM_SYNC) +
|
||||
(sizeof(struct MR_PD_CFG_SEQ) *
|
||||
(MAX_PHYSICAL_DEVICES - 1));
|
||||
for (i = 0; i < 2 ; i++) {
|
||||
@ -8773,8 +8773,7 @@ int megasas_update_device_list(struct megasas_instance *instance,
|
||||
|
||||
if (event_type & SCAN_VD_CHANNEL) {
|
||||
if (!instance->requestorId ||
|
||||
(instance->requestorId &&
|
||||
megasas_get_ld_vf_affiliation(instance, 0))) {
|
||||
megasas_get_ld_vf_affiliation(instance, 0)) {
|
||||
dcmd_ret = megasas_ld_list_query(instance,
|
||||
MR_LD_QUERY_TYPE_EXPOSED_TO_HOST);
|
||||
if (dcmd_ret != DCMD_SUCCESS)
|
||||
|
@ -1582,8 +1582,10 @@ mpt3sas_base_pause_mq_polling(struct MPT3SAS_ADAPTER *ioc)
|
||||
* wait for current poll to complete.
|
||||
*/
|
||||
for (qid = 0; qid < iopoll_q_count; qid++) {
|
||||
while (atomic_read(&ioc->io_uring_poll_queues[qid].busy))
|
||||
while (atomic_read(&ioc->io_uring_poll_queues[qid].busy)) {
|
||||
cpu_relax();
|
||||
udelay(500);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2178,7 +2178,7 @@ mpt3sas_send_diag_release(struct MPT3SAS_ADAPTER *ioc, u8 buffer_type,
|
||||
mpt3sas_check_cmd_timeout(ioc,
|
||||
ioc->ctl_cmds.status, mpi_request,
|
||||
sizeof(Mpi2DiagReleaseRequest_t)/4, reset_needed);
|
||||
*issue_reset = reset_needed;
|
||||
*issue_reset = reset_needed;
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
@ -10749,8 +10749,7 @@ _mpt3sas_fw_work(struct MPT3SAS_ADAPTER *ioc, struct fw_event_work *fw_event)
|
||||
case MPI2_EVENT_PCIE_TOPOLOGY_CHANGE_LIST:
|
||||
_scsih_pcie_topology_change_event(ioc, fw_event);
|
||||
ioc->current_event = NULL;
|
||||
return;
|
||||
break;
|
||||
return;
|
||||
}
|
||||
out:
|
||||
fw_event_work_put(fw_event);
|
||||
|
@ -1939,11 +1939,8 @@ static void ncr_start_next_ccb (struct ncb *np, struct lcb * lp, int maxn);
|
||||
static void ncr_put_start_queue(struct ncb *np, struct ccb *cp);
|
||||
|
||||
static void insert_into_waiting_list(struct ncb *np, struct scsi_cmnd *cmd);
|
||||
static struct scsi_cmnd *retrieve_from_waiting_list(int to_remove, struct ncb *np, struct scsi_cmnd *cmd);
|
||||
static void process_waiting_list(struct ncb *np, int sts);
|
||||
|
||||
#define remove_from_waiting_list(np, cmd) \
|
||||
retrieve_from_waiting_list(1, (np), (cmd))
|
||||
#define requeue_waiting_list(np) process_waiting_list((np), DID_OK)
|
||||
#define reset_waiting_list(np) process_waiting_list((np), DID_RESET)
|
||||
|
||||
@ -7997,26 +7994,6 @@ static void insert_into_waiting_list(struct ncb *np, struct scsi_cmnd *cmd)
|
||||
}
|
||||
}
|
||||
|
||||
static struct scsi_cmnd *retrieve_from_waiting_list(int to_remove, struct ncb *np, struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct scsi_cmnd **pcmd = &np->waiting_list;
|
||||
|
||||
while (*pcmd) {
|
||||
if (cmd == *pcmd) {
|
||||
if (to_remove) {
|
||||
*pcmd = (struct scsi_cmnd *) cmd->next_wcmd;
|
||||
cmd->next_wcmd = NULL;
|
||||
}
|
||||
#ifdef DEBUG_WAITING_LIST
|
||||
printk("%s: cmd %lx retrieved from waiting list\n", ncr_name(np), (u_long) cmd);
|
||||
#endif
|
||||
return cmd;
|
||||
}
|
||||
pcmd = (struct scsi_cmnd **) &(*pcmd)->next_wcmd;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void process_waiting_list(struct ncb *np, int sts)
|
||||
{
|
||||
struct scsi_cmnd *waiting_list, *wcmd;
|
||||
|
@ -7169,7 +7169,8 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
|
||||
return 0;
|
||||
break;
|
||||
case QLA2XXX_INI_MODE_DUAL:
|
||||
if (!qla_dual_mode_enabled(vha))
|
||||
if (!qla_dual_mode_enabled(vha) &&
|
||||
!qla_ini_mode_enabled(vha))
|
||||
return 0;
|
||||
break;
|
||||
case QLA2XXX_INI_MODE_ENABLED:
|
||||
|
@ -441,9 +441,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
|
||||
struct iscsi_transport *t = iface->transport;
|
||||
int param = -1;
|
||||
|
||||
if (attr == &dev_attr_iface_enabled.attr)
|
||||
param = ISCSI_NET_PARAM_IFACE_ENABLE;
|
||||
else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)
|
||||
if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)
|
||||
param = ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO;
|
||||
else if (attr == &dev_attr_iface_header_digest.attr)
|
||||
param = ISCSI_IFACE_PARAM_HDRDGST_EN;
|
||||
@ -483,7 +481,9 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
|
||||
if (param != -1)
|
||||
return t->attr_is_visible(ISCSI_IFACE_PARAM, param);
|
||||
|
||||
if (attr == &dev_attr_iface_vlan_id.attr)
|
||||
if (attr == &dev_attr_iface_enabled.attr)
|
||||
param = ISCSI_NET_PARAM_IFACE_ENABLE;
|
||||
else if (attr == &dev_attr_iface_vlan_id.attr)
|
||||
param = ISCSI_NET_PARAM_VLAN_ID;
|
||||
else if (attr == &dev_attr_iface_vlan_priority.attr)
|
||||
param = ISCSI_NET_PARAM_VLAN_PRIORITY;
|
||||
|
@ -2124,6 +2124,8 @@ sd_spinup_disk(struct scsi_disk *sdkp)
|
||||
retries = 0;
|
||||
|
||||
do {
|
||||
bool media_was_present = sdkp->media_present;
|
||||
|
||||
cmd[0] = TEST_UNIT_READY;
|
||||
memset((void *) &cmd[1], 0, 9);
|
||||
|
||||
@ -2138,7 +2140,8 @@ sd_spinup_disk(struct scsi_disk *sdkp)
|
||||
* with any more polling.
|
||||
*/
|
||||
if (media_not_present(sdkp, &sshdr)) {
|
||||
sd_printk(KERN_NOTICE, sdkp, "Media removed, stopped polling\n");
|
||||
if (media_was_present)
|
||||
sd_printk(KERN_NOTICE, sdkp, "Media removed, stopped polling\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3401,15 +3404,16 @@ static int sd_probe(struct device *dev)
|
||||
}
|
||||
|
||||
device_initialize(&sdkp->dev);
|
||||
sdkp->dev.parent = dev;
|
||||
sdkp->dev.parent = get_device(dev);
|
||||
sdkp->dev.class = &sd_disk_class;
|
||||
dev_set_name(&sdkp->dev, "%s", dev_name(dev));
|
||||
|
||||
error = device_add(&sdkp->dev);
|
||||
if (error)
|
||||
goto out_free_index;
|
||||
if (error) {
|
||||
put_device(&sdkp->dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
get_device(dev);
|
||||
dev_set_drvdata(dev, sdkp);
|
||||
|
||||
gd->major = sd_major((index & 0xf0) >> 4);
|
||||
|
@ -154,8 +154,8 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp,
|
||||
|
||||
/*
|
||||
* Report zone buffer size should be at most 64B times the number of
|
||||
* zones requested plus the 64B reply header, but should be at least
|
||||
* SECTOR_SIZE for ATA devices.
|
||||
* zones requested plus the 64B reply header, but should be aligned
|
||||
* to SECTOR_SIZE for ATA devices.
|
||||
* Make sure that this size does not exceed the hardware capabilities.
|
||||
* Furthermore, since the report zone command cannot be split, make
|
||||
* sure that the allocated buffer can always be mapped by limiting the
|
||||
@ -174,7 +174,7 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp,
|
||||
*buflen = bufsize;
|
||||
return buf;
|
||||
}
|
||||
bufsize >>= 1;
|
||||
bufsize = rounddown(bufsize >> 1, SECTOR_SIZE);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@ -280,7 +280,7 @@ static void sd_zbc_update_wp_offset_workfn(struct work_struct *work)
|
||||
{
|
||||
struct scsi_disk *sdkp;
|
||||
unsigned long flags;
|
||||
unsigned int zno;
|
||||
sector_t zno;
|
||||
int ret;
|
||||
|
||||
sdkp = container_of(work, struct scsi_disk, zone_wp_offset_work);
|
||||
|
@ -87,9 +87,16 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,
|
||||
0
|
||||
};
|
||||
unsigned char recv_page_code;
|
||||
unsigned int retries = SES_RETRIES;
|
||||
struct scsi_sense_hdr sshdr;
|
||||
|
||||
do {
|
||||
ret = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
|
||||
&sshdr, SES_TIMEOUT, 1, NULL);
|
||||
} while (ret > 0 && --retries && scsi_sense_valid(&sshdr) &&
|
||||
(sshdr.sense_key == NOT_READY ||
|
||||
(sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));
|
||||
|
||||
ret = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
|
||||
NULL, SES_TIMEOUT, SES_RETRIES, NULL);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
|
||||
@ -121,9 +128,16 @@ static int ses_send_diag(struct scsi_device *sdev, int page_code,
|
||||
bufflen & 0xff,
|
||||
0
|
||||
};
|
||||
struct scsi_sense_hdr sshdr;
|
||||
unsigned int retries = SES_RETRIES;
|
||||
|
||||
do {
|
||||
result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
|
||||
&sshdr, SES_TIMEOUT, 1, NULL);
|
||||
} while (result > 0 && --retries && scsi_sense_valid(&sshdr) &&
|
||||
(sshdr.sense_key == NOT_READY ||
|
||||
(sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));
|
||||
|
||||
result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
|
||||
NULL, SES_TIMEOUT, SES_RETRIES, NULL);
|
||||
if (result)
|
||||
sdev_printk(KERN_ERR, sdev, "SEND DIAGNOSTIC result: %8x\n",
|
||||
result);
|
||||
|
@ -523,7 +523,7 @@ static int sr_read_sector(Scsi_CD *cd, int lba, int blksize, unsigned char *dest
|
||||
return rc;
|
||||
cd->readcd_known = 0;
|
||||
sr_printk(KERN_INFO, cd,
|
||||
"CDROM does'nt support READ CD (0xbe) command\n");
|
||||
"CDROM doesn't support READ CD (0xbe) command\n");
|
||||
/* fall & retry the other way */
|
||||
}
|
||||
/* ... if this fails, we switch the blocksize using MODE SELECT */
|
||||
|
@ -3823,6 +3823,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
|
||||
case CDROM_SEND_PACKET:
|
||||
if (!capable(CAP_SYS_RAWIO))
|
||||
return -EPERM;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -128,6 +128,81 @@ static int ufs_intel_link_startup_notify(struct ufs_hba *hba,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ufs_intel_set_lanes(struct ufs_hba *hba, u32 lanes)
|
||||
{
|
||||
struct ufs_pa_layer_attr pwr_info = hba->pwr_info;
|
||||
int ret;
|
||||
|
||||
pwr_info.lane_rx = lanes;
|
||||
pwr_info.lane_tx = lanes;
|
||||
ret = ufshcd_config_pwr_mode(hba, &pwr_info);
|
||||
if (ret)
|
||||
dev_err(hba->dev, "%s: Setting %u lanes, err = %d\n",
|
||||
__func__, lanes, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ufs_intel_lkf_pwr_change_notify(struct ufs_hba *hba,
|
||||
enum ufs_notify_change_status status,
|
||||
struct ufs_pa_layer_attr *dev_max_params,
|
||||
struct ufs_pa_layer_attr *dev_req_params)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
switch (status) {
|
||||
case PRE_CHANGE:
|
||||
if (ufshcd_is_hs_mode(dev_max_params) &&
|
||||
(hba->pwr_info.lane_rx != 2 || hba->pwr_info.lane_tx != 2))
|
||||
ufs_intel_set_lanes(hba, 2);
|
||||
memcpy(dev_req_params, dev_max_params, sizeof(*dev_req_params));
|
||||
break;
|
||||
case POST_CHANGE:
|
||||
if (ufshcd_is_hs_mode(dev_req_params)) {
|
||||
u32 peer_granularity;
|
||||
|
||||
usleep_range(1000, 1250);
|
||||
err = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_GRANULARITY),
|
||||
&peer_granularity);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int ufs_intel_lkf_apply_dev_quirks(struct ufs_hba *hba)
|
||||
{
|
||||
u32 granularity, peer_granularity;
|
||||
u32 pa_tactivate, peer_pa_tactivate;
|
||||
int ret;
|
||||
|
||||
ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_GRANULARITY), &granularity);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_GRANULARITY), &peer_granularity);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_TACTIVATE), &pa_tactivate);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = ufshcd_dme_peer_get(hba, UIC_ARG_MIB(PA_TACTIVATE), &peer_pa_tactivate);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (granularity == peer_granularity) {
|
||||
u32 new_peer_pa_tactivate = pa_tactivate + 2;
|
||||
|
||||
ret = ufshcd_dme_peer_set(hba, UIC_ARG_MIB(PA_TACTIVATE), new_peer_pa_tactivate);
|
||||
}
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define INTEL_ACTIVELTR 0x804
|
||||
#define INTEL_IDLELTR 0x808
|
||||
|
||||
@ -351,6 +426,7 @@ static int ufs_intel_lkf_init(struct ufs_hba *hba)
|
||||
struct ufs_host *ufs_host;
|
||||
int err;
|
||||
|
||||
hba->nop_out_timeout = 200;
|
||||
hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8;
|
||||
hba->caps |= UFSHCD_CAP_CRYPTO;
|
||||
err = ufs_intel_common_init(hba);
|
||||
@ -381,6 +457,8 @@ static struct ufs_hba_variant_ops ufs_intel_lkf_hba_vops = {
|
||||
.exit = ufs_intel_common_exit,
|
||||
.hce_enable_notify = ufs_intel_hce_enable_notify,
|
||||
.link_startup_notify = ufs_intel_link_startup_notify,
|
||||
.pwr_change_notify = ufs_intel_lkf_pwr_change_notify,
|
||||
.apply_dev_quirks = ufs_intel_lkf_apply_dev_quirks,
|
||||
.resume = ufs_intel_resume,
|
||||
.device_reset = ufs_intel_device_reset,
|
||||
};
|
||||
|
@ -17,8 +17,6 @@
|
||||
#include <linux/blk-pm.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <scsi/scsi_driver.h>
|
||||
#include <scsi/scsi_transport.h>
|
||||
#include "../scsi_transport_api.h"
|
||||
#include "ufshcd.h"
|
||||
#include "ufs_quirks.h"
|
||||
#include "unipro.h"
|
||||
@ -240,6 +238,7 @@ static int ufshcd_scale_clks(struct ufs_hba *hba, bool scale_up);
|
||||
static irqreturn_t ufshcd_intr(int irq, void *__hba);
|
||||
static int ufshcd_change_power_mode(struct ufs_hba *hba,
|
||||
struct ufs_pa_layer_attr *pwr_mode);
|
||||
static void ufshcd_schedule_eh_work(struct ufs_hba *hba);
|
||||
static int ufshcd_setup_hba_vreg(struct ufs_hba *hba, bool on);
|
||||
static int ufshcd_setup_vreg(struct ufs_hba *hba, bool on);
|
||||
static inline int ufshcd_config_vreg_hpm(struct ufs_hba *hba,
|
||||
@ -2779,8 +2778,13 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
|
||||
out:
|
||||
up_read(&hba->clk_scaling_lock);
|
||||
|
||||
if (ufs_trigger_eh())
|
||||
scsi_schedule_eh(hba->host);
|
||||
if (ufs_trigger_eh()) {
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
ufshcd_schedule_eh_work(hba);
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -3945,35 +3949,6 @@ int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ufshcd_dme_get_attr);
|
||||
|
||||
static inline bool ufshcd_is_saved_err_fatal(struct ufs_hba *hba)
|
||||
{
|
||||
lockdep_assert_held(hba->host->host_lock);
|
||||
|
||||
return (hba->saved_uic_err & UFSHCD_UIC_DL_PA_INIT_ERROR) ||
|
||||
(hba->saved_err & (INT_FATAL_ERRORS | UFSHCD_UIC_HIBERN8_MASK));
|
||||
}
|
||||
|
||||
static void ufshcd_schedule_eh(struct ufs_hba *hba)
|
||||
{
|
||||
bool schedule_eh = false;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
/* handle fatal errors only when link is not in error state */
|
||||
if (hba->ufshcd_state != UFSHCD_STATE_ERROR) {
|
||||
if (hba->force_reset || ufshcd_is_link_broken(hba) ||
|
||||
ufshcd_is_saved_err_fatal(hba))
|
||||
hba->ufshcd_state = UFSHCD_STATE_EH_SCHEDULED_FATAL;
|
||||
else
|
||||
hba->ufshcd_state = UFSHCD_STATE_EH_SCHEDULED_NON_FATAL;
|
||||
schedule_eh = true;
|
||||
}
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
|
||||
if (schedule_eh)
|
||||
scsi_schedule_eh(hba->host);
|
||||
}
|
||||
|
||||
/**
|
||||
* ufshcd_uic_pwr_ctrl - executes UIC commands (which affects the link power
|
||||
* state) and waits for it to take effect.
|
||||
@ -3994,7 +3969,6 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
|
||||
{
|
||||
DECLARE_COMPLETION_ONSTACK(uic_async_done);
|
||||
unsigned long flags;
|
||||
bool schedule_eh = false;
|
||||
u8 status;
|
||||
int ret;
|
||||
bool reenable_intr = false;
|
||||
@ -4064,14 +4038,10 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
|
||||
ufshcd_enable_intr(hba, UIC_COMMAND_COMPL);
|
||||
if (ret) {
|
||||
ufshcd_set_link_broken(hba);
|
||||
schedule_eh = true;
|
||||
ufshcd_schedule_eh_work(hba);
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
|
||||
if (schedule_eh)
|
||||
ufshcd_schedule_eh(hba);
|
||||
mutex_unlock(&hba->uic_cmd_mutex);
|
||||
|
||||
return ret;
|
||||
@ -4802,7 +4772,7 @@ static int ufshcd_verify_dev_init(struct ufs_hba *hba)
|
||||
mutex_lock(&hba->dev_cmd.lock);
|
||||
for (retries = NOP_OUT_RETRIES; retries > 0; retries--) {
|
||||
err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_NOP,
|
||||
NOP_OUT_TIMEOUT);
|
||||
hba->nop_out_timeout);
|
||||
|
||||
if (!err || err == -ETIMEDOUT)
|
||||
break;
|
||||
@ -5941,6 +5911,27 @@ static bool ufshcd_quirk_dl_nac_errors(struct ufs_hba *hba)
|
||||
return err_handling;
|
||||
}
|
||||
|
||||
/* host lock must be held before calling this func */
|
||||
static inline bool ufshcd_is_saved_err_fatal(struct ufs_hba *hba)
|
||||
{
|
||||
return (hba->saved_uic_err & UFSHCD_UIC_DL_PA_INIT_ERROR) ||
|
||||
(hba->saved_err & (INT_FATAL_ERRORS | UFSHCD_UIC_HIBERN8_MASK));
|
||||
}
|
||||
|
||||
/* host lock must be held before calling this func */
|
||||
static inline void ufshcd_schedule_eh_work(struct ufs_hba *hba)
|
||||
{
|
||||
/* handle fatal errors only when link is not in error state */
|
||||
if (hba->ufshcd_state != UFSHCD_STATE_ERROR) {
|
||||
if (hba->force_reset || ufshcd_is_link_broken(hba) ||
|
||||
ufshcd_is_saved_err_fatal(hba))
|
||||
hba->ufshcd_state = UFSHCD_STATE_EH_SCHEDULED_FATAL;
|
||||
else
|
||||
hba->ufshcd_state = UFSHCD_STATE_EH_SCHEDULED_NON_FATAL;
|
||||
queue_work(hba->eh_wq, &hba->eh_work);
|
||||
}
|
||||
}
|
||||
|
||||
static void ufshcd_clk_scaling_allow(struct ufs_hba *hba, bool allow)
|
||||
{
|
||||
down_write(&hba->clk_scaling_lock);
|
||||
@ -6074,11 +6065,11 @@ static bool ufshcd_is_pwr_mode_restore_needed(struct ufs_hba *hba)
|
||||
|
||||
/**
|
||||
* ufshcd_err_handler - handle UFS errors that require s/w attention
|
||||
* @host: SCSI host pointer
|
||||
* @work: pointer to work structure
|
||||
*/
|
||||
static void ufshcd_err_handler(struct Scsi_Host *host)
|
||||
static void ufshcd_err_handler(struct work_struct *work)
|
||||
{
|
||||
struct ufs_hba *hba = shost_priv(host);
|
||||
struct ufs_hba *hba;
|
||||
unsigned long flags;
|
||||
bool err_xfer = false;
|
||||
bool err_tm = false;
|
||||
@ -6086,9 +6077,10 @@ static void ufshcd_err_handler(struct Scsi_Host *host)
|
||||
int tag;
|
||||
bool needs_reset = false, needs_restore = false;
|
||||
|
||||
hba = container_of(work, struct ufs_hba, eh_work);
|
||||
|
||||
down(&hba->host_sem);
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
hba->host->host_eh_scheduled = 0;
|
||||
if (ufshcd_err_handling_should_stop(hba)) {
|
||||
if (hba->ufshcd_state != UFSHCD_STATE_ERROR)
|
||||
hba->ufshcd_state = UFSHCD_STATE_OPERATIONAL;
|
||||
@ -6403,6 +6395,7 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba, u32 intr_status)
|
||||
"host_regs: ");
|
||||
ufshcd_print_pwr_info(hba);
|
||||
}
|
||||
ufshcd_schedule_eh_work(hba);
|
||||
retval |= IRQ_HANDLED;
|
||||
}
|
||||
/*
|
||||
@ -6414,10 +6407,6 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba, u32 intr_status)
|
||||
hba->errors = 0;
|
||||
hba->uic_error = 0;
|
||||
spin_unlock(hba->host->host_lock);
|
||||
|
||||
if (queue_eh_work)
|
||||
ufshcd_schedule_eh(hba);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -6908,7 +6897,7 @@ static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
|
||||
err = ufshcd_clear_cmd(hba, pos);
|
||||
if (err)
|
||||
break;
|
||||
__ufshcd_transfer_req_compl(hba, pos, /*retry_requests=*/true);
|
||||
__ufshcd_transfer_req_compl(hba, 1U << pos, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -7080,17 +7069,15 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
|
||||
* will be to send LU reset which, again, is a spec violation.
|
||||
* To avoid these unnecessary/illegal steps, first we clean up
|
||||
* the lrb taken by this cmd and re-set it in outstanding_reqs,
|
||||
* then queue the error handler and bail.
|
||||
* then queue the eh_work and bail.
|
||||
*/
|
||||
if (lrbp->lun == UFS_UPIU_UFS_DEVICE_WLUN) {
|
||||
ufshcd_update_evt_hist(hba, UFS_EVT_ABORT, lrbp->lun);
|
||||
|
||||
spin_lock_irqsave(host->host_lock, flags);
|
||||
hba->force_reset = true;
|
||||
ufshcd_schedule_eh_work(hba);
|
||||
spin_unlock_irqrestore(host->host_lock, flags);
|
||||
|
||||
ufshcd_schedule_eh(hba);
|
||||
|
||||
goto release;
|
||||
}
|
||||
|
||||
@ -7223,10 +7210,11 @@ static int ufshcd_eh_host_reset_handler(struct scsi_cmnd *cmd)
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
hba->force_reset = true;
|
||||
ufshcd_schedule_eh_work(hba);
|
||||
dev_err(hba->dev, "%s: reset in progress - 1\n", __func__);
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
|
||||
ufshcd_err_handler(hba->host);
|
||||
flush_work(&hba->eh_work);
|
||||
|
||||
spin_lock_irqsave(hba->host->host_lock, flags);
|
||||
if (hba->ufshcd_state == UFSHCD_STATE_ERROR)
|
||||
@ -8636,6 +8624,8 @@ static void ufshcd_hba_exit(struct ufs_hba *hba)
|
||||
if (hba->is_powered) {
|
||||
ufshcd_exit_clk_scaling(hba);
|
||||
ufshcd_exit_clk_gating(hba);
|
||||
if (hba->eh_wq)
|
||||
destroy_workqueue(hba->eh_wq);
|
||||
ufs_debugfs_hba_exit(hba);
|
||||
ufshcd_variant_hba_exit(hba);
|
||||
ufshcd_setup_vreg(hba, false);
|
||||
@ -9480,10 +9470,6 @@ static int ufshcd_set_dma_mask(struct ufs_hba *hba)
|
||||
return dma_set_mask_and_coherent(hba->dev, DMA_BIT_MASK(32));
|
||||
}
|
||||
|
||||
static struct scsi_transport_template ufshcd_transport_template = {
|
||||
.eh_strategy_handler = ufshcd_err_handler,
|
||||
};
|
||||
|
||||
/**
|
||||
* ufshcd_alloc_host - allocate Host Bus Adapter (HBA)
|
||||
* @dev: pointer to device handle
|
||||
@ -9510,11 +9496,11 @@ int ufshcd_alloc_host(struct device *dev, struct ufs_hba **hba_handle)
|
||||
err = -ENOMEM;
|
||||
goto out_error;
|
||||
}
|
||||
host->transportt = &ufshcd_transport_template;
|
||||
hba = shost_priv(host);
|
||||
hba->host = host;
|
||||
hba->dev = dev;
|
||||
hba->dev_ref_clk_freq = REF_CLK_FREQ_INVAL;
|
||||
hba->nop_out_timeout = NOP_OUT_TIMEOUT;
|
||||
hba->sg_entry_size = sizeof(struct ufshcd_sg_entry);
|
||||
INIT_LIST_HEAD(&hba->clk_list_head);
|
||||
spin_lock_init(&hba->outstanding_lock);
|
||||
@ -9550,6 +9536,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
||||
int err;
|
||||
struct Scsi_Host *host = hba->host;
|
||||
struct device *dev = hba->dev;
|
||||
char eh_wq_name[sizeof("ufs_eh_wq_00")];
|
||||
|
||||
if (!mmio_base) {
|
||||
dev_err(hba->dev,
|
||||
@ -9603,6 +9590,17 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
||||
|
||||
hba->max_pwr_info.is_valid = false;
|
||||
|
||||
/* Initialize work queues */
|
||||
snprintf(eh_wq_name, sizeof(eh_wq_name), "ufs_eh_wq_%d",
|
||||
hba->host->host_no);
|
||||
hba->eh_wq = create_singlethread_workqueue(eh_wq_name);
|
||||
if (!hba->eh_wq) {
|
||||
dev_err(hba->dev, "%s: failed to create eh workqueue\n",
|
||||
__func__);
|
||||
err = -ENOMEM;
|
||||
goto out_disable;
|
||||
}
|
||||
INIT_WORK(&hba->eh_work, ufshcd_err_handler);
|
||||
INIT_WORK(&hba->eeh_work, ufshcd_exception_event_handler);
|
||||
|
||||
sema_init(&hba->host_sem, 1);
|
||||
|
@ -765,6 +765,8 @@ struct ufs_hba_monitor {
|
||||
* @is_powered: flag to check if HBA is powered
|
||||
* @shutting_down: flag to check if shutdown has been invoked
|
||||
* @host_sem: semaphore used to serialize concurrent contexts
|
||||
* @eh_wq: Workqueue that eh_work works on
|
||||
* @eh_work: Worker to handle UFS errors that require s/w attention
|
||||
* @eeh_work: Worker to handle exception events
|
||||
* @errors: HBA errors
|
||||
* @uic_error: UFS interconnect layer error status
|
||||
@ -868,6 +870,8 @@ struct ufs_hba {
|
||||
struct semaphore host_sem;
|
||||
|
||||
/* Work Queues */
|
||||
struct workqueue_struct *eh_wq;
|
||||
struct work_struct eh_work;
|
||||
struct work_struct eeh_work;
|
||||
|
||||
/* HBA Errors */
|
||||
@ -883,6 +887,7 @@ struct ufs_hba {
|
||||
/* Device management request data */
|
||||
struct ufs_dev_cmd dev_cmd;
|
||||
ktime_t last_dme_cmd_tstamp;
|
||||
int nop_out_timeout;
|
||||
|
||||
/* Keeps information of the UFS device connected to this host */
|
||||
struct ufs_dev_info dev_info;
|
||||
|
@ -333,9 +333,8 @@ ufshpb_get_pos_from_lpn(struct ufshpb_lu *hpb, unsigned long lpn, int *rgn_idx,
|
||||
}
|
||||
|
||||
static void
|
||||
ufshpb_set_hpb_read_to_upiu(struct ufs_hba *hba, struct ufshpb_lu *hpb,
|
||||
struct ufshcd_lrb *lrbp, u32 lpn, __be64 ppn,
|
||||
u8 transfer_len, int read_id)
|
||||
ufshpb_set_hpb_read_to_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
|
||||
__be64 ppn, u8 transfer_len, int read_id)
|
||||
{
|
||||
unsigned char *cdb = lrbp->cmd->cmnd;
|
||||
__be64 ppn_tmp = ppn;
|
||||
@ -703,8 +702,7 @@ int ufshpb_prep(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
|
||||
}
|
||||
}
|
||||
|
||||
ufshpb_set_hpb_read_to_upiu(hba, hpb, lrbp, lpn, ppn, transfer_len,
|
||||
read_id);
|
||||
ufshpb_set_hpb_read_to_upiu(hba, lrbp, ppn, transfer_len, read_id);
|
||||
|
||||
hpb->stats.hit_cnt++;
|
||||
return 0;
|
||||
|
@ -761,6 +761,17 @@ static void gb_tty_port_shutdown(struct tty_port *port)
|
||||
gbphy_runtime_put_autosuspend(gb_tty->gbphy_dev);
|
||||
}
|
||||
|
||||
static void gb_tty_port_destruct(struct tty_port *port)
|
||||
{
|
||||
struct gb_tty *gb_tty = container_of(port, struct gb_tty, port);
|
||||
|
||||
if (gb_tty->minor != GB_NUM_MINORS)
|
||||
release_minor(gb_tty);
|
||||
kfifo_free(&gb_tty->write_fifo);
|
||||
kfree(gb_tty->buffer);
|
||||
kfree(gb_tty);
|
||||
}
|
||||
|
||||
static const struct tty_operations gb_ops = {
|
||||
.install = gb_tty_install,
|
||||
.open = gb_tty_open,
|
||||
@ -786,6 +797,7 @@ static const struct tty_port_operations gb_port_ops = {
|
||||
.dtr_rts = gb_tty_dtr_rts,
|
||||
.activate = gb_tty_port_activate,
|
||||
.shutdown = gb_tty_port_shutdown,
|
||||
.destruct = gb_tty_port_destruct,
|
||||
};
|
||||
|
||||
static int gb_uart_probe(struct gbphy_device *gbphy_dev,
|
||||
@ -798,17 +810,11 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
|
||||
int retval;
|
||||
int minor;
|
||||
|
||||
gb_tty = kzalloc(sizeof(*gb_tty), GFP_KERNEL);
|
||||
if (!gb_tty)
|
||||
return -ENOMEM;
|
||||
|
||||
connection = gb_connection_create(gbphy_dev->bundle,
|
||||
le16_to_cpu(gbphy_dev->cport_desc->id),
|
||||
gb_uart_request_handler);
|
||||
if (IS_ERR(connection)) {
|
||||
retval = PTR_ERR(connection);
|
||||
goto exit_tty_free;
|
||||
}
|
||||
if (IS_ERR(connection))
|
||||
return PTR_ERR(connection);
|
||||
|
||||
max_payload = gb_operation_get_payload_size_max(connection);
|
||||
if (max_payload < sizeof(struct gb_uart_send_data_request)) {
|
||||
@ -816,13 +822,23 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
|
||||
goto exit_connection_destroy;
|
||||
}
|
||||
|
||||
gb_tty = kzalloc(sizeof(*gb_tty), GFP_KERNEL);
|
||||
if (!gb_tty) {
|
||||
retval = -ENOMEM;
|
||||
goto exit_connection_destroy;
|
||||
}
|
||||
|
||||
tty_port_init(&gb_tty->port);
|
||||
gb_tty->port.ops = &gb_port_ops;
|
||||
gb_tty->minor = GB_NUM_MINORS;
|
||||
|
||||
gb_tty->buffer_payload_max = max_payload -
|
||||
sizeof(struct gb_uart_send_data_request);
|
||||
|
||||
gb_tty->buffer = kzalloc(gb_tty->buffer_payload_max, GFP_KERNEL);
|
||||
if (!gb_tty->buffer) {
|
||||
retval = -ENOMEM;
|
||||
goto exit_connection_destroy;
|
||||
goto exit_put_port;
|
||||
}
|
||||
|
||||
INIT_WORK(&gb_tty->tx_work, gb_uart_tx_write_work);
|
||||
@ -830,7 +846,7 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
|
||||
retval = kfifo_alloc(&gb_tty->write_fifo, GB_UART_WRITE_FIFO_SIZE,
|
||||
GFP_KERNEL);
|
||||
if (retval)
|
||||
goto exit_buf_free;
|
||||
goto exit_put_port;
|
||||
|
||||
gb_tty->credits = GB_UART_FIRMWARE_CREDITS;
|
||||
init_completion(&gb_tty->credits_complete);
|
||||
@ -844,7 +860,7 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
|
||||
} else {
|
||||
retval = minor;
|
||||
}
|
||||
goto exit_kfifo_free;
|
||||
goto exit_put_port;
|
||||
}
|
||||
|
||||
gb_tty->minor = minor;
|
||||
@ -853,9 +869,6 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
|
||||
init_waitqueue_head(&gb_tty->wioctl);
|
||||
mutex_init(&gb_tty->mutex);
|
||||
|
||||
tty_port_init(&gb_tty->port);
|
||||
gb_tty->port.ops = &gb_port_ops;
|
||||
|
||||
gb_tty->connection = connection;
|
||||
gb_tty->gbphy_dev = gbphy_dev;
|
||||
gb_connection_set_data(connection, gb_tty);
|
||||
@ -863,7 +876,7 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
|
||||
|
||||
retval = gb_connection_enable_tx(connection);
|
||||
if (retval)
|
||||
goto exit_release_minor;
|
||||
goto exit_put_port;
|
||||
|
||||
send_control(gb_tty, gb_tty->ctrlout);
|
||||
|
||||
@ -890,16 +903,10 @@ static int gb_uart_probe(struct gbphy_device *gbphy_dev,
|
||||
|
||||
exit_connection_disable:
|
||||
gb_connection_disable(connection);
|
||||
exit_release_minor:
|
||||
release_minor(gb_tty);
|
||||
exit_kfifo_free:
|
||||
kfifo_free(&gb_tty->write_fifo);
|
||||
exit_buf_free:
|
||||
kfree(gb_tty->buffer);
|
||||
exit_put_port:
|
||||
tty_port_put(&gb_tty->port);
|
||||
exit_connection_destroy:
|
||||
gb_connection_destroy(connection);
|
||||
exit_tty_free:
|
||||
kfree(gb_tty);
|
||||
|
||||
return retval;
|
||||
}
|
||||
@ -930,15 +937,10 @@ static void gb_uart_remove(struct gbphy_device *gbphy_dev)
|
||||
gb_connection_disable_rx(connection);
|
||||
tty_unregister_device(gb_tty_driver, gb_tty->minor);
|
||||
|
||||
/* FIXME - free transmit / receive buffers */
|
||||
|
||||
gb_connection_disable(connection);
|
||||
tty_port_destroy(&gb_tty->port);
|
||||
gb_connection_destroy(connection);
|
||||
release_minor(gb_tty);
|
||||
kfifo_free(&gb_tty->write_fifo);
|
||||
kfree(gb_tty->buffer);
|
||||
kfree(gb_tty);
|
||||
|
||||
tty_port_put(&gb_tty->port);
|
||||
}
|
||||
|
||||
static int gb_tty_init(void)
|
||||
|
@ -5372,8 +5372,8 @@ static int rtw_mp_read_reg(struct net_device *dev,
|
||||
|
||||
pnext++;
|
||||
if (*pnext != '\0') {
|
||||
strtout = simple_strtoul(pnext, &ptmp, 16);
|
||||
sprintf(extra, "%s %d", extra, strtout);
|
||||
strtout = simple_strtoul(pnext, &ptmp, 16);
|
||||
sprintf(extra + strlen(extra), " %d", strtout);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@ -5405,7 +5405,7 @@ static int rtw_mp_read_reg(struct net_device *dev,
|
||||
pnext++;
|
||||
if (*pnext != '\0') {
|
||||
strtout = simple_strtoul(pnext, &ptmp, 16);
|
||||
sprintf(extra, "%s %d", extra, strtout);
|
||||
sprintf(extra + strlen(extra), " %d", strtout);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
@ -5512,7 +5512,7 @@ static int rtw_mp_read_rf(struct net_device *dev,
|
||||
pnext++;
|
||||
if (*pnext != '\0') {
|
||||
strtou = simple_strtoul(pnext, &ptmp, 16);
|
||||
sprintf(extra, "%s %d", extra, strtou);
|
||||
sprintf(extra + strlen(extra), " %d", strtou);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
|
@ -1110,20 +1110,24 @@ static ssize_t alua_support_store(struct config_item *item,
|
||||
{
|
||||
struct se_dev_attrib *da = to_attrib(item);
|
||||
struct se_device *dev = da->da_dev;
|
||||
bool flag;
|
||||
bool flag, oldflag;
|
||||
int ret;
|
||||
|
||||
ret = strtobool(page, &flag);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
oldflag = !(dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA);
|
||||
if (flag == oldflag)
|
||||
return count;
|
||||
|
||||
if (!(dev->transport->transport_flags_changeable &
|
||||
TRANSPORT_FLAG_PASSTHROUGH_ALUA)) {
|
||||
pr_err("dev[%p]: Unable to change SE Device alua_support:"
|
||||
" alua_support has fixed value\n", dev);
|
||||
return -EINVAL;
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
ret = strtobool(page, &flag);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (flag)
|
||||
dev->transport_flags &= ~TRANSPORT_FLAG_PASSTHROUGH_ALUA;
|
||||
else
|
||||
@ -1145,20 +1149,24 @@ static ssize_t pgr_support_store(struct config_item *item,
|
||||
{
|
||||
struct se_dev_attrib *da = to_attrib(item);
|
||||
struct se_device *dev = da->da_dev;
|
||||
bool flag;
|
||||
bool flag, oldflag;
|
||||
int ret;
|
||||
|
||||
ret = strtobool(page, &flag);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
oldflag = !(dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR);
|
||||
if (flag == oldflag)
|
||||
return count;
|
||||
|
||||
if (!(dev->transport->transport_flags_changeable &
|
||||
TRANSPORT_FLAG_PASSTHROUGH_PGR)) {
|
||||
pr_err("dev[%p]: Unable to change SE Device pgr_support:"
|
||||
" pgr_support has fixed value\n", dev);
|
||||
return -EINVAL;
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
ret = strtobool(page, &flag);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (flag)
|
||||
dev->transport_flags &= ~TRANSPORT_FLAG_PASSTHROUGH_PGR;
|
||||
else
|
||||
|
@ -269,7 +269,7 @@ target_scsi2_reservation_reserve(struct se_cmd *cmd)
|
||||
spin_lock(&dev->dev_reservation_lock);
|
||||
if (dev->reservation_holder &&
|
||||
dev->reservation_holder->se_node_acl != sess->se_node_acl) {
|
||||
pr_err("SCSI-2 RESERVATION CONFLIFT for %s fabric\n",
|
||||
pr_err("SCSI-2 RESERVATION CONFLICT for %s fabric\n",
|
||||
tpg->se_tpg_tfo->fabric_name);
|
||||
pr_err("Original reserver LUN: %llu %s\n",
|
||||
cmd->se_lun->unpacked_lun,
|
||||
|
@ -107,7 +107,7 @@ static int tcc_offset_update(unsigned int tcc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int tcc_offset_save;
|
||||
static int tcc_offset_save = -1;
|
||||
|
||||
static ssize_t tcc_offset_degree_celsius_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
@ -352,7 +352,8 @@ int proc_thermal_resume(struct device *dev)
|
||||
proc_dev = dev_get_drvdata(dev);
|
||||
proc_thermal_read_ppcc(proc_dev);
|
||||
|
||||
tcc_offset_update(tcc_offset_save);
|
||||
if (tcc_offset_save >= 0)
|
||||
tcc_offset_update(tcc_offset_save);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -417,7 +417,7 @@ static irqreturn_t tsens_critical_irq_thread(int irq, void *data)
|
||||
const struct tsens_sensor *s = &priv->sensor[i];
|
||||
u32 hw_id = s->hw_id;
|
||||
|
||||
if (IS_ERR(s->tzd))
|
||||
if (!s->tzd)
|
||||
continue;
|
||||
if (!tsens_threshold_violated(priv, hw_id, &d))
|
||||
continue;
|
||||
@ -467,7 +467,7 @@ static irqreturn_t tsens_irq_thread(int irq, void *data)
|
||||
const struct tsens_sensor *s = &priv->sensor[i];
|
||||
u32 hw_id = s->hw_id;
|
||||
|
||||
if (IS_ERR(s->tzd))
|
||||
if (!s->tzd)
|
||||
continue;
|
||||
if (!tsens_threshold_violated(priv, hw_id, &d))
|
||||
continue;
|
||||
|
@ -222,15 +222,14 @@ int thermal_build_list_of_policies(char *buf)
|
||||
{
|
||||
struct thermal_governor *pos;
|
||||
ssize_t count = 0;
|
||||
ssize_t size = PAGE_SIZE;
|
||||
|
||||
mutex_lock(&thermal_governor_lock);
|
||||
|
||||
list_for_each_entry(pos, &thermal_governor_list, governor_list) {
|
||||
size = PAGE_SIZE - count;
|
||||
count += scnprintf(buf + count, size, "%s ", pos->name);
|
||||
count += scnprintf(buf + count, PAGE_SIZE - count, "%s ",
|
||||
pos->name);
|
||||
}
|
||||
count += scnprintf(buf + count, size, "\n");
|
||||
count += scnprintf(buf + count, PAGE_SIZE - count, "\n");
|
||||
|
||||
mutex_unlock(&thermal_governor_lock);
|
||||
|
||||
|
@ -106,7 +106,7 @@
|
||||
#define UART_OMAP_EFR2_TIMEOUT_BEHAVE BIT(6)
|
||||
|
||||
/* RX FIFO occupancy indicator */
|
||||
#define UART_OMAP_RX_LVL 0x64
|
||||
#define UART_OMAP_RX_LVL 0x19
|
||||
|
||||
struct omap8250_priv {
|
||||
int line;
|
||||
|
@ -163,7 +163,7 @@ static unsigned int mvebu_uart_tx_empty(struct uart_port *port)
|
||||
st = readl(port->membase + UART_STAT);
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
||||
return (st & STAT_TX_FIFO_EMP) ? TIOCSER_TEMT : 0;
|
||||
return (st & STAT_TX_EMP) ? TIOCSER_TEMT : 0;
|
||||
}
|
||||
|
||||
static unsigned int mvebu_uart_get_mctrl(struct uart_port *port)
|
||||
|
@ -438,8 +438,8 @@ static void reset_tbufs(struct slgt_info *info);
|
||||
static void tdma_reset(struct slgt_info *info);
|
||||
static bool tx_load(struct slgt_info *info, const char *buf, unsigned int count);
|
||||
|
||||
static void get_signals(struct slgt_info *info);
|
||||
static void set_signals(struct slgt_info *info);
|
||||
static void get_gtsignals(struct slgt_info *info);
|
||||
static void set_gtsignals(struct slgt_info *info);
|
||||
static void set_rate(struct slgt_info *info, u32 data_rate);
|
||||
|
||||
static void bh_transmit(struct slgt_info *info);
|
||||
@ -720,7 +720,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
|
||||
if ((old_termios->c_cflag & CBAUD) && !C_BAUD(tty)) {
|
||||
info->signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
}
|
||||
|
||||
@ -730,7 +730,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
|
||||
if (!C_CRTSCTS(tty) || !tty_throttled(tty))
|
||||
info->signals |= SerialSignal_RTS;
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
}
|
||||
|
||||
@ -1181,7 +1181,7 @@ static inline void line_info(struct seq_file *m, struct slgt_info *info)
|
||||
|
||||
/* output current serial signal states */
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
get_signals(info);
|
||||
get_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
|
||||
stat_buf[0] = 0;
|
||||
@ -1281,7 +1281,7 @@ static void throttle(struct tty_struct * tty)
|
||||
if (C_CRTSCTS(tty)) {
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
info->signals &= ~SerialSignal_RTS;
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
}
|
||||
}
|
||||
@ -1306,7 +1306,7 @@ static void unthrottle(struct tty_struct * tty)
|
||||
if (C_CRTSCTS(tty)) {
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
info->signals |= SerialSignal_RTS;
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
}
|
||||
}
|
||||
@ -1477,7 +1477,7 @@ static int hdlcdev_open(struct net_device *dev)
|
||||
|
||||
/* inform generic HDLC layer of current DCD status */
|
||||
spin_lock_irqsave(&info->lock, flags);
|
||||
get_signals(info);
|
||||
get_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock, flags);
|
||||
if (info->signals & SerialSignal_DCD)
|
||||
netif_carrier_on(dev);
|
||||
@ -2229,7 +2229,7 @@ static void isr_txeom(struct slgt_info *info, unsigned short status)
|
||||
if (info->params.mode != MGSL_MODE_ASYNC && info->drop_rts_on_tx_done) {
|
||||
info->signals &= ~SerialSignal_RTS;
|
||||
info->drop_rts_on_tx_done = false;
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
}
|
||||
|
||||
#if SYNCLINK_GENERIC_HDLC
|
||||
@ -2394,7 +2394,7 @@ static void shutdown(struct slgt_info *info)
|
||||
|
||||
if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
|
||||
info->signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
}
|
||||
|
||||
flush_cond_wait(&info->gpio_wait_q);
|
||||
@ -2422,7 +2422,7 @@ static void program_hw(struct slgt_info *info)
|
||||
else
|
||||
async_mode(info);
|
||||
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
|
||||
info->dcd_chkcount = 0;
|
||||
info->cts_chkcount = 0;
|
||||
@ -2430,7 +2430,7 @@ static void program_hw(struct slgt_info *info)
|
||||
info->dsr_chkcount = 0;
|
||||
|
||||
slgt_irq_on(info, IRQ_DCD | IRQ_CTS | IRQ_DSR | IRQ_RI);
|
||||
get_signals(info);
|
||||
get_gtsignals(info);
|
||||
|
||||
if (info->netcount ||
|
||||
(info->port.tty && info->port.tty->termios.c_cflag & CREAD))
|
||||
@ -2667,7 +2667,7 @@ static int wait_mgsl_event(struct slgt_info *info, int __user *mask_ptr)
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
|
||||
/* return immediately if state matches requested events */
|
||||
get_signals(info);
|
||||
get_gtsignals(info);
|
||||
s = info->signals;
|
||||
|
||||
events = mask &
|
||||
@ -3085,7 +3085,7 @@ static int tiocmget(struct tty_struct *tty)
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
get_signals(info);
|
||||
get_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
|
||||
result = ((info->signals & SerialSignal_RTS) ? TIOCM_RTS:0) +
|
||||
@ -3124,7 +3124,7 @@ static int tiocmset(struct tty_struct *tty,
|
||||
info->signals &= ~SerialSignal_DTR;
|
||||
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
return 0;
|
||||
}
|
||||
@ -3135,7 +3135,7 @@ static int carrier_raised(struct tty_port *port)
|
||||
struct slgt_info *info = container_of(port, struct slgt_info, port);
|
||||
|
||||
spin_lock_irqsave(&info->lock,flags);
|
||||
get_signals(info);
|
||||
get_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
return (info->signals & SerialSignal_DCD) ? 1 : 0;
|
||||
}
|
||||
@ -3150,7 +3150,7 @@ static void dtr_rts(struct tty_port *port, int on)
|
||||
info->signals |= SerialSignal_RTS | SerialSignal_DTR;
|
||||
else
|
||||
info->signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
spin_unlock_irqrestore(&info->lock,flags);
|
||||
}
|
||||
|
||||
@ -3948,10 +3948,10 @@ static void tx_start(struct slgt_info *info)
|
||||
|
||||
if (info->params.mode != MGSL_MODE_ASYNC) {
|
||||
if (info->params.flags & HDLC_FLAG_AUTO_RTS) {
|
||||
get_signals(info);
|
||||
get_gtsignals(info);
|
||||
if (!(info->signals & SerialSignal_RTS)) {
|
||||
info->signals |= SerialSignal_RTS;
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
info->drop_rts_on_tx_done = true;
|
||||
}
|
||||
}
|
||||
@ -4005,7 +4005,7 @@ static void reset_port(struct slgt_info *info)
|
||||
rx_stop(info);
|
||||
|
||||
info->signals &= ~(SerialSignal_RTS | SerialSignal_DTR);
|
||||
set_signals(info);
|
||||
set_gtsignals(info);
|
||||
|
||||
slgt_irq_off(info, IRQ_ALL | IRQ_MASTER);
|
||||
}
|
||||
@ -4427,7 +4427,7 @@ static void tx_set_idle(struct slgt_info *info)
|
||||
/*
|
||||
* get state of V24 status (input) signals
|
||||
*/
|
||||
static void get_signals(struct slgt_info *info)
|
||||
static void get_gtsignals(struct slgt_info *info)
|
||||
{
|
||||
unsigned short status = rd_reg16(info, SSR);
|
||||
|
||||
@ -4489,7 +4489,7 @@ static void msc_set_vcr(struct slgt_info *info)
|
||||
/*
|
||||
* set state of V24 control (output) signals
|
||||
*/
|
||||
static void set_signals(struct slgt_info *info)
|
||||
static void set_gtsignals(struct slgt_info *info)
|
||||
{
|
||||
unsigned char val = rd_reg8(info, VCR);
|
||||
if (info->signals & SerialSignal_DTR)
|
||||
|
@ -812,7 +812,6 @@ void tty_ldisc_release(struct tty_struct *tty)
|
||||
|
||||
tty_ldisc_debug(tty, "released\n");
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tty_ldisc_release);
|
||||
|
||||
/**
|
||||
* tty_ldisc_init - ldisc setup for new tty
|
||||
|
@ -1100,6 +1100,19 @@ static int cdns3_ep_run_stream_transfer(struct cdns3_endpoint *priv_ep,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void cdns3_rearm_drdy_if_needed(struct cdns3_endpoint *priv_ep)
|
||||
{
|
||||
struct cdns3_device *priv_dev = priv_ep->cdns3_dev;
|
||||
|
||||
if (priv_dev->dev_ver < DEV_VER_V3)
|
||||
return;
|
||||
|
||||
if (readl(&priv_dev->regs->ep_sts) & EP_STS_TRBERR) {
|
||||
writel(EP_STS_TRBERR, &priv_dev->regs->ep_sts);
|
||||
writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* cdns3_ep_run_transfer - start transfer on no-default endpoint hardware
|
||||
* @priv_ep: endpoint object
|
||||
@ -1351,6 +1364,7 @@ static int cdns3_ep_run_transfer(struct cdns3_endpoint *priv_ep,
|
||||
/*clearing TRBERR and EP_STS_DESCMIS before seting DRDY*/
|
||||
writel(EP_STS_TRBERR | EP_STS_DESCMIS, &priv_dev->regs->ep_sts);
|
||||
writel(EP_CMD_DRDY, &priv_dev->regs->ep_cmd);
|
||||
cdns3_rearm_drdy_if_needed(priv_ep);
|
||||
trace_cdns3_doorbell_epx(priv_ep->name,
|
||||
readl(&priv_dev->regs->ep_traddr));
|
||||
}
|
||||
|
@ -726,7 +726,8 @@ static void acm_port_destruct(struct tty_port *port)
|
||||
{
|
||||
struct acm *acm = container_of(port, struct acm, port);
|
||||
|
||||
acm_release_minor(acm);
|
||||
if (acm->minor != ACM_MINOR_INVALID)
|
||||
acm_release_minor(acm);
|
||||
usb_put_intf(acm->control);
|
||||
kfree(acm->country_codes);
|
||||
kfree(acm);
|
||||
@ -1323,8 +1324,10 @@ static int acm_probe(struct usb_interface *intf,
|
||||
usb_get_intf(acm->control); /* undone in destruct() */
|
||||
|
||||
minor = acm_alloc_minor(acm);
|
||||
if (minor < 0)
|
||||
if (minor < 0) {
|
||||
acm->minor = ACM_MINOR_INVALID;
|
||||
goto err_put_port;
|
||||
}
|
||||
|
||||
acm->minor = minor;
|
||||
acm->dev = usb_dev;
|
||||
|
@ -22,6 +22,8 @@
|
||||
#define ACM_TTY_MAJOR 166
|
||||
#define ACM_TTY_MINORS 256
|
||||
|
||||
#define ACM_MINOR_INVALID ACM_TTY_MINORS
|
||||
|
||||
/*
|
||||
* Requests.
|
||||
*/
|
||||
|
@ -2760,6 +2760,26 @@ static void usb_put_invalidate_rhdev(struct usb_hcd *hcd)
|
||||
usb_put_dev(rhdev);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_stop_hcd - Halt the HCD
|
||||
* @hcd: the usb_hcd that has to be halted
|
||||
*
|
||||
* Stop the root-hub polling timer and invoke the HCD's ->stop callback.
|
||||
*/
|
||||
static void usb_stop_hcd(struct usb_hcd *hcd)
|
||||
{
|
||||
hcd->rh_pollable = 0;
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
|
||||
hcd->driver->stop(hcd);
|
||||
hcd->state = HC_STATE_HALT;
|
||||
|
||||
/* In case the HCD restarted the timer, stop it again. */
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_add_hcd - finish generic HCD structure initialization and register
|
||||
* @hcd: the usb_hcd structure to initialize
|
||||
@ -2775,6 +2795,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
|
||||
{
|
||||
int retval;
|
||||
struct usb_device *rhdev;
|
||||
struct usb_hcd *shared_hcd;
|
||||
|
||||
if (!hcd->skip_phy_initialization && usb_hcd_is_primary_hcd(hcd)) {
|
||||
hcd->phy_roothub = usb_phy_roothub_alloc(hcd->self.sysdev);
|
||||
@ -2935,24 +2956,31 @@ int usb_add_hcd(struct usb_hcd *hcd,
|
||||
goto err_hcd_driver_start;
|
||||
}
|
||||
|
||||
/* starting here, usbcore will pay attention to this root hub */
|
||||
retval = register_root_hub(hcd);
|
||||
if (retval != 0)
|
||||
goto err_register_root_hub;
|
||||
/* starting here, usbcore will pay attention to the shared HCD roothub */
|
||||
shared_hcd = hcd->shared_hcd;
|
||||
if (!usb_hcd_is_primary_hcd(hcd) && shared_hcd && HCD_DEFER_RH_REGISTER(shared_hcd)) {
|
||||
retval = register_root_hub(shared_hcd);
|
||||
if (retval != 0)
|
||||
goto err_register_root_hub;
|
||||
|
||||
if (hcd->uses_new_polling && HCD_POLL_RH(hcd))
|
||||
usb_hcd_poll_rh_status(hcd);
|
||||
if (shared_hcd->uses_new_polling && HCD_POLL_RH(shared_hcd))
|
||||
usb_hcd_poll_rh_status(shared_hcd);
|
||||
}
|
||||
|
||||
/* starting here, usbcore will pay attention to this root hub */
|
||||
if (!HCD_DEFER_RH_REGISTER(hcd)) {
|
||||
retval = register_root_hub(hcd);
|
||||
if (retval != 0)
|
||||
goto err_register_root_hub;
|
||||
|
||||
if (hcd->uses_new_polling && HCD_POLL_RH(hcd))
|
||||
usb_hcd_poll_rh_status(hcd);
|
||||
}
|
||||
|
||||
return retval;
|
||||
|
||||
err_register_root_hub:
|
||||
hcd->rh_pollable = 0;
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
hcd->driver->stop(hcd);
|
||||
hcd->state = HC_STATE_HALT;
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
usb_stop_hcd(hcd);
|
||||
err_hcd_driver_start:
|
||||
if (usb_hcd_is_primary_hcd(hcd) && hcd->irq > 0)
|
||||
free_irq(irqnum, hcd);
|
||||
@ -2985,6 +3013,7 @@ EXPORT_SYMBOL_GPL(usb_add_hcd);
|
||||
void usb_remove_hcd(struct usb_hcd *hcd)
|
||||
{
|
||||
struct usb_device *rhdev = hcd->self.root_hub;
|
||||
bool rh_registered;
|
||||
|
||||
dev_info(hcd->self.controller, "remove, state %x\n", hcd->state);
|
||||
|
||||
@ -2995,6 +3024,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)
|
||||
|
||||
dev_dbg(hcd->self.controller, "roothub graceful disconnect\n");
|
||||
spin_lock_irq (&hcd_root_hub_lock);
|
||||
rh_registered = hcd->rh_registered;
|
||||
hcd->rh_registered = 0;
|
||||
spin_unlock_irq (&hcd_root_hub_lock);
|
||||
|
||||
@ -3004,7 +3034,8 @@ void usb_remove_hcd(struct usb_hcd *hcd)
|
||||
cancel_work_sync(&hcd->died_work);
|
||||
|
||||
mutex_lock(&usb_bus_idr_lock);
|
||||
usb_disconnect(&rhdev); /* Sets rhdev to NULL */
|
||||
if (rh_registered)
|
||||
usb_disconnect(&rhdev); /* Sets rhdev to NULL */
|
||||
mutex_unlock(&usb_bus_idr_lock);
|
||||
|
||||
/*
|
||||
@ -3022,16 +3053,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)
|
||||
* interrupt occurs), but usb_hcd_poll_rh_status() won't invoke
|
||||
* the hub_status_data() callback.
|
||||
*/
|
||||
hcd->rh_pollable = 0;
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
|
||||
hcd->driver->stop(hcd);
|
||||
hcd->state = HC_STATE_HALT;
|
||||
|
||||
/* In case the HCD restarted the timer, stop it again. */
|
||||
clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
|
||||
del_timer_sync(&hcd->rh_timer);
|
||||
usb_stop_hcd(hcd);
|
||||
|
||||
if (usb_hcd_is_primary_hcd(hcd)) {
|
||||
if (hcd->irq > 0)
|
||||
|
@ -115,10 +115,16 @@ static inline bool using_desc_dma(struct dwc2_hsotg *hsotg)
|
||||
*/
|
||||
static inline void dwc2_gadget_incr_frame_num(struct dwc2_hsotg_ep *hs_ep)
|
||||
{
|
||||
struct dwc2_hsotg *hsotg = hs_ep->parent;
|
||||
u16 limit = DSTS_SOFFN_LIMIT;
|
||||
|
||||
if (hsotg->gadget.speed != USB_SPEED_HIGH)
|
||||
limit >>= 3;
|
||||
|
||||
hs_ep->target_frame += hs_ep->interval;
|
||||
if (hs_ep->target_frame > DSTS_SOFFN_LIMIT) {
|
||||
if (hs_ep->target_frame > limit) {
|
||||
hs_ep->frame_overrun = true;
|
||||
hs_ep->target_frame &= DSTS_SOFFN_LIMIT;
|
||||
hs_ep->target_frame &= limit;
|
||||
} else {
|
||||
hs_ep->frame_overrun = false;
|
||||
}
|
||||
@ -136,10 +142,16 @@ static inline void dwc2_gadget_incr_frame_num(struct dwc2_hsotg_ep *hs_ep)
|
||||
*/
|
||||
static inline void dwc2_gadget_dec_frame_num_by_one(struct dwc2_hsotg_ep *hs_ep)
|
||||
{
|
||||
struct dwc2_hsotg *hsotg = hs_ep->parent;
|
||||
u16 limit = DSTS_SOFFN_LIMIT;
|
||||
|
||||
if (hsotg->gadget.speed != USB_SPEED_HIGH)
|
||||
limit >>= 3;
|
||||
|
||||
if (hs_ep->target_frame)
|
||||
hs_ep->target_frame -= 1;
|
||||
else
|
||||
hs_ep->target_frame = DSTS_SOFFN_LIMIT;
|
||||
hs_ep->target_frame = limit;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1018,6 +1030,12 @@ static void dwc2_gadget_start_isoc_ddma(struct dwc2_hsotg_ep *hs_ep)
|
||||
dwc2_writel(hsotg, ctrl, depctl);
|
||||
}
|
||||
|
||||
static bool dwc2_gadget_target_frame_elapsed(struct dwc2_hsotg_ep *hs_ep);
|
||||
static void dwc2_hsotg_complete_request(struct dwc2_hsotg *hsotg,
|
||||
struct dwc2_hsotg_ep *hs_ep,
|
||||
struct dwc2_hsotg_req *hs_req,
|
||||
int result);
|
||||
|
||||
/**
|
||||
* dwc2_hsotg_start_req - start a USB request from an endpoint's queue
|
||||
* @hsotg: The controller state.
|
||||
@ -1170,14 +1188,19 @@ static void dwc2_hsotg_start_req(struct dwc2_hsotg *hsotg,
|
||||
}
|
||||
}
|
||||
|
||||
if (hs_ep->isochronous && hs_ep->interval == 1) {
|
||||
hs_ep->target_frame = dwc2_hsotg_read_frameno(hsotg);
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
|
||||
if (hs_ep->target_frame & 0x1)
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
if (hs_ep->isochronous) {
|
||||
if (!dwc2_gadget_target_frame_elapsed(hs_ep)) {
|
||||
if (hs_ep->interval == 1) {
|
||||
if (hs_ep->target_frame & 0x1)
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
}
|
||||
ctrl |= DXEPCTL_CNAK;
|
||||
} else {
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, -ENODATA);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ctrl |= DXEPCTL_EPENA; /* ensure ep enabled */
|
||||
@ -1325,12 +1348,16 @@ static bool dwc2_gadget_target_frame_elapsed(struct dwc2_hsotg_ep *hs_ep)
|
||||
u32 target_frame = hs_ep->target_frame;
|
||||
u32 current_frame = hsotg->frame_number;
|
||||
bool frame_overrun = hs_ep->frame_overrun;
|
||||
u16 limit = DSTS_SOFFN_LIMIT;
|
||||
|
||||
if (hsotg->gadget.speed != USB_SPEED_HIGH)
|
||||
limit >>= 3;
|
||||
|
||||
if (!frame_overrun && current_frame >= target_frame)
|
||||
return true;
|
||||
|
||||
if (frame_overrun && current_frame >= target_frame &&
|
||||
((current_frame - target_frame) < DSTS_SOFFN_LIMIT / 2))
|
||||
((current_frame - target_frame) < limit / 2))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@ -1713,11 +1740,9 @@ static struct dwc2_hsotg_req *get_ep_head(struct dwc2_hsotg_ep *hs_ep)
|
||||
*/
|
||||
static void dwc2_gadget_start_next_request(struct dwc2_hsotg_ep *hs_ep)
|
||||
{
|
||||
u32 mask;
|
||||
struct dwc2_hsotg *hsotg = hs_ep->parent;
|
||||
int dir_in = hs_ep->dir_in;
|
||||
struct dwc2_hsotg_req *hs_req;
|
||||
u32 epmsk_reg = dir_in ? DIEPMSK : DOEPMSK;
|
||||
|
||||
if (!list_empty(&hs_ep->queue)) {
|
||||
hs_req = get_ep_head(hs_ep);
|
||||
@ -1733,9 +1758,6 @@ static void dwc2_gadget_start_next_request(struct dwc2_hsotg_ep *hs_ep)
|
||||
} else {
|
||||
dev_dbg(hsotg->dev, "%s: No more ISOC-OUT requests\n",
|
||||
__func__);
|
||||
mask = dwc2_readl(hsotg, epmsk_reg);
|
||||
mask |= DOEPMSK_OUTTKNEPDISMSK;
|
||||
dwc2_writel(hsotg, mask, epmsk_reg);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2306,19 +2328,6 @@ static void dwc2_hsotg_ep0_zlp(struct dwc2_hsotg *hsotg, bool dir_in)
|
||||
dwc2_hsotg_program_zlp(hsotg, hsotg->eps_out[0]);
|
||||
}
|
||||
|
||||
static void dwc2_hsotg_change_ep_iso_parity(struct dwc2_hsotg *hsotg,
|
||||
u32 epctl_reg)
|
||||
{
|
||||
u32 ctrl;
|
||||
|
||||
ctrl = dwc2_readl(hsotg, epctl_reg);
|
||||
if (ctrl & DXEPCTL_EOFRNUM)
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
dwc2_writel(hsotg, ctrl, epctl_reg);
|
||||
}
|
||||
|
||||
/*
|
||||
* dwc2_gadget_get_xfersize_ddma - get transferred bytes amount from desc
|
||||
* @hs_ep - The endpoint on which transfer went
|
||||
@ -2439,20 +2448,11 @@ static void dwc2_hsotg_handle_outdone(struct dwc2_hsotg *hsotg, int epnum)
|
||||
dwc2_hsotg_ep0_zlp(hsotg, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Slave mode OUT transfers do not go through XferComplete so
|
||||
* adjust the ISOC parity here.
|
||||
*/
|
||||
if (!using_dma(hsotg)) {
|
||||
if (hs_ep->isochronous && hs_ep->interval == 1)
|
||||
dwc2_hsotg_change_ep_iso_parity(hsotg, DOEPCTL(epnum));
|
||||
else if (hs_ep->isochronous && hs_ep->interval > 1)
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
}
|
||||
|
||||
/* Set actual frame number for completed transfers */
|
||||
if (!using_desc_dma(hsotg) && hs_ep->isochronous)
|
||||
req->frame_number = hsotg->frame_number;
|
||||
if (!using_desc_dma(hsotg) && hs_ep->isochronous) {
|
||||
req->frame_number = hs_ep->target_frame;
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
}
|
||||
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, result);
|
||||
}
|
||||
@ -2766,6 +2766,12 @@ static void dwc2_hsotg_complete_in(struct dwc2_hsotg *hsotg,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set actual frame number for completed transfers */
|
||||
if (!using_desc_dma(hsotg) && hs_ep->isochronous) {
|
||||
hs_req->req.frame_number = hs_ep->target_frame;
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
}
|
||||
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, 0);
|
||||
}
|
||||
|
||||
@ -2826,23 +2832,18 @@ static void dwc2_gadget_handle_ep_disabled(struct dwc2_hsotg_ep *hs_ep)
|
||||
|
||||
dwc2_hsotg_txfifo_flush(hsotg, hs_ep->fifo_index);
|
||||
|
||||
if (hs_ep->isochronous) {
|
||||
dwc2_hsotg_complete_in(hsotg, hs_ep);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((epctl & DXEPCTL_STALL) && (epctl & DXEPCTL_EPTYPE_BULK)) {
|
||||
int dctl = dwc2_readl(hsotg, DCTL);
|
||||
|
||||
dctl |= DCTL_CGNPINNAK;
|
||||
dwc2_writel(hsotg, dctl, DCTL);
|
||||
}
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
|
||||
if (dctl & DCTL_GOUTNAKSTS) {
|
||||
dctl |= DCTL_CGOUTNAK;
|
||||
dwc2_writel(hsotg, dctl, DCTL);
|
||||
if (dctl & DCTL_GOUTNAKSTS) {
|
||||
dctl |= DCTL_CGOUTNAK;
|
||||
dwc2_writel(hsotg, dctl, DCTL);
|
||||
}
|
||||
}
|
||||
|
||||
if (!hs_ep->isochronous)
|
||||
@ -2863,8 +2864,6 @@ static void dwc2_gadget_handle_ep_disabled(struct dwc2_hsotg_ep *hs_ep)
|
||||
/* Update current frame number value. */
|
||||
hsotg->frame_number = dwc2_hsotg_read_frameno(hsotg);
|
||||
} while (dwc2_gadget_target_frame_elapsed(hs_ep));
|
||||
|
||||
dwc2_gadget_start_next_request(hs_ep);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2881,8 +2880,8 @@ static void dwc2_gadget_handle_ep_disabled(struct dwc2_hsotg_ep *hs_ep)
|
||||
static void dwc2_gadget_handle_out_token_ep_disabled(struct dwc2_hsotg_ep *ep)
|
||||
{
|
||||
struct dwc2_hsotg *hsotg = ep->parent;
|
||||
struct dwc2_hsotg_req *hs_req;
|
||||
int dir_in = ep->dir_in;
|
||||
u32 doepmsk;
|
||||
|
||||
if (dir_in || !ep->isochronous)
|
||||
return;
|
||||
@ -2896,28 +2895,39 @@ static void dwc2_gadget_handle_out_token_ep_disabled(struct dwc2_hsotg_ep *ep)
|
||||
return;
|
||||
}
|
||||
|
||||
if (ep->interval > 1 &&
|
||||
ep->target_frame == TARGET_FRAME_INITIAL) {
|
||||
if (ep->target_frame == TARGET_FRAME_INITIAL) {
|
||||
u32 ctrl;
|
||||
|
||||
ep->target_frame = hsotg->frame_number;
|
||||
dwc2_gadget_incr_frame_num(ep);
|
||||
if (ep->interval > 1) {
|
||||
ctrl = dwc2_readl(hsotg, DOEPCTL(ep->index));
|
||||
if (ep->target_frame & 0x1)
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
|
||||
ctrl = dwc2_readl(hsotg, DOEPCTL(ep->index));
|
||||
if (ep->target_frame & 0x1)
|
||||
ctrl |= DXEPCTL_SETODDFR;
|
||||
else
|
||||
ctrl |= DXEPCTL_SETEVENFR;
|
||||
|
||||
dwc2_writel(hsotg, ctrl, DOEPCTL(ep->index));
|
||||
dwc2_writel(hsotg, ctrl, DOEPCTL(ep->index));
|
||||
}
|
||||
}
|
||||
|
||||
dwc2_gadget_start_next_request(ep);
|
||||
doepmsk = dwc2_readl(hsotg, DOEPMSK);
|
||||
doepmsk &= ~DOEPMSK_OUTTKNEPDISMSK;
|
||||
dwc2_writel(hsotg, doepmsk, DOEPMSK);
|
||||
while (dwc2_gadget_target_frame_elapsed(ep)) {
|
||||
hs_req = get_ep_head(ep);
|
||||
if (hs_req)
|
||||
dwc2_hsotg_complete_request(hsotg, ep, hs_req, -ENODATA);
|
||||
|
||||
dwc2_gadget_incr_frame_num(ep);
|
||||
/* Update current frame number value. */
|
||||
hsotg->frame_number = dwc2_hsotg_read_frameno(hsotg);
|
||||
}
|
||||
|
||||
if (!ep->req)
|
||||
dwc2_gadget_start_next_request(ep);
|
||||
|
||||
}
|
||||
|
||||
static void dwc2_hsotg_ep_stop_xfr(struct dwc2_hsotg *hsotg,
|
||||
struct dwc2_hsotg_ep *hs_ep);
|
||||
|
||||
/**
|
||||
* dwc2_gadget_handle_nak - handle NAK interrupt
|
||||
* @hs_ep: The endpoint on which interrupt is asserted.
|
||||
@ -2935,7 +2945,9 @@ static void dwc2_gadget_handle_out_token_ep_disabled(struct dwc2_hsotg_ep *ep)
|
||||
static void dwc2_gadget_handle_nak(struct dwc2_hsotg_ep *hs_ep)
|
||||
{
|
||||
struct dwc2_hsotg *hsotg = hs_ep->parent;
|
||||
struct dwc2_hsotg_req *hs_req;
|
||||
int dir_in = hs_ep->dir_in;
|
||||
u32 ctrl;
|
||||
|
||||
if (!dir_in || !hs_ep->isochronous)
|
||||
return;
|
||||
@ -2977,13 +2989,29 @@ static void dwc2_gadget_handle_nak(struct dwc2_hsotg_ep *hs_ep)
|
||||
|
||||
dwc2_writel(hsotg, ctrl, DIEPCTL(hs_ep->index));
|
||||
}
|
||||
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep,
|
||||
get_ep_head(hs_ep), 0);
|
||||
}
|
||||
|
||||
if (!using_desc_dma(hsotg))
|
||||
if (using_desc_dma(hsotg))
|
||||
return;
|
||||
|
||||
ctrl = dwc2_readl(hsotg, DIEPCTL(hs_ep->index));
|
||||
if (ctrl & DXEPCTL_EPENA)
|
||||
dwc2_hsotg_ep_stop_xfr(hsotg, hs_ep);
|
||||
else
|
||||
dwc2_hsotg_txfifo_flush(hsotg, hs_ep->fifo_index);
|
||||
|
||||
while (dwc2_gadget_target_frame_elapsed(hs_ep)) {
|
||||
hs_req = get_ep_head(hs_ep);
|
||||
if (hs_req)
|
||||
dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, -ENODATA);
|
||||
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
/* Update current frame number value. */
|
||||
hsotg->frame_number = dwc2_hsotg_read_frameno(hsotg);
|
||||
}
|
||||
|
||||
if (!hs_ep->req)
|
||||
dwc2_gadget_start_next_request(hs_ep);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3039,21 +3067,15 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx,
|
||||
|
||||
/* In DDMA handle isochronous requests separately */
|
||||
if (using_desc_dma(hsotg) && hs_ep->isochronous) {
|
||||
/* XferCompl set along with BNA */
|
||||
if (!(ints & DXEPINT_BNAINTR))
|
||||
dwc2_gadget_complete_isoc_request_ddma(hs_ep);
|
||||
dwc2_gadget_complete_isoc_request_ddma(hs_ep);
|
||||
} else if (dir_in) {
|
||||
/*
|
||||
* We get OutDone from the FIFO, so we only
|
||||
* need to look at completing IN requests here
|
||||
* if operating slave mode
|
||||
*/
|
||||
if (hs_ep->isochronous && hs_ep->interval > 1)
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
|
||||
dwc2_hsotg_complete_in(hsotg, hs_ep);
|
||||
if (ints & DXEPINT_NAKINTRPT)
|
||||
ints &= ~DXEPINT_NAKINTRPT;
|
||||
if (!hs_ep->isochronous || !(ints & DXEPINT_NAKINTRPT))
|
||||
dwc2_hsotg_complete_in(hsotg, hs_ep);
|
||||
|
||||
if (idx == 0 && !hs_ep->req)
|
||||
dwc2_hsotg_enqueue_setup(hsotg);
|
||||
@ -3062,10 +3084,8 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx,
|
||||
* We're using DMA, we need to fire an OutDone here
|
||||
* as we ignore the RXFIFO.
|
||||
*/
|
||||
if (hs_ep->isochronous && hs_ep->interval > 1)
|
||||
dwc2_gadget_incr_frame_num(hs_ep);
|
||||
|
||||
dwc2_hsotg_handle_outdone(hsotg, idx);
|
||||
if (!hs_ep->isochronous || !(ints & DXEPINT_OUTTKNEPDIS))
|
||||
dwc2_hsotg_handle_outdone(hsotg, idx);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4085,6 +4105,7 @@ static int dwc2_hsotg_ep_enable(struct usb_ep *ep,
|
||||
mask |= DIEPMSK_NAKMSK;
|
||||
dwc2_writel(hsotg, mask, DIEPMSK);
|
||||
} else {
|
||||
epctrl |= DXEPCTL_SNAK;
|
||||
mask = dwc2_readl(hsotg, DOEPMSK);
|
||||
mask |= DOEPMSK_OUTTKNEPDISMSK;
|
||||
dwc2_writel(hsotg, mask, DOEPMSK);
|
||||
|
@ -5191,6 +5191,10 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg)
|
||||
hcd->has_tt = 1;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
retval = -EINVAL;
|
||||
goto error1;
|
||||
}
|
||||
hcd->rsrc_start = res->start;
|
||||
hcd->rsrc_len = resource_size(res);
|
||||
|
||||
|
@ -264,19 +264,6 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
|
||||
{
|
||||
u32 reg;
|
||||
int retries = 1000;
|
||||
int ret;
|
||||
|
||||
usb_phy_init(dwc->usb2_phy);
|
||||
usb_phy_init(dwc->usb3_phy);
|
||||
ret = phy_init(dwc->usb2_generic_phy);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = phy_init(dwc->usb3_generic_phy);
|
||||
if (ret < 0) {
|
||||
phy_exit(dwc->usb2_generic_phy);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* We're resetting only the device side because, if we're in host mode,
|
||||
@ -310,9 +297,6 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
|
||||
udelay(1);
|
||||
} while (--retries);
|
||||
|
||||
phy_exit(dwc->usb3_generic_phy);
|
||||
phy_exit(dwc->usb2_generic_phy);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
||||
done:
|
||||
@ -982,9 +966,21 @@ static int dwc3_core_init(struct dwc3 *dwc)
|
||||
dwc->phys_ready = true;
|
||||
}
|
||||
|
||||
usb_phy_init(dwc->usb2_phy);
|
||||
usb_phy_init(dwc->usb3_phy);
|
||||
ret = phy_init(dwc->usb2_generic_phy);
|
||||
if (ret < 0)
|
||||
goto err0a;
|
||||
|
||||
ret = phy_init(dwc->usb3_generic_phy);
|
||||
if (ret < 0) {
|
||||
phy_exit(dwc->usb2_generic_phy);
|
||||
goto err0a;
|
||||
}
|
||||
|
||||
ret = dwc3_core_soft_reset(dwc);
|
||||
if (ret)
|
||||
goto err0a;
|
||||
goto err1;
|
||||
|
||||
if (hw_mode == DWC3_GHWPARAMS0_MODE_DRD &&
|
||||
!DWC3_VER_IS_WITHIN(DWC3, ANY, 194A)) {
|
||||
|
@ -406,6 +406,14 @@ static struct usb_endpoint_descriptor ss_epin_fback_desc = {
|
||||
.bInterval = 4,
|
||||
};
|
||||
|
||||
static struct usb_ss_ep_comp_descriptor ss_epin_fback_desc_comp = {
|
||||
.bLength = sizeof(ss_epin_fback_desc_comp),
|
||||
.bDescriptorType = USB_DT_SS_ENDPOINT_COMP,
|
||||
.bMaxBurst = 0,
|
||||
.bmAttributes = 0,
|
||||
.wBytesPerInterval = cpu_to_le16(4),
|
||||
};
|
||||
|
||||
|
||||
/* Audio Streaming IN Interface - Alt0 */
|
||||
static struct usb_interface_descriptor std_as_in_if0_desc = {
|
||||
@ -597,6 +605,7 @@ static struct usb_descriptor_header *ss_audio_desc[] = {
|
||||
(struct usb_descriptor_header *)&ss_epout_desc_comp,
|
||||
(struct usb_descriptor_header *)&as_iso_out_desc,
|
||||
(struct usb_descriptor_header *)&ss_epin_fback_desc,
|
||||
(struct usb_descriptor_header *)&ss_epin_fback_desc_comp,
|
||||
|
||||
(struct usb_descriptor_header *)&std_as_in_if0_desc,
|
||||
(struct usb_descriptor_header *)&std_as_in_if1_desc,
|
||||
@ -705,6 +714,7 @@ static void setup_headers(struct f_uac2_opts *opts,
|
||||
{
|
||||
struct usb_ss_ep_comp_descriptor *epout_desc_comp = NULL;
|
||||
struct usb_ss_ep_comp_descriptor *epin_desc_comp = NULL;
|
||||
struct usb_ss_ep_comp_descriptor *epin_fback_desc_comp = NULL;
|
||||
struct usb_endpoint_descriptor *epout_desc;
|
||||
struct usb_endpoint_descriptor *epin_desc;
|
||||
struct usb_endpoint_descriptor *epin_fback_desc;
|
||||
@ -730,6 +740,7 @@ static void setup_headers(struct f_uac2_opts *opts,
|
||||
epout_desc_comp = &ss_epout_desc_comp;
|
||||
epin_desc_comp = &ss_epin_desc_comp;
|
||||
epin_fback_desc = &ss_epin_fback_desc;
|
||||
epin_fback_desc_comp = &ss_epin_fback_desc_comp;
|
||||
ep_int_desc = &ss_ep_int_desc;
|
||||
}
|
||||
|
||||
@ -773,8 +784,11 @@ static void setup_headers(struct f_uac2_opts *opts,
|
||||
|
||||
headers[i++] = USBDHDR(&as_iso_out_desc);
|
||||
|
||||
if (EPOUT_FBACK_IN_EN(opts))
|
||||
if (EPOUT_FBACK_IN_EN(opts)) {
|
||||
headers[i++] = USBDHDR(epin_fback_desc);
|
||||
if (epin_fback_desc_comp)
|
||||
headers[i++] = USBDHDR(epin_fback_desc_comp);
|
||||
}
|
||||
}
|
||||
|
||||
if (EPIN_EN(opts)) {
|
||||
@ -1164,6 +1178,9 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
|
||||
agdev->out_ep_maxpsize = max_t(u16, agdev->out_ep_maxpsize,
|
||||
le16_to_cpu(ss_epout_desc.wMaxPacketSize));
|
||||
|
||||
ss_epin_desc_comp.wBytesPerInterval = ss_epin_desc.wMaxPacketSize;
|
||||
ss_epout_desc_comp.wBytesPerInterval = ss_epout_desc.wMaxPacketSize;
|
||||
|
||||
// HS and SS endpoint addresses are copied from autoconfigured FS descriptors
|
||||
hs_ep_int_desc.bEndpointAddress = fs_ep_int_desc.bEndpointAddress;
|
||||
hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress;
|
||||
|
@ -96,11 +96,13 @@ static const struct snd_pcm_hardware uac_pcm_hardware = {
|
||||
};
|
||||
|
||||
static void u_audio_set_fback_frequency(enum usb_device_speed speed,
|
||||
struct usb_ep *out_ep,
|
||||
unsigned long long freq,
|
||||
unsigned int pitch,
|
||||
void *buf)
|
||||
{
|
||||
u32 ff = 0;
|
||||
const struct usb_endpoint_descriptor *ep_desc;
|
||||
|
||||
/*
|
||||
* Because the pitch base is 1000000, the final divider here
|
||||
@ -128,8 +130,13 @@ static void u_audio_set_fback_frequency(enum usb_device_speed speed,
|
||||
* byte fromat (that is Q16.16)
|
||||
*
|
||||
* ff = (freq << 16) / 8000
|
||||
*
|
||||
* Win10 and OSX UAC2 drivers require number of samples per packet
|
||||
* in order to honor the feedback value.
|
||||
* Linux snd-usb-audio detects the applied bit-shift automatically.
|
||||
*/
|
||||
freq <<= 4;
|
||||
ep_desc = out_ep->desc;
|
||||
freq <<= 4 + (ep_desc->bInterval - 1);
|
||||
}
|
||||
|
||||
ff = DIV_ROUND_CLOSEST_ULL((freq * pitch), 1953125);
|
||||
@ -267,7 +274,7 @@ static void u_audio_iso_fback_complete(struct usb_ep *ep,
|
||||
pr_debug("%s: iso_complete status(%d) %d/%d\n",
|
||||
__func__, status, req->actual, req->length);
|
||||
|
||||
u_audio_set_fback_frequency(audio_dev->gadget->speed,
|
||||
u_audio_set_fback_frequency(audio_dev->gadget->speed, audio_dev->out_ep,
|
||||
params->c_srate, prm->pitch,
|
||||
req->buf);
|
||||
|
||||
@ -526,7 +533,7 @@ int u_audio_start_capture(struct g_audio *audio_dev)
|
||||
* be meauserd at start of playback
|
||||
*/
|
||||
prm->pitch = 1000000;
|
||||
u_audio_set_fback_frequency(audio_dev->gadget->speed,
|
||||
u_audio_set_fback_frequency(audio_dev->gadget->speed, ep,
|
||||
params->c_srate, prm->pitch,
|
||||
req_fback->buf);
|
||||
|
||||
|
@ -1250,7 +1250,7 @@ static void set_feature(struct r8a66597 *r8a66597, struct usb_ctrlrequest *ctrl)
|
||||
do {
|
||||
tmp = r8a66597_read(r8a66597, INTSTS0) & CTSQ;
|
||||
udelay(1);
|
||||
} while (tmp != CS_IDST || timeout-- > 0);
|
||||
} while (tmp != CS_IDST && timeout-- > 0);
|
||||
|
||||
if (tmp == CS_IDST)
|
||||
r8a66597_bset(r8a66597,
|
||||
|
@ -406,12 +406,9 @@ static int bcma_hcd_probe(struct bcma_device *core)
|
||||
return -ENOMEM;
|
||||
usb_dev->core = core;
|
||||
|
||||
if (core->dev.of_node) {
|
||||
if (core->dev.of_node)
|
||||
usb_dev->gpio_desc = devm_gpiod_get(&core->dev, "vcc",
|
||||
GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(usb_dev->gpio_desc))
|
||||
return PTR_ERR(usb_dev->gpio_desc);
|
||||
}
|
||||
|
||||
switch (core->id.id) {
|
||||
case BCMA_CORE_USB20_HOST:
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/byteorder.h>
|
||||
@ -1278,29 +1279,39 @@ MODULE_LICENSE ("GPL");
|
||||
|
||||
#ifdef CONFIG_USB_EHCI_SH
|
||||
#include "ehci-sh.c"
|
||||
#define PLATFORM_DRIVER ehci_hcd_sh_driver
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_PS3
|
||||
#include "ehci-ps3.c"
|
||||
#define PS3_SYSTEM_BUS_DRIVER ps3_ehci_driver
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_USB_EHCI_HCD_PPC_OF
|
||||
#include "ehci-ppc-of.c"
|
||||
#define OF_PLATFORM_DRIVER ehci_hcd_ppc_of_driver
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_XPS_USB_HCD_XILINX
|
||||
#include "ehci-xilinx-of.c"
|
||||
#define XILINX_OF_PLATFORM_DRIVER ehci_hcd_xilinx_of_driver
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SPARC_LEON
|
||||
#include "ehci-grlib.c"
|
||||
#define PLATFORM_DRIVER ehci_grlib_driver
|
||||
#endif
|
||||
|
||||
static struct platform_driver * const platform_drivers[] = {
|
||||
#ifdef CONFIG_USB_EHCI_SH
|
||||
&ehci_hcd_sh_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_USB_EHCI_HCD_PPC_OF
|
||||
&ehci_hcd_ppc_of_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_XPS_USB_HCD_XILINX
|
||||
&ehci_hcd_xilinx_of_driver,
|
||||
#endif
|
||||
#ifdef CONFIG_SPARC_LEON
|
||||
&ehci_grlib_driver,
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init ehci_hcd_init(void)
|
||||
{
|
||||
int retval = 0;
|
||||
@ -1324,47 +1335,23 @@ static int __init ehci_hcd_init(void)
|
||||
ehci_debug_root = debugfs_create_dir("ehci", usb_debug_root);
|
||||
#endif
|
||||
|
||||
#ifdef PLATFORM_DRIVER
|
||||
retval = platform_driver_register(&PLATFORM_DRIVER);
|
||||
retval = platform_register_drivers(platform_drivers, ARRAY_SIZE(platform_drivers));
|
||||
if (retval < 0)
|
||||
goto clean0;
|
||||
#endif
|
||||
|
||||
#ifdef PS3_SYSTEM_BUS_DRIVER
|
||||
retval = ps3_ehci_driver_register(&PS3_SYSTEM_BUS_DRIVER);
|
||||
#ifdef CONFIG_PPC_PS3
|
||||
retval = ps3_ehci_driver_register(&ps3_ehci_driver);
|
||||
if (retval < 0)
|
||||
goto clean2;
|
||||
goto clean1;
|
||||
#endif
|
||||
|
||||
#ifdef OF_PLATFORM_DRIVER
|
||||
retval = platform_driver_register(&OF_PLATFORM_DRIVER);
|
||||
if (retval < 0)
|
||||
goto clean3;
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
#ifdef XILINX_OF_PLATFORM_DRIVER
|
||||
retval = platform_driver_register(&XILINX_OF_PLATFORM_DRIVER);
|
||||
if (retval < 0)
|
||||
goto clean4;
|
||||
#ifdef CONFIG_PPC_PS3
|
||||
clean1:
|
||||
#endif
|
||||
return retval;
|
||||
|
||||
#ifdef XILINX_OF_PLATFORM_DRIVER
|
||||
/* platform_driver_unregister(&XILINX_OF_PLATFORM_DRIVER); */
|
||||
clean4:
|
||||
#endif
|
||||
#ifdef OF_PLATFORM_DRIVER
|
||||
platform_driver_unregister(&OF_PLATFORM_DRIVER);
|
||||
clean3:
|
||||
#endif
|
||||
#ifdef PS3_SYSTEM_BUS_DRIVER
|
||||
ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
|
||||
clean2:
|
||||
#endif
|
||||
#ifdef PLATFORM_DRIVER
|
||||
platform_driver_unregister(&PLATFORM_DRIVER);
|
||||
platform_unregister_drivers(platform_drivers, ARRAY_SIZE(platform_drivers));
|
||||
clean0:
|
||||
#endif
|
||||
#ifdef CONFIG_DYNAMIC_DEBUG
|
||||
debugfs_remove(ehci_debug_root);
|
||||
ehci_debug_root = NULL;
|
||||
@ -1376,18 +1363,10 @@ module_init(ehci_hcd_init);
|
||||
|
||||
static void __exit ehci_hcd_cleanup(void)
|
||||
{
|
||||
#ifdef XILINX_OF_PLATFORM_DRIVER
|
||||
platform_driver_unregister(&XILINX_OF_PLATFORM_DRIVER);
|
||||
#endif
|
||||
#ifdef OF_PLATFORM_DRIVER
|
||||
platform_driver_unregister(&OF_PLATFORM_DRIVER);
|
||||
#endif
|
||||
#ifdef PLATFORM_DRIVER
|
||||
platform_driver_unregister(&PLATFORM_DRIVER);
|
||||
#endif
|
||||
#ifdef PS3_SYSTEM_BUS_DRIVER
|
||||
ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
|
||||
#ifdef CONFIG_PPC_PS3
|
||||
ps3_ehci_driver_unregister(&ps3_ehci_driver);
|
||||
#endif
|
||||
platform_unregister_drivers(platform_drivers, ARRAY_SIZE(platform_drivers));
|
||||
#ifdef CONFIG_DYNAMIC_DEBUG
|
||||
debugfs_remove(ehci_debug_root);
|
||||
#endif
|
||||
|
@ -692,6 +692,7 @@ int xhci_run(struct usb_hcd *hcd)
|
||||
if (ret)
|
||||
xhci_free_command(xhci, command);
|
||||
}
|
||||
set_bit(HCD_FLAG_DEFER_RH_REGISTER, &hcd->flags);
|
||||
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
||||
"Finished xhci_run for USB2 roothub");
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user