Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c08772e authored by Jeff Garzik's avatar Jeff Garzik
Browse files

[libata] sata_mv: more S/G fixes



* 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: default avatarJeff Garzik <jgarzik@redhat.com>
parent bbf25010
Loading
Loading
Loading
Loading
+18 −9
Original line number Diff line number Diff line
@@ -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)