commit:     ce1e8033e28f6091f77e2de23af617ffa5a21433
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed May 13 19:11:57 2015 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed May 13 19:11:57 2015 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=ce1e8033

Linux patch 3.14.42

 0000_README              |    4 +
 1041_linux-3.14.42.patch | 1174 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1178 insertions(+)

diff --git a/0000_README b/0000_README
index 131b883..e2ba2e6 100644
--- a/0000_README
+++ b/0000_README
@@ -206,6 +206,10 @@ Patch:  1040_linux-3.14.41.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.14.41
 
+Patch:  1041_linux-3.14.42.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.14.42
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1041_linux-3.14.42.patch b/1041_linux-3.14.42.patch
new file mode 100644
index 0000000..69f3d5e
--- /dev/null
+++ b/1041_linux-3.14.42.patch
@@ -0,0 +1,1174 @@
+diff --git a/Makefile b/Makefile
+index 7a60d4a1301c..b9d850d86366 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 14
+-SUBLEVEL = 41
++SUBLEVEL = 42
+ EXTRAVERSION =
+ NAME = Remembering Coco
+ 
+diff --git a/arch/arc/kernel/signal.c b/arch/arc/kernel/signal.c
+index d68b410595c8..a0c63fc48457 100644
+--- a/arch/arc/kernel/signal.c
++++ b/arch/arc/kernel/signal.c
+@@ -131,6 +131,15 @@ SYSCALL_DEFINE0(rt_sigreturn)
+       /* Don't restart from sigreturn */
+       syscall_wont_restart(regs);
+ 
++      /*
++       * Ensure that sigreturn always returns to user mode (in case the
++       * regs saved on user stack got fudged between save and sigreturn)
++       * Otherwise it is easy to panic the kernel with a custom
++       * signal handler and/or restorer which clobberes the status32/ret
++       * to return to a bogus location in kernel mode.
++       */
++      regs->status32 |= STATUS_U_MASK;
++
+       return regs->r0;
+ 
+ badframe:
+@@ -234,8 +243,11 @@ setup_rt_frame(int signo, struct k_sigaction *ka, 
siginfo_t *info,
+ 
+       /*
+        * handler returns using sigreturn stub provided already by userpsace
++       * If not, nuke the process right away
+        */
+-      BUG_ON(!(ka->sa.sa_flags & SA_RESTORER));
++      if(!(ka->sa.sa_flags & SA_RESTORER))
++              return 1;
++
+       regs->blink = (unsigned long)ka->sa.sa_restorer;
+ 
+       /* User Stack for signal handler will be above the frame just carved */
+@@ -302,12 +314,12 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, 
siginfo_t *info,
+             struct pt_regs *regs)
+ {
+       sigset_t *oldset = sigmask_to_save();
+-      int ret;
++      int failed;
+ 
+       /* Set up the stack frame */
+-      ret = setup_rt_frame(sig, ka, info, oldset, regs);
++      failed = setup_rt_frame(sig, ka, info, oldset, regs);
+ 
+-      if (ret)
++      if (failed)
+               force_sigsegv(sig, current);
+       else
+               signal_delivered(sig, info, ka, regs, 0);
+diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
+index 275a7dc2b06c..63688d3a6ea0 100644
+--- a/drivers/block/rbd.c
++++ b/drivers/block/rbd.c
+@@ -2084,6 +2084,11 @@ static bool rbd_img_obj_end_request(struct 
rbd_obj_request *obj_request)
+                       result, xferred);
+               if (!img_request->result)
+                       img_request->result = result;
++              /*
++               * Need to end I/O on the entire obj_request worth of
++               * bytes in case of error.
++               */
++              xferred = obj_request->length;
+       }
+ 
+       /* Image object requests don't own their page array */
+diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c
+index 35bf2bba69bf..11804cc1e11f 100644
+--- a/drivers/gpu/drm/radeon/si_dpm.c
++++ b/drivers/gpu/drm/radeon/si_dpm.c
+@@ -2913,6 +2913,7 @@ struct si_dpm_quirk {
+ static struct si_dpm_quirk si_dpm_quirk_list[] = {
+       /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */
+       { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 },
++      { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 },
+       { 0, 0, 0, 0 },
+ };
+ 
+diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
+index 505fe29c75b0..8c248818592e 100644
+--- a/drivers/hv/channel_mgmt.c
++++ b/drivers/hv/channel_mgmt.c
+@@ -716,7 +716,7 @@ int vmbus_request_offers(void)
+ {
+       struct vmbus_channel_message_header *msg;
+       struct vmbus_channel_msginfo *msginfo;
+-      int ret, t;
++      int ret;
+ 
+       msginfo = kmalloc(sizeof(*msginfo) +
+                         sizeof(struct vmbus_channel_message_header),
+@@ -724,8 +724,6 @@ int vmbus_request_offers(void)
+       if (!msginfo)
+               return -ENOMEM;
+ 
+-      init_completion(&msginfo->waitevent);
+-
+       msg = (struct vmbus_channel_message_header *)msginfo->msg;
+ 
+       msg->msgtype = CHANNELMSG_REQUESTOFFERS;
+@@ -739,14 +737,6 @@ int vmbus_request_offers(void)
+               goto cleanup;
+       }
+ 
+-      t = wait_for_completion_timeout(&msginfo->waitevent, 5*HZ);
+-      if (t == 0) {
+-              ret = -ETIMEDOUT;
+-              goto cleanup;
+-      }
+-
+-
+-
+ cleanup:
+       kfree(msginfo);
+ 
+diff --git a/drivers/mtd/ubi/misc.c b/drivers/mtd/ubi/misc.c
+index f913d701a5b3..c4b1af07a121 100644
+--- a/drivers/mtd/ubi/misc.c
++++ b/drivers/mtd/ubi/misc.c
+@@ -74,6 +74,8 @@ int ubi_check_volume(struct ubi_device *ubi, int vol_id)
+       for (i = 0; i < vol->used_ebs; i++) {
+               int size;
+ 
++              cond_resched();
++
+               if (i == vol->used_ebs - 1)
+                       size = vol->last_eb_bytes;
+               else
+diff --git a/drivers/platform/x86/compal-laptop.c 
b/drivers/platform/x86/compal-laptop.c
+index 2d9d1985adc1..54407a8209b5 100644
+--- a/drivers/platform/x86/compal-laptop.c
++++ b/drivers/platform/x86/compal-laptop.c
+@@ -1027,9 +1027,9 @@ static int compal_probe(struct platform_device *pdev)
+       if (err)
+               return err;
+ 
+-      hwmon_dev = hwmon_device_register_with_groups(&pdev->dev,
+-                                                    DRIVER_NAME, data,
+-                                                    compal_hwmon_groups);
++      hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev,
++                                                         DRIVER_NAME, data,
++                                                         compal_hwmon_groups);
+       if (IS_ERR(hwmon_dev)) {
+               err = PTR_ERR(hwmon_dev);
+               goto remove;
+diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
+index 0a7325361d29..5f57e3d35e26 100644
+--- a/drivers/scsi/3w-9xxx.c
++++ b/drivers/scsi/3w-9xxx.c
+@@ -149,7 +149,6 @@ static int twa_reset_sequence(TW_Device_Extension *tw_dev, 
int soft_reset);
+ static int twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int 
request_id, char *cdb, int use_sg, TW_SG_Entry *sglistarg);
+ static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int 
request_id);
+ static char *twa_string_lookup(twa_message_type *table, unsigned int 
aen_code);
+-static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id);
+ 
+ /* Functions */
+ 
+@@ -1352,11 +1351,11 @@ static irqreturn_t twa_interrupt(int irq, void 
*dev_instance)
+                               }
+ 
+                               /* Now complete the io */
++                              scsi_dma_unmap(cmd);
++                              cmd->scsi_done(cmd);
+                               tw_dev->state[request_id] = TW_S_COMPLETED;
+                               twa_free_request_id(tw_dev, request_id);
+                               tw_dev->posted_request_count--;
+-                              
tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
+-                              twa_unmap_scsi_data(tw_dev, request_id);
+                       }
+ 
+                       /* Check for valid status after each drain */
+@@ -1414,26 +1413,6 @@ static void twa_load_sgl(TW_Device_Extension *tw_dev, 
TW_Command_Full *full_comm
+       }
+ } /* End twa_load_sgl() */
+ 
+-/* This function will perform a pci-dma mapping for a scatter gather list */
+-static int twa_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
+-{
+-      int use_sg;
+-      struct scsi_cmnd *cmd = tw_dev->srb[request_id];
+-
+-      use_sg = scsi_dma_map(cmd);
+-      if (!use_sg)
+-              return 0;
+-      else if (use_sg < 0) {
+-              TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1c, "Failed to map scatter 
gather list");
+-              return 0;
+-      }
+-
+-      cmd->SCp.phase = TW_PHASE_SGLIST;
+-      cmd->SCp.have_data_in = use_sg;
+-
+-      return use_sg;
+-} /* End twa_map_scsi_sg_data() */
+-
+ /* This function will poll for a response interrupt of a request */
+ static int twa_poll_response(TW_Device_Extension *tw_dev, int request_id, int 
seconds)
+ {
+@@ -1612,9 +1591,11 @@ static int 
twa_reset_device_extension(TW_Device_Extension *tw_dev)
+                   (tw_dev->state[i] != TW_S_INITIAL) &&
+                   (tw_dev->state[i] != TW_S_COMPLETED)) {
+                       if (tw_dev->srb[i]) {
+-                              tw_dev->srb[i]->result = (DID_RESET << 16);
+-                              tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
+-                              twa_unmap_scsi_data(tw_dev, i);
++                              struct scsi_cmnd *cmd = tw_dev->srb[i];
++
++                              cmd->result = (DID_RESET << 16);
++                              scsi_dma_unmap(cmd);
++                              cmd->scsi_done(cmd);
+                       }
+               }
+       }
+@@ -1793,21 +1774,18 @@ static int twa_scsi_queue_lck(struct scsi_cmnd *SCpnt, 
void (*done)(struct scsi_
+       /* Save the scsi command for use by the ISR */
+       tw_dev->srb[request_id] = SCpnt;
+ 
+-      /* Initialize phase to zero */
+-      SCpnt->SCp.phase = TW_PHASE_INITIAL;
+-
+       retval = twa_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
+       switch (retval) {
+       case SCSI_MLQUEUE_HOST_BUSY:
++              scsi_dma_unmap(SCpnt);
+               twa_free_request_id(tw_dev, request_id);
+-              twa_unmap_scsi_data(tw_dev, request_id);
+               break;
+       case 1:
+-              tw_dev->state[request_id] = TW_S_COMPLETED;
+-              twa_free_request_id(tw_dev, request_id);
+-              twa_unmap_scsi_data(tw_dev, request_id);
+               SCpnt->result = (DID_ERROR << 16);
++              scsi_dma_unmap(SCpnt);
+               done(SCpnt);
++              tw_dev->state[request_id] = TW_S_COMPLETED;
++              twa_free_request_id(tw_dev, request_id);
+               retval = 0;
+       }
+ out:
+@@ -1875,8 +1853,8 @@ static int twa_scsiop_execute_scsi(TW_Device_Extension 
*tw_dev, int request_id,
+                               command_packet->sg_list[0].address = 
TW_CPU_TO_SGL(tw_dev->generic_buffer_phys[request_id]);
+                               command_packet->sg_list[0].length = 
cpu_to_le32(TW_MIN_SGL_LENGTH);
+                       } else {
+-                              sg_count = twa_map_scsi_sg_data(tw_dev, 
request_id);
+-                              if (sg_count == 0)
++                              sg_count = scsi_dma_map(srb);
++                              if (sg_count < 0)
+                                       goto out;
+ 
+                               scsi_for_each_sg(srb, sg, sg_count, i) {
+@@ -1991,15 +1969,6 @@ static char *twa_string_lookup(twa_message_type *table, 
unsigned int code)
+       return(table[index].text);
+ } /* End twa_string_lookup() */
+ 
+-/* This function will perform a pci-dma unmap */
+-static void twa_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
+-{
+-      struct scsi_cmnd *cmd = tw_dev->srb[request_id];
+-
+-      if (cmd->SCp.phase == TW_PHASE_SGLIST)
+-              scsi_dma_unmap(cmd);
+-} /* End twa_unmap_scsi_data() */
+-
+ /* This function gets called when a disk is coming on-line */
+ static int twa_slave_configure(struct scsi_device *sdev)
+ {
+diff --git a/drivers/scsi/3w-9xxx.h b/drivers/scsi/3w-9xxx.h
+index 040f7214e5b7..0fdc83cfa0e1 100644
+--- a/drivers/scsi/3w-9xxx.h
++++ b/drivers/scsi/3w-9xxx.h
+@@ -324,11 +324,6 @@ static twa_message_type twa_error_table[] = {
+ #define TW_CURRENT_DRIVER_BUILD 0
+ #define TW_CURRENT_DRIVER_BRANCH 0
+ 
+-/* Phase defines */
+-#define TW_PHASE_INITIAL 0
+-#define TW_PHASE_SINGLE  1
+-#define TW_PHASE_SGLIST  2
+-
+ /* Misc defines */
+ #define TW_9550SX_DRAIN_COMPLETED           0xFFFF
+ #define TW_SECTOR_SIZE                        512
+diff --git a/drivers/scsi/3w-sas.c b/drivers/scsi/3w-sas.c
+index 4de346017e9f..61702ac00d42 100644
+--- a/drivers/scsi/3w-sas.c
++++ b/drivers/scsi/3w-sas.c
+@@ -303,26 +303,6 @@ static int twl_post_command_packet(TW_Device_Extension 
*tw_dev, int request_id)
+       return 0;
+ } /* End twl_post_command_packet() */
+ 
+-/* This function will perform a pci-dma mapping for a scatter gather list */
+-static int twl_map_scsi_sg_data(TW_Device_Extension *tw_dev, int request_id)
+-{
+-      int use_sg;
+-      struct scsi_cmnd *cmd = tw_dev->srb[request_id];
+-
+-      use_sg = scsi_dma_map(cmd);
+-      if (!use_sg)
+-              return 0;
+-      else if (use_sg < 0) {
+-              TW_PRINTK(tw_dev->host, TW_DRIVER, 0x1, "Failed to map scatter 
gather list");
+-              return 0;
+-      }
+-
+-      cmd->SCp.phase = TW_PHASE_SGLIST;
+-      cmd->SCp.have_data_in = use_sg;
+-
+-      return use_sg;
+-} /* End twl_map_scsi_sg_data() */
+-
+ /* This function hands scsi cdb's to the firmware */
+ static int twl_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int 
request_id, char *cdb, int use_sg, TW_SG_Entry_ISO *sglistarg)
+ {
+@@ -370,8 +350,8 @@ static int twl_scsiop_execute_scsi(TW_Device_Extension 
*tw_dev, int request_id,
+       if (!sglistarg) {
+               /* Map sglist from scsi layer to cmd packet */
+               if (scsi_sg_count(srb)) {
+-                      sg_count = twl_map_scsi_sg_data(tw_dev, request_id);
+-                      if (sg_count == 0)
++                      sg_count = scsi_dma_map(srb);
++                      if (sg_count <= 0)
+                               goto out;
+ 
+                       scsi_for_each_sg(srb, sg, sg_count, i) {
+@@ -1116,15 +1096,6 @@ out:
+       return retval;
+ } /* End twl_initialize_device_extension() */
+ 
+-/* This function will perform a pci-dma unmap */
+-static void twl_unmap_scsi_data(TW_Device_Extension *tw_dev, int request_id)
+-{
+-      struct scsi_cmnd *cmd = tw_dev->srb[request_id];
+-
+-      if (cmd->SCp.phase == TW_PHASE_SGLIST)
+-              scsi_dma_unmap(cmd);
+-} /* End twl_unmap_scsi_data() */
+-
+ /* This function will handle attention interrupts */
+ static int twl_handle_attention_interrupt(TW_Device_Extension *tw_dev)
+ {
+@@ -1265,11 +1236,11 @@ static irqreturn_t twl_interrupt(int irq, void 
*dev_instance)
+                       }
+ 
+                       /* Now complete the io */
++                      scsi_dma_unmap(cmd);
++                      cmd->scsi_done(cmd);
+                       tw_dev->state[request_id] = TW_S_COMPLETED;
+                       twl_free_request_id(tw_dev, request_id);
+                       tw_dev->posted_request_count--;
+-                      
tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
+-                      twl_unmap_scsi_data(tw_dev, request_id);
+               }
+ 
+               /* Check for another response interrupt */
+@@ -1414,10 +1385,12 @@ static int 
twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_res
+               if ((tw_dev->state[i] != TW_S_FINISHED) &&
+                   (tw_dev->state[i] != TW_S_INITIAL) &&
+                   (tw_dev->state[i] != TW_S_COMPLETED)) {
+-                      if (tw_dev->srb[i]) {
+-                              tw_dev->srb[i]->result = (DID_RESET << 16);
+-                              tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
+-                              twl_unmap_scsi_data(tw_dev, i);
++                      struct scsi_cmnd *cmd = tw_dev->srb[i];
++
++                      if (cmd) {
++                              cmd->result = (DID_RESET << 16);
++                              scsi_dma_unmap(cmd);
++                              cmd->scsi_done(cmd);
+                       }
+               }
+       }
+@@ -1521,9 +1494,6 @@ static int twl_scsi_queue_lck(struct scsi_cmnd *SCpnt, 
void (*done)(struct scsi_
+       /* Save the scsi command for use by the ISR */
+       tw_dev->srb[request_id] = SCpnt;
+ 
+-      /* Initialize phase to zero */
+-      SCpnt->SCp.phase = TW_PHASE_INITIAL;
+-
+       retval = twl_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL);
+       if (retval) {
+               tw_dev->state[request_id] = TW_S_COMPLETED;
+diff --git a/drivers/scsi/3w-sas.h b/drivers/scsi/3w-sas.h
+index d474892701d4..fec6449c7595 100644
+--- a/drivers/scsi/3w-sas.h
++++ b/drivers/scsi/3w-sas.h
+@@ -103,10 +103,6 @@ static char *twl_aen_severity_table[] =
+ #define TW_CURRENT_DRIVER_BUILD 0
+ #define TW_CURRENT_DRIVER_BRANCH 0
+ 
+-/* Phase defines */
+-#define TW_PHASE_INITIAL 0
+-#define TW_PHASE_SGLIST  2
+-
+ /* Misc defines */
+ #define TW_SECTOR_SIZE                        512
+ #define TW_MAX_UNITS                        32
+diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
+index 752624e6bc00..b327742b95ef 100644
+--- a/drivers/scsi/3w-xxxx.c
++++ b/drivers/scsi/3w-xxxx.c
+@@ -1284,32 +1284,6 @@ static int 
tw_initialize_device_extension(TW_Device_Extension *tw_dev)
+       return 0;
+ } /* End tw_initialize_device_extension() */
+ 
+-static int tw_map_scsi_sg_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
+-{
+-      int use_sg;
+-
+-      dprintk(KERN_WARNING "3w-xxxx: tw_map_scsi_sg_data()\n");
+-
+-      use_sg = scsi_dma_map(cmd);
+-      if (use_sg < 0) {
+-              printk(KERN_WARNING "3w-xxxx: tw_map_scsi_sg_data(): 
pci_map_sg() failed.\n");
+-              return 0;
+-      }
+-
+-      cmd->SCp.phase = TW_PHASE_SGLIST;
+-      cmd->SCp.have_data_in = use_sg;
+-
+-      return use_sg;
+-} /* End tw_map_scsi_sg_data() */
+-
+-static void tw_unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
+-{
+-      dprintk(KERN_WARNING "3w-xxxx: tw_unmap_scsi_data()\n");
+-
+-      if (cmd->SCp.phase == TW_PHASE_SGLIST)
+-              scsi_dma_unmap(cmd);
+-} /* End tw_unmap_scsi_data() */
+-
+ /* This function will reset a device extension */
+ static int tw_reset_device_extension(TW_Device_Extension *tw_dev)
+ {
+@@ -1332,8 +1306,8 @@ static int tw_reset_device_extension(TW_Device_Extension 
*tw_dev)
+                       srb = tw_dev->srb[i];
+                       if (srb != NULL) {
+                               srb->result = (DID_RESET << 16);
+-                              tw_dev->srb[i]->scsi_done(tw_dev->srb[i]);
+-                              tw_unmap_scsi_data(tw_dev->tw_pci_dev, 
tw_dev->srb[i]);
++                              scsi_dma_unmap(srb);
++                              srb->scsi_done(srb);
+                       }
+               }
+       }
+@@ -1780,8 +1754,8 @@ static int tw_scsiop_read_write(TW_Device_Extension 
*tw_dev, int request_id)
+       command_packet->byte8.io.lba = lba;
+       command_packet->byte6.block_count = num_sectors;
+ 
+-      use_sg = tw_map_scsi_sg_data(tw_dev->tw_pci_dev, 
tw_dev->srb[request_id]);
+-      if (!use_sg)
++      use_sg = scsi_dma_map(srb);
++      if (use_sg <= 0)
+               return 1;
+ 
+       scsi_for_each_sg(tw_dev->srb[request_id], sg, use_sg, i) {
+@@ -1968,9 +1942,6 @@ static int tw_scsi_queue_lck(struct scsi_cmnd *SCpnt, 
void (*done)(struct scsi_c
+       /* Save the scsi command for use by the ISR */
+       tw_dev->srb[request_id] = SCpnt;
+ 
+-      /* Initialize phase to zero */
+-      SCpnt->SCp.phase = TW_PHASE_INITIAL;
+-
+       switch (*command) {
+               case READ_10:
+               case READ_6:
+@@ -2198,12 +2169,11 @@ static irqreturn_t tw_interrupt(int irq, void 
*dev_instance)
+ 
+                               /* Now complete the io */
+                               if ((error != TW_ISR_DONT_COMPLETE)) {
++                                      scsi_dma_unmap(tw_dev->srb[request_id]);
++                                      
tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
+                                       tw_dev->state[request_id] = 
TW_S_COMPLETED;
+                                       tw_state_request_finish(tw_dev, 
request_id);
+                                       tw_dev->posted_request_count--;
+-                                      
tw_dev->srb[request_id]->scsi_done(tw_dev->srb[request_id]);
+-                                      
+-                                      tw_unmap_scsi_data(tw_dev->tw_pci_dev, 
tw_dev->srb[request_id]);
+                               }
+                       }
+                               
+diff --git a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h
+index 49dcf03c631a..1d31858766ce 100644
+--- a/drivers/scsi/3w-xxxx.h
++++ b/drivers/scsi/3w-xxxx.h
+@@ -195,11 +195,6 @@ static unsigned char tw_sense_table[][4] =
+ #define TW_AEN_SMART_FAIL        0x000F
+ #define TW_AEN_SBUF_FAIL         0x0024
+ 
+-/* Phase defines */
+-#define TW_PHASE_INITIAL 0
+-#define TW_PHASE_SINGLE 1
+-#define TW_PHASE_SGLIST 2
+-
+ /* Misc defines */
+ #define TW_ALIGNMENT_6000                   64 /* 64 bytes */
+ #define TW_ALIGNMENT_7000                     4  /* 4 bytes */
+diff --git a/drivers/staging/panel/panel.c b/drivers/staging/panel/panel.c
+index ec4b1fd14021..790e12e0f524 100644
+--- a/drivers/staging/panel/panel.c
++++ b/drivers/staging/panel/panel.c
+@@ -275,11 +275,11 @@ static unsigned char 
lcd_bits[LCD_PORTS][LCD_BITS][BIT_STATES];
+  * LCD types
+  */
+ #define LCD_TYPE_NONE         0
+-#define LCD_TYPE_OLD          1
+-#define LCD_TYPE_KS0074               2
+-#define LCD_TYPE_HANTRONIX    3
+-#define LCD_TYPE_NEXCOM               4
+-#define LCD_TYPE_CUSTOM               5
++#define LCD_TYPE_CUSTOM               1
++#define LCD_TYPE_OLD          2
++#define LCD_TYPE_KS0074               3
++#define LCD_TYPE_HANTRONIX    4
++#define LCD_TYPE_NEXCOM               5
+ 
+ /*
+  * keypad types
+@@ -457,8 +457,7 @@ MODULE_PARM_DESC(keypad_enabled, "Deprecated option, use 
keypad_type instead");
+ static int lcd_type = -1;
+ module_param(lcd_type, int, 0000);
+ MODULE_PARM_DESC(lcd_type,
+-               "LCD type: 0=none, 1=old //, 2=serial ks0074, "
+-               "3=hantronix //, 4=nexcom //, 5=compiled-in");
++              "LCD type: 0=none, 1=compiled-in, 2=old, 3=serial ks0074, 
4=hantronix, 5=nexcom");
+ 
+ static int lcd_proto = -1;
+ module_param(lcd_proto, int, 0000);
+diff --git a/drivers/tty/serial/atmel_serial.c 
b/drivers/tty/serial/atmel_serial.c
+index 0d3e6cb36748..9d162ef79af6 100644
+--- a/drivers/tty/serial/atmel_serial.c
++++ b/drivers/tty/serial/atmel_serial.c
+@@ -757,6 +757,7 @@ static int atmel_prepare_tx_dma(struct uart_port *port)
+       config.direction = DMA_MEM_TO_DEV;
+       config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
+       config.dst_addr = port->mapbase + ATMEL_US_THR;
++      config.dst_maxburst = 1;
+ 
+       ret = dmaengine_device_control(atmel_port->chan_tx,
+                                       DMA_SLAVE_CONFIG,
+@@ -921,6 +922,7 @@ static int atmel_prepare_rx_dma(struct uart_port *port)
+       config.direction = DMA_DEV_TO_MEM;
+       config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
+       config.src_addr = port->mapbase + ATMEL_US_RHR;
++      config.src_maxburst = 1;
+ 
+       ret = dmaengine_device_control(atmel_port->chan_rx,
+                                       DMA_SLAVE_CONFIG,
+diff --git a/drivers/tty/serial/of_serial.c b/drivers/tty/serial/of_serial.c
+index 99246606a256..9dd8a71fff9e 100644
+--- a/drivers/tty/serial/of_serial.c
++++ b/drivers/tty/serial/of_serial.c
+@@ -261,7 +261,6 @@ static struct of_device_id of_platform_serial_table[] = {
+       { .compatible = "ibm,qpace-nwp-serial",
+               .data = (void *)PORT_NWPSERIAL, },
+ #endif
+-      { .type = "serial",         .data = (void *)PORT_UNKNOWN, },
+       { /* end of list */ },
+ };
+ 
+diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c
+index 69b76efd11e9..44e698cd5246 100644
+--- a/drivers/usb/gadget/printer.c
++++ b/drivers/usb/gadget/printer.c
+@@ -975,6 +975,15 @@ unknown:
+               break;
+       }
+       /* host either stalls (value < 0) or reports success */
++      if (value >= 0) {
++              req->length = value;
++              req->zero = value < wLength;
++              value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
++              if (value < 0) {
++                      ERROR(dev, "%s:%d Error!\n", __func__, __LINE__);
++                      req->status = 0;
++              }
++      }
+       return value;
+ }
+ 
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index 488a30836c36..3df32fa8c8ae 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -787,12 +787,12 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
+                                       ehci->reset_done[i] == 0))
+                               continue;
+ 
+-                      /* start 20 msec resume signaling from this port,
+-                       * and make khubd collect PORT_STAT_C_SUSPEND to
+-                       * stop that signaling.  Use 5 ms extra for safety,
+-                       * like usb_port_resume() does.
++                      /* start USB_RESUME_TIMEOUT msec resume signaling from
++                       * this port, and make hub_wq collect
++                       * PORT_STAT_C_SUSPEND to stop that signaling.
+                        */
+-                      ehci->reset_done[i] = jiffies + msecs_to_jiffies(25);
++                      ehci->reset_done[i] = jiffies +
++                              msecs_to_jiffies(USB_RESUME_TIMEOUT);
+                       set_bit(i, &ehci->resuming_ports);
+                       ehci_dbg (ehci, "port %d remote wakeup\n", i + 1);
+                       usb_hcd_start_port_resume(&hcd->self, i);
+diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
+index 7d6f64c447bf..323c5faf7a2f 100644
+--- a/drivers/usb/host/ehci-hub.c
++++ b/drivers/usb/host/ehci-hub.c
+@@ -482,10 +482,13 @@ static int ehci_bus_resume (struct usb_hcd *hcd)
+               ehci_writel(ehci, temp, &ehci->regs->port_status [i]);
+       }
+ 
+-      /* msleep for 20ms only if code is trying to resume port */
++      /*
++       * msleep for USB_RESUME_TIMEOUT ms only if code is trying to resume
++       * port
++       */
+       if (resume_needed) {
+               spin_unlock_irq(&ehci->lock);
+-              msleep(20);
++              msleep(USB_RESUME_TIMEOUT);
+               spin_lock_irq(&ehci->lock);
+               if (ehci->shutdown)
+                       goto shutdown;
+@@ -953,7 +956,7 @@ static int ehci_hub_control (
+                       temp &= ~PORT_WAKE_BITS;
+                       ehci_writel(ehci, temp | PORT_RESUME, status_reg);
+                       ehci->reset_done[wIndex] = jiffies
+-                                      + msecs_to_jiffies(20);
++                                      + msecs_to_jiffies(USB_RESUME_TIMEOUT);
+                       set_bit(wIndex, &ehci->resuming_ports);
+                       usb_hcd_start_port_resume(&hcd->self, wIndex);
+                       break;
+diff --git a/drivers/usb/host/oxu210hp-hcd.c b/drivers/usb/host/oxu210hp-hcd.c
+index e07248b6ab67..1b1e6e0d9270 100644
+--- a/drivers/usb/host/oxu210hp-hcd.c
++++ b/drivers/usb/host/oxu210hp-hcd.c
+@@ -2500,11 +2500,12 @@ static irqreturn_t oxu210_hcd_irq(struct usb_hcd *hcd)
+                                       || oxu->reset_done[i] != 0)
+                               continue;
+ 
+-                      /* start 20 msec resume signaling from this port,
+-                       * and make khubd collect PORT_STAT_C_SUSPEND to
++                      /* start USB_RESUME_TIMEOUT resume signaling from this
++                       * port, and make hub_wq collect PORT_STAT_C_SUSPEND to
+                        * stop that signaling.
+                        */
+-                      oxu->reset_done[i] = jiffies + msecs_to_jiffies(20);
++                      oxu->reset_done[i] = jiffies +
++                              msecs_to_jiffies(USB_RESUME_TIMEOUT);
+                       oxu_dbg(oxu, "port %d remote wakeup\n", i + 1);
+                       mod_timer(&hcd->rh_timer, oxu->reset_done[i]);
+               }
+diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
+index 07576907e2c6..ec69b90475c7 100644
+--- a/drivers/usb/musb/musb_core.c
++++ b/drivers/usb/musb/musb_core.c
+@@ -99,6 +99,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/io.h>
+ #include <linux/dma-mapping.h>
++#include <linux/usb.h>
+ 
+ #include "musb_core.h"
+ 
+@@ -477,10 +478,11 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 
int_usb,
+                                               (USB_PORT_STAT_C_SUSPEND << 16)
+                                               | MUSB_PORT_STAT_RESUME;
+                               musb->rh_timer = jiffies
+-                                               + msecs_to_jiffies(20);
++                                      + msecs_to_jiffies(USB_RESUME_TIMEOUT);
++
+                               schedule_delayed_work(
+                                       &musb->finish_resume_work,
+-                                      msecs_to_jiffies(20));
++                                      msecs_to_jiffies(USB_RESUME_TIMEOUT));
+ 
+                               musb->xceiv->state = OTG_STATE_A_HOST;
+                               musb->is_active = 1;
+diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c
+index e2d2d8c9891b..0241a3a0d63e 100644
+--- a/drivers/usb/musb/musb_virthub.c
++++ b/drivers/usb/musb/musb_virthub.c
+@@ -136,7 +136,7 @@ void musb_port_suspend(struct musb *musb, bool do_suspend)
+               /* later, GetPortStatus will stop RESUME signaling */
+               musb->port1_status |= MUSB_PORT_STAT_RESUME;
+               schedule_delayed_work(&musb->finish_resume_work,
+-                                    msecs_to_jiffies(20));
++                                    msecs_to_jiffies(USB_RESUME_TIMEOUT));
+       }
+ }
+ 
+diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
+index 171b9fa0f27a..4e8b79def9c7 100644
+--- a/fs/ext4/extents_status.c
++++ b/fs/ext4/extents_status.c
+@@ -656,6 +656,14 @@ int ext4_es_insert_extent(struct inode *inode, 
ext4_lblk_t lblk,
+ 
+       BUG_ON(end < lblk);
+ 
++      if ((status & EXTENT_STATUS_DELAYED) &&
++          (status & EXTENT_STATUS_WRITTEN)) {
++              ext4_warning(inode->i_sb, "Inserting extent [%u/%u] as "
++                              " delayed and written which can potentially "
++                              " cause data loss.\n", lblk, len);
++              WARN_ON(1);
++      }
++
+       newes.es_lblk = lblk;
+       newes.es_len = len;
+       ext4_es_store_pblock(&newes, pblk);
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index 3a7e0341447f..da03340fdb17 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -569,6 +569,7 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode,
+               status = map->m_flags & EXT4_MAP_UNWRITTEN ?
+                               EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
+               if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) &&
++                  !(status & EXTENT_STATUS_WRITTEN) &&
+                   ext4_find_delalloc_range(inode, map->m_lblk,
+                                            map->m_lblk + map->m_len - 1))
+                       status |= EXTENT_STATUS_DELAYED;
+@@ -678,6 +679,7 @@ found:
+               status = map->m_flags & EXT4_MAP_UNWRITTEN ?
+                               EXTENT_STATUS_UNWRITTEN : EXTENT_STATUS_WRITTEN;
+               if (!(flags & EXT4_GET_BLOCKS_DELALLOC_RESERVE) &&
++                  !(status & EXTENT_STATUS_WRITTEN) &&
+                   ext4_find_delalloc_range(inode, map->m_lblk,
+                                            map->m_lblk + map->m_len - 1))
+                       status |= EXTENT_STATUS_DELAYED;
+diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
+index dfb42ca6d043..8898cdeb42a4 100644
+--- a/include/sound/emu10k1.h
++++ b/include/sound/emu10k1.h
+@@ -41,7 +41,8 @@
+ 
+ #define EMUPAGESIZE     4096
+ #define MAXREQVOICES    8
+-#define MAXPAGES        8192
++#define MAXPAGES0       4096  /* 32 bit mode */
++#define MAXPAGES1       8192  /* 31 bit mode */
+ #define RESERVED        0
+ #define NUM_MIDI        16
+ #define NUM_G           64              /* use all channels */
+@@ -50,8 +51,7 @@
+ 
+ /* FIXME? - according to the OSS driver the EMU10K1 needs a 29 bit DMA mask */
+ #define EMU10K1_DMA_MASK      0x7fffffffUL    /* 31bit */
+-#define AUDIGY_DMA_MASK               0x7fffffffUL    /* 31bit FIXME - 32 
should work? */
+-                                              /* See ALSA bug #1276 - 
rlrevell */
++#define AUDIGY_DMA_MASK               0xffffffffUL    /* 32bit mode */
+ 
+ #define TMEMSIZE        256*1024
+ #define TMEMSIZEREG     4
+@@ -468,8 +468,11 @@
+ 
+ #define MAPB                  0x0d            /* Cache map B                  
                        */
