mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-27 09:11:49 +00:00
1486 lines
49 KiB
Diff
1486 lines
49 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index c11116f..2fe1f6d 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,6 +1,6 @@
|
|
VERSION = 3
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 55
|
|
+SUBLEVEL = 56
|
|
EXTRAVERSION =
|
|
NAME = Saber-toothed Squirrel
|
|
|
|
diff --git a/arch/powerpc/include/asm/module.h b/arch/powerpc/include/asm/module.h
|
|
index 0192a4e..80de64b 100644
|
|
--- a/arch/powerpc/include/asm/module.h
|
|
+++ b/arch/powerpc/include/asm/module.h
|
|
@@ -87,10 +87,9 @@ struct exception_table_entry;
|
|
void sort_ex_table(struct exception_table_entry *start,
|
|
struct exception_table_entry *finish);
|
|
|
|
-#ifdef CONFIG_MODVERSIONS
|
|
+#if defined(CONFIG_MODVERSIONS) && defined(CONFIG_PPC64)
|
|
#define ARCH_RELOCATES_KCRCTAB
|
|
-
|
|
-extern const unsigned long reloc_start[];
|
|
+#define reloc_start PHYSICAL_START
|
|
#endif
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _ASM_POWERPC_MODULE_H */
|
|
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
|
|
index 65d1c08..7703569 100644
|
|
--- a/arch/powerpc/kernel/vmlinux.lds.S
|
|
+++ b/arch/powerpc/kernel/vmlinux.lds.S
|
|
@@ -38,9 +38,6 @@ jiffies = jiffies_64 + 4;
|
|
#endif
|
|
SECTIONS
|
|
{
|
|
- . = 0;
|
|
- reloc_start = .;
|
|
-
|
|
. = KERNELBASE;
|
|
|
|
/*
|
|
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
|
|
index 011358c..2f36a66 100644
|
|
--- a/arch/s390/include/asm/pgtable.h
|
|
+++ b/arch/s390/include/asm/pgtable.h
|
|
@@ -67,6 +67,10 @@ static inline int is_zero_pfn(unsigned long pfn)
|
|
|
|
#define my_zero_pfn(addr) page_to_pfn(ZERO_PAGE(addr))
|
|
|
|
+/* TODO: s390 cannot support io_remap_pfn_range... */
|
|
+#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
|
|
+ remap_pfn_range(vma, vaddr, pfn, size, prot)
|
|
+
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
/*
|
|
diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
|
|
index d985713..f81597f 100644
|
|
--- a/drivers/acpi/acpi_memhotplug.c
|
|
+++ b/drivers/acpi/acpi_memhotplug.c
|
|
@@ -421,6 +421,7 @@ static int acpi_memory_device_add(struct acpi_device *device)
|
|
/* Get the range from the _CRS */
|
|
result = acpi_memory_get_device_resources(mem_device);
|
|
if (result) {
|
|
+ device->driver_data = NULL;
|
|
kfree(mem_device);
|
|
return result;
|
|
}
|
|
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
|
|
index 6bdedd7..1ad34ed 100644
|
|
--- a/drivers/ata/Kconfig
|
|
+++ b/drivers/ata/Kconfig
|
|
@@ -93,7 +93,7 @@ config SATA_FSL
|
|
If unsure, say N.
|
|
|
|
config SATA_INIC162X
|
|
- tristate "Initio 162x SATA support"
|
|
+ tristate "Initio 162x SATA support (Very Experimental)"
|
|
depends on PCI
|
|
help
|
|
This option enables support for Initio 162x Serial ATA.
|
|
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
|
|
index 45cc02b..9dbd3ae 100644
|
|
--- a/drivers/ata/ata_piix.c
|
|
+++ b/drivers/ata/ata_piix.c
|
|
@@ -344,7 +344,7 @@ static const struct pci_device_id piix_pci_tbl[] = {
|
|
/* SATA Controller IDE (Wellsburg) */
|
|
{ 0x8086, 0x8d00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
|
|
/* SATA Controller IDE (Wellsburg) */
|
|
- { 0x8086, 0x8d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
|
+ { 0x8086, 0x8d08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_snb },
|
|
/* SATA Controller IDE (Wellsburg) */
|
|
{ 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
|
|
/* SATA Controller IDE (Wellsburg) */
|
|
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c
|
|
index 5c7d70c..3a8b55e 100644
|
|
--- a/drivers/ata/sata_inic162x.c
|
|
+++ b/drivers/ata/sata_inic162x.c
|
|
@@ -6,6 +6,18 @@
|
|
*
|
|
* This file is released under GPL v2.
|
|
*
|
|
+ * **** WARNING ****
|
|
+ *
|
|
+ * This driver never worked properly and unfortunately data corruption is
|
|
+ * relatively common. There isn't anyone working on the driver and there's
|
|
+ * no support from the vendor. Do not use this driver in any production
|
|
+ * environment.
|
|
+ *
|
|
+ * http://thread.gmane.org/gmane.linux.debian.devel.bugs.rc/378525/focus=54491
|
|
+ * https://bugzilla.kernel.org/show_bug.cgi?id=60565
|
|
+ *
|
|
+ * *****************
|
|
+ *
|
|
* This controller is eccentric and easily locks up if something isn't
|
|
* right. Documentation is available at initio's website but it only
|
|
* documents registers (not programming model).
|
|
@@ -809,6 +821,8 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
|
ata_print_version_once(&pdev->dev, DRV_VERSION);
|
|
|
|
+ dev_alert(&pdev->dev, "inic162x support is broken with common data corruption issues and will be disabled by default, contact linux-ide@vger.kernel.org if in production use\n");
|
|
+
|
|
/* alloc host */
|
|
host = ata_host_alloc_pinfo(&pdev->dev, ppi, NR_PORTS);
|
|
hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
|
|
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
|
|
index 4fd1dea..4ed7bf9 100644
|
|
--- a/drivers/block/xen-blkback/blkback.c
|
|
+++ b/drivers/block/xen-blkback/blkback.c
|
|
@@ -399,7 +399,18 @@ static int dispatch_discard_io(struct xen_blkif *blkif,
|
|
int status = BLKIF_RSP_OKAY;
|
|
struct block_device *bdev = blkif->vbd.bdev;
|
|
unsigned long secure;
|
|
+ struct phys_req preq;
|
|
+
|
|
+ preq.sector_number = req->u.discard.sector_number;
|
|
+ preq.nr_sects = req->u.discard.nr_sectors;
|
|
|
|
+ err = xen_vbd_translate(&preq, blkif, WRITE);
|
|
+ if (err) {
|
|
+ pr_warn(DRV_PFX "access denied: DISCARD [%llu->%llu] on dev=%04x\n",
|
|
+ preq.sector_number,
|
|
+ preq.sector_number + preq.nr_sects, blkif->vbd.pdevice);
|
|
+ goto fail_response;
|
|
+ }
|
|
blkif->st_ds_req++;
|
|
|
|
xen_blkif_get(blkif);
|
|
@@ -410,7 +421,7 @@ static int dispatch_discard_io(struct xen_blkif *blkif,
|
|
err = blkdev_issue_discard(bdev, req->u.discard.sector_number,
|
|
req->u.discard.nr_sectors,
|
|
GFP_KERNEL, secure);
|
|
-
|
|
+fail_response:
|
|
if (err == -EOPNOTSUPP) {
|
|
pr_debug(DRV_PFX "discard op failed, not supported\n");
|
|
status = BLKIF_RSP_EOPNOTSUPP;
|
|
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
|
|
index b8e4809..b558810 100644
|
|
--- a/drivers/firewire/core-cdev.c
|
|
+++ b/drivers/firewire/core-cdev.c
|
|
@@ -53,6 +53,7 @@
|
|
#define FW_CDEV_KERNEL_VERSION 5
|
|
#define FW_CDEV_VERSION_EVENT_REQUEST2 4
|
|
#define FW_CDEV_VERSION_ALLOCATE_REGION_END 4
|
|
+#define FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW 5
|
|
|
|
struct client {
|
|
u32 version;
|
|
@@ -998,6 +999,8 @@ static int ioctl_create_iso_context(struct client *client, union ioctl_arg *arg)
|
|
a->channel, a->speed, a->header_size, cb, client);
|
|
if (IS_ERR(context))
|
|
return PTR_ERR(context);
|
|
+ if (client->version < FW_CDEV_VERSION_AUTO_FLUSH_ISO_OVERFLOW)
|
|
+ context->drop_overflow_headers = true;
|
|
|
|
/* We only support one context at this time. */
|
|
spin_lock_irq(&client->lock);
|
|
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
|
|
index 2b54600..c1de4c3 100644
|
|
--- a/drivers/firewire/ohci.c
|
|
+++ b/drivers/firewire/ohci.c
|
|
@@ -2694,8 +2694,11 @@ static void copy_iso_headers(struct iso_context *ctx, const u32 *dma_hdr)
|
|
{
|
|
u32 *ctx_hdr;
|
|
|
|
- if (ctx->header_length + ctx->base.header_size > PAGE_SIZE)
|
|
+ if (ctx->header_length + ctx->base.header_size > PAGE_SIZE) {
|
|
+ if (ctx->base.drop_overflow_headers)
|
|
+ return;
|
|
flush_iso_completions(ctx);
|
|
+ }
|
|
|
|
ctx_hdr = ctx->header + ctx->header_length;
|
|
ctx->last_timestamp = (u16)le32_to_cpu((__force __le32)dma_hdr[0]);
|
|
@@ -2855,8 +2858,11 @@ static int handle_it_packet(struct context *context,
|
|
|
|
sync_it_packet_for_cpu(context, d);
|
|
|
|
- if (ctx->header_length + 4 > PAGE_SIZE)
|
|
+ if (ctx->header_length + 4 > PAGE_SIZE) {
|
|
+ if (ctx->base.drop_overflow_headers)
|
|
+ return 1;
|
|
flush_iso_completions(ctx);
|
|
+ }
|
|
|
|
ctx_hdr = ctx->header + ctx->header_length;
|
|
ctx->last_timestamp = le16_to_cpu(last->res_count);
|
|
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c
|
|
index 43672b6..daa1e34 100644
|
|
--- a/drivers/gpu/drm/radeon/atom.c
|
|
+++ b/drivers/gpu/drm/radeon/atom.c
|
|
@@ -1222,12 +1222,17 @@ int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params)
|
|
int r;
|
|
|
|
mutex_lock(&ctx->mutex);
|
|
+ /* reset data block */
|
|
+ ctx->data_block = 0;
|
|
/* reset reg block */
|
|
ctx->reg_block = 0;
|
|
/* reset fb window */
|
|
ctx->fb_base = 0;
|
|
/* reset io mode */
|
|
ctx->io_mode = ATOM_IO_MM;
|
|
+ /* reset divmul */
|
|
+ ctx->divmul[0] = 0;
|
|
+ ctx->divmul[1] = 0;
|
|
r = atom_execute_table_locked(ctx, index, params);
|
|
mutex_unlock(&ctx->mutex);
|
|
return r;
|
|
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c
|
|
index 886b41f..505f27e 100644
|
|
--- a/drivers/gpu/drm/radeon/atombios_dp.c
|
|
+++ b/drivers/gpu/drm/radeon/atombios_dp.c
|
|
@@ -45,6 +45,41 @@ static char *pre_emph_names[] = {
|
|
};
|
|
|
|
/***** radeon AUX functions *****/
|
|
+
|
|
+/* Atom needs data in little endian format
|
|
+ * so swap as appropriate when copying data to
|
|
+ * or from atom. Note that atom operates on
|
|
+ * dw units.
|
|
+ */
|
|
+static void radeon_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le)
|
|
+{
|
|
+#ifdef __BIG_ENDIAN
|
|
+ u8 src_tmp[20], dst_tmp[20]; /* used for byteswapping */
|
|
+ u32 *dst32, *src32;
|
|
+ int i;
|
|
+
|
|
+ memcpy(src_tmp, src, num_bytes);
|
|
+ src32 = (u32 *)src_tmp;
|
|
+ dst32 = (u32 *)dst_tmp;
|
|
+ if (to_le) {
|
|
+ for (i = 0; i < ((num_bytes + 3) / 4); i++)
|
|
+ dst32[i] = cpu_to_le32(src32[i]);
|
|
+ memcpy(dst, dst_tmp, num_bytes);
|
|
+ } else {
|
|
+ u8 dws = num_bytes & ~3;
|
|
+ for (i = 0; i < ((num_bytes + 3) / 4); i++)
|
|
+ dst32[i] = le32_to_cpu(src32[i]);
|
|
+ memcpy(dst, dst_tmp, dws);
|
|
+ if (num_bytes % 4) {
|
|
+ for (i = 0; i < (num_bytes % 4); i++)
|
|
+ dst[dws+i] = dst_tmp[dws+i];
|
|
+ }
|
|
+ }
|
|
+#else
|
|
+ memcpy(dst, src, num_bytes);
|
|
+#endif
|
|
+}
|
|
+
|
|
union aux_channel_transaction {
|
|
PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION v1;
|
|
PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 v2;
|
|
@@ -66,10 +101,10 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan,
|
|
|
|
base = (unsigned char *)(rdev->mode_info.atom_context->scratch + 1);
|
|
|
|
- memcpy(base, send, send_bytes);
|
|
+ radeon_copy_swap(base, send, send_bytes, true);
|
|
|
|
- args.v1.lpAuxRequest = 0 + 4;
|
|
- args.v1.lpDataOut = 16 + 4;
|
|
+ args.v1.lpAuxRequest = cpu_to_le16((u16)(0 + 4));
|
|
+ args.v1.lpDataOut = cpu_to_le16((u16)(16 + 4));
|
|
args.v1.ucDataOutLen = 0;
|
|
args.v1.ucChannelID = chan->rec.i2c_id;
|
|
args.v1.ucDelay = delay / 10;
|
|
@@ -103,7 +138,7 @@ static int radeon_process_aux_ch(struct radeon_i2c_chan *chan,
|
|
recv_bytes = recv_size;
|
|
|
|
if (recv && recv_size)
|
|
- memcpy(recv, base + 16, recv_bytes);
|
|
+ radeon_copy_swap(recv, base + 16, recv_bytes, false);
|
|
|
|
return recv_bytes;
|
|
}
|
|
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c
|
|
index 2b2c557..07d0bcd 100644
|
|
--- a/drivers/gpu/drm/radeon/radeon_combios.c
|
|
+++ b/drivers/gpu/drm/radeon/radeon_combios.c
|
|
@@ -147,7 +147,7 @@ static uint16_t combios_get_table_offset(struct drm_device *dev,
|
|
enum radeon_combios_table_offset table)
|
|
{
|
|
struct radeon_device *rdev = dev->dev_private;
|
|
- int rev;
|
|
+ int rev, size;
|
|
uint16_t offset = 0, check_offset;
|
|
|
|
if (!rdev->bios)
|
|
@@ -156,174 +156,106 @@ static uint16_t combios_get_table_offset(struct drm_device *dev,
|
|
switch (table) {
|
|
/* absolute offset tables */
|
|
case COMBIOS_ASIC_INIT_1_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0xc);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0xc;
|
|
break;
|
|
case COMBIOS_BIOS_SUPPORT_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x14);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x14;
|
|
break;
|
|
case COMBIOS_DAC_PROGRAMMING_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x2a);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x2a;
|
|
break;
|
|
case COMBIOS_MAX_COLOR_DEPTH_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x2c);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x2c;
|
|
break;
|
|
case COMBIOS_CRTC_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x2e);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x2e;
|
|
break;
|
|
case COMBIOS_PLL_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x30);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x30;
|
|
break;
|
|
case COMBIOS_TV_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x32);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x32;
|
|
break;
|
|
case COMBIOS_DFP_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x34);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x34;
|
|
break;
|
|
case COMBIOS_HW_CONFIG_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x36);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x36;
|
|
break;
|
|
case COMBIOS_MULTIMEDIA_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x38);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x38;
|
|
break;
|
|
case COMBIOS_TV_STD_PATCH_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x3e);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x3e;
|
|
break;
|
|
case COMBIOS_LCD_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x40);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x40;
|
|
break;
|
|
case COMBIOS_MOBILE_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x42);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x42;
|
|
break;
|
|
case COMBIOS_PLL_INIT_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x46);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x46;
|
|
break;
|
|
case COMBIOS_MEM_CONFIG_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x48);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x48;
|
|
break;
|
|
case COMBIOS_SAVE_MASK_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x4a);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x4a;
|
|
break;
|
|
case COMBIOS_HARDCODED_EDID_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x4c);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x4c;
|
|
break;
|
|
case COMBIOS_ASIC_INIT_2_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x4e);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x4e;
|
|
break;
|
|
case COMBIOS_CONNECTOR_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x50);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x50;
|
|
break;
|
|
case COMBIOS_DYN_CLK_1_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x52);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x52;
|
|
break;
|
|
case COMBIOS_RESERVED_MEM_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x54);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x54;
|
|
break;
|
|
case COMBIOS_EXT_TMDS_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x58);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x58;
|
|
break;
|
|
case COMBIOS_MEM_CLK_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x5a);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x5a;
|
|
break;
|
|
case COMBIOS_EXT_DAC_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x5c);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x5c;
|
|
break;
|
|
case COMBIOS_MISC_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x5e);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x5e;
|
|
break;
|
|
case COMBIOS_CRT_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x60);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x60;
|
|
break;
|
|
case COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x62);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x62;
|
|
break;
|
|
case COMBIOS_COMPONENT_VIDEO_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x64);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x64;
|
|
break;
|
|
case COMBIOS_FAN_SPEED_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x66);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x66;
|
|
break;
|
|
case COMBIOS_OVERDRIVE_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x68);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x68;
|
|
break;
|
|
case COMBIOS_OEM_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x6a);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x6a;
|
|
break;
|
|
case COMBIOS_DYN_CLK_2_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x6c);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x6c;
|
|
break;
|
|
case COMBIOS_POWER_CONNECTOR_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x6e);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x6e;
|
|
break;
|
|
case COMBIOS_I2C_INFO_TABLE:
|
|
- check_offset = RBIOS16(rdev->bios_header_start + 0x70);
|
|
- if (check_offset)
|
|
- offset = check_offset;
|
|
+ check_offset = 0x70;
|
|
break;
|
|
/* relative offset tables */
|
|
case COMBIOS_ASIC_INIT_3_TABLE: /* offset from misc info */
|
|
@@ -439,11 +371,16 @@ static uint16_t combios_get_table_offset(struct drm_device *dev,
|
|
}
|
|
break;
|
|
default:
|
|
+ check_offset = 0;
|
|
break;
|
|
}
|
|
|
|
- return offset;
|
|
+ size = RBIOS8(rdev->bios_header_start + 0x6);
|
|
+ /* check absolute offset tables */
|
|
+ if (table < COMBIOS_ASIC_INIT_3_TABLE && check_offset && check_offset < size)
|
|
+ offset = RBIOS16(rdev->bios_header_start + check_offset);
|
|
|
|
+ return offset;
|
|
}
|
|
|
|
bool radeon_combios_check_hardcoded_edid(struct radeon_device *rdev)
|
|
@@ -953,8 +890,10 @@ struct radeon_encoder_primary_dac *radeon_combios_get_primary_dac_info(struct
|
|
dac = RBIOS8(dac_info + 0x3) & 0xf;
|
|
p_dac->ps2_pdac_adj = (bg << 8) | (dac);
|
|
}
|
|
- /* if the values are all zeros, use the table */
|
|
- if (p_dac->ps2_pdac_adj)
|
|
+ /* if the values are zeros, use the table */
|
|
+ if ((dac == 0) || (bg == 0))
|
|
+ found = 0;
|
|
+ else
|
|
found = 1;
|
|
}
|
|
|
|
diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity.c
|
|
index 68bf5c3..9ab2a6a 100644
|
|
--- a/drivers/md/dm-verity.c
|
|
+++ b/drivers/md/dm-verity.c
|
|
@@ -813,9 +813,8 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
|
for (i = v->levels - 1; i >= 0; i--) {
|
|
sector_t s;
|
|
v->hash_level_block[i] = hash_position;
|
|
- s = verity_position_at_level(v, v->data_blocks, i);
|
|
- s = (s >> v->hash_per_block_bits) +
|
|
- !!(s & ((1 << v->hash_per_block_bits) - 1));
|
|
+ s = (v->data_blocks + ((sector_t)1 << ((i + 1) * v->hash_per_block_bits)) - 1)
|
|
+ >> ((i + 1) * v->hash_per_block_bits);
|
|
if (hash_position + s < hash_position) {
|
|
ti->error = "Hash device offset overflow";
|
|
r = -E2BIG;
|
|
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
|
|
index 0cc7985..54ba531 100644
|
|
--- a/drivers/md/raid10.c
|
|
+++ b/drivers/md/raid10.c
|
|
@@ -2029,12 +2029,18 @@ static void recovery_request_write(struct mddev *mddev, struct r10bio *r10_bio)
|
|
d = r10_bio->devs[1].devnum;
|
|
wbio = r10_bio->devs[1].bio;
|
|
wbio2 = r10_bio->devs[1].repl_bio;
|
|
+ /* Need to test wbio2->bi_end_io before we call
|
|
+ * generic_make_request as if the former is NULL,
|
|
+ * the latter is free to free wbio2.
|
|
+ */
|
|
+ if (wbio2 && !wbio2->bi_end_io)
|
|
+ wbio2 = NULL;
|
|
if (wbio->bi_end_io) {
|
|
atomic_inc(&conf->mirrors[d].rdev->nr_pending);
|
|
md_sync_acct(conf->mirrors[d].rdev->bdev, wbio->bi_size >> 9);
|
|
generic_make_request(wbio);
|
|
}
|
|
- if (wbio2 && wbio2->bi_end_io) {
|
|
+ if (wbio2) {
|
|
atomic_inc(&conf->mirrors[d].replacement->nr_pending);
|
|
md_sync_acct(conf->mirrors[d].replacement->bdev,
|
|
wbio2->bi_size >> 9);
|
|
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
|
|
index 0240576..6155c8b 100644
|
|
--- a/drivers/md/raid5.c
|
|
+++ b/drivers/md/raid5.c
|
|
@@ -3326,6 +3326,7 @@ static void handle_stripe(struct stripe_head *sh)
|
|
if (test_and_clear_bit(STRIPE_SYNC_REQUESTED, &sh->state)) {
|
|
set_bit(STRIPE_SYNCING, &sh->state);
|
|
clear_bit(STRIPE_INSYNC, &sh->state);
|
|
+ clear_bit(STRIPE_REPLACED, &sh->state);
|
|
}
|
|
clear_bit(STRIPE_DELAYED, &sh->state);
|
|
|
|
@@ -3465,19 +3466,23 @@ static void handle_stripe(struct stripe_head *sh)
|
|
handle_parity_checks5(conf, sh, &s, disks);
|
|
}
|
|
|
|
- if (s.replacing && s.locked == 0
|
|
- && !test_bit(STRIPE_INSYNC, &sh->state)) {
|
|
+ if ((s.replacing || s.syncing) && s.locked == 0
|
|
+ && !test_bit(STRIPE_COMPUTE_RUN, &sh->state)
|
|
+ && !test_bit(STRIPE_REPLACED, &sh->state)) {
|
|
/* Write out to replacement devices where possible */
|
|
for (i = 0; i < conf->raid_disks; i++)
|
|
- if (test_bit(R5_UPTODATE, &sh->dev[i].flags) &&
|
|
- test_bit(R5_NeedReplace, &sh->dev[i].flags)) {
|
|
+ if (test_bit(R5_NeedReplace, &sh->dev[i].flags)) {
|
|
+ WARN_ON(!test_bit(R5_UPTODATE, &sh->dev[i].flags));
|
|
set_bit(R5_WantReplace, &sh->dev[i].flags);
|
|
set_bit(R5_LOCKED, &sh->dev[i].flags);
|
|
s.locked++;
|
|
}
|
|
- set_bit(STRIPE_INSYNC, &sh->state);
|
|
+ if (s.replacing)
|
|
+ set_bit(STRIPE_INSYNC, &sh->state);
|
|
+ set_bit(STRIPE_REPLACED, &sh->state);
|
|
}
|
|
if ((s.syncing || s.replacing) && s.locked == 0 &&
|
|
+ !test_bit(STRIPE_COMPUTE_RUN, &sh->state) &&
|
|
test_bit(STRIPE_INSYNC, &sh->state)) {
|
|
md_done_sync(conf->mddev, STRIPE_SECTORS, 1);
|
|
clear_bit(STRIPE_SYNCING, &sh->state);
|
|
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h
|
|
index 8d8e139..f1ed18e 100644
|
|
--- a/drivers/md/raid5.h
|
|
+++ b/drivers/md/raid5.h
|
|
@@ -306,6 +306,7 @@ enum {
|
|
STRIPE_SYNC_REQUESTED,
|
|
STRIPE_SYNCING,
|
|
STRIPE_INSYNC,
|
|
+ STRIPE_REPLACED,
|
|
STRIPE_PREREAD_ACTIVE,
|
|
STRIPE_DELAYED,
|
|
STRIPE_DEGRADED,
|
|
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
|
|
index cbefe67..bc177b9 100644
|
|
--- a/drivers/net/virtio_net.c
|
|
+++ b/drivers/net/virtio_net.c
|
|
@@ -518,7 +518,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
|
|
{
|
|
struct virtnet_info *vi = container_of(napi, struct virtnet_info, napi);
|
|
void *buf;
|
|
- unsigned int len, received = 0;
|
|
+ unsigned int r, len, received = 0;
|
|
|
|
again:
|
|
while (received < budget &&
|
|
@@ -535,8 +535,9 @@ again:
|
|
|
|
/* Out of packets? */
|
|
if (received < budget) {
|
|
+ r = virtqueue_enable_cb_prepare(vi->rvq);
|
|
napi_complete(napi);
|
|
- if (unlikely(!virtqueue_enable_cb(vi->rvq)) &&
|
|
+ if (unlikely(virtqueue_poll(vi->rvq, r)) &&
|
|
napi_schedule_prep(napi)) {
|
|
virtqueue_disable_cb(vi->rvq);
|
|
__napi_schedule(napi);
|
|
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c
|
|
index 4f1b10b..3743ac9 100644
|
|
--- a/drivers/s390/scsi/zfcp_aux.c
|
|
+++ b/drivers/s390/scsi/zfcp_aux.c
|
|
@@ -3,7 +3,7 @@
|
|
*
|
|
* Module interface and handling of zfcp data structures.
|
|
*
|
|
- * Copyright IBM Corporation 2002, 2010
|
|
+ * Copyright IBM Corp. 2002, 2013
|
|
*/
|
|
|
|
/*
|
|
@@ -23,6 +23,7 @@
|
|
* Christof Schmitt
|
|
* Martin Petermann
|
|
* Sven Schuetz
|
|
+ * Steffen Maier
|
|
*/
|
|
|
|
#define KMSG_COMPONENT "zfcp"
|
|
@@ -415,6 +416,8 @@ struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *ccw_device)
|
|
adapter->dma_parms.max_segment_size = ZFCP_QDIO_SBALE_LEN;
|
|
adapter->ccw_device->dev.dma_parms = &adapter->dma_parms;
|
|
|
|
+ adapter->stat_read_buf_num = FSF_STATUS_READS_RECOM;
|
|
+
|
|
if (!zfcp_scsi_adapter_register(adapter))
|
|
return adapter;
|
|
|
|
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c
|
|
index 5fdf70b..961e327 100644
|
|
--- a/drivers/s390/scsi/zfcp_fsf.c
|
|
+++ b/drivers/s390/scsi/zfcp_fsf.c
|
|
@@ -3,7 +3,7 @@
|
|
*
|
|
* Implementation of FSF commands.
|
|
*
|
|
- * Copyright IBM Corporation 2002, 2010
|
|
+ * Copyright IBM Corp. 2002, 2013
|
|
*/
|
|
|
|
#define KMSG_COMPONENT "zfcp"
|
|
@@ -483,12 +483,8 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req)
|
|
|
|
fc_host_port_name(shost) = nsp->fl_wwpn;
|
|
fc_host_node_name(shost) = nsp->fl_wwnn;
|
|
- fc_host_port_id(shost) = ntoh24(bottom->s_id);
|
|
- fc_host_speed(shost) =
|
|
- zfcp_fsf_convert_portspeed(bottom->fc_link_speed);
|
|
fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3;
|
|
|
|
- adapter->hydra_version = bottom->adapter_type;
|
|
adapter->timer_ticks = bottom->timer_interval & ZFCP_FSF_TIMER_INT_MASK;
|
|
adapter->stat_read_buf_num = max(bottom->status_read_buf_num,
|
|
(u16)FSF_STATUS_READS_RECOM);
|
|
@@ -496,6 +492,19 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req)
|
|
if (fc_host_permanent_port_name(shost) == -1)
|
|
fc_host_permanent_port_name(shost) = fc_host_port_name(shost);
|
|
|
|
+ zfcp_scsi_set_prot(adapter);
|
|
+
|
|
+ /* no error return above here, otherwise must fix call chains */
|
|
+ /* do not evaluate invalid fields */
|
|
+ if (req->qtcb->header.fsf_status == FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE)
|
|
+ return 0;
|
|
+
|
|
+ fc_host_port_id(shost) = ntoh24(bottom->s_id);
|
|
+ fc_host_speed(shost) =
|
|
+ zfcp_fsf_convert_portspeed(bottom->fc_link_speed);
|
|
+
|
|
+ adapter->hydra_version = bottom->adapter_type;
|
|
+
|
|
switch (bottom->fc_topology) {
|
|
case FSF_TOPO_P2P:
|
|
adapter->peer_d_id = ntoh24(bottom->peer_d_id);
|
|
@@ -517,8 +526,6 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req)
|
|
return -EIO;
|
|
}
|
|
|
|
- zfcp_scsi_set_prot(adapter);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -569,6 +576,8 @@ static void zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *req)
|
|
&adapter->status);
|
|
zfcp_fsf_link_down_info_eval(req,
|
|
&qtcb->header.fsf_status_qual.link_down_info);
|
|
+ if (zfcp_fsf_exchange_config_evaluate(req))
|
|
+ return;
|
|
break;
|
|
default:
|
|
zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh3");
|
|
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
|
|
index eac9509..d99d4a0 100644
|
|
--- a/drivers/scsi/qla2xxx/qla_iocb.c
|
|
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
|
|
@@ -423,6 +423,8 @@ qla2x00_start_scsi(srb_t *sp)
|
|
__constant_cpu_to_le16(CF_SIMPLE_TAG);
|
|
break;
|
|
}
|
|
+ } else {
|
|
+ cmd_pkt->control_flags = __constant_cpu_to_le16(CF_SIMPLE_TAG);
|
|
}
|
|
|
|
/* Load SCSI command packet. */
|
|
@@ -1331,11 +1333,11 @@ qla24xx_build_scsi_crc_2_iocbs(srb_t *sp, struct cmd_type_crc_2 *cmd_pkt,
|
|
fcp_cmnd->task_attribute = TSK_ORDERED;
|
|
break;
|
|
default:
|
|
- fcp_cmnd->task_attribute = 0;
|
|
+ fcp_cmnd->task_attribute = TSK_SIMPLE;
|
|
break;
|
|
}
|
|
} else {
|
|
- fcp_cmnd->task_attribute = 0;
|
|
+ fcp_cmnd->task_attribute = TSK_SIMPLE;
|
|
}
|
|
|
|
cmd_pkt->fcp_rsp_dseg_len = 0; /* Let response come in status iocb */
|
|
@@ -1541,7 +1543,12 @@ qla24xx_start_scsi(srb_t *sp)
|
|
case ORDERED_QUEUE_TAG:
|
|
cmd_pkt->task = TSK_ORDERED;
|
|
break;
|
|
+ default:
|
|
+ cmd_pkt->task = TSK_SIMPLE;
|
|
+ break;
|
|
}
|
|
+ } else {
|
|
+ cmd_pkt->task = TSK_SIMPLE;
|
|
}
|
|
|
|
/* Load SCSI command packet. */
|
|
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
|
|
index 3141c1a..105fff2 100644
|
|
--- a/drivers/scsi/sd.c
|
|
+++ b/drivers/scsi/sd.c
|
|
@@ -672,10 +672,17 @@ static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq)
|
|
|
|
static void sd_unprep_fn(struct request_queue *q, struct request *rq)
|
|
{
|
|
+ struct scsi_cmnd *SCpnt = rq->special;
|
|
+
|
|
if (rq->cmd_flags & REQ_DISCARD) {
|
|
free_page((unsigned long)rq->buffer);
|
|
rq->buffer = NULL;
|
|
}
|
|
+ if (SCpnt->cmnd != rq->cmd) {
|
|
+ mempool_free(SCpnt->cmnd, sd_cdb_pool);
|
|
+ SCpnt->cmnd = NULL;
|
|
+ SCpnt->cmd_len = 0;
|
|
+ }
|
|
}
|
|
|
|
/**
|
|
@@ -1539,21 +1546,6 @@ static int sd_done(struct scsi_cmnd *SCpnt)
|
|
if (rq_data_dir(SCpnt->request) == READ && scsi_prot_sg_count(SCpnt))
|
|
sd_dif_complete(SCpnt, good_bytes);
|
|
|
|
- if (scsi_host_dif_capable(sdkp->device->host, sdkp->protection_type)
|
|
- == SD_DIF_TYPE2_PROTECTION && SCpnt->cmnd != SCpnt->request->cmd) {
|
|
-
|
|
- /* We have to print a failed command here as the
|
|
- * extended CDB gets freed before scsi_io_completion()
|
|
- * is called.
|
|
- */
|
|
- if (result)
|
|
- scsi_print_command(SCpnt);
|
|
-
|
|
- mempool_free(SCpnt->cmnd, sd_cdb_pool);
|
|
- SCpnt->cmnd = NULL;
|
|
- SCpnt->cmd_len = 0;
|
|
- }
|
|
-
|
|
return good_bytes;
|
|
}
|
|
|
|
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c
|
|
index 3799cf1..50dc93e 100644
|
|
--- a/drivers/staging/comedi/comedi_fops.c
|
|
+++ b/drivers/staging/comedi/comedi_fops.c
|
|
@@ -1370,6 +1370,7 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg,
|
|
void *file)
|
|
{
|
|
struct comedi_subdevice *s;
|
|
+ int ret;
|
|
|
|
if (arg >= dev->n_subdevices)
|
|
return -EINVAL;
|
|
@@ -1386,7 +1387,11 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg,
|
|
if (s->busy != file)
|
|
return -EBUSY;
|
|
|
|
- return do_cancel(dev, s);
|
|
+ ret = do_cancel(dev, s);
|
|
+ if (comedi_get_subdevice_runflags(s) & SRF_USER)
|
|
+ wake_up_interruptible(&s->async->wait_head);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
/*
|
|
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
|
|
index 00c58cc..facb3ad 100644
|
|
--- a/drivers/target/iscsi/iscsi_target_configfs.c
|
|
+++ b/drivers/target/iscsi/iscsi_target_configfs.c
|
|
@@ -415,7 +415,7 @@ static ssize_t __iscsi_##prefix##_store_##name( \
|
|
if (!capable(CAP_SYS_ADMIN)) \
|
|
return -EPERM; \
|
|
\
|
|
- snprintf(auth->name, PAGE_SIZE, "%s", page); \
|
|
+ snprintf(auth->name, sizeof(auth->name), "%s", page); \
|
|
if (!strncmp("NULL", auth->name, 4)) \
|
|
auth->naf_flags &= ~flags; \
|
|
else \
|
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
index 49b139c..a969ec1 100644
|
|
--- a/drivers/usb/core/hub.c
|
|
+++ b/drivers/usb/core/hub.c
|
|
@@ -488,6 +488,15 @@ resubmit:
|
|
static inline int
|
|
hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt)
|
|
{
|
|
+ /* Need to clear both directions for control ep */
|
|
+ if (((devinfo >> 11) & USB_ENDPOINT_XFERTYPE_MASK) ==
|
|
+ USB_ENDPOINT_XFER_CONTROL) {
|
|
+ int status = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
|
|
+ HUB_CLEAR_TT_BUFFER, USB_RT_PORT,
|
|
+ devinfo ^ 0x8000, tt, NULL, 0, 1000);
|
|
+ if (status)
|
|
+ return status;
|
|
+ }
|
|
return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
|
|
HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo,
|
|
tt, NULL, 0, 1000);
|
|
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
|
|
index 6c7945b..29a68f0a 100644
|
|
--- a/drivers/usb/dwc3/core.h
|
|
+++ b/drivers/usb/dwc3/core.h
|
|
@@ -641,8 +641,8 @@ struct dwc3 {
|
|
|
|
struct dwc3_event_type {
|
|
u32 is_devspec:1;
|
|
- u32 type:6;
|
|
- u32 reserved8_31:25;
|
|
+ u32 type:7;
|
|
+ u32 reserved8_31:24;
|
|
} __packed;
|
|
|
|
#define DWC3_DEPEVT_XFERCOMPLETE 0x01
|
|
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
|
|
index f62629b..6d6fb88 100644
|
|
--- a/drivers/usb/dwc3/gadget.c
|
|
+++ b/drivers/usb/dwc3/gadget.c
|
|
@@ -1393,6 +1393,7 @@ err1:
|
|
__dwc3_gadget_ep_disable(dwc->eps[0]);
|
|
|
|
err0:
|
|
+ dwc->gadget_driver = NULL;
|
|
spin_unlock_irqrestore(&dwc->lock, flags);
|
|
|
|
return ret;
|
|
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
|
index 0f928b3..8072a93 100644
|
|
--- a/drivers/usb/host/xhci.c
|
|
+++ b/drivers/usb/host/xhci.c
|
|
@@ -1162,9 +1162,6 @@ static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev,
|
|
}
|
|
|
|
xhci = hcd_to_xhci(hcd);
|
|
- if (xhci->xhc_state & XHCI_STATE_HALTED)
|
|
- return -ENODEV;
|
|
-
|
|
if (check_virt_dev) {
|
|
if (!udev->slot_id || !xhci->devs[udev->slot_id]) {
|
|
printk(KERN_DEBUG "xHCI %s called with unaddressed "
|
|
@@ -1180,6 +1177,9 @@ static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev,
|
|
}
|
|
}
|
|
|
|
+ if (xhci->xhc_state & XHCI_STATE_HALTED)
|
|
+ return -ENODEV;
|
|
+
|
|
return 1;
|
|
}
|
|
|
|
@@ -4194,6 +4194,13 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
|
|
|
|
get_quirks(dev, xhci);
|
|
|
|
+ /* In xhci controllers which follow xhci 1.0 spec gives a spurious
|
|
+ * success event after a short transfer. This quirk will ignore such
|
|
+ * spurious event.
|
|
+ */
|
|
+ if (xhci->hci_version > 0x96)
|
|
+ xhci->quirks |= XHCI_SPURIOUS_SUCCESS;
|
|
+
|
|
/* Make sure the HC is halted. */
|
|
retval = xhci_halt(xhci);
|
|
if (retval)
|
|
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c
|
|
index dd573ab..7af163d 100644
|
|
--- a/drivers/usb/misc/sisusbvga/sisusb.c
|
|
+++ b/drivers/usb/misc/sisusbvga/sisusb.c
|
|
@@ -3247,6 +3247,7 @@ static const struct usb_device_id sisusb_table[] = {
|
|
{ USB_DEVICE(0x0711, 0x0903) },
|
|
{ USB_DEVICE(0x0711, 0x0918) },
|
|
{ USB_DEVICE(0x0711, 0x0920) },
|
|
+ { USB_DEVICE(0x0711, 0x0950) },
|
|
{ USB_DEVICE(0x182d, 0x021c) },
|
|
{ USB_DEVICE(0x182d, 0x0269) },
|
|
{ }
|
|
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
|
|
index f8a9cd7..3e4c27d 100644
|
|
--- a/drivers/usb/serial/ftdi_sio.c
|
|
+++ b/drivers/usb/serial/ftdi_sio.c
|
|
@@ -745,9 +745,34 @@ static struct usb_device_id id_table_combined [] = {
|
|
{ USB_DEVICE(FTDI_VID, FTDI_NDI_AURORA_SCU_PID),
|
|
.driver_info = (kernel_ulong_t)&ftdi_NDI_device_quirk },
|
|
{ USB_DEVICE(TELLDUS_VID, TELLDUS_TELLSTICK_PID) },
|
|
- { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_SERIAL_VX7_PID) },
|
|
- { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_CT29B_PID) },
|
|
- { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_RTS01_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S03_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_59_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57A_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_57B_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29A_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29B_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29F_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62B_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S01_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_29C_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_81B_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_82B_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5D_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K4Y_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_K5G_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_S05_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_60_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_61_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_62_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_63B_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_64_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_65_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_92D_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_W5R_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_A5R_PID) },
|
|
+ { USB_DEVICE(RTSYSTEMS_VID, RTSYSTEMS_USB_PW1_PID) },
|
|
{ USB_DEVICE(FTDI_VID, FTDI_MAXSTREAM_PID) },
|
|
{ USB_DEVICE(FTDI_VID, FTDI_PHI_FISCO_PID) },
|
|
{ USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) },
|
|
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
|
|
index 6dd7925..1b8af46 100644
|
|
--- a/drivers/usb/serial/ftdi_sio_ids.h
|
|
+++ b/drivers/usb/serial/ftdi_sio_ids.h
|
|
@@ -815,11 +815,35 @@
|
|
/*
|
|
* RT Systems programming cables for various ham radios
|
|
*/
|
|
-#define RTSYSTEMS_VID 0x2100 /* Vendor ID */
|
|
-#define RTSYSTEMS_SERIAL_VX7_PID 0x9e52 /* Serial converter for VX-7 Radios using FT232RL */
|
|
-#define RTSYSTEMS_CT29B_PID 0x9e54 /* CT29B Radio Cable */
|
|
-#define RTSYSTEMS_RTS01_PID 0x9e57 /* USB-RTS01 Radio Cable */
|
|
-
|
|
+#define RTSYSTEMS_VID 0x2100 /* Vendor ID */
|
|
+#define RTSYSTEMS_USB_S03_PID 0x9001 /* RTS-03 USB to Serial Adapter */
|
|
+#define RTSYSTEMS_USB_59_PID 0x9e50 /* USB-59 USB to 8 pin plug */
|
|
+#define RTSYSTEMS_USB_57A_PID 0x9e51 /* USB-57A USB to 4pin 3.5mm plug */
|
|
+#define RTSYSTEMS_USB_57B_PID 0x9e52 /* USB-57B USB to extended 4pin 3.5mm plug */
|
|
+#define RTSYSTEMS_USB_29A_PID 0x9e53 /* USB-29A USB to 3.5mm stereo plug */
|
|
+#define RTSYSTEMS_USB_29B_PID 0x9e54 /* USB-29B USB to 6 pin mini din */
|
|
+#define RTSYSTEMS_USB_29F_PID 0x9e55 /* USB-29F USB to 6 pin modular plug */
|
|
+#define RTSYSTEMS_USB_62B_PID 0x9e56 /* USB-62B USB to 8 pin mini din plug*/
|
|
+#define RTSYSTEMS_USB_S01_PID 0x9e57 /* USB-RTS01 USB to 3.5 mm stereo plug*/
|
|
+#define RTSYSTEMS_USB_63_PID 0x9e58 /* USB-63 USB to 9 pin female*/
|
|
+#define RTSYSTEMS_USB_29C_PID 0x9e59 /* USB-29C USB to 4 pin modular plug*/
|
|
+#define RTSYSTEMS_USB_81B_PID 0x9e5A /* USB-81 USB to 8 pin mini din plug*/
|
|
+#define RTSYSTEMS_USB_82B_PID 0x9e5B /* USB-82 USB to 2.5 mm stereo plug*/
|
|
+#define RTSYSTEMS_USB_K5D_PID 0x9e5C /* USB-K5D USB to 8 pin modular plug*/
|
|
+#define RTSYSTEMS_USB_K4Y_PID 0x9e5D /* USB-K4Y USB to 2.5/3.5 mm plugs*/
|
|
+#define RTSYSTEMS_USB_K5G_PID 0x9e5E /* USB-K5G USB to 8 pin modular plug*/
|
|
+#define RTSYSTEMS_USB_S05_PID 0x9e5F /* USB-RTS05 USB to 2.5 mm stereo plug*/
|
|
+#define RTSYSTEMS_USB_60_PID 0x9e60 /* USB-60 USB to 6 pin din*/
|
|
+#define RTSYSTEMS_USB_61_PID 0x9e61 /* USB-61 USB to 6 pin mini din*/
|
|
+#define RTSYSTEMS_USB_62_PID 0x9e62 /* USB-62 USB to 8 pin mini din*/
|
|
+#define RTSYSTEMS_USB_63B_PID 0x9e63 /* USB-63 USB to 9 pin female*/
|
|
+#define RTSYSTEMS_USB_64_PID 0x9e64 /* USB-64 USB to 9 pin male*/
|
|
+#define RTSYSTEMS_USB_65_PID 0x9e65 /* USB-65 USB to 9 pin female null modem*/
|
|
+#define RTSYSTEMS_USB_92_PID 0x9e66 /* USB-92 USB to 12 pin plug*/
|
|
+#define RTSYSTEMS_USB_92D_PID 0x9e67 /* USB-92D USB to 12 pin plug data*/
|
|
+#define RTSYSTEMS_USB_W5R_PID 0x9e68 /* USB-W5R USB to 8 pin modular plug*/
|
|
+#define RTSYSTEMS_USB_A5R_PID 0x9e69 /* USB-A5R USB to 8 pin modular plug*/
|
|
+#define RTSYSTEMS_USB_PW1_PID 0x9e6A /* USB-PW1 USB to 8 pin modular plug*/
|
|
|
|
/*
|
|
* Physik Instrumente
|
|
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
|
|
index a39a08c..a7492ba 100644
|
|
--- a/drivers/usb/serial/ti_usb_3410_5052.c
|
|
+++ b/drivers/usb/serial/ti_usb_3410_5052.c
|
|
@@ -390,7 +390,7 @@ static int ti_startup(struct usb_serial *serial)
|
|
usb_set_serial_data(serial, tdev);
|
|
|
|
/* determine device type */
|
|
- if (usb_match_id(serial->interface, ti_id_table_3410))
|
|
+ if (serial->type == &ti_1port_device)
|
|
tdev->td_is_3410 = 1;
|
|
dbg("%s - device type is %s", __func__,
|
|
tdev->td_is_3410 ? "3410" : "5052");
|
|
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
|
|
index 8ee632c..cf442e0 100644
|
|
--- a/drivers/usb/storage/unusual_devs.h
|
|
+++ b/drivers/usb/storage/unusual_devs.h
|
|
@@ -657,6 +657,13 @@ UNUSUAL_DEV( 0x054c, 0x016a, 0x0000, 0x9999,
|
|
USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
|
US_FL_FIX_INQUIRY ),
|
|
|
|
+/* Submitted by Ren Bigcren <bigcren.ren@sonymobile.com> */
|
|
+UNUSUAL_DEV( 0x054c, 0x02a5, 0x0100, 0x0100,
|
|
+ "Sony Corp.",
|
|
+ "MicroVault Flash Drive",
|
|
+ USB_SC_DEVICE, USB_PR_DEVICE, NULL,
|
|
+ US_FL_NO_READ_CAPACITY_16 ),
|
|
+
|
|
/* floppy reports multiple luns */
|
|
UNUSUAL_DEV( 0x055d, 0x2020, 0x0000, 0x0210,
|
|
"SAMSUNG",
|
|
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
|
|
index 52bfd07..c212de7 100644
|
|
--- a/drivers/virtio/virtio_ring.c
|
|
+++ b/drivers/virtio/virtio_ring.c
|
|
@@ -498,16 +498,18 @@ EXPORT_SYMBOL_GPL(virtqueue_disable_cb);
|
|
* virtqueue_enable_cb - restart callbacks after disable_cb.
|
|
* @vq: the struct virtqueue we're talking about.
|
|
*
|
|
- * This re-enables callbacks; it returns "false" if there are pending
|
|
- * buffers in the queue, to detect a possible race between the driver
|
|
- * checking for more work, and enabling callbacks.
|
|
+ * This re-enables callbacks; it returns current queue state
|
|
+ * in an opaque unsigned value. This value should be later tested by
|
|
+ * virtqueue_poll, to detect a possible race between the driver checking for
|
|
+ * more work, and enabling callbacks.
|
|
*
|
|
* Caller must ensure we don't call this with other virtqueue
|
|
* operations at the same time (except where noted).
|
|
*/
|
|
-bool virtqueue_enable_cb(struct virtqueue *_vq)
|
|
+unsigned virtqueue_enable_cb_prepare(struct virtqueue *_vq)
|
|
{
|
|
struct vring_virtqueue *vq = to_vvq(_vq);
|
|
+ u16 last_used_idx;
|
|
|
|
START_USE(vq);
|
|
|
|
@@ -517,15 +519,45 @@ bool virtqueue_enable_cb(struct virtqueue *_vq)
|
|
* either clear the flags bit or point the event index at the next
|
|
* entry. Always do both to keep code simple. */
|
|
vq->vring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT;
|
|
- vring_used_event(&vq->vring) = vq->last_used_idx;
|
|
+ vring_used_event(&vq->vring) = last_used_idx = vq->last_used_idx;
|
|
+ END_USE(vq);
|
|
+ return last_used_idx;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(virtqueue_enable_cb_prepare);
|
|
+
|
|
+/**
|
|
+ * virtqueue_poll - query pending used buffers
|
|
+ * @vq: the struct virtqueue we're talking about.
|
|
+ * @last_used_idx: virtqueue state (from call to virtqueue_enable_cb_prepare).
|
|
+ *
|
|
+ * Returns "true" if there are pending used buffers in the queue.
|
|
+ *
|
|
+ * This does not need to be serialized.
|
|
+ */
|
|
+bool virtqueue_poll(struct virtqueue *_vq, unsigned last_used_idx)
|
|
+{
|
|
+ struct vring_virtqueue *vq = to_vvq(_vq);
|
|
+
|
|
virtio_mb(vq);
|
|
- if (unlikely(more_used(vq))) {
|
|
- END_USE(vq);
|
|
- return false;
|
|
- }
|
|
+ return (u16)last_used_idx != vq->vring.used->idx;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(virtqueue_poll);
|
|
|
|
- END_USE(vq);
|
|
- return true;
|
|
+/**
|
|
+ * virtqueue_enable_cb - restart callbacks after disable_cb.
|
|
+ * @vq: the struct virtqueue we're talking about.
|
|
+ *
|
|
+ * This re-enables callbacks; it returns "false" if there are pending
|
|
+ * buffers in the queue, to detect a possible race between the driver
|
|
+ * checking for more work, and enabling callbacks.
|
|
+ *
|
|
+ * Caller must ensure we don't call this with other virtqueue
|
|
+ * operations at the same time (except where noted).
|
|
+ */
|
|
+bool virtqueue_enable_cb(struct virtqueue *_vq)
|
|
+{
|
|
+ unsigned last_used_idx = virtqueue_enable_cb_prepare(_vq);
|
|
+ return !virtqueue_poll(_vq, last_used_idx);
|
|
}
|
|
EXPORT_SYMBOL_GPL(virtqueue_enable_cb);
|
|
|
|
diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c
|
|
index b2db77e..82b27d4 100644
|
|
--- a/drivers/xen/evtchn.c
|
|
+++ b/drivers/xen/evtchn.c
|
|
@@ -377,18 +377,12 @@ static long evtchn_ioctl(struct file *file,
|
|
if (unbind.port >= NR_EVENT_CHANNELS)
|
|
break;
|
|
|
|
- spin_lock_irq(&port_user_lock);
|
|
-
|
|
rc = -ENOTCONN;
|
|
- if (get_port_user(unbind.port) != u) {
|
|
- spin_unlock_irq(&port_user_lock);
|
|
+ if (get_port_user(unbind.port) != u)
|
|
break;
|
|
- }
|
|
|
|
disable_irq(irq_from_evtchn(unbind.port));
|
|
|
|
- spin_unlock_irq(&port_user_lock);
|
|
-
|
|
evtchn_unbind_from_user(u, unbind.port);
|
|
|
|
rc = 0;
|
|
@@ -488,26 +482,15 @@ static int evtchn_release(struct inode *inode, struct file *filp)
|
|
int i;
|
|
struct per_user_data *u = filp->private_data;
|
|
|
|
- spin_lock_irq(&port_user_lock);
|
|
-
|
|
- free_page((unsigned long)u->ring);
|
|
-
|
|
for (i = 0; i < NR_EVENT_CHANNELS; i++) {
|
|
if (get_port_user(i) != u)
|
|
continue;
|
|
|
|
disable_irq(irq_from_evtchn(i));
|
|
- }
|
|
-
|
|
- spin_unlock_irq(&port_user_lock);
|
|
-
|
|
- for (i = 0; i < NR_EVENT_CHANNELS; i++) {
|
|
- if (get_port_user(i) != u)
|
|
- continue;
|
|
-
|
|
evtchn_unbind_from_user(get_port_user(i), i);
|
|
}
|
|
|
|
+ free_page((unsigned long)u->ring);
|
|
kfree(u->name);
|
|
kfree(u);
|
|
|
|
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
|
|
index fef1f21..c4f0a99 100644
|
|
--- a/fs/btrfs/extent-tree.c
|
|
+++ b/fs/btrfs/extent-tree.c
|
|
@@ -6846,6 +6846,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
|
|
int err = 0;
|
|
int ret;
|
|
int level;
|
|
+ bool root_dropped = false;
|
|
|
|
path = btrfs_alloc_path();
|
|
if (!path) {
|
|
@@ -6903,6 +6904,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
|
|
while (1) {
|
|
btrfs_tree_lock(path->nodes[level]);
|
|
btrfs_set_lock_blocking(path->nodes[level]);
|
|
+ path->locks[level] = BTRFS_WRITE_LOCK_BLOCKING;
|
|
|
|
ret = btrfs_lookup_extent_info(trans, root,
|
|
path->nodes[level]->start,
|
|
@@ -6919,6 +6921,7 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
|
|
break;
|
|
|
|
btrfs_tree_unlock(path->nodes[level]);
|
|
+ path->locks[level] = 0;
|
|
WARN_ON(wc->refs[level] != 1);
|
|
level--;
|
|
}
|
|
@@ -7014,12 +7017,22 @@ int btrfs_drop_snapshot(struct btrfs_root *root,
|
|
free_extent_buffer(root->commit_root);
|
|
kfree(root);
|
|
}
|
|
+ root_dropped = true;
|
|
out_end_trans:
|
|
btrfs_end_transaction_throttle(trans, tree_root);
|
|
out_free:
|
|
kfree(wc);
|
|
btrfs_free_path(path);
|
|
out:
|
|
+ /*
|
|
+ * So if we need to stop dropping the snapshot for whatever reason we
|
|
+ * need to make sure to add it back to the dead root list so that we
|
|
+ * keep trying to do the work later. This also cleans up roots if we
|
|
+ * don't have it in the radix (like when we recover after a power fail
|
|
+ * or unmount) so we don't leak memory.
|
|
+ */
|
|
+ if (root_dropped == false)
|
|
+ btrfs_add_dead_root(root);
|
|
if (err)
|
|
btrfs_std_error(root->fs_info, err);
|
|
return err;
|
|
diff --git a/fs/super.c b/fs/super.c
|
|
index cf00177..3c520a5 100644
|
|
--- a/fs/super.c
|
|
+++ b/fs/super.c
|
|
@@ -298,19 +298,19 @@ EXPORT_SYMBOL(deactivate_super);
|
|
* and want to turn it into a full-blown active reference. grab_super()
|
|
* is called with sb_lock held and drops it. Returns 1 in case of
|
|
* success, 0 if we had failed (superblock contents was already dead or
|
|
- * dying when grab_super() had been called).
|
|
+ * dying when grab_super() had been called). Note that this is only
|
|
+ * called for superblocks not in rundown mode (== ones still on ->fs_supers
|
|
+ * of their type), so increment of ->s_count is OK here.
|
|
*/
|
|
static int grab_super(struct super_block *s) __releases(sb_lock)
|
|
{
|
|
- if (atomic_inc_not_zero(&s->s_active)) {
|
|
- spin_unlock(&sb_lock);
|
|
- return 1;
|
|
- }
|
|
- /* it's going away */
|
|
s->s_count++;
|
|
spin_unlock(&sb_lock);
|
|
- /* wait for it to die */
|
|
down_write(&s->s_umount);
|
|
+ if ((s->s_flags & MS_BORN) && atomic_inc_not_zero(&s->s_active)) {
|
|
+ put_super(s);
|
|
+ return 1;
|
|
+ }
|
|
up_write(&s->s_umount);
|
|
put_super(s);
|
|
return 0;
|
|
@@ -440,11 +440,6 @@ retry:
|
|
destroy_super(s);
|
|
s = NULL;
|
|
}
|
|
- down_write(&old->s_umount);
|
|
- if (unlikely(!(old->s_flags & MS_BORN))) {
|
|
- deactivate_locked_super(old);
|
|
- goto retry;
|
|
- }
|
|
return old;
|
|
}
|
|
}
|
|
@@ -677,10 +672,10 @@ restart:
|
|
if (hlist_unhashed(&sb->s_instances))
|
|
continue;
|
|
if (sb->s_bdev == bdev) {
|
|
- if (grab_super(sb)) /* drops sb_lock */
|
|
- return sb;
|
|
- else
|
|
+ if (!grab_super(sb))
|
|
goto restart;
|
|
+ up_write(&sb->s_umount);
|
|
+ return sb;
|
|
}
|
|
}
|
|
spin_unlock(&sb_lock);
|
|
diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h
|
|
index d500369..1db453e 100644
|
|
--- a/include/linux/firewire-cdev.h
|
|
+++ b/include/linux/firewire-cdev.h
|
|
@@ -215,8 +215,8 @@ struct fw_cdev_event_request2 {
|
|
* with the %FW_CDEV_ISO_INTERRUPT bit set, when explicitly requested with
|
|
* %FW_CDEV_IOC_FLUSH_ISO, or when there have been so many completed packets
|
|
* without the interrupt bit set that the kernel's internal buffer for @header
|
|
- * is about to overflow. (In the last case, kernels with ABI version < 5 drop
|
|
- * header data up to the next interrupt packet.)
|
|
+ * is about to overflow. (In the last case, ABI versions < 5 drop header data
|
|
+ * up to the next interrupt packet.)
|
|
*
|
|
* Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT):
|
|
*
|
|
diff --git a/include/linux/firewire.h b/include/linux/firewire.h
|
|
index cdc9b71..4d259fc 100644
|
|
--- a/include/linux/firewire.h
|
|
+++ b/include/linux/firewire.h
|
|
@@ -409,6 +409,7 @@ struct fw_iso_context {
|
|
int type;
|
|
int channel;
|
|
int speed;
|
|
+ bool drop_overflow_headers;
|
|
size_t header_size;
|
|
union {
|
|
fw_iso_callback_t sc;
|
|
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
|
|
index 8efd28a..2b779bf 100644
|
|
--- a/include/linux/virtio.h
|
|
+++ b/include/linux/virtio.h
|
|
@@ -44,6 +44,10 @@ void virtqueue_disable_cb(struct virtqueue *vq);
|
|
|
|
bool virtqueue_enable_cb(struct virtqueue *vq);
|
|
|
|
+unsigned virtqueue_enable_cb_prepare(struct virtqueue *vq);
|
|
+
|
|
+bool virtqueue_poll(struct virtqueue *vq, unsigned);
|
|
+
|
|
bool virtqueue_enable_cb_delayed(struct virtqueue *vq);
|
|
|
|
void *virtqueue_detach_unused_buf(struct virtqueue *vq);
|
|
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
|
|
index e675182..c9ce09a 100644
|
|
--- a/kernel/trace/trace_syscalls.c
|
|
+++ b/kernel/trace/trace_syscalls.c
|
|
@@ -358,6 +358,9 @@ void ftrace_syscall_exit(void *ignore, struct pt_regs *regs, long ret)
|
|
if (!sys_data)
|
|
return;
|
|
|
|
+ local_save_flags(irq_flags);
|
|
+ pc = preempt_count();
|
|
+
|
|
event = trace_current_buffer_lock_reserve(&buffer,
|
|
sys_data->exit_event->event.type, sizeof(*entry),
|
|
irq_flags, pc);
|
|
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
|
|
index 533ea80..8090542 100644
|
|
--- a/mm/page_alloc.c
|
|
+++ b/mm/page_alloc.c
|
|
@@ -5592,4 +5592,10 @@ __offline_isolated_pages(unsigned long start_pfn, unsigned long end_pfn)
|
|
zone->free_area[order].nr_free--;
|
|
+ __mod_zone_page_state(zone, NR_FREE_PAGES,
|
|
+ - (1UL << order));
|
|
+#ifdef CONFIG_HIGHMEM
|
|
+ if (PageHighMem(page))
|
|
+ totalhigh_pages -= 1 << order;
|
|
+#endif
|
|
for (i = 0; i < (1 << order); i++)
|
|
SetPageReserved((page+i));
|
|
pfn += (1 << order);
|
|
diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c
|
|
index 4790568..8df4597 100644
|
|
--- a/sound/soc/codecs/max98088.c
|
|
+++ b/sound/soc/codecs/max98088.c
|
|
@@ -1594,7 +1594,7 @@ static int max98088_dai2_digital_mute(struct snd_soc_dai *codec_dai, int mute)
|
|
|
|
static void max98088_sync_cache(struct snd_soc_codec *codec)
|
|
{
|
|
- u16 *reg_cache = codec->reg_cache;
|
|
+ u8 *reg_cache = codec->reg_cache;
|
|
int i;
|
|
|
|
if (!codec->cache_sync)
|
|
diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c
|
|
index 96f6f9f..e96c6ed 100644
|
|
--- a/sound/soc/codecs/wm8962.c
|
|
+++ b/sound/soc/codecs/wm8962.c
|
|
@@ -1599,7 +1599,6 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol,
|
|
struct snd_ctl_elem_value *ucontrol)
|
|
{
|
|
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
- u16 *reg_cache = codec->reg_cache;
|
|
int ret;
|
|
|
|
/* Apply the update (if any) */
|
|
@@ -1608,16 +1607,19 @@ static int wm8962_put_hp_sw(struct snd_kcontrol *kcontrol,
|
|
return 0;
|
|
|
|
/* If the left PGA is enabled hit that VU bit... */
|
|
- if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTL_PGA_ENA)
|
|
- return snd_soc_write(codec, WM8962_HPOUTL_VOLUME,
|
|
- reg_cache[WM8962_HPOUTL_VOLUME]);
|
|
+ ret = snd_soc_read(codec, WM8962_PWR_MGMT_2);
|
|
+ if (ret & WM8962_HPOUTL_PGA_ENA) {
|
|
+ snd_soc_write(codec, WM8962_HPOUTL_VOLUME,
|
|
+ snd_soc_read(codec, WM8962_HPOUTL_VOLUME));
|
|
+ return 1;
|
|
+ }
|
|
|
|
/* ...otherwise the right. The VU is stereo. */
|
|
- if (snd_soc_read(codec, WM8962_PWR_MGMT_2) & WM8962_HPOUTR_PGA_ENA)
|
|
- return snd_soc_write(codec, WM8962_HPOUTR_VOLUME,
|
|
- reg_cache[WM8962_HPOUTR_VOLUME]);
|
|
+ if (ret & WM8962_HPOUTR_PGA_ENA)
|
|
+ snd_soc_write(codec, WM8962_HPOUTR_VOLUME,
|
|
+ snd_soc_read(codec, WM8962_HPOUTR_VOLUME));
|
|
|
|
- return 0;
|
|
+ return 1;
|
|
}
|
|
|
|
/* The VU bits for the speakers are in a different register to the mute
|
|
@@ -3363,7 +3365,6 @@ static int wm8962_probe(struct snd_soc_codec *codec)
|
|
int ret;
|
|
struct wm8962_priv *wm8962 = snd_soc_codec_get_drvdata(codec);
|
|
struct wm8962_pdata *pdata = dev_get_platdata(codec->dev);
|
|
- u16 *reg_cache = codec->reg_cache;
|
|
int i, trigger, irq_pol;
|
|
bool dmicclk, dmicdat;
|
|
|
|
@@ -3421,8 +3422,9 @@ static int wm8962_probe(struct snd_soc_codec *codec)
|
|
|
|
/* Put the speakers into mono mode? */
|
|
if (pdata->spk_mono)
|
|
- reg_cache[WM8962_CLASS_D_CONTROL_2]
|
|
- |= WM8962_SPK_MONO;
|
|
+ snd_soc_update_bits(codec, WM8962_CLASS_D_CONTROL_2,
|
|
+ WM8962_SPK_MONO_MASK, WM8962_SPK_MONO);
|
|
+
|
|
|
|
/* Micbias setup, detection enable and detection
|
|
* threasholds. */
|