]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
linux 2.6.23.1 v2.6.23.1
authorGreg Kroah-Hartman <gregkh@suse.de>
Fri, 12 Oct 2007 17:16:02 +0000 (10:16 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 12 Oct 2007 17:16:02 +0000 (10:16 -0700)
releases/2.6.23.1/libata-sata_mv-more-s-g-fixes.patch [new file with mode: 0644]

diff --git a/releases/2.6.23.1/libata-sata_mv-more-s-g-fixes.patch b/releases/2.6.23.1/libata-sata_mv-more-s-g-fixes.patch
new file mode 100644 (file)
index 0000000..9ab1308
--- /dev/null
@@ -0,0 +1,110 @@
+From 6c08772e49622e90d39903e7ff0be1a0f463ac86 Mon Sep 17 00:00:00 2001
+From: Jeff Garzik <jeff@garzik.org>
+Date: Fri, 12 Oct 2007 00:16:23 -0400
+Subject: libata: sata_mv: more S/G fixes
+
+commit 6c08772e49622e90d39903e7ff0be1a0f463ac86 in mainline.
+
+* corruption fix: we only want the lower 16 bits of length (0 == 64kb)
+
+* ditto: the upper layer sets max-phys-segments to LIBATA_MAX_PRD,
+  so we must reset it to own hw-specific length.
+
+* delete unused mv_fill_sg() return value
+
+Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+--- a/drivers/ata/sata_mv.c
++++ b/drivers/ata/sata_mv.c
+@@ -69,10 +69,11 @@
+ #include <linux/device.h>
+ #include <scsi/scsi_host.h>
+ #include <scsi/scsi_cmnd.h>
++#include <scsi/scsi_device.h>
+ #include <linux/libata.h>
+ #define DRV_NAME      "sata_mv"
+-#define DRV_VERSION   "1.0"
++#define DRV_VERSION   "1.01"
+ enum {
+       /* BAR's are enumerated in terms of pci_resource_start() terms */
+@@ -420,6 +421,7 @@ static void mv_error_handler(struct ata_port *ap);
+ static void mv_post_int_cmd(struct ata_queued_cmd *qc);
+ static void mv_eh_freeze(struct ata_port *ap);
+ static void mv_eh_thaw(struct ata_port *ap);
++static int mv_slave_config(struct scsi_device *sdev);
+ static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
+ static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio,
+@@ -457,7 +459,7 @@ static struct scsi_host_template mv5_sht = {
+       .use_clustering         = 1,
+       .proc_name              = DRV_NAME,
+       .dma_boundary           = MV_DMA_BOUNDARY,
+-      .slave_configure        = ata_scsi_slave_config,
++      .slave_configure        = mv_slave_config,
+       .slave_destroy          = ata_scsi_slave_destroy,
+       .bios_param             = ata_std_bios_param,
+ };
+@@ -475,7 +477,7 @@ static struct scsi_host_template mv6_sht = {
+       .use_clustering         = 1,
+       .proc_name              = DRV_NAME,
+       .dma_boundary           = MV_DMA_BOUNDARY,
+-      .slave_configure        = ata_scsi_slave_config,
++      .slave_configure        = mv_slave_config,
+       .slave_destroy          = ata_scsi_slave_destroy,
+       .bios_param             = ata_std_bios_param,
+ };
+@@ -763,6 +765,17 @@ static void mv_irq_clear(struct ata_port *ap)
+ {
+ }
++static int mv_slave_config(struct scsi_device *sdev)
++{
++      int rc = ata_scsi_slave_config(sdev);
++      if (rc)
++              return rc;
++
++      blk_queue_max_phys_segments(sdev->request_queue, MV_MAX_SG_CT / 2);
++
++      return 0;       /* scsi layer doesn't check return value, sigh */
++}
++
+ static void mv_set_edma_ptrs(void __iomem *port_mmio,
+                            struct mv_host_priv *hpriv,
+                            struct mv_port_priv *pp)
+@@ -1130,10 +1143,9 @@ static void mv_port_stop(struct ata_port *ap)
+  *      LOCKING:
+  *      Inherited from caller.
+  */
+-static unsigned int mv_fill_sg(struct ata_queued_cmd *qc)
++static void mv_fill_sg(struct ata_queued_cmd *qc)
+ {
+       struct mv_port_priv *pp = qc->ap->private_data;
+-      unsigned int n_sg = 0;
+       struct scatterlist *sg;
+       struct mv_sg *mv_sg;
+@@ -1151,7 +1163,7 @@ static unsigned int mv_fill_sg(struct ata_queued_cmd *qc)
+                       mv_sg->addr = cpu_to_le32(addr & 0xffffffff);
+                       mv_sg->addr_hi = cpu_to_le32((addr >> 16) >> 16);
+-                      mv_sg->flags_size = cpu_to_le32(len);
++                      mv_sg->flags_size = cpu_to_le32(len & 0xffff);
+                       sg_len -= len;
+                       addr += len;
+@@ -1160,12 +1172,9 @@ static unsigned int mv_fill_sg(struct ata_queued_cmd *qc)
+                               mv_sg->flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL);
+                       mv_sg++;
+-                      n_sg++;
+               }
+       }
+-
+-      return n_sg;
+ }
+ static inline void mv_crqb_pack_cmd(__le16 *cmdw, u8 data, u8 addr, unsigned last)