mirror of
https://github.com/adulau/aha.git
synced 2024-12-29 12:16:20 +00:00
[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: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
bbf25010f1
commit
6c08772e49
1 changed files with 18 additions and 9 deletions
|
@ -69,10 +69,11 @@
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <scsi/scsi_host.h>
|
#include <scsi/scsi_host.h>
|
||||||
#include <scsi/scsi_cmnd.h>
|
#include <scsi/scsi_cmnd.h>
|
||||||
|
#include <scsi/scsi_device.h>
|
||||||
#include <linux/libata.h>
|
#include <linux/libata.h>
|
||||||
|
|
||||||
#define DRV_NAME "sata_mv"
|
#define DRV_NAME "sata_mv"
|
||||||
#define DRV_VERSION "1.0"
|
#define DRV_VERSION "1.01"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
/* BAR's are enumerated in terms of pci_resource_start() terms */
|
/* 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_post_int_cmd(struct ata_queued_cmd *qc);
|
||||||
static void mv_eh_freeze(struct ata_port *ap);
|
static void mv_eh_freeze(struct ata_port *ap);
|
||||||
static void mv_eh_thaw(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 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,
|
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,
|
.use_clustering = 1,
|
||||||
.proc_name = DRV_NAME,
|
.proc_name = DRV_NAME,
|
||||||
.dma_boundary = MV_DMA_BOUNDARY,
|
.dma_boundary = MV_DMA_BOUNDARY,
|
||||||
.slave_configure = ata_scsi_slave_config,
|
.slave_configure = mv_slave_config,
|
||||||
.slave_destroy = ata_scsi_slave_destroy,
|
.slave_destroy = ata_scsi_slave_destroy,
|
||||||
.bios_param = ata_std_bios_param,
|
.bios_param = ata_std_bios_param,
|
||||||
};
|
};
|
||||||
|
@ -475,7 +477,7 @@ static struct scsi_host_template mv6_sht = {
|
||||||
.use_clustering = 1,
|
.use_clustering = 1,
|
||||||
.proc_name = DRV_NAME,
|
.proc_name = DRV_NAME,
|
||||||
.dma_boundary = MV_DMA_BOUNDARY,
|
.dma_boundary = MV_DMA_BOUNDARY,
|
||||||
.slave_configure = ata_scsi_slave_config,
|
.slave_configure = mv_slave_config,
|
||||||
.slave_destroy = ata_scsi_slave_destroy,
|
.slave_destroy = ata_scsi_slave_destroy,
|
||||||
.bios_param = ata_std_bios_param,
|
.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,
|
static void mv_set_edma_ptrs(void __iomem *port_mmio,
|
||||||
struct mv_host_priv *hpriv,
|
struct mv_host_priv *hpriv,
|
||||||
struct mv_port_priv *pp)
|
struct mv_port_priv *pp)
|
||||||
|
@ -1130,10 +1143,9 @@ static void mv_port_stop(struct ata_port *ap)
|
||||||
* LOCKING:
|
* LOCKING:
|
||||||
* Inherited from caller.
|
* 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;
|
struct mv_port_priv *pp = qc->ap->private_data;
|
||||||
unsigned int n_sg = 0;
|
|
||||||
struct scatterlist *sg;
|
struct scatterlist *sg;
|
||||||
struct mv_sg *mv_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 = cpu_to_le32(addr & 0xffffffff);
|
||||||
mv_sg->addr_hi = cpu_to_le32((addr >> 16) >> 16);
|
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;
|
sg_len -= len;
|
||||||
addr += 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->flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL);
|
||||||
|
|
||||||
mv_sg++;
|
mv_sg++;
|
||||||
n_sg++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return n_sg;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void mv_crqb_pack_cmd(__le16 *cmdw, u8 data, u8 addr, unsigned last)
|
static inline void mv_crqb_pack_cmd(__le16 *cmdw, u8 data, u8 addr, unsigned last)
|
||||||
|
|
Loading…
Reference in a new issue