+ 
+-#define MAP_PTE_MASK          0xffffe000      /* The 19 MSBs of the PTE 
indexed by the PTI            */
+-#define MAP_PTI_MASK          0x00001fff      /* The 13 bit index to one of 
the 8192 PTE dwords       */
++#define MAP_PTE_MASK0         0xfffff000      /* The 20 MSBs of the PTE 
indexed by the PTI            */
++#define MAP_PTI_MASK0         0x00000fff      /* The 12 bit index to one of 
the 4096 PTE dwords       */
++
++#define MAP_PTE_MASK1         0xffffe000      /* The 19 MSBs of the PTE 
indexed by the PTI            */
++#define MAP_PTI_MASK1         0x00001fff      /* The 13 bit index to one of 
the 8192 PTE dwords       */
+ 
+ /* 0x0e, 0x0f: Not used */
+ 
+@@ -1706,6 +1709,7 @@ struct snd_emu10k1 {
+       unsigned short model;                   /* subsystem id */
+       unsigned int card_type;                 /* EMU10K1_CARD_* */
+       unsigned int ecard_ctrl;                /* ecard control bits */
++      unsigned int address_mode;              /* address mode */
+       unsigned long dma_mask;                 /* PCI DMA mask */
+       unsigned int delay_pcm_irq;             /* in samples */
+       int max_cache_pages;                    /* max memory size / PAGE_SIZE 
*/
+diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
+index 6e89ef6c11c1..13412ab158ee 100644
+--- a/include/sound/soc-dapm.h
++++ b/include/sound/soc-dapm.h
+@@ -302,7 +302,7 @@ struct device;
+       .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | 
SNDRV_CTL_ELEM_ACCESS_READWRITE,\
+       .tlv.p = (tlv_array), \
+       .get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
+-      .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
++      .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 1) }
+ #define SOC_DAPM_SINGLE_TLV_VIRT(xname, max, tlv_array) \
+       SOC_DAPM_SINGLE(xname, SND_SOC_NOPM, 0, max, 0, tlv_array)
+ #define SOC_DAPM_ENUM(xname, xenum) \
+diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
+index b94002ab8052..1e2e9bf62f1a 100644
+--- a/net/ipv4/ping.c
++++ b/net/ipv4/ping.c
+@@ -158,6 +158,7 @@ void ping_unhash(struct sock *sk)
+       if (sk_hashed(sk)) {
+               write_lock_bh(&ping_table.lock);
+               hlist_nulls_del(&sk->sk_nulls_node);
++              sk_nulls_node_init(&sk->sk_nulls_node);
+               sock_put(sk);
+               isk->inet_num = 0;
+               isk->inet_sport = 0;
+diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c
+index 9e1bd0c39a8c..6757458e8db6 100644
+--- a/sound/pci/emu10k1/emu10k1.c
++++ b/sound/pci/emu10k1/emu10k1.c
+@@ -181,8 +181,10 @@ static int snd_card_emu10k1_probe(struct pci_dev *pci,
+       }
+ #endif
+  
+-      strcpy(card->driver, emu->card_capabilities->driver);
+-      strcpy(card->shortname, emu->card_capabilities->name);
++      strlcpy(card->driver, emu->card_capabilities->driver,
++              sizeof(card->driver));
++      strlcpy(card->shortname, emu->card_capabilities->name,
++              sizeof(card->shortname));
+       snprintf(card->longname, sizeof(card->longname),
+                "%s (rev.%d, serial:0x%x) at 0x%lx, irq %i",
+                card->shortname, emu->revision, emu->serial, emu->port, 
emu->irq);
+diff --git a/sound/pci/emu10k1/emu10k1_callback.c 
b/sound/pci/emu10k1/emu10k1_callback.c
+index 0a34b5f1c475..f8a6549f00e5 100644
+--- a/sound/pci/emu10k1/emu10k1_callback.c
++++ b/sound/pci/emu10k1/emu10k1_callback.c
+@@ -415,7 +415,7 @@ start_voice(struct snd_emux_voice *vp)
+       snd_emu10k1_ptr_write(hw, Z2, ch, 0);
+ 
+       /* invalidate maps */
+-      temp = (hw->silent_page.addr << 1) | MAP_PTI_MASK;
++      temp = (hw->silent_page.addr << hw->address_mode) | (hw->address_mode ? 
MAP_PTI_MASK1 : MAP_PTI_MASK0);
+       snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
+       snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
+ #if 0
+@@ -436,7 +436,7 @@ start_voice(struct snd_emux_voice *vp)
+               snd_emu10k1_ptr_write(hw, CDF, ch, sample);
+ 
+               /* invalidate maps */
+-              temp = ((unsigned int)hw->silent_page.addr << 1) | MAP_PTI_MASK;
++              temp = ((unsigned int)hw->silent_page.addr << hw_address_mode) 
| (hw->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
+               snd_emu10k1_ptr_write(hw, MAPA, ch, temp);
+               snd_emu10k1_ptr_write(hw, MAPB, ch, temp);
+               
+diff --git a/sound/pci/emu10k1/emu10k1_main.c 
b/sound/pci/emu10k1/emu10k1_main.c
+index bdd888ec9a84..a131092572e6 100644
+--- a/sound/pci/emu10k1/emu10k1_main.c
++++ b/sound/pci/emu10k1/emu10k1_main.c
+@@ -282,7 +282,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int 
enable_ir, int resume)
+       snd_emu10k1_ptr_write(emu, TCB, 0, 0);  /* taken from original driver */
+       snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */
+ 
+-      silent_page = (emu->silent_page.addr << 1) | MAP_PTI_MASK;
++      silent_page = (emu->silent_page.addr << emu->address_mode) | 
(emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
+       for (ch = 0; ch < NUM_G; ch++) {
+               snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page);
+               snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page);
+@@ -348,6 +348,11 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int 
enable_ir, int resume)
+               outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG);
+       }
+ 
++      if (emu->address_mode == 0) {
++              /* use 16M in 4G */
++              outl(inl(emu->port + HCFG) | HCFG_EXPANDED_MEM, emu->port + 
HCFG);
++      }
++
+       return 0;
+ }
+ 
+@@ -1411,7 +1416,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
+        *
+        */
+       {.vendor = 0x1102, .device = 0x0008, .subsystem = 0x20011102,
+-       .driver = "Audigy2", .name = "SB Audigy 2 ZS Notebook [SB0530]",
++       .driver = "Audigy2", .name = "Audigy 2 ZS Notebook [SB0530]",
+        .id = "Audigy2",
+        .emu10k2_chip = 1,
+        .ca0108_chip = 1,
+@@ -1561,7 +1566,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
+        .adc_1361t = 1,  /* 24 bit capture instead of 16bit */
+        .ac97_chip = 1} ,
+       {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x10051102,
+-       .driver = "Audigy2", .name = "SB Audigy 2 Platinum EX [SB0280]",
++       .driver = "Audigy2", .name = "Audigy 2 Platinum EX [SB0280]",
+        .id = "Audigy2",
+        .emu10k2_chip = 1,
+        .ca0102_chip = 1,
+@@ -1865,8 +1870,10 @@ int snd_emu10k1_create(struct snd_card *card,
+ 
+       is_audigy = emu->audigy = c->emu10k2_chip;
+ 
++      /* set addressing mode */
++      emu->address_mode = is_audigy ? 0 : 1;
+       /* set the DMA transfer mask */
+-      emu->dma_mask = is_audigy ? AUDIGY_DMA_MASK : EMU10K1_DMA_MASK;
++      emu->dma_mask = emu->address_mode ? EMU10K1_DMA_MASK : AUDIGY_DMA_MASK;
+       if (pci_set_dma_mask(pci, emu->dma_mask) < 0 ||
+           pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) {
+               snd_printk(KERN_ERR "architecture does not support PCI 
busmaster DMA with mask 0x%lx\n", emu->dma_mask);
+@@ -1889,7 +1896,7 @@ int snd_emu10k1_create(struct snd_card *card,
+ 
+       emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
+       if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
+-                              32 * 1024, &emu->ptb_pages) < 0) {
++                              (emu->address_mode ? 32 : 16) * 1024, 
&emu->ptb_pages) < 0) {
+               err = -ENOMEM;
+               goto error;
+       }
+@@ -1988,8 +1995,8 @@ int snd_emu10k1_create(struct snd_card *card,
+ 
+       /* Clear silent pages and set up pointers */
+       memset(emu->silent_page.area, 0, PAGE_SIZE);
+-      silent_page = emu->silent_page.addr << 1;
+-      for (idx = 0; idx < MAXPAGES; idx++)
++      silent_page = emu->silent_page.addr << emu->address_mode;
++      for (idx = 0; idx < (emu->address_mode ? MAXPAGES1 : MAXPAGES0); idx++)
+               ((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | 
idx);
+ 
+       /* set up voice indices */
+diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
+index 5ae1d045bdcb..7581019d7c84 100644
+--- a/sound/pci/emu10k1/emupcm.c
++++ b/sound/pci/emu10k1/emupcm.c
+@@ -379,7 +379,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 
*emu,
+       snd_emu10k1_ptr_write(emu, Z1, voice, 0);
+       snd_emu10k1_ptr_write(emu, Z2, voice, 0);
+       /* invalidate maps */
+-      silent_page = ((unsigned int)emu->silent_page.addr << 1) | MAP_PTI_MASK;
++      silent_page = ((unsigned int)emu->silent_page.addr << 
emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
+       snd_emu10k1_ptr_write(emu, MAPA, voice, silent_page);
+       snd_emu10k1_ptr_write(emu, MAPB, voice, silent_page);
+       /* modulation envelope */
+diff --git a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c
+index ae709c1ab3a8..d514458efe3d 100644
+--- a/sound/pci/emu10k1/memory.c
++++ b/sound/pci/emu10k1/memory.c
+@@ -34,10 +34,11 @@
+  * aligned pages in others
+  */
+ #define __set_ptb_entry(emu,page,addr) \
+-      (((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << 1) | 
(page)))
++      (((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << 
(emu->address_mode)) | (page)))
+ 
+ #define UNIT_PAGES            (PAGE_SIZE / EMUPAGESIZE)
+-#define MAX_ALIGN_PAGES               (MAXPAGES / UNIT_PAGES)
++#define MAX_ALIGN_PAGES0              (MAXPAGES0 / UNIT_PAGES)
++#define MAX_ALIGN_PAGES1              (MAXPAGES1 / UNIT_PAGES)
+ /* get aligned page from offset address */
+ #define get_aligned_page(offset)      ((offset) >> PAGE_SHIFT)
+ /* get offset address from aligned page */
+@@ -124,7 +125,7 @@ static int search_empty_map_area(struct snd_emu10k1 *emu, 
int npages, struct lis
+               }
+               page = blk->mapped_page + blk->pages;
+       }
+-      size = MAX_ALIGN_PAGES - page;
++      size = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0) - page;
+       if (size >= max_size) {
+               *nextp = pos;
+               return page;
+@@ -181,7 +182,7 @@ static int unmap_memblk(struct snd_emu10k1 *emu, struct 
snd_emu10k1_memblk *blk)
+               q = get_emu10k1_memblk(p, mapped_link);
+               end_page = q->mapped_page;
+       } else
+-              end_page = MAX_ALIGN_PAGES;
++              end_page = (emu->address_mode ? MAX_ALIGN_PAGES1 : 
MAX_ALIGN_PAGES0);
+ 
+       /* remove links */
+       list_del(&blk->mapped_link);
+@@ -305,7 +306,7 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct 
snd_pcm_substream *subst
+       if (snd_BUG_ON(!emu))
+               return NULL;
+       if (snd_BUG_ON(runtime->dma_bytes <= 0 ||
+-                     runtime->dma_bytes >= MAXPAGES * EMUPAGESIZE))
++                     runtime->dma_bytes >= (emu->address_mode ? MAXPAGES1 : 
MAXPAGES0) * EMUPAGESIZE))
+               return NULL;
+       hdr = emu->memhdr;
+       if (snd_BUG_ON(!hdr))
+diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
+index f6e5c4ed03ed..97ebc105cf3c 100644
+--- a/sound/pci/hda/hda_codec.c
++++ b/sound/pci/hda/hda_codec.c
+@@ -2082,6 +2082,16 @@ static void put_vol_mute(struct hda_codec *codec, 
unsigned int amp_caps,
+       snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE, parm);
+ }
+ 
++/* meta hook to call each driver's vmaster hook */
++static void vmaster_hook(void *private_data, int enabled)
++{
++      struct hda_vmaster_mute_hook *hook = private_data;
++
++      if (hook->mute_mode != HDA_VMUTE_FOLLOW_MASTER)
++              enabled = hook->mute_mode;
++      hook->hook(hook->codec, enabled);
++}
++
+ /**
+  * snd_hda_codec_amp_read - Read AMP value
+  * @codec: HD-audio codec
+@@ -2917,9 +2927,9 @@ int snd_hda_add_vmaster_hook(struct hda_codec *codec,
+ 
+       if (!hook->hook || !hook->sw_kctl)
+               return 0;
+-      snd_ctl_add_vmaster_hook(hook->sw_kctl, hook->hook, codec);
+       hook->codec = codec;
+       hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
++      snd_ctl_add_vmaster_hook(hook->sw_kctl, vmaster_hook, hook);
+       if (!expose_enum_ctl)
+               return 0;
+       kctl = snd_ctl_new1(&vmaster_mute_mode, hook);
+@@ -2942,14 +2952,7 @@ void snd_hda_sync_vmaster_hook(struct 
hda_vmaster_mute_hook *hook)
+        */
+       if (hook->codec->bus->shutdown)
+               return;
+-      switch (hook->mute_mode) {
+-      case HDA_VMUTE_FOLLOW_MASTER:
+-              snd_ctl_sync_vmaster_hook(hook->sw_kctl);
+-              break;
+-      default:
+-              hook->hook(hook->codec, hook->mute_mode);
+-              break;
+-      }
++      snd_ctl_sync_vmaster_hook(hook->sw_kctl);
+ }
+ EXPORT_SYMBOL_GPL(snd_hda_sync_vmaster_hook);
+ 
+diff --git a/sound/pci/hda/thinkpad_helper.c b/sound/pci/hda/thinkpad_helper.c
+index 8fe3b8c18ed4..1eafc1a28193 100644
+--- a/sound/pci/hda/thinkpad_helper.c
++++ b/sound/pci/hda/thinkpad_helper.c
+@@ -71,6 +71,7 @@ static void hda_fixup_thinkpad_acpi(struct hda_codec *codec,
+               if (led_set_func(TPACPI_LED_MUTE, false) >= 0) {
+                       old_vmaster_hook = spec->vmaster_mute.hook;
+                       spec->vmaster_mute.hook = update_tpacpi_mute_led;
++                      spec->vmaster_mute_enum = 1;
+                       removefunc = false;
+               }
+               if (led_set_func(TPACPI_LED_MICMUTE, false) >= 0) {
+diff --git a/sound/synth/emux/emux_oss.c b/sound/synth/emux/emux_oss.c
+index 319754cf6208..daf61abc3670 100644
+--- a/sound/synth/emux/emux_oss.c
++++ b/sound/synth/emux/emux_oss.c
+@@ -118,12 +118,8 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void 
*closure)
+       if (snd_BUG_ON(!arg || !emu))
+               return -ENXIO;
+ 
+-      mutex_lock(&emu->register_mutex);
+-
+-      if (!snd_emux_inc_count(emu)) {
+-              mutex_unlock(&emu->register_mutex);
++      if (!snd_emux_inc_count(emu))
+               return -EFAULT;
+-      }
+ 
+       memset(&callback, 0, sizeof(callback));
+       callback.owner = THIS_MODULE;
+@@ -135,7 +131,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void 
*closure)
+       if (p == NULL) {
+               snd_printk(KERN_ERR "can't create port\n");
+               snd_emux_dec_count(emu);
+-              mutex_unlock(&emu->register_mutex);
+               return -ENOMEM;
+       }
+ 
+@@ -148,8 +143,6 @@ snd_emux_open_seq_oss(struct snd_seq_oss_arg *arg, void 
*closure)
+       reset_port_mode(p, arg->seq_mode);
+ 
+       snd_emux_reset_port(p);
+-
+-      mutex_unlock(&emu->register_mutex);
+       return 0;
+ }
+ 
+@@ -195,13 +188,11 @@ snd_emux_close_seq_oss(struct snd_seq_oss_arg *arg)
+       if (snd_BUG_ON(!emu))
+               return -ENXIO;
+ 
+-      mutex_lock(&emu->register_mutex);
+       snd_emux_sounds_off_all(p);
+       snd_soundfont_close_check(emu->sflist, SF_CLIENT_NO(p->chset.port));
+       snd_seq_event_port_detach(p->chset.client, p->chset.port);
+       snd_emux_dec_count(emu);
+ 
+-      mutex_unlock(&emu->register_mutex);
+       return 0;
+ }
+ 
+diff --git a/sound/synth/emux/emux_seq.c b/sound/synth/emux/emux_seq.c
+index 7778b8e19782..a0209204ae48 100644
+--- a/sound/synth/emux/emux_seq.c
++++ b/sound/synth/emux/emux_seq.c
+@@ -124,12 +124,10 @@ snd_emux_detach_seq(struct snd_emux *emu)
+       if (emu->voices)
+               snd_emux_terminate_all(emu);
+               
+-      mutex_lock(&emu->register_mutex);
+       if (emu->client >= 0) {
+               snd_seq_delete_kernel_client(emu->client);
+               emu->client = -1;
+       }
+-      mutex_unlock(&emu->register_mutex);
+ }
+ 
+ 
+@@ -269,8 +267,8 @@ snd_emux_event_input(struct snd_seq_event *ev, int direct, 
void *private_data,
+ /*
+  * increment usage count
+  */
+-int
+-snd_emux_inc_count(struct snd_emux *emu)
++static int
++__snd_emux_inc_count(struct snd_emux *emu)
+ {
+       emu->used++;
+       if (!try_module_get(emu->ops.owner))
+@@ -284,12 +282,21 @@ snd_emux_inc_count(struct snd_emux *emu)
+       return 1;
+ }
+ 
++int snd_emux_inc_count(struct snd_emux *emu)
++{
++      int ret;
++
++      mutex_lock(&emu->register_mutex);
++      ret = __snd_emux_inc_count(emu);
++      mutex_unlock(&emu->register_mutex);
++      return ret;
++}
+ 
+ /*
+  * decrease usage count
+  */
+-void
+-snd_emux_dec_count(struct snd_emux *emu)
++static void
++__snd_emux_dec_count(struct snd_emux *emu)
+ {
+       module_put(emu->card->module);
+       emu->used--;
+@@ -298,6 +305,12 @@ snd_emux_dec_count(struct snd_emux *emu)
+       module_put(emu->ops.owner);
+ }
+ 
++void snd_emux_dec_count(struct snd_emux *emu)
++{
++      mutex_lock(&emu->register_mutex);
++      __snd_emux_dec_count(emu);
++      mutex_unlock(&emu->register_mutex);
++}
+ 
+ /*
+  * Routine that is called upon a first use of a particular port
+@@ -317,7 +330,7 @@ snd_emux_use(void *private_data, struct 
snd_seq_port_subscribe *info)
+ 
+       mutex_lock(&emu->register_mutex);
+       snd_emux_init_port(p);
+-      snd_emux_inc_count(emu);
++      __snd_emux_inc_count(emu);
+       mutex_unlock(&emu->register_mutex);
+       return 0;
+ }
+@@ -340,7 +353,7 @@ snd_emux_unuse(void *private_data, struct 
snd_seq_port_subscribe *info)
+ 
+       mutex_lock(&emu->register_mutex);
+       snd_emux_sounds_off_all(p);
+-      snd_emux_dec_count(emu);
++      __snd_emux_dec_count(emu);
+       mutex_unlock(&emu->register_mutex);
+       return 0;
+ }

Reply via email to