diff options
| -rw-r--r-- | drivers/ata/sata_mv.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index cb7dec97fee6..d9832e234e44 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
| @@ -69,10 +69,11 @@ | |||
| 69 | #include <linux/device.h> | 69 | #include <linux/device.h> |
| 70 | #include <scsi/scsi_host.h> | 70 | #include <scsi/scsi_host.h> |
| 71 | #include <scsi/scsi_cmnd.h> | 71 | #include <scsi/scsi_cmnd.h> |
| 72 | #include <scsi/scsi_device.h> | ||
| 72 | #include <linux/libata.h> | 73 | #include <linux/libata.h> |
| 73 | 74 | ||
| 74 | #define DRV_NAME "sata_mv" | 75 | #define DRV_NAME "sata_mv" |
| 75 | #define DRV_VERSION "1.0" | 76 | #define DRV_VERSION "1.01" |
| 76 | 77 | ||
| 77 | enum { | 78 | enum { |
| 78 | /* BAR's are enumerated in terms of pci_resource_start() terms */ | 79 | /* BAR's are enumerated in terms of pci_resource_start() terms */ |
| @@ -420,6 +421,7 @@ static void mv_error_handler(struct ata_port *ap); | |||
| 420 | static void mv_post_int_cmd(struct ata_queued_cmd *qc); | 421 | static void mv_post_int_cmd(struct ata_queued_cmd *qc); |
| 421 | static void mv_eh_freeze(struct ata_port *ap); | 422 | static void mv_eh_freeze(struct ata_port *ap); |
| 422 | static void mv_eh_thaw(struct ata_port *ap); | 423 | static void mv_eh_thaw(struct ata_port *ap); |
| 424 | static int mv_slave_config(struct scsi_device *sdev); | ||
| 423 | static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); | 425 | static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent); |
| 424 | 426 | ||
| 425 | static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | 427 | static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, |
| @@ -457,7 +459,7 @@ static struct scsi_host_template mv5_sht = { | |||
| 457 | .use_clustering = 1, | 459 | .use_clustering = 1, |
| 458 | .proc_name = DRV_NAME, | 460 | .proc_name = DRV_NAME, |
| 459 | .dma_boundary = MV_DMA_BOUNDARY, | 461 | .dma_boundary = MV_DMA_BOUNDARY, |
| 460 | .slave_configure = ata_scsi_slave_config, | 462 | .slave_configure = mv_slave_config, |
| 461 | .slave_destroy = ata_scsi_slave_destroy, | 463 | .slave_destroy = ata_scsi_slave_destroy, |
| 462 | .bios_param = ata_std_bios_param, | 464 | .bios_param = ata_std_bios_param, |
| 463 | }; | 465 | }; |
| @@ -475,7 +477,7 @@ static struct scsi_host_template mv6_sht = { | |||
| 475 | .use_clustering = 1, | 477 | .use_clustering = 1, |
| 476 | .proc_name = DRV_NAME, | 478 | .proc_name = DRV_NAME, |
| 477 | .dma_boundary = MV_DMA_BOUNDARY, | 479 | .dma_boundary = MV_DMA_BOUNDARY, |
| 478 | .slave_configure = ata_scsi_slave_config, | 480 | .slave_configure = mv_slave_config, |
| 479 | .slave_destroy = ata_scsi_slave_destroy, | 481 | .slave_destroy = ata_scsi_slave_destroy, |
| 480 | .bios_param = ata_std_bios_param, | 482 | .bios_param = ata_std_bios_param, |
| 481 | }; | 483 | }; |
| @@ -763,6 +765,17 @@ static void mv_irq_clear(struct ata_port *ap) | |||
| 763 | { | 765 | { |
| 764 | } | 766 | } |
| 765 | 767 | ||
| 768 | static int mv_slave_config(struct scsi_device *sdev) | ||
| 769 | { | ||
| 770 | int rc = ata_scsi_slave_config(sdev); | ||
| 771 | if (rc) | ||
| 772 | return rc; | ||
| 773 | |||
| 774 | blk_queue_max_phys_segments(sdev->request_queue, MV_MAX_SG_CT / 2); | ||
| 775 | |||
| 776 | return 0; /* scsi layer doesn't check return value, sigh */ | ||
| 777 | } | ||
| 778 | |||
| 766 | static void mv_set_edma_ptrs(void __iomem *port_mmio, | 779 | static void mv_set_edma_ptrs(void __iomem *port_mmio, |
| 767 | struct mv_host_priv *hpriv, | 780 | struct mv_host_priv *hpriv, |
| 768 | struct mv_port_priv *pp) | 781 | struct mv_port_priv *pp) |
| @@ -1130,10 +1143,9 @@ static void mv_port_stop(struct ata_port *ap) | |||
| 1130 | * LOCKING: | 1143 | * LOCKING: |
| 1131 | * Inherited from caller. | 1144 | * Inherited from caller. |
| 1132 | */ | 1145 | */ |
| 1133 | static unsigned int mv_fill_sg(struct ata_queued_cmd *qc) | 1146 | static void mv_fill_sg(struct ata_queued_cmd *qc) |
| 1134 | { | 1147 | { |
| 1135 | struct mv_port_priv *pp = qc->ap->private_data; | 1148 | struct mv_port_priv *pp = qc->ap->private_data; |
| 1136 | unsigned int n_sg = 0; | ||
| 1137 | struct scatterlist *sg; | 1149 | struct scatterlist *sg; |
| 1138 | struct mv_sg *mv_sg; | 1150 | struct mv_sg *mv_sg; |
| 1139 | 1151 | ||
| @@ -1151,7 +1163,7 @@ static unsigned int mv_fill_sg(struct ata_queued_cmd *qc) | |||
| 1151 | 1163 | ||
| 1152 | mv_sg->addr = cpu_to_le32(addr & 0xffffffff); | 1164 | mv_sg->addr = cpu_to_le32(addr & 0xffffffff); |
| 1153 | mv_sg->addr_hi = cpu_to_le32((addr >> 16) >> 16); | 1165 | mv_sg->addr_hi = cpu_to_le32((addr >> 16) >> 16); |
| 1154 | mv_sg->flags_size = cpu_to_le32(len); | 1166 | mv_sg->flags_size = cpu_to_le32(len & 0xffff); |
| 1155 | 1167 | ||
| 1156 | sg_len -= len; | 1168 | sg_len -= len; |
| 1157 | addr += len; | 1169 | addr += len; |
| @@ -1160,12 +1172,9 @@ static unsigned int mv_fill_sg(struct ata_queued_cmd *qc) | |||
| 1160 | mv_sg->flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL); | 1172 | mv_sg->flags_size |= cpu_to_le32(EPRD_FLAG_END_OF_TBL); |
| 1161 | 1173 | ||
| 1162 | mv_sg++; | 1174 | mv_sg++; |
| 1163 | n_sg++; | ||
| 1164 | } | 1175 | } |
| 1165 | 1176 | ||
| 1166 | } | 1177 | } |
| 1167 | |||
| 1168 | return n_sg; | ||
| 1169 | } | 1178 | } |
| 1170 | 1179 | ||
| 1171 | static inline void mv_crqb_pack_cmd(__le16 *cmdw, u8 data, u8 addr, unsigned last) | 1180 | static inline void mv_crqb_pack_cmd(__le16 *cmdw, u8 data, u8 addr, unsigned last) |
