mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 22:14:04 +02:00
Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
This commit is contained in:
commit
73dadd0ed3
2
Makefile
2
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 56
|
||||
SUBLEVEL = 58
|
||||
EXTRAVERSION =
|
||||
NAME = Blurry Fish Butt
|
||||
|
||||
|
|
|
|||
|
|
@ -856,6 +856,13 @@ uart0: serial@f801c000 {
|
|||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xf801c000 0x100>;
|
||||
interrupts = <24 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
dmas = <&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(35))>,
|
||||
<&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(36))>;
|
||||
dma-names = "tx", "rx";
|
||||
clocks = <&uart0_clk>;
|
||||
clock-names = "usart";
|
||||
status = "disabled";
|
||||
|
|
@ -865,6 +872,13 @@ uart1: serial@f8020000 {
|
|||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xf8020000 0x100>;
|
||||
interrupts = <25 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
dmas = <&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(37))>,
|
||||
<&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(38))>;
|
||||
dma-names = "tx", "rx";
|
||||
clocks = <&uart1_clk>;
|
||||
clock-names = "usart";
|
||||
status = "disabled";
|
||||
|
|
@ -874,6 +888,13 @@ uart2: serial@f8024000 {
|
|||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xf8024000 0x100>;
|
||||
interrupts = <26 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
dmas = <&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(39))>,
|
||||
<&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(40))>;
|
||||
dma-names = "tx", "rx";
|
||||
clocks = <&uart2_clk>;
|
||||
clock-names = "usart";
|
||||
status = "disabled";
|
||||
|
|
@ -985,6 +1006,13 @@ uart3: serial@fc008000 {
|
|||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xfc008000 0x100>;
|
||||
interrupts = <27 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
dmas = <&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(41))>,
|
||||
<&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(42))>;
|
||||
dma-names = "tx", "rx";
|
||||
clocks = <&uart3_clk>;
|
||||
clock-names = "usart";
|
||||
status = "disabled";
|
||||
|
|
@ -993,6 +1021,13 @@ uart3: serial@fc008000 {
|
|||
uart4: serial@fc00c000 {
|
||||
compatible = "atmel,at91sam9260-usart";
|
||||
reg = <0xfc00c000 0x100>;
|
||||
dmas = <&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(43))>,
|
||||
<&dma0
|
||||
(AT91_XDMAC_DT_MEM_IF(0) | AT91_XDMAC_DT_PER_IF(1) |
|
||||
AT91_XDMAC_DT_PERID(44))>;
|
||||
dma-names = "tx", "rx";
|
||||
interrupts = <28 IRQ_TYPE_LEVEL_HIGH 7>;
|
||||
clocks = <&uart4_clk>;
|
||||
clock-names = "usart";
|
||||
|
|
|
|||
|
|
@ -286,6 +286,22 @@ static void at91_ddr_standby(void)
|
|||
at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1);
|
||||
}
|
||||
|
||||
static void sama5d3_ddr_standby(void)
|
||||
{
|
||||
u32 lpr0;
|
||||
u32 saved_lpr0;
|
||||
|
||||
saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR);
|
||||
lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB;
|
||||
lpr0 |= AT91_DDRSDRC_LPCB_POWER_DOWN;
|
||||
|
||||
at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0);
|
||||
|
||||
cpu_do_idle();
|
||||
|
||||
at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0);
|
||||
}
|
||||
|
||||
/* We manage both DDRAM/SDRAM controllers, we need more than one value to
|
||||
* remember.
|
||||
*/
|
||||
|
|
@ -320,7 +336,7 @@ static const struct of_device_id const ramc_ids[] __initconst = {
|
|||
{ .compatible = "atmel,at91rm9200-sdramc", .data = at91rm9200_standby },
|
||||
{ .compatible = "atmel,at91sam9260-sdramc", .data = at91sam9_sdram_standby },
|
||||
{ .compatible = "atmel,at91sam9g45-ddramc", .data = at91_ddr_standby },
|
||||
{ .compatible = "atmel,sama5d3-ddramc", .data = at91_ddr_standby },
|
||||
{ .compatible = "atmel,sama5d3-ddramc", .data = sama5d3_ddr_standby },
|
||||
{ /*sentinel*/ }
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ SECTIONS
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PPC64_BOOT_WRAPPER
|
||||
. = ALIGN(256);
|
||||
.got :
|
||||
{
|
||||
__toc_start = .;
|
||||
|
|
|
|||
|
|
@ -302,7 +302,6 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu)
|
|||
advance = 0;
|
||||
printk(KERN_ERR "Couldn't emulate instruction 0x%08x "
|
||||
"(op %d xop %d)\n", inst, get_op(inst), get_xop(inst));
|
||||
kvmppc_core_queue_program(vcpu, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -455,7 +455,7 @@ int zpci_dma_init_device(struct zpci_dev *zdev)
|
|||
zdev->dma_table = dma_alloc_cpu_table();
|
||||
if (!zdev->dma_table) {
|
||||
rc = -ENOMEM;
|
||||
goto out_clean;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -475,18 +475,22 @@ int zpci_dma_init_device(struct zpci_dev *zdev)
|
|||
zdev->iommu_bitmap = vzalloc(zdev->iommu_pages / 8);
|
||||
if (!zdev->iommu_bitmap) {
|
||||
rc = -ENOMEM;
|
||||
goto out_reg;
|
||||
goto free_dma_table;
|
||||
}
|
||||
|
||||
rc = zpci_register_ioat(zdev, 0, zdev->start_dma, zdev->end_dma,
|
||||
(u64) zdev->dma_table);
|
||||
if (rc)
|
||||
goto out_reg;
|
||||
return 0;
|
||||
goto free_bitmap;
|
||||
|
||||
out_reg:
|
||||
return 0;
|
||||
free_bitmap:
|
||||
vfree(zdev->iommu_bitmap);
|
||||
zdev->iommu_bitmap = NULL;
|
||||
free_dma_table:
|
||||
dma_free_cpu_table(zdev->dma_table);
|
||||
out_clean:
|
||||
zdev->dma_table = NULL;
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -219,6 +219,29 @@ static int ghash_async_final(struct ahash_request *req)
|
|||
}
|
||||
}
|
||||
|
||||
static int ghash_async_import(struct ahash_request *req, const void *in)
|
||||
{
|
||||
struct ahash_request *cryptd_req = ahash_request_ctx(req);
|
||||
struct shash_desc *desc = cryptd_shash_desc(cryptd_req);
|
||||
struct ghash_desc_ctx *dctx = shash_desc_ctx(desc);
|
||||
|
||||
ghash_async_init(req);
|
||||
memcpy(dctx, in, sizeof(*dctx));
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int ghash_async_export(struct ahash_request *req, void *out)
|
||||
{
|
||||
struct ahash_request *cryptd_req = ahash_request_ctx(req);
|
||||
struct shash_desc *desc = cryptd_shash_desc(cryptd_req);
|
||||
struct ghash_desc_ctx *dctx = shash_desc_ctx(desc);
|
||||
|
||||
memcpy(out, dctx, sizeof(*dctx));
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int ghash_async_digest(struct ahash_request *req)
|
||||
{
|
||||
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
|
||||
|
|
@ -288,8 +311,11 @@ static struct ahash_alg ghash_async_alg = {
|
|||
.final = ghash_async_final,
|
||||
.setkey = ghash_async_setkey,
|
||||
.digest = ghash_async_digest,
|
||||
.export = ghash_async_export,
|
||||
.import = ghash_async_import,
|
||||
.halg = {
|
||||
.digestsize = GHASH_DIGEST_SIZE,
|
||||
.statesize = sizeof(struct ghash_desc_ctx),
|
||||
.base = {
|
||||
.cra_name = "ghash",
|
||||
.cra_driver_name = "ghash-clmulni",
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include <asm/apic.h>
|
||||
#include <asm/timer.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/nmi.h>
|
||||
|
||||
struct ms_hyperv_info ms_hyperv;
|
||||
EXPORT_SYMBOL_GPL(ms_hyperv);
|
||||
|
|
@ -157,6 +158,26 @@ static unsigned char hv_get_nmi_reason(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_LOCAL_APIC
|
||||
/*
|
||||
* Prior to WS2016 Debug-VM sends NMIs to all CPUs which makes
|
||||
* it dificult to process CHANNELMSG_UNLOAD in case of crash. Handle
|
||||
* unknown NMI on the first CPU which gets it.
|
||||
*/
|
||||
static int hv_nmi_unknown(unsigned int val, struct pt_regs *regs)
|
||||
{
|
||||
static atomic_t nmi_cpu = ATOMIC_INIT(-1);
|
||||
|
||||
if (!unknown_nmi_panic)
|
||||
return NMI_DONE;
|
||||
|
||||
if (atomic_cmpxchg(&nmi_cpu, -1, raw_smp_processor_id()) != -1)
|
||||
return NMI_HANDLED;
|
||||
|
||||
return NMI_DONE;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __init ms_hyperv_init_platform(void)
|
||||
{
|
||||
/*
|
||||
|
|
@ -182,6 +203,9 @@ static void __init ms_hyperv_init_platform(void)
|
|||
printk(KERN_INFO "HyperV: LAPIC Timer Frequency: %#x\n",
|
||||
lapic_timer_frequency);
|
||||
}
|
||||
|
||||
register_nmi_handler(NMI_UNKNOWN, hv_nmi_unknown, NMI_FLAG_FIRST,
|
||||
"hv_nmi_unknown");
|
||||
#endif
|
||||
|
||||
if (ms_hyperv.features & HV_X64_MSR_TIME_REF_COUNT_AVAILABLE)
|
||||
|
|
|
|||
|
|
@ -231,23 +231,14 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
|
|||
return 1;
|
||||
|
||||
for_each_pci_msi_entry(msidesc, dev) {
|
||||
__pci_read_msi_msg(msidesc, &msg);
|
||||
pirq = MSI_ADDR_EXT_DEST_ID(msg.address_hi) |
|
||||
((msg.address_lo >> MSI_ADDR_DEST_ID_SHIFT) & 0xff);
|
||||
if (msg.data != XEN_PIRQ_MSI_DATA ||
|
||||
xen_irq_from_pirq(pirq) < 0) {
|
||||
pirq = xen_allocate_pirq_msi(dev, msidesc);
|
||||
if (pirq < 0) {
|
||||
irq = -ENODEV;
|
||||
goto error;
|
||||
}
|
||||
xen_msi_compose_msg(dev, pirq, &msg);
|
||||
__pci_write_msi_msg(msidesc, &msg);
|
||||
dev_dbg(&dev->dev, "xen: msi bound to pirq=%d\n", pirq);
|
||||
} else {
|
||||
dev_dbg(&dev->dev,
|
||||
"xen: msi already bound to pirq=%d\n", pirq);
|
||||
pirq = xen_allocate_pirq_msi(dev, msidesc);
|
||||
if (pirq < 0) {
|
||||
irq = -ENODEV;
|
||||
goto error;
|
||||
}
|
||||
xen_msi_compose_msg(dev, pirq, &msg);
|
||||
__pci_write_msi_msg(msidesc, &msg);
|
||||
dev_dbg(&dev->dev, "xen: msi bound to pirq=%d\n", pirq);
|
||||
irq = xen_bind_pirq_msi_to_irq(dev, msidesc, pirq,
|
||||
(type == PCI_CAP_ID_MSI) ? nvec : 1,
|
||||
(type == PCI_CAP_ID_MSIX) ?
|
||||
|
|
|
|||
|
|
@ -27,6 +27,12 @@ static bool xen_pvspin = true;
|
|||
|
||||
static void xen_qlock_kick(int cpu)
|
||||
{
|
||||
int irq = per_cpu(lock_kicker_irq, cpu);
|
||||
|
||||
/* Don't kick if the target's kicker interrupt is not initialized. */
|
||||
if (irq == -1)
|
||||
return;
|
||||
|
||||
xen_send_IPI_one(cpu, XEN_SPIN_UNLOCK_VECTOR);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -182,6 +182,9 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter)
|
|||
__set_bit(WRITE_16, filter->write_ok);
|
||||
__set_bit(WRITE_LONG, filter->write_ok);
|
||||
__set_bit(WRITE_LONG_2, filter->write_ok);
|
||||
__set_bit(WRITE_SAME, filter->write_ok);
|
||||
__set_bit(WRITE_SAME_16, filter->write_ok);
|
||||
__set_bit(WRITE_SAME_32, filter->write_ok);
|
||||
__set_bit(ERASE, filter->write_ok);
|
||||
__set_bit(GPCMD_MODE_SELECT_10, filter->write_ok);
|
||||
__set_bit(MODE_SELECT, filter->write_ok);
|
||||
|
|
|
|||
|
|
@ -184,7 +184,7 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags)
|
|||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct hash_ctx *ctx = ask->private;
|
||||
struct ahash_request *req = &ctx->req;
|
||||
char state[crypto_ahash_statesize(crypto_ahash_reqtfm(req))];
|
||||
char state[crypto_ahash_statesize(crypto_ahash_reqtfm(req)) ? : 1];
|
||||
struct sock *sk2;
|
||||
struct alg_sock *ask2;
|
||||
struct hash_ctx *ctx2;
|
||||
|
|
|
|||
|
|
@ -642,6 +642,7 @@ static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
|
|||
inst->alg.halg.base.cra_flags = type;
|
||||
|
||||
inst->alg.halg.digestsize = salg->digestsize;
|
||||
inst->alg.halg.statesize = salg->statesize;
|
||||
inst->alg.halg.base.cra_ctxsize = sizeof(struct cryptd_hash_ctx);
|
||||
|
||||
inst->alg.halg.base.cra_init = cryptd_hash_init_tfm;
|
||||
|
|
|
|||
|
|
@ -531,6 +531,7 @@ static int mcryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
|
|||
inst->alg.halg.base.cra_flags = type;
|
||||
|
||||
inst->alg.halg.digestsize = salg->digestsize;
|
||||
inst->alg.halg.statesize = salg->statesize;
|
||||
inst->alg.halg.base.cra_ctxsize = sizeof(struct mcryptd_hash_ctx);
|
||||
|
||||
inst->alg.halg.base.cra_init = mcryptd_hash_init_tfm;
|
||||
|
|
|
|||
|
|
@ -1211,6 +1211,9 @@ static int acpi_video_device_enumerate(struct acpi_video_bus *video)
|
|||
union acpi_object *dod = NULL;
|
||||
union acpi_object *obj;
|
||||
|
||||
if (!video->cap._DOD)
|
||||
return AE_NOT_EXIST;
|
||||
|
||||
status = acpi_evaluate_object(video->device->handle, "_DOD", NULL, &buffer);
|
||||
if (!ACPI_SUCCESS(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "Evaluating _DOD"));
|
||||
|
|
|
|||
|
|
@ -346,6 +346,34 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9343"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = dmi_enable_rev_override,
|
||||
.ident = "DELL Precision 5520",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Precision 5520"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = dmi_enable_rev_override,
|
||||
.ident = "DELL Precision 3520",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3520"),
|
||||
},
|
||||
},
|
||||
/*
|
||||
* Resolves a quirk with the Dell Latitude 3350 that
|
||||
* causes the ethernet adapter to not function.
|
||||
*/
|
||||
{
|
||||
.callback = dmi_enable_rev_override,
|
||||
.ident = "DELL Latitude 3350",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Latitude 3350"),
|
||||
},
|
||||
},
|
||||
#endif
|
||||
{}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -401,7 +401,7 @@ static void disable_interrupts(struct tpm_chip *chip)
|
|||
iowrite32(intmask,
|
||||
chip->vendor.iobase +
|
||||
TPM_INT_ENABLE(chip->vendor.locality));
|
||||
free_irq(chip->vendor.irq, chip);
|
||||
devm_free_irq(chip->pdev, chip->vendor.irq, chip);
|
||||
chip->vendor.irq = 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -688,9 +688,11 @@ static ssize_t show_cpuinfo_cur_freq(struct cpufreq_policy *policy,
|
|||
char *buf)
|
||||
{
|
||||
unsigned int cur_freq = __cpufreq_get(policy);
|
||||
if (!cur_freq)
|
||||
return sprintf(buf, "<unknown>");
|
||||
return sprintf(buf, "%u\n", cur_freq);
|
||||
|
||||
if (cur_freq)
|
||||
return sprintf(buf, "%u\n", cur_freq);
|
||||
|
||||
return sprintf(buf, "<unknown>\n");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -1246,6 +1248,9 @@ static int cpufreq_online(unsigned int cpu)
|
|||
for_each_cpu(j, policy->related_cpus)
|
||||
per_cpu(cpufreq_cpu_data, j) = policy;
|
||||
write_unlock_irqrestore(&cpufreq_driver_lock, flags);
|
||||
} else {
|
||||
policy->min = policy->user_policy.min;
|
||||
policy->max = policy->user_policy.max;
|
||||
}
|
||||
|
||||
if (cpufreq_driver->get && !cpufreq_driver->setpolicy) {
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#include <linux/irq.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/amdgpu_drm.h>
|
||||
|
|
|
|||
|
|
@ -274,7 +274,7 @@ int hv_init(void)
|
|||
*
|
||||
* This routine is called normally during driver unloading or exiting.
|
||||
*/
|
||||
void hv_cleanup(void)
|
||||
void hv_cleanup(bool crash)
|
||||
{
|
||||
union hv_x64_msr_hypercall_contents hypercall_msr;
|
||||
|
||||
|
|
@ -284,7 +284,8 @@ void hv_cleanup(void)
|
|||
if (hv_context.hypercall_page) {
|
||||
hypercall_msr.as_uint64 = 0;
|
||||
wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
|
||||
vfree(hv_context.hypercall_page);
|
||||
if (!crash)
|
||||
vfree(hv_context.hypercall_page);
|
||||
hv_context.hypercall_page = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -304,7 +305,8 @@ void hv_cleanup(void)
|
|||
|
||||
hypercall_msr.as_uint64 = 0;
|
||||
wrmsrl(HV_X64_MSR_REFERENCE_TSC, hypercall_msr.as_uint64);
|
||||
vfree(hv_context.tsc_page);
|
||||
if (!crash)
|
||||
vfree(hv_context.tsc_page);
|
||||
hv_context.tsc_page = NULL;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -714,7 +714,7 @@ static bool pfn_covered(unsigned long start_pfn, unsigned long pfn_cnt)
|
|||
* If the pfn range we are dealing with is not in the current
|
||||
* "hot add block", move on.
|
||||
*/
|
||||
if ((start_pfn >= has->end_pfn))
|
||||
if (start_pfn < has->start_pfn || start_pfn >= has->end_pfn)
|
||||
continue;
|
||||
/*
|
||||
* If the current hot add-request extends beyond
|
||||
|
|
@ -768,7 +768,7 @@ static unsigned long handle_pg_range(unsigned long pg_start,
|
|||
* If the pfn range we are dealing with is not in the current
|
||||
* "hot add block", move on.
|
||||
*/
|
||||
if ((start_pfn >= has->end_pfn))
|
||||
if (start_pfn < has->start_pfn || start_pfn >= has->end_pfn)
|
||||
continue;
|
||||
|
||||
old_covered_state = has->covered_end_pfn;
|
||||
|
|
|
|||
|
|
@ -581,7 +581,7 @@ struct hv_ring_buffer_debug_info {
|
|||
|
||||
extern int hv_init(void);
|
||||
|
||||
extern void hv_cleanup(void);
|
||||
extern void hv_cleanup(bool crash);
|
||||
|
||||
extern int hv_post_message(union hv_connection_id connection_id,
|
||||
enum hv_message_type message_type,
|
||||
|
|
|
|||
|
|
@ -889,7 +889,7 @@ static int vmbus_bus_init(int irq)
|
|||
bus_unregister(&hv_bus);
|
||||
|
||||
err_cleanup:
|
||||
hv_cleanup();
|
||||
hv_cleanup(false);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1254,7 +1254,7 @@ static void hv_kexec_handler(void)
|
|||
vmbus_initiate_unload();
|
||||
for_each_online_cpu(cpu)
|
||||
smp_call_function_single(cpu, hv_synic_cleanup, NULL, 1);
|
||||
hv_cleanup();
|
||||
hv_cleanup(false);
|
||||
};
|
||||
|
||||
static void hv_crash_handler(struct pt_regs *regs)
|
||||
|
|
@ -1266,7 +1266,7 @@ static void hv_crash_handler(struct pt_regs *regs)
|
|||
* for kdump.
|
||||
*/
|
||||
hv_synic_cleanup(NULL);
|
||||
hv_cleanup();
|
||||
hv_cleanup(true);
|
||||
};
|
||||
|
||||
static int __init hv_acpi_init(void)
|
||||
|
|
@ -1330,7 +1330,7 @@ static void __exit vmbus_exit(void)
|
|||
&hyperv_panic_block);
|
||||
}
|
||||
bus_unregister(&hv_bus);
|
||||
hv_cleanup();
|
||||
hv_cleanup(false);
|
||||
for_each_online_cpu(cpu) {
|
||||
tasklet_kill(hv_context.event_dpc[cpu]);
|
||||
smp_call_function_single(cpu, hv_synic_cleanup, NULL, 1);
|
||||
|
|
|
|||
|
|
@ -151,7 +151,9 @@ static irqreturn_t tiadc_irq_h(int irq, void *private)
|
|||
{
|
||||
struct iio_dev *indio_dev = private;
|
||||
struct tiadc_device *adc_dev = iio_priv(indio_dev);
|
||||
unsigned int status, config;
|
||||
unsigned int status, config, adc_fsm;
|
||||
unsigned short count = 0;
|
||||
|
||||
status = tiadc_readl(adc_dev, REG_IRQSTATUS);
|
||||
|
||||
/*
|
||||
|
|
@ -165,6 +167,15 @@ static irqreturn_t tiadc_irq_h(int irq, void *private)
|
|||
tiadc_writel(adc_dev, REG_CTRL, config);
|
||||
tiadc_writel(adc_dev, REG_IRQSTATUS, IRQENB_FIFO1OVRRUN
|
||||
| IRQENB_FIFO1UNDRFLW | IRQENB_FIFO1THRES);
|
||||
|
||||
/* wait for idle state.
|
||||
* ADC needs to finish the current conversion
|
||||
* before disabling the module
|
||||
*/
|
||||
do {
|
||||
adc_fsm = tiadc_readl(adc_dev, REG_ADCFSM);
|
||||
} while (adc_fsm != 0x10 && count++ < 100);
|
||||
|
||||
tiadc_writel(adc_dev, REG_CTRL, (config | CNTRLREG_TSCSSENB));
|
||||
return IRQ_HANDLED;
|
||||
} else if (status & IRQENB_FIFO1THRES) {
|
||||
|
|
|
|||
|
|
@ -51,8 +51,6 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)
|
|||
st->report_state.report_id,
|
||||
st->report_state.index,
|
||||
HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM);
|
||||
|
||||
poll_value = hid_sensor_read_poll_value(st);
|
||||
} else {
|
||||
int val;
|
||||
|
||||
|
|
@ -89,7 +87,9 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state)
|
|||
sensor_hub_get_feature(st->hsdev, st->power_state.report_id,
|
||||
st->power_state.index,
|
||||
sizeof(state_val), &state_val);
|
||||
if (state && poll_value)
|
||||
if (state)
|
||||
poll_value = hid_sensor_read_poll_value(st);
|
||||
if (poll_value > 0)
|
||||
msleep_interruptible(poll_value * 2);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -141,6 +141,9 @@ static int iforce_usb_probe(struct usb_interface *intf,
|
|||
|
||||
interface = intf->cur_altsetting;
|
||||
|
||||
if (interface->desc.bNumEndpoints < 2)
|
||||
return -ENODEV;
|
||||
|
||||
epirq = &interface->endpoint[0].desc;
|
||||
epout = &interface->endpoint[1].desc;
|
||||
|
||||
|
|
|
|||
|
|
@ -675,6 +675,10 @@ static int cm109_usb_probe(struct usb_interface *intf,
|
|||
int error = -ENOMEM;
|
||||
|
||||
interface = intf->cur_altsetting;
|
||||
|
||||
if (interface->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
endpoint = &interface->endpoint[0].desc;
|
||||
|
||||
if (!usb_endpoint_is_int_in(endpoint))
|
||||
|
|
|
|||
|
|
@ -1667,6 +1667,10 @@ static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pc
|
|||
return -EINVAL;
|
||||
|
||||
alt = pcu->ctrl_intf->cur_altsetting;
|
||||
|
||||
if (alt->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
pcu->ep_ctrl = &alt->endpoint[0].desc;
|
||||
pcu->max_ctrl_size = usb_endpoint_maxp(pcu->ep_ctrl);
|
||||
|
||||
|
|
|
|||
|
|
@ -875,6 +875,10 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
|||
int ret, pipe, i;
|
||||
|
||||
interface = intf->cur_altsetting;
|
||||
|
||||
if (interface->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
endpoint = &interface->endpoint[0].desc;
|
||||
if (!usb_endpoint_is_int_in(endpoint))
|
||||
return -ENODEV;
|
||||
|
|
|
|||
|
|
@ -218,17 +218,19 @@ static int elan_query_product(struct elan_tp_data *data)
|
|||
|
||||
static int elan_check_ASUS_special_fw(struct elan_tp_data *data)
|
||||
{
|
||||
if (data->ic_type != 0x0E)
|
||||
return false;
|
||||
|
||||
switch (data->product_id) {
|
||||
case 0x05 ... 0x07:
|
||||
case 0x09:
|
||||
case 0x13:
|
||||
if (data->ic_type == 0x0E) {
|
||||
switch (data->product_id) {
|
||||
case 0x05 ... 0x07:
|
||||
case 0x09:
|
||||
case 0x13:
|
||||
return true;
|
||||
}
|
||||
} else if (data->ic_type == 0x08 && data->product_id == 0x26) {
|
||||
/* ASUS EeeBook X205TA */
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int __elan_initialize(struct elan_tp_data *data)
|
||||
|
|
|
|||
|
|
@ -119,6 +119,13 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_VERSION, "DL760"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Dell Embedded Box PC 3000 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* OQO Model 01 */
|
||||
.matches = {
|
||||
|
|
|
|||
|
|
@ -340,6 +340,9 @@ static int hanwang_probe(struct usb_interface *intf, const struct usb_device_id
|
|||
int error;
|
||||
int i;
|
||||
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
hanwang = kzalloc(sizeof(struct hanwang), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!hanwang || !input_dev) {
|
||||
|
|
|
|||
|
|
@ -122,6 +122,9 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i
|
|||
struct input_dev *input_dev;
|
||||
int error = -ENOMEM;
|
||||
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
kbtab = kzalloc(sizeof(struct kbtab), GFP_KERNEL);
|
||||
input_dev = input_allocate_device();
|
||||
if (!kbtab || !input_dev)
|
||||
|
|
|
|||
|
|
@ -500,6 +500,9 @@ static int sur40_probe(struct usb_interface *interface,
|
|||
if (iface_desc->desc.bInterfaceClass != 0xFF)
|
||||
return -ENODEV;
|
||||
|
||||
if (iface_desc->desc.bNumEndpoints < 5)
|
||||
return -ENODEV;
|
||||
|
||||
/* Use endpoint #4 (0x86). */
|
||||
endpoint = &iface_desc->endpoint[4].desc;
|
||||
if (endpoint->bEndpointAddress != TOUCH_ENDPOINT)
|
||||
|
|
|
|||
|
|
@ -908,7 +908,7 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
|
|||
* which we used for the IOMMU lookup. Strictly speaking
|
||||
* we could do this for all PCI devices; we only need to
|
||||
* get the BDF# from the scope table for ACPI matches. */
|
||||
if (pdev->is_virtfn)
|
||||
if (pdev && pdev->is_virtfn)
|
||||
goto got_pdev;
|
||||
|
||||
*bus = drhd->devices[i].bus;
|
||||
|
|
|
|||
|
|
@ -2317,6 +2317,9 @@ static int gigaset_probe(struct usb_interface *interface,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (hostif->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
dev_info(&udev->dev,
|
||||
"%s: Device matched (Vendor: 0x%x, Product: 0x%x)\n",
|
||||
__func__, le16_to_cpu(udev->descriptor.idVendor),
|
||||
|
|
|
|||
|
|
@ -1072,6 +1072,8 @@ static void __make_request(struct mddev *mddev, struct bio *bio)
|
|||
int max_sectors;
|
||||
int sectors;
|
||||
|
||||
md_write_start(mddev, bio);
|
||||
|
||||
/*
|
||||
* Register the new request and wait if the reconstruction
|
||||
* thread has put up a bar for new requests.
|
||||
|
|
@ -1455,8 +1457,6 @@ static void make_request(struct mddev *mddev, struct bio *bio)
|
|||
return;
|
||||
}
|
||||
|
||||
md_write_start(mddev, bio);
|
||||
|
||||
do {
|
||||
|
||||
/*
|
||||
|
|
@ -1477,7 +1477,25 @@ static void make_request(struct mddev *mddev, struct bio *bio)
|
|||
split = bio;
|
||||
}
|
||||
|
||||
/*
|
||||
* If a bio is splitted, the first part of bio will pass
|
||||
* barrier but the bio is queued in current->bio_list (see
|
||||
* generic_make_request). If there is a raise_barrier() called
|
||||
* here, the second part of bio can't pass barrier. But since
|
||||
* the first part bio isn't dispatched to underlaying disks
|
||||
* yet, the barrier is never released, hence raise_barrier will
|
||||
* alays wait. We have a deadlock.
|
||||
* Note, this only happens in read path. For write path, the
|
||||
* first part of bio is dispatched in a schedule() call
|
||||
* (because of blk plug) or offloaded to raid10d.
|
||||
* Quitting from the function immediately can change the bio
|
||||
* order queued in bio_list and avoid the deadlock.
|
||||
*/
|
||||
__make_request(mddev, split);
|
||||
if (split != bio && bio_data_dir(bio) == READ) {
|
||||
generic_make_request(bio);
|
||||
break;
|
||||
}
|
||||
} while (split != bio);
|
||||
|
||||
/* In case raid10d snuck in to freeze_array */
|
||||
|
|
|
|||
|
|
@ -1595,6 +1595,114 @@ static const char *uvc_print_chain(struct uvc_video_chain *chain)
|
|||
return buffer;
|
||||
}
|
||||
|
||||
static struct uvc_video_chain *uvc_alloc_chain(struct uvc_device *dev)
|
||||
{
|
||||
struct uvc_video_chain *chain;
|
||||
|
||||
chain = kzalloc(sizeof(*chain), GFP_KERNEL);
|
||||
if (chain == NULL)
|
||||
return NULL;
|
||||
|
||||
INIT_LIST_HEAD(&chain->entities);
|
||||
mutex_init(&chain->ctrl_mutex);
|
||||
chain->dev = dev;
|
||||
v4l2_prio_init(&chain->prio);
|
||||
|
||||
return chain;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fallback heuristic for devices that don't connect units and terminals in a
|
||||
* valid chain.
|
||||
*
|
||||
* Some devices have invalid baSourceID references, causing uvc_scan_chain()
|
||||
* to fail, but if we just take the entities we can find and put them together
|
||||
* in the most sensible chain we can think of, turns out they do work anyway.
|
||||
* Note: This heuristic assumes there is a single chain.
|
||||
*
|
||||
* At the time of writing, devices known to have such a broken chain are
|
||||
* - Acer Integrated Camera (5986:055a)
|
||||
* - Realtek rtl157a7 (0bda:57a7)
|
||||
*/
|
||||
static int uvc_scan_fallback(struct uvc_device *dev)
|
||||
{
|
||||
struct uvc_video_chain *chain;
|
||||
struct uvc_entity *iterm = NULL;
|
||||
struct uvc_entity *oterm = NULL;
|
||||
struct uvc_entity *entity;
|
||||
struct uvc_entity *prev;
|
||||
|
||||
/*
|
||||
* Start by locating the input and output terminals. We only support
|
||||
* devices with exactly one of each for now.
|
||||
*/
|
||||
list_for_each_entry(entity, &dev->entities, list) {
|
||||
if (UVC_ENTITY_IS_ITERM(entity)) {
|
||||
if (iterm)
|
||||
return -EINVAL;
|
||||
iterm = entity;
|
||||
}
|
||||
|
||||
if (UVC_ENTITY_IS_OTERM(entity)) {
|
||||
if (oterm)
|
||||
return -EINVAL;
|
||||
oterm = entity;
|
||||
}
|
||||
}
|
||||
|
||||
if (iterm == NULL || oterm == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
/* Allocate the chain and fill it. */
|
||||
chain = uvc_alloc_chain(dev);
|
||||
if (chain == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (uvc_scan_chain_entity(chain, oterm) < 0)
|
||||
goto error;
|
||||
|
||||
prev = oterm;
|
||||
|
||||
/*
|
||||
* Add all Processing and Extension Units with two pads. The order
|
||||
* doesn't matter much, use reverse list traversal to connect units in
|
||||
* UVC descriptor order as we build the chain from output to input. This
|
||||
* leads to units appearing in the order meant by the manufacturer for
|
||||
* the cameras known to require this heuristic.
|
||||
*/
|
||||
list_for_each_entry_reverse(entity, &dev->entities, list) {
|
||||
if (entity->type != UVC_VC_PROCESSING_UNIT &&
|
||||
entity->type != UVC_VC_EXTENSION_UNIT)
|
||||
continue;
|
||||
|
||||
if (entity->num_pads != 2)
|
||||
continue;
|
||||
|
||||
if (uvc_scan_chain_entity(chain, entity) < 0)
|
||||
goto error;
|
||||
|
||||
prev->baSourceID[0] = entity->id;
|
||||
prev = entity;
|
||||
}
|
||||
|
||||
if (uvc_scan_chain_entity(chain, iterm) < 0)
|
||||
goto error;
|
||||
|
||||
prev->baSourceID[0] = iterm->id;
|
||||
|
||||
list_add_tail(&chain->list, &dev->chains);
|
||||
|
||||
uvc_trace(UVC_TRACE_PROBE,
|
||||
"Found a video chain by fallback heuristic (%s).\n",
|
||||
uvc_print_chain(chain));
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
kfree(chain);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Scan the device for video chains and register video devices.
|
||||
*
|
||||
|
|
@ -1617,15 +1725,10 @@ static int uvc_scan_device(struct uvc_device *dev)
|
|||
if (term->chain.next || term->chain.prev)
|
||||
continue;
|
||||
|
||||
chain = kzalloc(sizeof(*chain), GFP_KERNEL);
|
||||
chain = uvc_alloc_chain(dev);
|
||||
if (chain == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
INIT_LIST_HEAD(&chain->entities);
|
||||
mutex_init(&chain->ctrl_mutex);
|
||||
chain->dev = dev;
|
||||
v4l2_prio_init(&chain->prio);
|
||||
|
||||
term->flags |= UVC_ENTITY_FLAG_DEFAULT;
|
||||
|
||||
if (uvc_scan_chain(chain, term) < 0) {
|
||||
|
|
@ -1639,6 +1742,9 @@ static int uvc_scan_device(struct uvc_device *dev)
|
|||
list_add_tail(&chain->list, &dev->chains);
|
||||
}
|
||||
|
||||
if (list_empty(&dev->chains))
|
||||
uvc_scan_fallback(dev);
|
||||
|
||||
if (list_empty(&dev->chains)) {
|
||||
uvc_printk(KERN_INFO, "No valid video chain found.\n");
|
||||
return -1;
|
||||
|
|
|
|||
|
|
@ -1274,7 +1274,9 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|||
return;
|
||||
}
|
||||
timeout--;
|
||||
mdelay(1);
|
||||
spin_unlock_irq(&host->lock);
|
||||
usleep_range(900, 1100);
|
||||
spin_lock_irq(&host->lock);
|
||||
}
|
||||
|
||||
clk |= SDHCI_CLOCK_CARD_EN;
|
||||
|
|
|
|||
|
|
@ -426,6 +426,9 @@ static int ushc_probe(struct usb_interface *intf, const struct usb_device_id *id
|
|||
struct ushc_data *ushc;
|
||||
int ret;
|
||||
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
mmc = mmc_alloc_host(sizeof(struct ushc_data), &intf->dev);
|
||||
if (mmc == NULL)
|
||||
return -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -913,8 +913,8 @@
|
|||
#define RX_PACKET_ATTRIBUTES_CSUM_DONE_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_INDEX 1
|
||||
#define RX_PACKET_ATTRIBUTES_VLAN_CTAG_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_INCOMPLETE_INDEX 2
|
||||
#define RX_PACKET_ATTRIBUTES_INCOMPLETE_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_LAST_INDEX 2
|
||||
#define RX_PACKET_ATTRIBUTES_LAST_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_INDEX 3
|
||||
#define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_CONTEXT_INDEX 4
|
||||
|
|
@ -923,6 +923,8 @@
|
|||
#define RX_PACKET_ATTRIBUTES_RX_TSTAMP_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_RSS_HASH_INDEX 6
|
||||
#define RX_PACKET_ATTRIBUTES_RSS_HASH_WIDTH 1
|
||||
#define RX_PACKET_ATTRIBUTES_FIRST_INDEX 7
|
||||
#define RX_PACKET_ATTRIBUTES_FIRST_WIDTH 1
|
||||
|
||||
#define RX_NORMAL_DESC0_OVT_INDEX 0
|
||||
#define RX_NORMAL_DESC0_OVT_WIDTH 16
|
||||
|
|
|
|||
|
|
@ -1658,10 +1658,15 @@ static int xgbe_dev_read(struct xgbe_channel *channel)
|
|||
|
||||
/* Get the header length */
|
||||
if (XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, FD)) {
|
||||
XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
FIRST, 1);
|
||||
rdata->rx.hdr_len = XGMAC_GET_BITS_LE(rdesc->desc2,
|
||||
RX_NORMAL_DESC2, HL);
|
||||
if (rdata->rx.hdr_len)
|
||||
pdata->ext_stats.rx_split_header_packets++;
|
||||
} else {
|
||||
XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
FIRST, 0);
|
||||
}
|
||||
|
||||
/* Get the RSS hash */
|
||||
|
|
@ -1684,19 +1689,16 @@ static int xgbe_dev_read(struct xgbe_channel *channel)
|
|||
}
|
||||
}
|
||||
|
||||
/* Get the packet length */
|
||||
rdata->rx.len = XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, PL);
|
||||
|
||||
if (!XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, LD)) {
|
||||
/* Not all the data has been transferred for this packet */
|
||||
XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
INCOMPLETE, 1);
|
||||
/* Not all the data has been transferred for this packet */
|
||||
if (!XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, LD))
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This is the last of the data for this packet */
|
||||
XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
INCOMPLETE, 0);
|
||||
LAST, 1);
|
||||
|
||||
/* Get the packet length */
|
||||
rdata->rx.len = XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, PL);
|
||||
|
||||
/* Set checksum done indicator as appropriate */
|
||||
if (netdev->features & NETIF_F_RXCSUM)
|
||||
|
|
|
|||
|
|
@ -1760,13 +1760,12 @@ static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata,
|
|||
{
|
||||
struct sk_buff *skb;
|
||||
u8 *packet;
|
||||
unsigned int copy_len;
|
||||
|
||||
skb = napi_alloc_skb(napi, rdata->rx.hdr.dma_len);
|
||||
if (!skb)
|
||||
return NULL;
|
||||
|
||||
/* Start with the header buffer which may contain just the header
|
||||
/* Pull in the header buffer which may contain just the header
|
||||
* or the header plus data
|
||||
*/
|
||||
dma_sync_single_range_for_cpu(pdata->dev, rdata->rx.hdr.dma_base,
|
||||
|
|
@ -1775,30 +1774,49 @@ static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata,
|
|||
|
||||
packet = page_address(rdata->rx.hdr.pa.pages) +
|
||||
rdata->rx.hdr.pa.pages_offset;
|
||||
copy_len = (rdata->rx.hdr_len) ? rdata->rx.hdr_len : len;
|
||||
copy_len = min(rdata->rx.hdr.dma_len, copy_len);
|
||||
skb_copy_to_linear_data(skb, packet, copy_len);
|
||||
skb_put(skb, copy_len);
|
||||
|
||||
len -= copy_len;
|
||||
if (len) {
|
||||
/* Add the remaining data as a frag */
|
||||
dma_sync_single_range_for_cpu(pdata->dev,
|
||||
rdata->rx.buf.dma_base,
|
||||
rdata->rx.buf.dma_off,
|
||||
rdata->rx.buf.dma_len,
|
||||
DMA_FROM_DEVICE);
|
||||
|
||||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||
rdata->rx.buf.pa.pages,
|
||||
rdata->rx.buf.pa.pages_offset,
|
||||
len, rdata->rx.buf.dma_len);
|
||||
rdata->rx.buf.pa.pages = NULL;
|
||||
}
|
||||
skb_copy_to_linear_data(skb, packet, len);
|
||||
skb_put(skb, len);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static unsigned int xgbe_rx_buf1_len(struct xgbe_ring_data *rdata,
|
||||
struct xgbe_packet_data *packet)
|
||||
{
|
||||
/* Always zero if not the first descriptor */
|
||||
if (!XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, FIRST))
|
||||
return 0;
|
||||
|
||||
/* First descriptor with split header, return header length */
|
||||
if (rdata->rx.hdr_len)
|
||||
return rdata->rx.hdr_len;
|
||||
|
||||
/* First descriptor but not the last descriptor and no split header,
|
||||
* so the full buffer was used
|
||||
*/
|
||||
if (!XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, LAST))
|
||||
return rdata->rx.hdr.dma_len;
|
||||
|
||||
/* First descriptor and last descriptor and no split header, so
|
||||
* calculate how much of the buffer was used
|
||||
*/
|
||||
return min_t(unsigned int, rdata->rx.hdr.dma_len, rdata->rx.len);
|
||||
}
|
||||
|
||||
static unsigned int xgbe_rx_buf2_len(struct xgbe_ring_data *rdata,
|
||||
struct xgbe_packet_data *packet,
|
||||
unsigned int len)
|
||||
{
|
||||
/* Always the full buffer if not the last descriptor */
|
||||
if (!XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, LAST))
|
||||
return rdata->rx.buf.dma_len;
|
||||
|
||||
/* Last descriptor so calculate how much of the buffer was used
|
||||
* for the last bit of data
|
||||
*/
|
||||
return rdata->rx.len - len;
|
||||
}
|
||||
|
||||
static int xgbe_tx_poll(struct xgbe_channel *channel)
|
||||
{
|
||||
struct xgbe_prv_data *pdata = channel->pdata;
|
||||
|
|
@ -1881,8 +1899,8 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
|
|||
struct napi_struct *napi;
|
||||
struct sk_buff *skb;
|
||||
struct skb_shared_hwtstamps *hwtstamps;
|
||||
unsigned int incomplete, error, context_next, context;
|
||||
unsigned int len, rdesc_len, max_len;
|
||||
unsigned int last, error, context_next, context;
|
||||
unsigned int len, buf1_len, buf2_len, max_len;
|
||||
unsigned int received = 0;
|
||||
int packet_count = 0;
|
||||
|
||||
|
|
@ -1892,7 +1910,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
|
|||
if (!ring)
|
||||
return 0;
|
||||
|
||||
incomplete = 0;
|
||||
last = 0;
|
||||
context_next = 0;
|
||||
|
||||
napi = (pdata->per_channel_irq) ? &channel->napi : &pdata->napi;
|
||||
|
|
@ -1926,9 +1944,8 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
|
|||
received++;
|
||||
ring->cur++;
|
||||
|
||||
incomplete = XGMAC_GET_BITS(packet->attributes,
|
||||
RX_PACKET_ATTRIBUTES,
|
||||
INCOMPLETE);
|
||||
last = XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES,
|
||||
LAST);
|
||||
context_next = XGMAC_GET_BITS(packet->attributes,
|
||||
RX_PACKET_ATTRIBUTES,
|
||||
CONTEXT_NEXT);
|
||||
|
|
@ -1937,7 +1954,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
|
|||
CONTEXT);
|
||||
|
||||
/* Earlier error, just drain the remaining data */
|
||||
if ((incomplete || context_next) && error)
|
||||
if ((!last || context_next) && error)
|
||||
goto read_again;
|
||||
|
||||
if (error || packet->errors) {
|
||||
|
|
@ -1949,16 +1966,22 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
|
|||
}
|
||||
|
||||
if (!context) {
|
||||
/* Length is cumulative, get this descriptor's length */
|
||||
rdesc_len = rdata->rx.len - len;
|
||||
len += rdesc_len;
|
||||
/* Get the data length in the descriptor buffers */
|
||||
buf1_len = xgbe_rx_buf1_len(rdata, packet);
|
||||
len += buf1_len;
|
||||
buf2_len = xgbe_rx_buf2_len(rdata, packet, len);
|
||||
len += buf2_len;
|
||||
|
||||
if (rdesc_len && !skb) {
|
||||
if (!skb) {
|
||||
skb = xgbe_create_skb(pdata, napi, rdata,
|
||||
rdesc_len);
|
||||
if (!skb)
|
||||
buf1_len);
|
||||
if (!skb) {
|
||||
error = 1;
|
||||
} else if (rdesc_len) {
|
||||
goto skip_data;
|
||||
}
|
||||
}
|
||||
|
||||
if (buf2_len) {
|
||||
dma_sync_single_range_for_cpu(pdata->dev,
|
||||
rdata->rx.buf.dma_base,
|
||||
rdata->rx.buf.dma_off,
|
||||
|
|
@ -1968,13 +1991,14 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
|
|||
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
|
||||
rdata->rx.buf.pa.pages,
|
||||
rdata->rx.buf.pa.pages_offset,
|
||||
rdesc_len,
|
||||
buf2_len,
|
||||
rdata->rx.buf.dma_len);
|
||||
rdata->rx.buf.pa.pages = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (incomplete || context_next)
|
||||
skip_data:
|
||||
if (!last || context_next)
|
||||
goto read_again;
|
||||
|
||||
if (!skb)
|
||||
|
|
@ -2033,7 +2057,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget)
|
|||
}
|
||||
|
||||
/* Check if we need to save state before leaving */
|
||||
if (received && (incomplete || context_next)) {
|
||||
if (received && (!last || context_next)) {
|
||||
rdata = XGBE_GET_DESC_DATA(ring, ring->cur);
|
||||
rdata->state_saved = 1;
|
||||
rdata->state.skb = skb;
|
||||
|
|
|
|||
|
|
@ -3495,7 +3495,8 @@ static int bcmgenet_suspend(struct device *d)
|
|||
|
||||
bcmgenet_netif_stop(dev);
|
||||
|
||||
phy_suspend(priv->phydev);
|
||||
if (!device_may_wakeup(d))
|
||||
phy_suspend(priv->phydev);
|
||||
|
||||
netif_device_detach(dev);
|
||||
|
||||
|
|
@ -3592,7 +3593,8 @@ static int bcmgenet_resume(struct device *d)
|
|||
|
||||
netif_device_attach(dev);
|
||||
|
||||
phy_resume(priv->phydev);
|
||||
if (!device_may_wakeup(d))
|
||||
phy_resume(priv->phydev);
|
||||
|
||||
if (priv->eee.eee_enabled)
|
||||
bcmgenet_eee_enable_set(dev, true);
|
||||
|
|
|
|||
|
|
@ -220,20 +220,6 @@ void bcmgenet_phy_power_set(struct net_device *dev, bool enable)
|
|||
udelay(60);
|
||||
}
|
||||
|
||||
static void bcmgenet_internal_phy_setup(struct net_device *dev)
|
||||
{
|
||||
struct bcmgenet_priv *priv = netdev_priv(dev);
|
||||
u32 reg;
|
||||
|
||||
/* Power up PHY */
|
||||
bcmgenet_phy_power_set(dev, true);
|
||||
/* enable APD */
|
||||
reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
|
||||
reg |= EXT_PWR_DN_EN_LD;
|
||||
bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
|
||||
bcmgenet_mii_reset(dev);
|
||||
}
|
||||
|
||||
static void bcmgenet_moca_phy_setup(struct bcmgenet_priv *priv)
|
||||
{
|
||||
u32 reg;
|
||||
|
|
@ -281,7 +267,6 @@ int bcmgenet_mii_config(struct net_device *dev)
|
|||
|
||||
if (priv->internal_phy) {
|
||||
phy_name = "internal PHY";
|
||||
bcmgenet_internal_phy_setup(dev);
|
||||
} else if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) {
|
||||
phy_name = "MoCA";
|
||||
bcmgenet_moca_phy_setup(priv);
|
||||
|
|
|
|||
|
|
@ -77,6 +77,10 @@ s32 igb_get_phy_id(struct e1000_hw *hw)
|
|||
s32 ret_val = 0;
|
||||
u16 phy_id;
|
||||
|
||||
/* ensure PHY page selection to fix misconfigured i210 */
|
||||
if ((hw->mac.type == e1000_i210) || (hw->mac.type == e1000_i211))
|
||||
phy->ops.write_reg(hw, I347AT4_PAGE_SELECT, 0);
|
||||
|
||||
ret_val = phy->ops.read_reg(hw, PHY_ID1, &phy_id);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -197,6 +197,10 @@ static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,
|
|||
if (lro_num_seg > 1) {
|
||||
mlx5e_lro_update_hdr(skb, cqe);
|
||||
skb_shinfo(skb)->gso_size = DIV_ROUND_UP(cqe_bcnt, lro_num_seg);
|
||||
/* Subtract one since we already counted this as one
|
||||
* "regular" packet in mlx5e_complete_rx_cqe()
|
||||
*/
|
||||
rq->stats.packets += lro_num_seg - 1;
|
||||
rq->stats.lro_packets++;
|
||||
rq->stats.lro_bytes += cqe_bcnt;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ static struct mlx5_profile profile[] = {
|
|||
[2] = {
|
||||
.mask = MLX5_PROF_MASK_QP_SIZE |
|
||||
MLX5_PROF_MASK_MR_CACHE,
|
||||
.log_max_qp = 17,
|
||||
.log_max_qp = 18,
|
||||
.mr_cache[0] = {
|
||||
.size = 500,
|
||||
.limit = 250
|
||||
|
|
|
|||
|
|
@ -197,65 +197,6 @@ static void *init_ppi_data(struct rndis_message *msg, u32 ppi_size,
|
|||
return ppi;
|
||||
}
|
||||
|
||||
union sub_key {
|
||||
u64 k;
|
||||
struct {
|
||||
u8 pad[3];
|
||||
u8 kb;
|
||||
u32 ka;
|
||||
};
|
||||
};
|
||||
|
||||
/* Toeplitz hash function
|
||||
* data: network byte order
|
||||
* return: host byte order
|
||||
*/
|
||||
static u32 comp_hash(u8 *key, int klen, void *data, int dlen)
|
||||
{
|
||||
union sub_key subk;
|
||||
int k_next = 4;
|
||||
u8 dt;
|
||||
int i, j;
|
||||
u32 ret = 0;
|
||||
|
||||
subk.k = 0;
|
||||
subk.ka = ntohl(*(u32 *)key);
|
||||
|
||||
for (i = 0; i < dlen; i++) {
|
||||
subk.kb = key[k_next];
|
||||
k_next = (k_next + 1) % klen;
|
||||
dt = ((u8 *)data)[i];
|
||||
for (j = 0; j < 8; j++) {
|
||||
if (dt & 0x80)
|
||||
ret ^= subk.ka;
|
||||
dt <<= 1;
|
||||
subk.k <<= 1;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool netvsc_set_hash(u32 *hash, struct sk_buff *skb)
|
||||
{
|
||||
struct flow_keys flow;
|
||||
int data_len;
|
||||
|
||||
if (!skb_flow_dissect_flow_keys(skb, &flow, 0) ||
|
||||
!(flow.basic.n_proto == htons(ETH_P_IP) ||
|
||||
flow.basic.n_proto == htons(ETH_P_IPV6)))
|
||||
return false;
|
||||
|
||||
if (flow.basic.ip_proto == IPPROTO_TCP)
|
||||
data_len = 12;
|
||||
else
|
||||
data_len = 8;
|
||||
|
||||
*hash = comp_hash(netvsc_hash_key, HASH_KEYLEN, &flow, data_len);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static u16 netvsc_select_queue(struct net_device *ndev, struct sk_buff *skb,
|
||||
void *accel_priv, select_queue_fallback_t fallback)
|
||||
{
|
||||
|
|
@ -268,11 +209,9 @@ static u16 netvsc_select_queue(struct net_device *ndev, struct sk_buff *skb,
|
|||
if (nvsc_dev == NULL || ndev->real_num_tx_queues <= 1)
|
||||
return 0;
|
||||
|
||||
if (netvsc_set_hash(&hash, skb)) {
|
||||
q_idx = nvsc_dev->send_table[hash % VRSS_SEND_TAB_SIZE] %
|
||||
ndev->real_num_tx_queues;
|
||||
skb_set_hash(skb, hash, PKT_HASH_TYPE_L3);
|
||||
}
|
||||
hash = skb_get_hash(skb);
|
||||
q_idx = nvsc_dev->send_table[hash % VRSS_SEND_TAB_SIZE] %
|
||||
ndev->real_num_tx_queues;
|
||||
|
||||
return q_idx;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -936,8 +936,10 @@ parport_register_dev_model(struct parport *port, const char *name,
|
|||
* pardevice fields. -arca
|
||||
*/
|
||||
port->ops->init_state(par_dev, par_dev->state);
|
||||
port->proc_device = par_dev;
|
||||
parport_device_proc_register(par_dev);
|
||||
if (!test_and_set_bit(PARPORT_DEVPROC_REGISTERED, &port->devflags)) {
|
||||
port->proc_device = par_dev;
|
||||
parport_device_proc_register(par_dev);
|
||||
}
|
||||
|
||||
return par_dev;
|
||||
|
||||
|
|
|
|||
|
|
@ -303,13 +303,6 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|||
return rc;
|
||||
}
|
||||
|
||||
pci_iov_set_numvfs(dev, nr_virtfn);
|
||||
iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE;
|
||||
pci_cfg_access_lock(dev);
|
||||
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
|
||||
msleep(100);
|
||||
pci_cfg_access_unlock(dev);
|
||||
|
||||
iov->initial_VFs = initial;
|
||||
if (nr_virtfn < initial)
|
||||
initial = nr_virtfn;
|
||||
|
|
@ -320,6 +313,13 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
|
|||
goto err_pcibios;
|
||||
}
|
||||
|
||||
pci_iov_set_numvfs(dev, nr_virtfn);
|
||||
iov->ctrl |= PCI_SRIOV_CTRL_VFE | PCI_SRIOV_CTRL_MSE;
|
||||
pci_cfg_access_lock(dev);
|
||||
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, iov->ctrl);
|
||||
msleep(100);
|
||||
pci_cfg_access_unlock(dev);
|
||||
|
||||
for (i = 0; i < initial; i++) {
|
||||
rc = virtfn_add(dev, i, 0);
|
||||
if (rc)
|
||||
|
|
@ -555,21 +555,61 @@ void pci_iov_release(struct pci_dev *dev)
|
|||
}
|
||||
|
||||
/**
|
||||
* pci_iov_resource_bar - get position of the SR-IOV BAR
|
||||
* pci_iov_update_resource - update a VF BAR
|
||||
* @dev: the PCI device
|
||||
* @resno: the resource number
|
||||
*
|
||||
* Returns position of the BAR encapsulated in the SR-IOV capability.
|
||||
* Update a VF BAR in the SR-IOV capability of a PF.
|
||||
*/
|
||||
int pci_iov_resource_bar(struct pci_dev *dev, int resno)
|
||||
void pci_iov_update_resource(struct pci_dev *dev, int resno)
|
||||
{
|
||||
if (resno < PCI_IOV_RESOURCES || resno > PCI_IOV_RESOURCE_END)
|
||||
return 0;
|
||||
struct pci_sriov *iov = dev->is_physfn ? dev->sriov : NULL;
|
||||
struct resource *res = dev->resource + resno;
|
||||
int vf_bar = resno - PCI_IOV_RESOURCES;
|
||||
struct pci_bus_region region;
|
||||
u16 cmd;
|
||||
u32 new;
|
||||
int reg;
|
||||
|
||||
BUG_ON(!dev->is_physfn);
|
||||
/*
|
||||
* The generic pci_restore_bars() path calls this for all devices,
|
||||
* including VFs and non-SR-IOV devices. If this is not a PF, we
|
||||
* have nothing to do.
|
||||
*/
|
||||
if (!iov)
|
||||
return;
|
||||
|
||||
return dev->sriov->pos + PCI_SRIOV_BAR +
|
||||
4 * (resno - PCI_IOV_RESOURCES);
|
||||
pci_read_config_word(dev, iov->pos + PCI_SRIOV_CTRL, &cmd);
|
||||
if ((cmd & PCI_SRIOV_CTRL_VFE) && (cmd & PCI_SRIOV_CTRL_MSE)) {
|
||||
dev_WARN(&dev->dev, "can't update enabled VF BAR%d %pR\n",
|
||||
vf_bar, res);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ignore unimplemented BARs, unused resource slots for 64-bit
|
||||
* BARs, and non-movable resources, e.g., those described via
|
||||
* Enhanced Allocation.
|
||||
*/
|
||||
if (!res->flags)
|
||||
return;
|
||||
|
||||
if (res->flags & IORESOURCE_UNSET)
|
||||
return;
|
||||
|
||||
if (res->flags & IORESOURCE_PCI_FIXED)
|
||||
return;
|
||||
|
||||
pcibios_resource_to_bus(dev->bus, ®ion, res);
|
||||
new = region.start;
|
||||
new |= res->flags & ~PCI_BASE_ADDRESS_MEM_MASK;
|
||||
|
||||
reg = iov->pos + PCI_SRIOV_BAR + 4 * vf_bar;
|
||||
pci_write_config_dword(dev, reg, new);
|
||||
if (res->flags & IORESOURCE_MEM_64) {
|
||||
new = region.start >> 16 >> 16;
|
||||
pci_write_config_dword(dev, reg + 4, new);
|
||||
}
|
||||
}
|
||||
|
||||
resource_size_t __weak pcibios_iov_resource_alignment(struct pci_dev *dev,
|
||||
|
|
|
|||
|
|
@ -519,10 +519,6 @@ static void pci_restore_bars(struct pci_dev *dev)
|
|||
{
|
||||
int i;
|
||||
|
||||
/* Per SR-IOV spec 3.4.1.11, VF BARs are RO zero */
|
||||
if (dev->is_virtfn)
|
||||
return;
|
||||
|
||||
for (i = 0; i < PCI_BRIDGE_RESOURCES; i++)
|
||||
pci_update_resource(dev, i);
|
||||
}
|
||||
|
|
@ -4472,36 +4468,6 @@ int pci_select_bars(struct pci_dev *dev, unsigned long flags)
|
|||
}
|
||||
EXPORT_SYMBOL(pci_select_bars);
|
||||
|
||||
/**
|
||||
* pci_resource_bar - get position of the BAR associated with a resource
|
||||
* @dev: the PCI device
|
||||
* @resno: the resource number
|
||||
* @type: the BAR type to be filled in
|
||||
*
|
||||
* Returns BAR position in config space, or 0 if the BAR is invalid.
|
||||
*/
|
||||
int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type)
|
||||
{
|
||||
int reg;
|
||||
|
||||
if (resno < PCI_ROM_RESOURCE) {
|
||||
*type = pci_bar_unknown;
|
||||
return PCI_BASE_ADDRESS_0 + 4 * resno;
|
||||
} else if (resno == PCI_ROM_RESOURCE) {
|
||||
*type = pci_bar_mem32;
|
||||
return dev->rom_base_reg;
|
||||
} else if (resno < PCI_BRIDGE_RESOURCES) {
|
||||
/* device specific resource */
|
||||
*type = pci_bar_unknown;
|
||||
reg = pci_iov_resource_bar(dev, resno);
|
||||
if (reg)
|
||||
return reg;
|
||||
}
|
||||
|
||||
dev_err(&dev->dev, "BAR %d: invalid resource\n", resno);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Some architectures require additional programming to enable VGA */
|
||||
static arch_set_vga_state_t arch_set_vga_state;
|
||||
|
||||
|
|
|
|||
|
|
@ -232,7 +232,6 @@ bool pci_bus_read_dev_vendor_id(struct pci_bus *bus, int devfn, u32 *pl,
|
|||
int pci_setup_device(struct pci_dev *dev);
|
||||
int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
||||
struct resource *res, unsigned int reg);
|
||||
int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type);
|
||||
void pci_configure_ari(struct pci_dev *dev);
|
||||
void __pci_bus_size_bridges(struct pci_bus *bus,
|
||||
struct list_head *realloc_head);
|
||||
|
|
@ -276,7 +275,7 @@ static inline void pci_restore_ats_state(struct pci_dev *dev)
|
|||
#ifdef CONFIG_PCI_IOV
|
||||
int pci_iov_init(struct pci_dev *dev);
|
||||
void pci_iov_release(struct pci_dev *dev);
|
||||
int pci_iov_resource_bar(struct pci_dev *dev, int resno);
|
||||
void pci_iov_update_resource(struct pci_dev *dev, int resno);
|
||||
resource_size_t pci_sriov_resource_alignment(struct pci_dev *dev, int resno);
|
||||
void pci_restore_iov_state(struct pci_dev *dev);
|
||||
int pci_iov_bus_range(struct pci_bus *bus);
|
||||
|
|
@ -290,10 +289,6 @@ static inline void pci_iov_release(struct pci_dev *dev)
|
|||
|
||||
{
|
||||
}
|
||||
static inline int pci_iov_resource_bar(struct pci_dev *dev, int resno)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void pci_restore_iov_state(struct pci_dev *dev)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -226,7 +226,8 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
|||
mask64 = (u32)PCI_BASE_ADDRESS_MEM_MASK;
|
||||
}
|
||||
} else {
|
||||
res->flags |= (l & IORESOURCE_ROM_ENABLE);
|
||||
if (l & PCI_ROM_ADDRESS_ENABLE)
|
||||
res->flags |= IORESOURCE_ROM_ENABLE;
|
||||
l64 = l & PCI_ROM_ADDRESS_MASK;
|
||||
sz64 = sz & PCI_ROM_ADDRESS_MASK;
|
||||
mask64 = (u32)PCI_ROM_ADDRESS_MASK;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,11 @@ int pci_enable_rom(struct pci_dev *pdev)
|
|||
if (!res->flags)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* Ideally pci_update_resource() would update the ROM BAR address,
|
||||
* and we would only set the enable bit here. But apparently some
|
||||
* devices have buggy ROM BARs that read as zero when disabled.
|
||||
*/
|
||||
pcibios_resource_to_bus(pdev->bus, ®ion, res);
|
||||
pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_addr);
|
||||
rom_addr &= ~PCI_ROM_ADDRESS_MASK;
|
||||
|
|
|
|||
|
|
@ -25,21 +25,18 @@
|
|||
#include <linux/slab.h>
|
||||
#include "pci.h"
|
||||
|
||||
|
||||
void pci_update_resource(struct pci_dev *dev, int resno)
|
||||
static void pci_std_update_resource(struct pci_dev *dev, int resno)
|
||||
{
|
||||
struct pci_bus_region region;
|
||||
bool disable;
|
||||
u16 cmd;
|
||||
u32 new, check, mask;
|
||||
int reg;
|
||||
enum pci_bar_type type;
|
||||
struct resource *res = dev->resource + resno;
|
||||
|
||||
if (dev->is_virtfn) {
|
||||
dev_warn(&dev->dev, "can't update VF BAR%d\n", resno);
|
||||
/* Per SR-IOV spec 3.4.1.11, VF BARs are RO zero */
|
||||
if (dev->is_virtfn)
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ignore resources for unimplemented BARs and unused resource slots
|
||||
|
|
@ -60,21 +57,34 @@ void pci_update_resource(struct pci_dev *dev, int resno)
|
|||
return;
|
||||
|
||||
pcibios_resource_to_bus(dev->bus, ®ion, res);
|
||||
new = region.start;
|
||||
|
||||
new = region.start | (res->flags & PCI_REGION_FLAG_MASK);
|
||||
if (res->flags & IORESOURCE_IO)
|
||||
if (res->flags & IORESOURCE_IO) {
|
||||
mask = (u32)PCI_BASE_ADDRESS_IO_MASK;
|
||||
else
|
||||
new |= res->flags & ~PCI_BASE_ADDRESS_IO_MASK;
|
||||
} else if (resno == PCI_ROM_RESOURCE) {
|
||||
mask = (u32)PCI_ROM_ADDRESS_MASK;
|
||||
} else {
|
||||
mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;
|
||||
new |= res->flags & ~PCI_BASE_ADDRESS_MEM_MASK;
|
||||
}
|
||||
|
||||
reg = pci_resource_bar(dev, resno, &type);
|
||||
if (!reg)
|
||||
return;
|
||||
if (type != pci_bar_unknown) {
|
||||
if (resno < PCI_ROM_RESOURCE) {
|
||||
reg = PCI_BASE_ADDRESS_0 + 4 * resno;
|
||||
} else if (resno == PCI_ROM_RESOURCE) {
|
||||
|
||||
/*
|
||||
* Apparently some Matrox devices have ROM BARs that read
|
||||
* as zero when disabled, so don't update ROM BARs unless
|
||||
* they're enabled. See https://lkml.org/lkml/2005/8/30/138.
|
||||
*/
|
||||
if (!(res->flags & IORESOURCE_ROM_ENABLE))
|
||||
return;
|
||||
|
||||
reg = dev->rom_base_reg;
|
||||
new |= PCI_ROM_ADDRESS_ENABLE;
|
||||
}
|
||||
} else
|
||||
return;
|
||||
|
||||
/*
|
||||
* We can't update a 64-bit BAR atomically, so when possible,
|
||||
|
|
@ -110,6 +120,16 @@ void pci_update_resource(struct pci_dev *dev, int resno)
|
|||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
|
||||
void pci_update_resource(struct pci_dev *dev, int resno)
|
||||
{
|
||||
if (resno <= PCI_ROM_RESOURCE)
|
||||
pci_std_update_resource(dev, resno);
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
else if (resno >= PCI_IOV_RESOURCES && resno <= PCI_IOV_RESOURCE_END)
|
||||
pci_iov_update_resource(dev, resno);
|
||||
#endif
|
||||
}
|
||||
|
||||
int pci_claim_resource(struct pci_dev *dev, int resource)
|
||||
{
|
||||
struct resource *res = &dev->resource[resource];
|
||||
|
|
|
|||
|
|
@ -1466,12 +1466,11 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq)
|
|||
offset += range->npins;
|
||||
}
|
||||
|
||||
/* Mask and clear all interrupts */
|
||||
chv_writel(0, pctrl->regs + CHV_INTMASK);
|
||||
/* Clear all interrupts */
|
||||
chv_writel(0xffff, pctrl->regs + CHV_INTSTAT);
|
||||
|
||||
ret = gpiochip_irqchip_add(chip, &chv_gpio_irqchip, 0,
|
||||
handle_simple_irq, IRQ_TYPE_NONE);
|
||||
handle_bad_irq, IRQ_TYPE_NONE);
|
||||
if (ret) {
|
||||
dev_err(pctrl->dev, "failed to add IRQ chip\n");
|
||||
goto fail;
|
||||
|
|
|
|||
|
|
@ -1651,6 +1651,9 @@ static void ap_scan_bus(struct work_struct *unused)
|
|||
ap_dev->queue_depth = queue_depth;
|
||||
ap_dev->raw_hwtype = device_type;
|
||||
ap_dev->device_type = device_type;
|
||||
/* CEX6 toleration: map to CEX5 */
|
||||
if (device_type == AP_DEVICE_TYPE_CEX6)
|
||||
ap_dev->device_type = AP_DEVICE_TYPE_CEX5;
|
||||
ap_dev->functions = device_functions;
|
||||
spin_lock_init(&ap_dev->lock);
|
||||
INIT_LIST_HEAD(&ap_dev->pendingq);
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ static inline int ap_test_bit(unsigned int *ptr, unsigned int nr)
|
|||
#define AP_DEVICE_TYPE_CEX3C 9
|
||||
#define AP_DEVICE_TYPE_CEX4 10
|
||||
#define AP_DEVICE_TYPE_CEX5 11
|
||||
#define AP_DEVICE_TYPE_CEX6 12
|
||||
|
||||
/*
|
||||
* Known function facilities
|
||||
|
|
|
|||
|
|
@ -34,7 +34,6 @@ extern const struct file_operations cxlflash_cxl_fops;
|
|||
sectors
|
||||
*/
|
||||
|
||||
#define NUM_RRQ_ENTRY 16 /* for master issued cmds */
|
||||
#define MAX_RHT_PER_CONTEXT (PAGE_SIZE / sizeof(struct sisl_rht_entry))
|
||||
|
||||
/* AFU command retry limit */
|
||||
|
|
@ -48,9 +47,12 @@ extern const struct file_operations cxlflash_cxl_fops;
|
|||
index derivation
|
||||
*/
|
||||
|
||||
#define CXLFLASH_MAX_CMDS 16
|
||||
#define CXLFLASH_MAX_CMDS 256
|
||||
#define CXLFLASH_MAX_CMDS_PER_LUN CXLFLASH_MAX_CMDS
|
||||
|
||||
/* RRQ for master issued cmds */
|
||||
#define NUM_RRQ_ENTRY CXLFLASH_MAX_CMDS
|
||||
|
||||
|
||||
static inline void check_sizes(void)
|
||||
{
|
||||
|
|
@ -149,7 +151,7 @@ struct afu_cmd {
|
|||
struct afu {
|
||||
/* Stuff requiring alignment go first. */
|
||||
|
||||
u64 rrq_entry[NUM_RRQ_ENTRY]; /* 128B RRQ */
|
||||
u64 rrq_entry[NUM_RRQ_ENTRY]; /* 2K RRQ */
|
||||
/*
|
||||
* Command & data for AFU commands.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -2305,7 +2305,7 @@ static struct scsi_host_template driver_template = {
|
|||
.eh_device_reset_handler = cxlflash_eh_device_reset_handler,
|
||||
.eh_host_reset_handler = cxlflash_eh_host_reset_handler,
|
||||
.change_queue_depth = cxlflash_change_queue_depth,
|
||||
.cmd_per_lun = 16,
|
||||
.cmd_per_lun = CXLFLASH_MAX_CMDS_PER_LUN,
|
||||
.can_queue = CXLFLASH_MAX_CMDS,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = SG_NONE, /* No scatter gather support */
|
||||
|
|
|
|||
|
|
@ -560,8 +560,12 @@ static void iscsi_complete_task(struct iscsi_task *task, int state)
|
|||
WARN_ON_ONCE(task->state == ISCSI_TASK_FREE);
|
||||
task->state = state;
|
||||
|
||||
if (!list_empty(&task->running))
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
if (!list_empty(&task->running)) {
|
||||
pr_debug_once("%s while task on list", __func__);
|
||||
list_del_init(&task->running);
|
||||
}
|
||||
spin_unlock_bh(&conn->taskqueuelock);
|
||||
|
||||
if (conn->task == task)
|
||||
conn->task = NULL;
|
||||
|
|
@ -783,7 +787,9 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
|
|||
if (session->tt->xmit_task(task))
|
||||
goto free_task;
|
||||
} else {
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
list_add_tail(&task->running, &conn->mgmtqueue);
|
||||
spin_unlock_bh(&conn->taskqueuelock);
|
||||
iscsi_conn_queue_work(conn);
|
||||
}
|
||||
|
||||
|
|
@ -1474,8 +1480,10 @@ void iscsi_requeue_task(struct iscsi_task *task)
|
|||
* this may be on the requeue list already if the xmit_task callout
|
||||
* is handling the r2ts while we are adding new ones
|
||||
*/
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
if (list_empty(&task->running))
|
||||
list_add_tail(&task->running, &conn->requeue);
|
||||
spin_unlock_bh(&conn->taskqueuelock);
|
||||
iscsi_conn_queue_work(conn);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iscsi_requeue_task);
|
||||
|
|
@ -1512,22 +1520,26 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
|
|||
* only have one nop-out as a ping from us and targets should not
|
||||
* overflow us with nop-ins
|
||||
*/
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
check_mgmt:
|
||||
while (!list_empty(&conn->mgmtqueue)) {
|
||||
conn->task = list_entry(conn->mgmtqueue.next,
|
||||
struct iscsi_task, running);
|
||||
list_del_init(&conn->task->running);
|
||||
spin_unlock_bh(&conn->taskqueuelock);
|
||||
if (iscsi_prep_mgmt_task(conn, conn->task)) {
|
||||
/* regular RX path uses back_lock */
|
||||
spin_lock_bh(&conn->session->back_lock);
|
||||
__iscsi_put_task(conn->task);
|
||||
spin_unlock_bh(&conn->session->back_lock);
|
||||
conn->task = NULL;
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
continue;
|
||||
}
|
||||
rc = iscsi_xmit_task(conn);
|
||||
if (rc)
|
||||
goto done;
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
}
|
||||
|
||||
/* process pending command queue */
|
||||
|
|
@ -1535,19 +1547,24 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
|
|||
conn->task = list_entry(conn->cmdqueue.next, struct iscsi_task,
|
||||
running);
|
||||
list_del_init(&conn->task->running);
|
||||
spin_unlock_bh(&conn->taskqueuelock);
|
||||
if (conn->session->state == ISCSI_STATE_LOGGING_OUT) {
|
||||
fail_scsi_task(conn->task, DID_IMM_RETRY);
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
continue;
|
||||
}
|
||||
rc = iscsi_prep_scsi_cmd_pdu(conn->task);
|
||||
if (rc) {
|
||||
if (rc == -ENOMEM || rc == -EACCES) {
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
list_add_tail(&conn->task->running,
|
||||
&conn->cmdqueue);
|
||||
conn->task = NULL;
|
||||
spin_unlock_bh(&conn->taskqueuelock);
|
||||
goto done;
|
||||
} else
|
||||
fail_scsi_task(conn->task, DID_ABORT);
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
continue;
|
||||
}
|
||||
rc = iscsi_xmit_task(conn);
|
||||
|
|
@ -1558,6 +1575,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
|
|||
* we need to check the mgmt queue for nops that need to
|
||||
* be sent to aviod starvation
|
||||
*/
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
if (!list_empty(&conn->mgmtqueue))
|
||||
goto check_mgmt;
|
||||
}
|
||||
|
|
@ -1577,12 +1595,15 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
|
|||
conn->task = task;
|
||||
list_del_init(&conn->task->running);
|
||||
conn->task->state = ISCSI_TASK_RUNNING;
|
||||
spin_unlock_bh(&conn->taskqueuelock);
|
||||
rc = iscsi_xmit_task(conn);
|
||||
if (rc)
|
||||
goto done;
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
if (!list_empty(&conn->mgmtqueue))
|
||||
goto check_mgmt;
|
||||
}
|
||||
spin_unlock_bh(&conn->taskqueuelock);
|
||||
spin_unlock_bh(&conn->session->frwd_lock);
|
||||
return -ENODATA;
|
||||
|
||||
|
|
@ -1738,7 +1759,9 @@ int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc)
|
|||
goto prepd_reject;
|
||||
}
|
||||
} else {
|
||||
spin_lock_bh(&conn->taskqueuelock);
|
||||
list_add_tail(&task->running, &conn->cmdqueue);
|
||||
spin_unlock_bh(&conn->taskqueuelock);
|
||||
iscsi_conn_queue_work(conn);
|
||||
}
|
||||
|
||||
|
|
@ -2900,6 +2923,7 @@ iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size,
|
|||
INIT_LIST_HEAD(&conn->mgmtqueue);
|
||||
INIT_LIST_HEAD(&conn->cmdqueue);
|
||||
INIT_LIST_HEAD(&conn->requeue);
|
||||
spin_lock_init(&conn->taskqueuelock);
|
||||
INIT_WORK(&conn->xmitwork, iscsi_xmitworker);
|
||||
|
||||
/* allocate login_task used for the login/text sequences */
|
||||
|
|
|
|||
|
|
@ -11387,6 +11387,7 @@ static struct pci_driver lpfc_driver = {
|
|||
.id_table = lpfc_id_table,
|
||||
.probe = lpfc_pci_probe_one,
|
||||
.remove = lpfc_pci_remove_one,
|
||||
.shutdown = lpfc_pci_remove_one,
|
||||
.suspend = lpfc_pci_suspend_one,
|
||||
.resume = lpfc_pci_resume_one,
|
||||
.err_handler = &lpfc_err_handler,
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ static void pscsi_tape_read_blocksize(struct se_device *dev,
|
|||
|
||||
buf = kzalloc(12, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return;
|
||||
goto out_free;
|
||||
|
||||
memset(cdb, 0, MAX_COMMAND_SIZE);
|
||||
cdb[0] = MODE_SENSE;
|
||||
|
|
@ -169,9 +169,10 @@ static void pscsi_tape_read_blocksize(struct se_device *dev,
|
|||
* If MODE_SENSE still returns zero, set the default value to 1024.
|
||||
*/
|
||||
sdev->sector_size = (buf[9] << 16) | (buf[10] << 8) | (buf[11]);
|
||||
out_free:
|
||||
if (!sdev->sector_size)
|
||||
sdev->sector_size = 1024;
|
||||
out_free:
|
||||
|
||||
kfree(buf);
|
||||
}
|
||||
|
||||
|
|
@ -314,9 +315,10 @@ static int pscsi_add_device_to_list(struct se_device *dev,
|
|||
sd->lun, sd->queue_depth);
|
||||
}
|
||||
|
||||
dev->dev_attrib.hw_block_size = sd->sector_size;
|
||||
dev->dev_attrib.hw_block_size =
|
||||
min_not_zero((int)sd->sector_size, 512);
|
||||
dev->dev_attrib.hw_max_sectors =
|
||||
min_t(int, sd->host->max_sectors, queue_max_hw_sectors(q));
|
||||
min_not_zero(sd->host->max_sectors, queue_max_hw_sectors(q));
|
||||
dev->dev_attrib.hw_queue_depth = sd->queue_depth;
|
||||
|
||||
/*
|
||||
|
|
@ -339,8 +341,10 @@ static int pscsi_add_device_to_list(struct se_device *dev,
|
|||
/*
|
||||
* For TYPE_TAPE, attempt to determine blocksize with MODE_SENSE.
|
||||
*/
|
||||
if (sd->type == TYPE_TAPE)
|
||||
if (sd->type == TYPE_TAPE) {
|
||||
pscsi_tape_read_blocksize(dev, sd);
|
||||
dev->dev_attrib.hw_block_size = sd->sector_size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -406,7 +410,7 @@ static int pscsi_create_type_disk(struct se_device *dev, struct scsi_device *sd)
|
|||
/*
|
||||
* Called with struct Scsi_Host->host_lock called.
|
||||
*/
|
||||
static int pscsi_create_type_rom(struct se_device *dev, struct scsi_device *sd)
|
||||
static int pscsi_create_type_nondisk(struct se_device *dev, struct scsi_device *sd)
|
||||
__releases(sh->host_lock)
|
||||
{
|
||||
struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
|
||||
|
|
@ -433,28 +437,6 @@ static int pscsi_create_type_rom(struct se_device *dev, struct scsi_device *sd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called with struct Scsi_Host->host_lock called.
|
||||
*/
|
||||
static int pscsi_create_type_other(struct se_device *dev,
|
||||
struct scsi_device *sd)
|
||||
__releases(sh->host_lock)
|
||||
{
|
||||
struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
|
||||
struct Scsi_Host *sh = sd->host;
|
||||
int ret;
|
||||
|
||||
spin_unlock_irq(sh->host_lock);
|
||||
ret = pscsi_add_device_to_list(dev, sd);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
pr_debug("CORE_PSCSI[%d] - Added Type: %s for %d:%d:%d:%llu\n",
|
||||
phv->phv_host_id, scsi_device_type(sd->type), sh->host_no,
|
||||
sd->channel, sd->id, sd->lun);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pscsi_configure_device(struct se_device *dev)
|
||||
{
|
||||
struct se_hba *hba = dev->se_hba;
|
||||
|
|
@ -542,11 +524,8 @@ static int pscsi_configure_device(struct se_device *dev)
|
|||
case TYPE_DISK:
|
||||
ret = pscsi_create_type_disk(dev, sd);
|
||||
break;
|
||||
case TYPE_ROM:
|
||||
ret = pscsi_create_type_rom(dev, sd);
|
||||
break;
|
||||
default:
|
||||
ret = pscsi_create_type_other(dev, sd);
|
||||
ret = pscsi_create_type_nondisk(dev, sd);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -611,8 +590,7 @@ static void pscsi_free_device(struct se_device *dev)
|
|||
else if (pdv->pdv_lld_host)
|
||||
scsi_host_put(pdv->pdv_lld_host);
|
||||
|
||||
if ((sd->type == TYPE_DISK) || (sd->type == TYPE_ROM))
|
||||
scsi_device_put(sd);
|
||||
scsi_device_put(sd);
|
||||
|
||||
pdv->pdv_sd = NULL;
|
||||
}
|
||||
|
|
@ -1088,7 +1066,6 @@ static sector_t pscsi_get_blocks(struct se_device *dev)
|
|||
if (pdv->pdv_bd && pdv->pdv_bd->bd_part)
|
||||
return pdv->pdv_bd->bd_part->nr_sects;
|
||||
|
||||
dump_stack();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1096,9 +1096,15 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
|
|||
return ret;
|
||||
break;
|
||||
case VERIFY:
|
||||
case VERIFY_16:
|
||||
size = 0;
|
||||
sectors = transport_get_sectors_10(cdb);
|
||||
cmd->t_task_lba = transport_lba_32(cdb);
|
||||
if (cdb[0] == VERIFY) {
|
||||
sectors = transport_get_sectors_10(cdb);
|
||||
cmd->t_task_lba = transport_lba_32(cdb);
|
||||
} else {
|
||||
sectors = transport_get_sectors_16(cdb);
|
||||
cmd->t_task_lba = transport_lba_64(cdb);
|
||||
}
|
||||
cmd->execute_cmd = sbc_emulate_noop;
|
||||
goto check_lba;
|
||||
case REZERO_UNIT:
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ struct serial_private {
|
|||
unsigned int nr;
|
||||
void __iomem *remapped_bar[PCI_NUM_BAR_RESOURCES];
|
||||
struct pci_serial_quirk *quirk;
|
||||
const struct pciserial_board *board;
|
||||
int line[0];
|
||||
};
|
||||
|
||||
|
|
@ -4058,6 +4059,7 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
|
|||
}
|
||||
}
|
||||
priv->nr = i;
|
||||
priv->board = board;
|
||||
return priv;
|
||||
|
||||
err_deinit:
|
||||
|
|
@ -4068,7 +4070,7 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(pciserial_init_ports);
|
||||
|
||||
void pciserial_remove_ports(struct serial_private *priv)
|
||||
void pciserial_detach_ports(struct serial_private *priv)
|
||||
{
|
||||
struct pci_serial_quirk *quirk;
|
||||
int i;
|
||||
|
|
@ -4088,7 +4090,11 @@ void pciserial_remove_ports(struct serial_private *priv)
|
|||
quirk = find_quirk(priv->dev);
|
||||
if (quirk->exit)
|
||||
quirk->exit(priv->dev);
|
||||
}
|
||||
|
||||
void pciserial_remove_ports(struct serial_private *priv)
|
||||
{
|
||||
pciserial_detach_ports(priv);
|
||||
kfree(priv);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pciserial_remove_ports);
|
||||
|
|
@ -5819,7 +5825,7 @@ static pci_ers_result_t serial8250_io_error_detected(struct pci_dev *dev,
|
|||
return PCI_ERS_RESULT_DISCONNECT;
|
||||
|
||||
if (priv)
|
||||
pciserial_suspend_ports(priv);
|
||||
pciserial_detach_ports(priv);
|
||||
|
||||
pci_disable_device(dev);
|
||||
|
||||
|
|
@ -5844,9 +5850,18 @@ static pci_ers_result_t serial8250_io_slot_reset(struct pci_dev *dev)
|
|||
static void serial8250_io_resume(struct pci_dev *dev)
|
||||
{
|
||||
struct serial_private *priv = pci_get_drvdata(dev);
|
||||
const struct pciserial_board *board;
|
||||
|
||||
if (priv)
|
||||
pciserial_resume_ports(priv);
|
||||
if (!priv)
|
||||
return;
|
||||
|
||||
board = priv->board;
|
||||
kfree(priv);
|
||||
priv = pciserial_init_ports(dev, board);
|
||||
|
||||
if (!IS_ERR(priv)) {
|
||||
pci_set_drvdata(dev, priv);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct pci_error_handlers serial8250_err_handler = {
|
||||
|
|
|
|||
|
|
@ -1105,7 +1105,7 @@ static int usbtmc_probe(struct usb_interface *intf,
|
|||
|
||||
dev_dbg(&intf->dev, "%s called\n", __func__);
|
||||
|
||||
data = kmalloc(sizeof(*data), GFP_KERNEL);
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -1163,6 +1163,12 @@ static int usbtmc_probe(struct usb_interface *intf,
|
|||
}
|
||||
}
|
||||
|
||||
if (!data->bulk_out || !data->bulk_in) {
|
||||
dev_err(&intf->dev, "bulk endpoints not found\n");
|
||||
retcode = -ENODEV;
|
||||
goto err_put;
|
||||
}
|
||||
|
||||
retcode = get_capabilities(data);
|
||||
if (retcode)
|
||||
dev_err(&intf->dev, "can't read capabilities\n");
|
||||
|
|
@ -1186,6 +1192,7 @@ static int usbtmc_probe(struct usb_interface *intf,
|
|||
error_register:
|
||||
sysfs_remove_group(&intf->dev.kobj, &capability_attr_grp);
|
||||
sysfs_remove_group(&intf->dev.kobj, &data_attr_grp);
|
||||
err_put:
|
||||
kref_put(&data->kref, usbtmc_delete);
|
||||
return retcode;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -246,6 +246,16 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,
|
|||
|
||||
/*
|
||||
* Adjust bInterval for quirked devices.
|
||||
*/
|
||||
/*
|
||||
* This quirk fixes bIntervals reported in ms.
|
||||
*/
|
||||
if (to_usb_device(ddev)->quirks &
|
||||
USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL) {
|
||||
n = clamp(fls(d->bInterval) + 3, i, j);
|
||||
i = j = n;
|
||||
}
|
||||
/*
|
||||
* This quirk fixes bIntervals reported in
|
||||
* linear microframes.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -966,7 +966,7 @@ static void usb_bus_init (struct usb_bus *bus)
|
|||
bus->bandwidth_allocated = 0;
|
||||
bus->bandwidth_int_reqs = 0;
|
||||
bus->bandwidth_isoc_reqs = 0;
|
||||
mutex_init(&bus->usb_address0_mutex);
|
||||
mutex_init(&bus->devnum_next_mutex);
|
||||
|
||||
INIT_LIST_HEAD (&bus->bus_list);
|
||||
}
|
||||
|
|
@ -2497,6 +2497,14 @@ struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver,
|
|||
return NULL;
|
||||
}
|
||||
if (primary_hcd == NULL) {
|
||||
hcd->address0_mutex = kmalloc(sizeof(*hcd->address0_mutex),
|
||||
GFP_KERNEL);
|
||||
if (!hcd->address0_mutex) {
|
||||
kfree(hcd);
|
||||
dev_dbg(dev, "hcd address0 mutex alloc failed\n");
|
||||
return NULL;
|
||||
}
|
||||
mutex_init(hcd->address0_mutex);
|
||||
hcd->bandwidth_mutex = kmalloc(sizeof(*hcd->bandwidth_mutex),
|
||||
GFP_KERNEL);
|
||||
if (!hcd->bandwidth_mutex) {
|
||||
|
|
@ -2508,6 +2516,7 @@ struct usb_hcd *usb_create_shared_hcd(const struct hc_driver *driver,
|
|||
dev_set_drvdata(dev, hcd);
|
||||
} else {
|
||||
mutex_lock(&usb_port_peer_mutex);
|
||||
hcd->address0_mutex = primary_hcd->address0_mutex;
|
||||
hcd->bandwidth_mutex = primary_hcd->bandwidth_mutex;
|
||||
hcd->primary_hcd = primary_hcd;
|
||||
primary_hcd->primary_hcd = primary_hcd;
|
||||
|
|
@ -2564,24 +2573,23 @@ EXPORT_SYMBOL_GPL(usb_create_hcd);
|
|||
* Don't deallocate the bandwidth_mutex until the last shared usb_hcd is
|
||||
* deallocated.
|
||||
*
|
||||
* Make sure to only deallocate the bandwidth_mutex when the primary HCD is
|
||||
* freed. When hcd_release() is called for either hcd in a peer set
|
||||
* invalidate the peer's ->shared_hcd and ->primary_hcd pointers to
|
||||
* block new peering attempts
|
||||
* Make sure to deallocate the bandwidth_mutex only when the last HCD is
|
||||
* freed. When hcd_release() is called for either hcd in a peer set,
|
||||
* invalidate the peer's ->shared_hcd and ->primary_hcd pointers.
|
||||
*/
|
||||
static void hcd_release(struct kref *kref)
|
||||
{
|
||||
struct usb_hcd *hcd = container_of (kref, struct usb_hcd, kref);
|
||||
|
||||
mutex_lock(&usb_port_peer_mutex);
|
||||
if (usb_hcd_is_primary_hcd(hcd))
|
||||
kfree(hcd->bandwidth_mutex);
|
||||
if (hcd->shared_hcd) {
|
||||
struct usb_hcd *peer = hcd->shared_hcd;
|
||||
|
||||
peer->shared_hcd = NULL;
|
||||
if (peer->primary_hcd == hcd)
|
||||
peer->primary_hcd = NULL;
|
||||
peer->primary_hcd = NULL;
|
||||
} else {
|
||||
kfree(hcd->address0_mutex);
|
||||
kfree(hcd->bandwidth_mutex);
|
||||
}
|
||||
mutex_unlock(&usb_port_peer_mutex);
|
||||
kfree(hcd);
|
||||
|
|
|
|||
|
|
@ -1980,7 +1980,7 @@ static void choose_devnum(struct usb_device *udev)
|
|||
struct usb_bus *bus = udev->bus;
|
||||
|
||||
/* be safe when more hub events are proceed in parallel */
|
||||
mutex_lock(&bus->usb_address0_mutex);
|
||||
mutex_lock(&bus->devnum_next_mutex);
|
||||
if (udev->wusb) {
|
||||
devnum = udev->portnum + 1;
|
||||
BUG_ON(test_bit(devnum, bus->devmap.devicemap));
|
||||
|
|
@ -1998,7 +1998,7 @@ static void choose_devnum(struct usb_device *udev)
|
|||
set_bit(devnum, bus->devmap.devicemap);
|
||||
udev->devnum = devnum;
|
||||
}
|
||||
mutex_unlock(&bus->usb_address0_mutex);
|
||||
mutex_unlock(&bus->devnum_next_mutex);
|
||||
}
|
||||
|
||||
static void release_devnum(struct usb_device *udev)
|
||||
|
|
@ -4199,7 +4199,7 @@ static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev)
|
|||
struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent);
|
||||
int connect_type = USB_PORT_CONNECT_TYPE_UNKNOWN;
|
||||
|
||||
if (!udev->usb2_hw_lpm_capable)
|
||||
if (!udev->usb2_hw_lpm_capable || !udev->bos)
|
||||
return;
|
||||
|
||||
if (hub)
|
||||
|
|
@ -4262,7 +4262,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,
|
|||
if (oldspeed == USB_SPEED_LOW)
|
||||
delay = HUB_LONG_RESET_TIME;
|
||||
|
||||
mutex_lock(&hdev->bus->usb_address0_mutex);
|
||||
mutex_lock(hcd->address0_mutex);
|
||||
|
||||
/* Reset the device; full speed may morph to high speed */
|
||||
/* FIXME a USB 2.0 device may morph into SuperSpeed on reset. */
|
||||
|
|
@ -4548,7 +4548,7 @@ hub_port_init(struct usb_hub *hub, struct usb_device *udev, int port1,
|
|||
hub_port_disable(hub, port1, 0);
|
||||
update_devnum(udev, devnum); /* for disconnect processing */
|
||||
}
|
||||
mutex_unlock(&hdev->bus->usb_address0_mutex);
|
||||
mutex_unlock(hcd->address0_mutex);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -170,6 +170,14 @@ static const struct usb_device_id usb_quirk_list[] = {
|
|||
/* M-Systems Flash Disk Pioneers */
|
||||
{ USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||
|
||||
/* Baum Vario Ultra */
|
||||
{ USB_DEVICE(0x0904, 0x6101), .driver_info =
|
||||
USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL },
|
||||
{ USB_DEVICE(0x0904, 0x6102), .driver_info =
|
||||
USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL },
|
||||
{ USB_DEVICE(0x0904, 0x6103), .driver_info =
|
||||
USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL },
|
||||
|
||||
/* Keytouch QWERTY Panel keyboard */
|
||||
{ USB_DEVICE(0x0926, 0x3333), .driver_info =
|
||||
USB_QUIRK_CONFIG_INTF_STRINGS },
|
||||
|
|
|
|||
|
|
@ -535,13 +535,15 @@ static int acm_notify_serial_state(struct f_acm *acm)
|
|||
{
|
||||
struct usb_composite_dev *cdev = acm->port.func.config->cdev;
|
||||
int status;
|
||||
__le16 serial_state;
|
||||
|
||||
spin_lock(&acm->lock);
|
||||
if (acm->notify_req) {
|
||||
dev_dbg(&cdev->gadget->dev, "acm ttyGS%d serial state %04x\n",
|
||||
acm->port_num, acm->serial_state);
|
||||
serial_state = cpu_to_le16(acm->serial_state);
|
||||
status = acm_cdc_notify(acm, USB_CDC_NOTIFY_SERIAL_STATE,
|
||||
0, &acm->serial_state, sizeof(acm->serial_state));
|
||||
0, &serial_state, sizeof(acm->serial_state));
|
||||
} else {
|
||||
acm->pending = true;
|
||||
status = 0;
|
||||
|
|
|
|||
|
|
@ -625,7 +625,7 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
uvc_ss_streaming_comp.bMaxBurst = opts->streaming_maxburst;
|
||||
uvc_ss_streaming_comp.wBytesPerInterval =
|
||||
cpu_to_le16(max_packet_size * max_packet_mult *
|
||||
opts->streaming_maxburst);
|
||||
(opts->streaming_maxburst + 1));
|
||||
|
||||
/* Allocate endpoints. */
|
||||
ep = usb_ep_autoconfig(cdev->gadget, &uvc_control_ep);
|
||||
|
|
|
|||
|
|
@ -346,6 +346,9 @@ static int idmouse_probe(struct usb_interface *interface,
|
|||
if (iface_desc->desc.bInterfaceClass != 0x0A)
|
||||
return -ENODEV;
|
||||
|
||||
if (iface_desc->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
/* allocate memory for our device state and initialize it */
|
||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (dev == NULL)
|
||||
|
|
|
|||
|
|
@ -370,6 +370,10 @@ static int lvs_rh_probe(struct usb_interface *intf,
|
|||
|
||||
hdev = interface_to_usbdev(intf);
|
||||
desc = intf->cur_altsetting;
|
||||
|
||||
if (desc->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
endpoint = &desc->endpoint[0].desc;
|
||||
|
||||
/* valid only for SS root hub */
|
||||
|
|
|
|||
|
|
@ -711,6 +711,11 @@ static int uss720_probe(struct usb_interface *intf,
|
|||
|
||||
interface = intf->cur_altsetting;
|
||||
|
||||
if (interface->desc.bNumEndpoints < 3) {
|
||||
usb_put_dev(usbdev);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate parport interface
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -250,8 +250,27 @@ static void cppi41_dma_callback(void *private_data)
|
|||
transferred < cppi41_channel->packet_sz)
|
||||
cppi41_channel->prog_len = 0;
|
||||
|
||||
if (cppi41_channel->is_tx)
|
||||
empty = musb_is_tx_fifo_empty(hw_ep);
|
||||
if (cppi41_channel->is_tx) {
|
||||
u8 type;
|
||||
|
||||
if (is_host_active(musb))
|
||||
type = hw_ep->out_qh->type;
|
||||
else
|
||||
type = hw_ep->ep_in.type;
|
||||
|
||||
if (type == USB_ENDPOINT_XFER_ISOC)
|
||||
/*
|
||||
* Don't use the early-TX-interrupt workaround below
|
||||
* for Isoch transfter. Since Isoch are periodic
|
||||
* transfer, by the time the next transfer is
|
||||
* scheduled, the current one should be done already.
|
||||
*
|
||||
* This avoids audio playback underrun issue.
|
||||
*/
|
||||
empty = true;
|
||||
else
|
||||
empty = musb_is_tx_fifo_empty(hw_ep);
|
||||
}
|
||||
|
||||
if (!cppi41_channel->is_tx || empty) {
|
||||
cppi41_trans_done(cppi41_channel);
|
||||
|
|
|
|||
|
|
@ -233,6 +233,14 @@ static void option_instat_callback(struct urb *urb);
|
|||
#define BANDRICH_PRODUCT_1012 0x1012
|
||||
|
||||
#define QUALCOMM_VENDOR_ID 0x05C6
|
||||
/* These Quectel products use Qualcomm's vendor ID */
|
||||
#define QUECTEL_PRODUCT_UC20 0x9003
|
||||
#define QUECTEL_PRODUCT_UC15 0x9090
|
||||
|
||||
#define QUECTEL_VENDOR_ID 0x2c7c
|
||||
/* These Quectel products use Quectel's vendor ID */
|
||||
#define QUECTEL_PRODUCT_EC21 0x0121
|
||||
#define QUECTEL_PRODUCT_EC25 0x0125
|
||||
|
||||
#define CMOTECH_VENDOR_ID 0x16d8
|
||||
#define CMOTECH_PRODUCT_6001 0x6001
|
||||
|
|
@ -1161,7 +1169,14 @@ static const struct usb_device_id option_ids[] = {
|
|||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9003), /* Quectel UC20 */
|
||||
/* Quectel products using Qualcomm vendor ID */
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC15)},
|
||||
{ USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC20),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
/* Quectel products using Quectel vendor ID */
|
||||
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25),
|
||||
.driver_info = (kernel_ulong_t)&net_intf4_blacklist },
|
||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
|
||||
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
|
||||
|
|
|
|||
|
|
@ -169,6 +169,8 @@ static const struct usb_device_id id_table[] = {
|
|||
{DEVICE_SWI(0x413c, 0x81a9)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */
|
||||
{DEVICE_SWI(0x413c, 0x81b1)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card */
|
||||
{DEVICE_SWI(0x413c, 0x81b3)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */
|
||||
{DEVICE_SWI(0x413c, 0x81b5)}, /* Dell Wireless 5811e QDL */
|
||||
{DEVICE_SWI(0x413c, 0x81b6)}, /* Dell Wireless 5811e QDL */
|
||||
|
||||
/* Huawei devices */
|
||||
{DEVICE_HWI(0x03f0, 0x581d)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Modem (Huawei me906e) */
|
||||
|
|
|
|||
|
|
@ -39,6 +39,9 @@ int wa_create(struct wahc *wa, struct usb_interface *iface,
|
|||
int result;
|
||||
struct device *dev = &iface->dev;
|
||||
|
||||
if (iface->cur_altsetting->desc.bNumEndpoints < 3)
|
||||
return -ENODEV;
|
||||
|
||||
result = wa_rpipes_create(wa);
|
||||
if (result < 0)
|
||||
goto error_rpipes_create;
|
||||
|
|
|
|||
|
|
@ -825,6 +825,9 @@ static int hwarc_probe(struct usb_interface *iface,
|
|||
struct hwarc *hwarc;
|
||||
struct device *dev = &iface->dev;
|
||||
|
||||
if (iface->cur_altsetting->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
result = -ENOMEM;
|
||||
uwb_rc = uwb_rc_alloc();
|
||||
if (uwb_rc == NULL) {
|
||||
|
|
|
|||
|
|
@ -362,6 +362,9 @@ int i1480_usb_probe(struct usb_interface *iface, const struct usb_device_id *id)
|
|||
result);
|
||||
}
|
||||
|
||||
if (iface->cur_altsetting->desc.bNumEndpoints < 1)
|
||||
return -ENODEV;
|
||||
|
||||
result = -ENOMEM;
|
||||
i1480_usb = kzalloc(sizeof(*i1480_usb), GFP_KERNEL);
|
||||
if (i1480_usb == NULL) {
|
||||
|
|
|
|||
|
|
@ -511,6 +511,12 @@ static long tce_iommu_build_v2(struct tce_container *container,
|
|||
unsigned long hpa;
|
||||
enum dma_data_direction dirtmp;
|
||||
|
||||
if (!tbl->it_userspace) {
|
||||
ret = tce_iommu_userspace_view_alloc(tbl);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < pages; ++i) {
|
||||
struct mm_iommu_table_group_mem_t *mem = NULL;
|
||||
unsigned long *pua = IOMMU_TABLE_USERSPACE_ENTRY(tbl,
|
||||
|
|
@ -584,15 +590,6 @@ static long tce_iommu_create_table(struct tce_container *container,
|
|||
WARN_ON(!ret && !(*ptbl)->it_ops->free);
|
||||
WARN_ON(!ret && ((*ptbl)->it_allocated_size != table_size));
|
||||
|
||||
if (!ret && container->v2) {
|
||||
ret = tce_iommu_userspace_view_alloc(*ptbl);
|
||||
if (ret)
|
||||
(*ptbl)->it_ops->free(*ptbl);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
decrement_locked_vm(table_size >> PAGE_SHIFT);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1064,10 +1061,7 @@ static int tce_iommu_take_ownership(struct tce_container *container,
|
|||
if (!tbl || !tbl->it_map)
|
||||
continue;
|
||||
|
||||
rc = tce_iommu_userspace_view_alloc(tbl);
|
||||
if (!rc)
|
||||
rc = iommu_take_ownership(tbl);
|
||||
|
||||
rc = iommu_take_ownership(tbl);
|
||||
if (rc) {
|
||||
for (j = 0; j < i; ++j)
|
||||
iommu_release_ownership(
|
||||
|
|
|
|||
|
|
@ -1168,6 +1168,8 @@ static void fbcon_free_font(struct display *p, bool freefont)
|
|||
p->userfont = 0;
|
||||
}
|
||||
|
||||
static void set_vc_hi_font(struct vc_data *vc, bool set);
|
||||
|
||||
static void fbcon_deinit(struct vc_data *vc)
|
||||
{
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
|
|
@ -1203,6 +1205,9 @@ static void fbcon_deinit(struct vc_data *vc)
|
|||
if (free_font)
|
||||
vc->vc_font.data = NULL;
|
||||
|
||||
if (vc->vc_hi_font_mask)
|
||||
set_vc_hi_font(vc, false);
|
||||
|
||||
if (!con_is_bound(&fb_con))
|
||||
fbcon_exit();
|
||||
|
||||
|
|
@ -2439,32 +2444,10 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
||||
const u8 * data, int userfont)
|
||||
/* set/clear vc_hi_font_mask and update vc attrs accordingly */
|
||||
static void set_vc_hi_font(struct vc_data *vc, bool set)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
int resize;
|
||||
int cnt;
|
||||
char *old_data = NULL;
|
||||
|
||||
if (CON_IS_VISIBLE(vc) && softback_lines)
|
||||
fbcon_set_origin(vc);
|
||||
|
||||
resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
|
||||
if (p->userfont)
|
||||
old_data = vc->vc_font.data;
|
||||
if (userfont)
|
||||
cnt = FNTCHARCNT(data);
|
||||
else
|
||||
cnt = 256;
|
||||
vc->vc_font.data = (void *)(p->fontdata = data);
|
||||
if ((p->userfont = userfont))
|
||||
REFCOUNT(data)++;
|
||||
vc->vc_font.width = w;
|
||||
vc->vc_font.height = h;
|
||||
if (vc->vc_hi_font_mask && cnt == 256) {
|
||||
if (!set) {
|
||||
vc->vc_hi_font_mask = 0;
|
||||
if (vc->vc_can_do_color) {
|
||||
vc->vc_complement_mask >>= 1;
|
||||
|
|
@ -2487,7 +2470,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
|||
((c & 0xfe00) >> 1) | (c & 0xff);
|
||||
vc->vc_attr >>= 1;
|
||||
}
|
||||
} else if (!vc->vc_hi_font_mask && cnt == 512) {
|
||||
} else {
|
||||
vc->vc_hi_font_mask = 0x100;
|
||||
if (vc->vc_can_do_color) {
|
||||
vc->vc_complement_mask <<= 1;
|
||||
|
|
@ -2519,8 +2502,38 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
|||
} else
|
||||
vc->vc_video_erase_char = c & ~0x100;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
|
||||
const u8 * data, int userfont)
|
||||
{
|
||||
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
|
||||
struct fbcon_ops *ops = info->fbcon_par;
|
||||
struct display *p = &fb_display[vc->vc_num];
|
||||
int resize;
|
||||
int cnt;
|
||||
char *old_data = NULL;
|
||||
|
||||
if (CON_IS_VISIBLE(vc) && softback_lines)
|
||||
fbcon_set_origin(vc);
|
||||
|
||||
resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
|
||||
if (p->userfont)
|
||||
old_data = vc->vc_font.data;
|
||||
if (userfont)
|
||||
cnt = FNTCHARCNT(data);
|
||||
else
|
||||
cnt = 256;
|
||||
vc->vc_font.data = (void *)(p->fontdata = data);
|
||||
if ((p->userfont = userfont))
|
||||
REFCOUNT(data)++;
|
||||
vc->vc_font.width = w;
|
||||
vc->vc_font.height = h;
|
||||
if (vc->vc_hi_font_mask && cnt == 256)
|
||||
set_vc_hi_font(vc, false);
|
||||
else if (!vc->vc_hi_font_mask && cnt == 512)
|
||||
set_vc_hi_font(vc, true);
|
||||
|
||||
if (resize) {
|
||||
int cols, rows;
|
||||
|
|
|
|||
|
|
@ -27,10 +27,10 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <acpi/processor.h>
|
||||
#include <xen/xen.h>
|
||||
#include <xen/xen-ops.h>
|
||||
#include <xen/interface/platform.h>
|
||||
#include <asm/xen/hypercall.h>
|
||||
|
||||
|
|
@ -466,15 +466,33 @@ static int xen_upload_processor_pm_data(void)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int xen_acpi_processor_resume(struct notifier_block *nb,
|
||||
unsigned long action, void *data)
|
||||
static void xen_acpi_processor_resume_worker(struct work_struct *dummy)
|
||||
{
|
||||
int rc;
|
||||
|
||||
bitmap_zero(acpi_ids_done, nr_acpi_bits);
|
||||
return xen_upload_processor_pm_data();
|
||||
|
||||
rc = xen_upload_processor_pm_data();
|
||||
if (rc != 0)
|
||||
pr_info("ACPI data upload failed, error = %d\n", rc);
|
||||
}
|
||||
|
||||
struct notifier_block xen_acpi_processor_resume_nb = {
|
||||
.notifier_call = xen_acpi_processor_resume,
|
||||
static void xen_acpi_processor_resume(void)
|
||||
{
|
||||
static DECLARE_WORK(wq, xen_acpi_processor_resume_worker);
|
||||
|
||||
/*
|
||||
* xen_upload_processor_pm_data() calls non-atomic code.
|
||||
* However, the context for xen_acpi_processor_resume is syscore
|
||||
* with only the boot CPU online and in an atomic context.
|
||||
*
|
||||
* So defer the upload for some point safer.
|
||||
*/
|
||||
schedule_work(&wq);
|
||||
}
|
||||
|
||||
static struct syscore_ops xap_syscore_ops = {
|
||||
.resume = xen_acpi_processor_resume,
|
||||
};
|
||||
|
||||
static int __init xen_acpi_processor_init(void)
|
||||
|
|
@ -527,7 +545,7 @@ static int __init xen_acpi_processor_init(void)
|
|||
if (rc)
|
||||
goto err_unregister;
|
||||
|
||||
xen_resume_notifier_register(&xen_acpi_processor_resume_nb);
|
||||
register_syscore_ops(&xap_syscore_ops);
|
||||
|
||||
return 0;
|
||||
err_unregister:
|
||||
|
|
@ -544,7 +562,7 @@ static void __exit xen_acpi_processor_exit(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
xen_resume_notifier_unregister(&xen_acpi_processor_resume_nb);
|
||||
unregister_syscore_ops(&xap_syscore_ops);
|
||||
kfree(acpi_ids_done);
|
||||
kfree(acpi_id_present);
|
||||
kfree(acpi_id_cst_present);
|
||||
|
|
|
|||
|
|
@ -1164,10 +1164,9 @@ static int ext4_finish_convert_inline_dir(handle_t *handle,
|
|||
set_buffer_uptodate(dir_block);
|
||||
err = ext4_handle_dirty_dirent_node(handle, inode, dir_block);
|
||||
if (err)
|
||||
goto out;
|
||||
return err;
|
||||
set_buffer_verified(dir_block);
|
||||
out:
|
||||
return err;
|
||||
return ext4_mark_inode_dirty(handle, inode);
|
||||
}
|
||||
|
||||
static int ext4_convert_inline_data_nolock(handle_t *handle,
|
||||
|
|
|
|||
|
|
@ -3666,7 +3666,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
|
|||
db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) /
|
||||
EXT4_DESC_PER_BLOCK(sb);
|
||||
if (ext4_has_feature_meta_bg(sb)) {
|
||||
if (le32_to_cpu(es->s_first_meta_bg) >= db_count) {
|
||||
if (le32_to_cpu(es->s_first_meta_bg) > db_count) {
|
||||
ext4_msg(sb, KERN_WARNING,
|
||||
"first meta block group too large: %u "
|
||||
"(group descriptor block count %u)",
|
||||
|
|
|
|||
|
|
@ -207,7 +207,7 @@ struct lm_lockname {
|
|||
struct gfs2_sbd *ln_sbd;
|
||||
u64 ln_number;
|
||||
unsigned int ln_type;
|
||||
};
|
||||
} __packed __aligned(sizeof(int));
|
||||
|
||||
#define lm_name_equal(name1, name2) \
|
||||
(((name1)->ln_number == (name2)->ln_number) && \
|
||||
|
|
|
|||
|
|
@ -299,6 +299,14 @@ xfs_dinode_verify(
|
|||
if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC))
|
||||
return false;
|
||||
|
||||
/* don't allow invalid i_size */
|
||||
if (be64_to_cpu(dip->di_size) & (1ULL << 63))
|
||||
return false;
|
||||
|
||||
/* No zero-length symlinks. */
|
||||
if (S_ISLNK(be16_to_cpu(dip->di_mode)) && dip->di_size == 0)
|
||||
return false;
|
||||
|
||||
/* only version 3 or greater inodes are extensively verified here */
|
||||
if (dip->di_version < 3)
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -1713,6 +1713,7 @@ xfs_swap_extents(
|
|||
xfs_trans_t *tp;
|
||||
xfs_bstat_t *sbp = &sxp->sx_stat;
|
||||
xfs_ifork_t *tempifp, *ifp, *tifp;
|
||||
xfs_extnum_t nextents;
|
||||
int src_log_flags, target_log_flags;
|
||||
int error = 0;
|
||||
int aforkblks = 0;
|
||||
|
|
@ -1899,7 +1900,8 @@ xfs_swap_extents(
|
|||
* pointer. Otherwise it's already NULL or
|
||||
* pointing to the extent.
|
||||
*/
|
||||
if (ip->i_d.di_nextents <= XFS_INLINE_EXTS) {
|
||||
nextents = ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
|
||||
if (nextents <= XFS_INLINE_EXTS) {
|
||||
ifp->if_u1.if_extents =
|
||||
ifp->if_u2.if_inline_ext;
|
||||
}
|
||||
|
|
@ -1918,7 +1920,8 @@ xfs_swap_extents(
|
|||
* pointer. Otherwise it's already NULL or
|
||||
* pointing to the extent.
|
||||
*/
|
||||
if (tip->i_d.di_nextents <= XFS_INLINE_EXTS) {
|
||||
nextents = tip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t);
|
||||
if (nextents <= XFS_INLINE_EXTS) {
|
||||
tifp->if_u1.if_extents =
|
||||
tifp->if_u2.if_inline_ext;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -375,6 +375,7 @@ xfs_buf_allocate_memory(
|
|||
out_free_pages:
|
||||
for (i = 0; i < bp->b_page_count; i++)
|
||||
__free_page(bp->b_pages[i]);
|
||||
bp->b_flags &= ~_XBF_PAGES;
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,12 +15,6 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/*
|
||||
* deal with unrepresentable constant logarithms
|
||||
*/
|
||||
extern __attribute__((const, noreturn))
|
||||
int ____ilog2_NaN(void);
|
||||
|
||||
/*
|
||||
* non-constant log of base 2 calculators
|
||||
* - the arch may override these in asm/bitops.h if they can be implemented
|
||||
|
|
@ -85,7 +79,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
|
|||
#define ilog2(n) \
|
||||
( \
|
||||
__builtin_constant_p(n) ? ( \
|
||||
(n) < 1 ? ____ilog2_NaN() : \
|
||||
(n) < 2 ? 0 : \
|
||||
(n) & (1ULL << 63) ? 63 : \
|
||||
(n) & (1ULL << 62) ? 62 : \
|
||||
(n) & (1ULL << 61) ? 61 : \
|
||||
|
|
@ -148,10 +142,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
|
|||
(n) & (1ULL << 4) ? 4 : \
|
||||
(n) & (1ULL << 3) ? 3 : \
|
||||
(n) & (1ULL << 2) ? 2 : \
|
||||
(n) & (1ULL << 1) ? 1 : \
|
||||
(n) & (1ULL << 0) ? 0 : \
|
||||
____ilog2_NaN() \
|
||||
) : \
|
||||
1 ) : \
|
||||
(sizeof(n) <= 4) ? \
|
||||
__ilog2_u32(n) : \
|
||||
__ilog2_u64(n) \
|
||||
|
|
|
|||
|
|
@ -371,14 +371,13 @@ struct usb_bus {
|
|||
|
||||
int devnum_next; /* Next open device number in
|
||||
* round-robin allocation */
|
||||
struct mutex devnum_next_mutex; /* devnum_next mutex */
|
||||
|
||||
struct usb_devmap devmap; /* device address allocation map */
|
||||
struct usb_device *root_hub; /* Root hub */
|
||||
struct usb_bus *hs_companion; /* Companion EHCI bus, if any */
|
||||
struct list_head bus_list; /* list of busses */
|
||||
|
||||
struct mutex usb_address0_mutex; /* unaddressed device mutex */
|
||||
|
||||
int bandwidth_allocated; /* on this bus: how much of the time
|
||||
* reserved for periodic (intr/iso)
|
||||
* requests is used, on average?
|
||||
|
|
|
|||
|
|
@ -180,6 +180,7 @@ struct usb_hcd {
|
|||
* bandwidth_mutex should be dropped after a successful control message
|
||||
* to the device, or resetting the bandwidth after a failed attempt.
|
||||
*/
|
||||
struct mutex *address0_mutex;
|
||||
struct mutex *bandwidth_mutex;
|
||||
struct usb_hcd *shared_hcd;
|
||||
struct usb_hcd *primary_hcd;
|
||||
|
|
|
|||
|
|
@ -50,4 +50,10 @@
|
|||
/* device can't handle Link Power Management */
|
||||
#define USB_QUIRK_NO_LPM BIT(10)
|
||||
|
||||
/*
|
||||
* Device reports its bInterval as linear frames instead of the
|
||||
* USB 2.0 calculation.
|
||||
*/
|
||||
#define USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL BIT(11)
|
||||
|
||||
#endif /* __LINUX_USB_QUIRKS_H */
|
||||
|
|
|
|||
|
|
@ -196,6 +196,7 @@ struct iscsi_conn {
|
|||
struct iscsi_task *task; /* xmit task in progress */
|
||||
|
||||
/* xmit */
|
||||
spinlock_t taskqueuelock; /* protects the next three lists */
|
||||
struct list_head mgmtqueue; /* mgmt (control) xmit queue */
|
||||
struct list_head cmdqueue; /* data-path cmd queue */
|
||||
struct list_head requeue; /* tasks needing another run */
|
||||
|
|
|
|||
|
|
@ -9374,7 +9374,7 @@ static int perf_event_init_context(struct task_struct *child, int ctxn)
|
|||
ret = inherit_task_group(event, parent, parent_ctx,
|
||||
child, ctxn, &inherited_all);
|
||||
if (ret)
|
||||
break;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -9390,7 +9390,7 @@ static int perf_event_init_context(struct task_struct *child, int ctxn)
|
|||
ret = inherit_task_group(event, parent, parent_ctx,
|
||||
child, ctxn, &inherited_all);
|
||||
if (ret)
|
||||
break;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
raw_spin_lock_irqsave(&parent_ctx->lock, flags);
|
||||
|
|
@ -9418,6 +9418,7 @@ static int perf_event_init_context(struct task_struct *child, int ctxn)
|
|||
}
|
||||
|
||||
raw_spin_unlock_irqrestore(&parent_ctx->lock, flags);
|
||||
out_unlock:
|
||||
mutex_unlock(&parent_ctx->mutex);
|
||||
|
||||
perf_unpin_context(parent_ctx);
|
||||
|
|
|
|||
|
|
@ -331,13 +331,14 @@ void set_task_stack_end_magic(struct task_struct *tsk)
|
|||
*stackend = STACK_END_MAGIC; /* for overflow detection */
|
||||
}
|
||||
|
||||
static struct task_struct *dup_task_struct(struct task_struct *orig)
|
||||
static struct task_struct *dup_task_struct(struct task_struct *orig, int node)
|
||||
{
|
||||
struct task_struct *tsk;
|
||||
struct thread_info *ti;
|
||||
int node = tsk_fork_get_node(orig);
|
||||
int err;
|
||||
|
||||
if (node == NUMA_NO_NODE)
|
||||
node = tsk_fork_get_node(orig);
|
||||
tsk = alloc_task_struct_node(node);
|
||||
if (!tsk)
|
||||
return NULL;
|
||||
|
|
@ -1271,7 +1272,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
|||
int __user *child_tidptr,
|
||||
struct pid *pid,
|
||||
int trace,
|
||||
unsigned long tls)
|
||||
unsigned long tls,
|
||||
int node)
|
||||
{
|
||||
int retval;
|
||||
struct task_struct *p;
|
||||
|
|
@ -1324,7 +1326,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,
|
|||
goto fork_out;
|
||||
|
||||
retval = -ENOMEM;
|
||||
p = dup_task_struct(current);
|
||||
p = dup_task_struct(current, node);
|
||||
if (!p)
|
||||
goto fork_out;
|
||||
|
||||
|
|
@ -1700,7 +1702,8 @@ static inline void init_idle_pids(struct pid_link *links)
|
|||
struct task_struct *fork_idle(int cpu)
|
||||
{
|
||||
struct task_struct *task;
|
||||
task = copy_process(CLONE_VM, 0, 0, NULL, &init_struct_pid, 0, 0);
|
||||
task = copy_process(CLONE_VM, 0, 0, NULL, &init_struct_pid, 0, 0,
|
||||
cpu_to_node(cpu));
|
||||
if (!IS_ERR(task)) {
|
||||
init_idle_pids(task->pids);
|
||||
init_idle(task, cpu);
|
||||
|
|
@ -1745,7 +1748,7 @@ long _do_fork(unsigned long clone_flags,
|
|||
}
|
||||
|
||||
p = copy_process(clone_flags, stack_start, stack_size,
|
||||
child_tidptr, NULL, trace, tls);
|
||||
child_tidptr, NULL, trace, tls, NUMA_NO_NODE);
|
||||
/*
|
||||
* Do this prior waking up the new thread - the thread pointer
|
||||
* might get invalid after that point, if the thread exits quickly.
|
||||
|
|
|
|||
|
|
@ -1012,8 +1012,11 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved,
|
|||
mutex_unlock(&pcpu_alloc_mutex);
|
||||
}
|
||||
|
||||
if (chunk != pcpu_reserved_chunk)
|
||||
if (chunk != pcpu_reserved_chunk) {
|
||||
spin_lock_irqsave(&pcpu_lock, flags);
|
||||
pcpu_nr_empty_pop_pages -= occ_pages;
|
||||
spin_unlock_irqrestore(&pcpu_lock, flags);
|
||||
}
|
||||
|
||||
if (pcpu_nr_empty_pop_pages < PCPU_EMPTY_POP_PAGES_LOW)
|
||||
pcpu_schedule_balance_work();
|
||||
|
|
|
|||
|
|
@ -1265,7 +1265,6 @@ static int decode_new_up_state_weight(void **p, void *end,
|
|||
if ((map->osd_state[osd] & CEPH_OSD_EXISTS) &&
|
||||
(xorstate & CEPH_OSD_EXISTS)) {
|
||||
pr_info("osd%d does not exist\n", osd);
|
||||
map->osd_weight[osd] = CEPH_OSD_IN;
|
||||
ret = set_primary_affinity(map, osd,
|
||||
CEPH_OSD_DEFAULT_PRIMARY_AFFINITY);
|
||||
if (ret)
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user