diff options
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/ahci.c | 23 | ||||
-rw-r--r-- | drivers/ata/libata-core.c | 15 | ||||
-rw-r--r-- | drivers/ata/libata-pmp.c | 4 | ||||
-rw-r--r-- | drivers/ata/libata-scsi.c | 13 | ||||
-rw-r--r-- | drivers/ata/libata.h | 1 | ||||
-rw-r--r-- | drivers/ata/pata_atiixp.c | 4 | ||||
-rw-r--r-- | drivers/ata/sata_fsl.c | 8 | ||||
-rw-r--r-- | drivers/ata/sata_svw.c | 77 |
8 files changed, 112 insertions, 33 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 6dd12f7019a0..1db93b619074 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -85,6 +85,7 @@ enum { | |||
85 | board_ahci_ign_iferr = 2, | 85 | board_ahci_ign_iferr = 2, |
86 | board_ahci_sb600 = 3, | 86 | board_ahci_sb600 = 3, |
87 | board_ahci_mv = 4, | 87 | board_ahci_mv = 4, |
88 | board_ahci_sb700 = 5, | ||
88 | 89 | ||
89 | /* global controller registers */ | 90 | /* global controller registers */ |
90 | HOST_CAP = 0x00, /* host capabilities */ | 91 | HOST_CAP = 0x00, /* host capabilities */ |
@@ -442,6 +443,16 @@ static const struct ata_port_info ahci_port_info[] = { | |||
442 | .udma_mask = ATA_UDMA6, | 443 | .udma_mask = ATA_UDMA6, |
443 | .port_ops = &ahci_ops, | 444 | .port_ops = &ahci_ops, |
444 | }, | 445 | }, |
446 | /* board_ahci_sb700 */ | ||
447 | { | ||
448 | AHCI_HFLAGS (AHCI_HFLAG_IGN_SERR_INTERNAL | | ||
449 | AHCI_HFLAG_NO_PMP), | ||
450 | .flags = AHCI_FLAG_COMMON, | ||
451 | .link_flags = AHCI_LFLAG_COMMON, | ||
452 | .pio_mask = 0x1f, /* pio0-4 */ | ||
453 | .udma_mask = ATA_UDMA6, | ||
454 | .port_ops = &ahci_ops, | ||
455 | }, | ||
445 | }; | 456 | }; |
446 | 457 | ||
447 | static const struct pci_device_id ahci_pci_tbl[] = { | 458 | static const struct pci_device_id ahci_pci_tbl[] = { |
@@ -484,12 +495,12 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
484 | 495 | ||
485 | /* ATI */ | 496 | /* ATI */ |
486 | { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */ | 497 | { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */ |
487 | { PCI_VDEVICE(ATI, 0x4390), board_ahci_sb600 }, /* ATI SB700/800 */ | 498 | { PCI_VDEVICE(ATI, 0x4390), board_ahci_sb700 }, /* ATI SB700/800 */ |
488 | { PCI_VDEVICE(ATI, 0x4391), board_ahci_sb600 }, /* ATI SB700/800 */ | 499 | { PCI_VDEVICE(ATI, 0x4391), board_ahci_sb700 }, /* ATI SB700/800 */ |
489 | { PCI_VDEVICE(ATI, 0x4392), board_ahci_sb600 }, /* ATI SB700/800 */ | 500 | { PCI_VDEVICE(ATI, 0x4392), board_ahci_sb700 }, /* ATI SB700/800 */ |
490 | { PCI_VDEVICE(ATI, 0x4393), board_ahci_sb600 }, /* ATI SB700/800 */ | 501 | { PCI_VDEVICE(ATI, 0x4393), board_ahci_sb700 }, /* ATI SB700/800 */ |
491 | { PCI_VDEVICE(ATI, 0x4394), board_ahci_sb600 }, /* ATI SB700/800 */ | 502 | { PCI_VDEVICE(ATI, 0x4394), board_ahci_sb700 }, /* ATI SB700/800 */ |
492 | { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb600 }, /* ATI SB700/800 */ | 503 | { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb700 }, /* ATI SB700/800 */ |
493 | 504 | ||
494 | /* VIA */ | 505 | /* VIA */ |
495 | { PCI_VDEVICE(VIA, 0x3349), board_ahci_vt8251 }, /* VIA VT8251 */ | 506 | { PCI_VDEVICE(VIA, 0x3349), board_ahci_vt8251 }, /* VIA VT8251 */ |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 4cf8662df99e..4fbcce758b04 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -113,7 +113,7 @@ int atapi_enabled = 1; | |||
113 | module_param(atapi_enabled, int, 0444); | 113 | module_param(atapi_enabled, int, 0444); |
114 | MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)"); | 114 | MODULE_PARM_DESC(atapi_enabled, "Enable discovery of ATAPI devices (0=off, 1=on)"); |
115 | 115 | ||
116 | int atapi_dmadir = 0; | 116 | static int atapi_dmadir = 0; |
117 | module_param(atapi_dmadir, int, 0444); | 117 | module_param(atapi_dmadir, int, 0444); |
118 | MODULE_PARM_DESC(atapi_dmadir, "Enable ATAPI DMADIR bridge support (0=off, 1=on)"); | 118 | MODULE_PARM_DESC(atapi_dmadir, "Enable ATAPI DMADIR bridge support (0=off, 1=on)"); |
119 | 119 | ||
@@ -153,7 +153,7 @@ MODULE_VERSION(DRV_VERSION); | |||
153 | 153 | ||
154 | /** | 154 | /** |
155 | * ata_force_cbl - force cable type according to libata.force | 155 | * ata_force_cbl - force cable type according to libata.force |
156 | * @link: ATA link of interest | 156 | * @ap: ATA port of interest |
157 | * | 157 | * |
158 | * Force cable type according to libata.force and whine about it. | 158 | * Force cable type according to libata.force and whine about it. |
159 | * The last entry which has matching port number is used, so it | 159 | * The last entry which has matching port number is used, so it |
@@ -2396,6 +2396,7 @@ int ata_dev_configure(struct ata_device *dev) | |||
2396 | else if (dev->class == ATA_DEV_ATAPI) { | 2396 | else if (dev->class == ATA_DEV_ATAPI) { |
2397 | const char *cdb_intr_string = ""; | 2397 | const char *cdb_intr_string = ""; |
2398 | const char *atapi_an_string = ""; | 2398 | const char *atapi_an_string = ""; |
2399 | const char *dma_dir_string = ""; | ||
2399 | u32 sntf; | 2400 | u32 sntf; |
2400 | 2401 | ||
2401 | rc = atapi_cdb_len(id); | 2402 | rc = atapi_cdb_len(id); |
@@ -2436,13 +2437,19 @@ int ata_dev_configure(struct ata_device *dev) | |||
2436 | cdb_intr_string = ", CDB intr"; | 2437 | cdb_intr_string = ", CDB intr"; |
2437 | } | 2438 | } |
2438 | 2439 | ||
2440 | if (atapi_dmadir || atapi_id_dmadir(dev->id)) { | ||
2441 | dev->flags |= ATA_DFLAG_DMADIR; | ||
2442 | dma_dir_string = ", DMADIR"; | ||
2443 | } | ||
2444 | |||
2439 | /* print device info to dmesg */ | 2445 | /* print device info to dmesg */ |
2440 | if (ata_msg_drv(ap) && print_info) | 2446 | if (ata_msg_drv(ap) && print_info) |
2441 | ata_dev_printk(dev, KERN_INFO, | 2447 | ata_dev_printk(dev, KERN_INFO, |
2442 | "ATAPI: %s, %s, max %s%s%s\n", | 2448 | "ATAPI: %s, %s, max %s%s%s%s\n", |
2443 | modelbuf, fwrevbuf, | 2449 | modelbuf, fwrevbuf, |
2444 | ata_mode_string(xfer_mask), | 2450 | ata_mode_string(xfer_mask), |
2445 | cdb_intr_string, atapi_an_string); | 2451 | cdb_intr_string, atapi_an_string, |
2452 | dma_dir_string); | ||
2446 | } | 2453 | } |
2447 | 2454 | ||
2448 | /* determine max_sectors */ | 2455 | /* determine max_sectors */ |
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index caef2bbd4a8a..d91f5090ba9d 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
@@ -35,7 +35,7 @@ static unsigned int sata_pmp_read(struct ata_link *link, int reg, u32 *r_val) | |||
35 | ata_tf_init(pmp_dev, &tf); | 35 | ata_tf_init(pmp_dev, &tf); |
36 | tf.command = ATA_CMD_PMP_READ; | 36 | tf.command = ATA_CMD_PMP_READ; |
37 | tf.protocol = ATA_PROT_NODATA; | 37 | tf.protocol = ATA_PROT_NODATA; |
38 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 38 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48; |
39 | tf.feature = reg; | 39 | tf.feature = reg; |
40 | tf.device = link->pmp; | 40 | tf.device = link->pmp; |
41 | 41 | ||
@@ -71,7 +71,7 @@ static unsigned int sata_pmp_write(struct ata_link *link, int reg, u32 val) | |||
71 | ata_tf_init(pmp_dev, &tf); | 71 | ata_tf_init(pmp_dev, &tf); |
72 | tf.command = ATA_CMD_PMP_WRITE; | 72 | tf.command = ATA_CMD_PMP_WRITE; |
73 | tf.protocol = ATA_PROT_NODATA; | 73 | tf.protocol = ATA_PROT_NODATA; |
74 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE; | 74 | tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48; |
75 | tf.feature = reg; | 75 | tf.feature = reg; |
76 | tf.device = link->pmp; | 76 | tf.device = link->pmp; |
77 | tf.nsect = val & 0xff; | 77 | tf.nsect = val & 0xff; |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index f888babc8283..7b1f1ee8131d 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -1694,12 +1694,17 @@ void ata_scsi_rbuf_fill(struct ata_scsi_args *args, | |||
1694 | u8 *rbuf; | 1694 | u8 *rbuf; |
1695 | unsigned int buflen, rc; | 1695 | unsigned int buflen, rc; |
1696 | struct scsi_cmnd *cmd = args->cmd; | 1696 | struct scsi_cmnd *cmd = args->cmd; |
1697 | unsigned long flags; | ||
1698 | |||
1699 | local_irq_save(flags); | ||
1697 | 1700 | ||
1698 | buflen = ata_scsi_rbuf_get(cmd, &rbuf); | 1701 | buflen = ata_scsi_rbuf_get(cmd, &rbuf); |
1699 | memset(rbuf, 0, buflen); | 1702 | memset(rbuf, 0, buflen); |
1700 | rc = actor(args, rbuf, buflen); | 1703 | rc = actor(args, rbuf, buflen); |
1701 | ata_scsi_rbuf_put(cmd, rbuf); | 1704 | ata_scsi_rbuf_put(cmd, rbuf); |
1702 | 1705 | ||
1706 | local_irq_restore(flags); | ||
1707 | |||
1703 | if (rc == 0) | 1708 | if (rc == 0) |
1704 | cmd->result = SAM_STAT_GOOD; | 1709 | cmd->result = SAM_STAT_GOOD; |
1705 | args->done(cmd); | 1710 | args->done(cmd); |
@@ -2473,6 +2478,9 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc) | |||
2473 | if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) { | 2478 | if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) { |
2474 | u8 *buf = NULL; | 2479 | u8 *buf = NULL; |
2475 | unsigned int buflen; | 2480 | unsigned int buflen; |
2481 | unsigned long flags; | ||
2482 | |||
2483 | local_irq_save(flags); | ||
2476 | 2484 | ||
2477 | buflen = ata_scsi_rbuf_get(cmd, &buf); | 2485 | buflen = ata_scsi_rbuf_get(cmd, &buf); |
2478 | 2486 | ||
@@ -2490,6 +2498,8 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc) | |||
2490 | } | 2498 | } |
2491 | 2499 | ||
2492 | ata_scsi_rbuf_put(cmd, buf); | 2500 | ata_scsi_rbuf_put(cmd, buf); |
2501 | |||
2502 | local_irq_restore(flags); | ||
2493 | } | 2503 | } |
2494 | 2504 | ||
2495 | cmd->result = SAM_STAT_GOOD; | 2505 | cmd->result = SAM_STAT_GOOD; |
@@ -2582,7 +2592,8 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
2582 | qc->tf.protocol = ATAPI_PROT_DMA; | 2592 | qc->tf.protocol = ATAPI_PROT_DMA; |
2583 | qc->tf.feature |= ATAPI_PKT_DMA; | 2593 | qc->tf.feature |= ATAPI_PKT_DMA; |
2584 | 2594 | ||
2585 | if (atapi_dmadir && (scmd->sc_data_direction != DMA_TO_DEVICE)) | 2595 | if ((dev->flags & ATA_DFLAG_DMADIR) && |
2596 | (scmd->sc_data_direction != DMA_TO_DEVICE)) | ||
2586 | /* some SATA bridges need us to indicate data xfer direction */ | 2597 | /* some SATA bridges need us to indicate data xfer direction */ |
2587 | qc->tf.feature |= ATAPI_DMADIR; | 2598 | qc->tf.feature |= ATAPI_DMADIR; |
2588 | } | 2599 | } |
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index 6036dedfe377..aa884f71a12a 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
@@ -56,7 +56,6 @@ enum { | |||
56 | extern unsigned int ata_print_id; | 56 | extern unsigned int ata_print_id; |
57 | extern struct workqueue_struct *ata_aux_wq; | 57 | extern struct workqueue_struct *ata_aux_wq; |
58 | extern int atapi_enabled; | 58 | extern int atapi_enabled; |
59 | extern int atapi_dmadir; | ||
60 | extern int atapi_passthru16; | 59 | extern int atapi_passthru16; |
61 | extern int libata_fua; | 60 | extern int libata_fua; |
62 | extern int libata_noacpi; | 61 | extern int libata_noacpi; |
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index 9623f5295530..408bdc1a9776 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
@@ -227,7 +227,7 @@ static struct scsi_host_template atiixp_sht = { | |||
227 | .queuecommand = ata_scsi_queuecmd, | 227 | .queuecommand = ata_scsi_queuecmd, |
228 | .can_queue = ATA_DEF_QUEUE, | 228 | .can_queue = ATA_DEF_QUEUE, |
229 | .this_id = ATA_SHT_THIS_ID, | 229 | .this_id = ATA_SHT_THIS_ID, |
230 | .sg_tablesize = LIBATA_MAX_PRD, | 230 | .sg_tablesize = LIBATA_DUMB_MAX_PRD, |
231 | .cmd_per_lun = ATA_SHT_CMD_PER_LUN, | 231 | .cmd_per_lun = ATA_SHT_CMD_PER_LUN, |
232 | .emulated = ATA_SHT_EMULATED, | 232 | .emulated = ATA_SHT_EMULATED, |
233 | .use_clustering = ATA_SHT_USE_CLUSTERING, | 233 | .use_clustering = ATA_SHT_USE_CLUSTERING, |
@@ -259,7 +259,7 @@ static struct ata_port_operations atiixp_port_ops = { | |||
259 | .bmdma_stop = atiixp_bmdma_stop, | 259 | .bmdma_stop = atiixp_bmdma_stop, |
260 | .bmdma_status = ata_bmdma_status, | 260 | .bmdma_status = ata_bmdma_status, |
261 | 261 | ||
262 | .qc_prep = ata_qc_prep, | 262 | .qc_prep = ata_dumb_qc_prep, |
263 | .qc_issue = ata_qc_issue_prot, | 263 | .qc_issue = ata_qc_issue_prot, |
264 | 264 | ||
265 | .data_xfer = ata_data_xfer, | 265 | .data_xfer = ata_data_xfer, |
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index 9323dd0c7d8d..07791a7a48a5 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
@@ -335,7 +335,7 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc, | |||
335 | dma_addr_t indirect_ext_segment_paddr; | 335 | dma_addr_t indirect_ext_segment_paddr; |
336 | unsigned int si; | 336 | unsigned int si; |
337 | 337 | ||
338 | VPRINTK("SATA FSL : cd = 0x%x, prd = 0x%x\n", cmd_desc, prd); | 338 | VPRINTK("SATA FSL : cd = 0x%p, prd = 0x%p\n", cmd_desc, prd); |
339 | 339 | ||
340 | indirect_ext_segment_paddr = cmd_desc_paddr + | 340 | indirect_ext_segment_paddr = cmd_desc_paddr + |
341 | SATA_FSL_CMD_DESC_OFFSET_TO_PRDT + SATA_FSL_MAX_PRD_DIRECT * 16; | 341 | SATA_FSL_CMD_DESC_OFFSET_TO_PRDT + SATA_FSL_MAX_PRD_DIRECT * 16; |
@@ -459,7 +459,8 @@ static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc) | |||
459 | VPRINTK("CE=0x%x, DE=0x%x, CC=0x%x, CmdStat = 0x%x\n", | 459 | VPRINTK("CE=0x%x, DE=0x%x, CC=0x%x, CmdStat = 0x%x\n", |
460 | ioread32(CE + hcr_base), | 460 | ioread32(CE + hcr_base), |
461 | ioread32(DE + hcr_base), | 461 | ioread32(DE + hcr_base), |
462 | ioread32(CC + hcr_base), ioread32(COMMANDSTAT + csr_base)); | 462 | ioread32(CC + hcr_base), |
463 | ioread32(COMMANDSTAT + host_priv->csr_base)); | ||
463 | 464 | ||
464 | return 0; | 465 | return 0; |
465 | } | 466 | } |
@@ -522,7 +523,8 @@ static void sata_fsl_freeze(struct ata_port *ap) | |||
522 | ioread32(CQ + hcr_base), | 523 | ioread32(CQ + hcr_base), |
523 | ioread32(CA + hcr_base), | 524 | ioread32(CA + hcr_base), |
524 | ioread32(CE + hcr_base), ioread32(DE + hcr_base)); | 525 | ioread32(CE + hcr_base), ioread32(DE + hcr_base)); |
525 | VPRINTK("CmdStat = 0x%x\n", ioread32(csr_base + COMMANDSTAT)); | 526 | VPRINTK("CmdStat = 0x%x\n", |
527 | ioread32(host_priv->csr_base + COMMANDSTAT)); | ||
526 | 528 | ||
527 | /* disable interrupts on the controller/port */ | 529 | /* disable interrupts on the controller/port */ |
528 | temp = ioread32(hcr_base + HCONTROL); | 530 | temp = ioread32(hcr_base + HCONTROL); |
diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c index 69f651e0bc98..840d1c4a7850 100644 --- a/drivers/ata/sata_svw.c +++ b/drivers/ata/sata_svw.c | |||
@@ -45,6 +45,8 @@ | |||
45 | #include <linux/interrupt.h> | 45 | #include <linux/interrupt.h> |
46 | #include <linux/device.h> | 46 | #include <linux/device.h> |
47 | #include <scsi/scsi_host.h> | 47 | #include <scsi/scsi_host.h> |
48 | #include <scsi/scsi_cmnd.h> | ||
49 | #include <scsi/scsi.h> | ||
48 | #include <linux/libata.h> | 50 | #include <linux/libata.h> |
49 | 51 | ||
50 | #ifdef CONFIG_PPC_OF | 52 | #ifdef CONFIG_PPC_OF |
@@ -59,6 +61,7 @@ enum { | |||
59 | /* ap->flags bits */ | 61 | /* ap->flags bits */ |
60 | K2_FLAG_SATA_8_PORTS = (1 << 24), | 62 | K2_FLAG_SATA_8_PORTS = (1 << 24), |
61 | K2_FLAG_NO_ATAPI_DMA = (1 << 25), | 63 | K2_FLAG_NO_ATAPI_DMA = (1 << 25), |
64 | K2_FLAG_BAR_POS_3 = (1 << 26), | ||
62 | 65 | ||
63 | /* Taskfile registers offsets */ | 66 | /* Taskfile registers offsets */ |
64 | K2_SATA_TF_CMD_OFFSET = 0x00, | 67 | K2_SATA_TF_CMD_OFFSET = 0x00, |
@@ -88,8 +91,10 @@ enum { | |||
88 | /* Port stride */ | 91 | /* Port stride */ |
89 | K2_SATA_PORT_OFFSET = 0x100, | 92 | K2_SATA_PORT_OFFSET = 0x100, |
90 | 93 | ||
91 | board_svw4 = 0, | 94 | chip_svw4 = 0, |
92 | board_svw8 = 1, | 95 | chip_svw8 = 1, |
96 | chip_svw42 = 2, /* bar 3 */ | ||
97 | chip_svw43 = 3, /* bar 5 */ | ||
93 | }; | 98 | }; |
94 | 99 | ||
95 | static u8 k2_stat_check_status(struct ata_port *ap); | 100 | static u8 k2_stat_check_status(struct ata_port *ap); |
@@ -97,10 +102,25 @@ static u8 k2_stat_check_status(struct ata_port *ap); | |||
97 | 102 | ||
98 | static int k2_sata_check_atapi_dma(struct ata_queued_cmd *qc) | 103 | static int k2_sata_check_atapi_dma(struct ata_queued_cmd *qc) |
99 | { | 104 | { |
105 | u8 cmnd = qc->scsicmd->cmnd[0]; | ||
106 | |||
100 | if (qc->ap->flags & K2_FLAG_NO_ATAPI_DMA) | 107 | if (qc->ap->flags & K2_FLAG_NO_ATAPI_DMA) |
101 | return -1; /* ATAPI DMA not supported */ | 108 | return -1; /* ATAPI DMA not supported */ |
109 | else { | ||
110 | switch (cmnd) { | ||
111 | case READ_10: | ||
112 | case READ_12: | ||
113 | case READ_16: | ||
114 | case WRITE_10: | ||
115 | case WRITE_12: | ||
116 | case WRITE_16: | ||
117 | return 0; | ||
118 | |||
119 | default: | ||
120 | return -1; | ||
121 | } | ||
102 | 122 | ||
103 | return 0; | 123 | } |
104 | } | 124 | } |
105 | 125 | ||
106 | static int k2_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) | 126 | static int k2_sata_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val) |
@@ -354,7 +374,7 @@ static const struct ata_port_operations k2_sata_ops = { | |||
354 | }; | 374 | }; |
355 | 375 | ||
356 | static const struct ata_port_info k2_port_info[] = { | 376 | static const struct ata_port_info k2_port_info[] = { |
357 | /* board_svw4 */ | 377 | /* chip_svw4 */ |
358 | { | 378 | { |
359 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 379 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
360 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA, | 380 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA, |
@@ -363,7 +383,7 @@ static const struct ata_port_info k2_port_info[] = { | |||
363 | .udma_mask = ATA_UDMA6, | 383 | .udma_mask = ATA_UDMA6, |
364 | .port_ops = &k2_sata_ops, | 384 | .port_ops = &k2_sata_ops, |
365 | }, | 385 | }, |
366 | /* board_svw8 */ | 386 | /* chip_svw8 */ |
367 | { | 387 | { |
368 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 388 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
369 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA | | 389 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA | |
@@ -373,6 +393,24 @@ static const struct ata_port_info k2_port_info[] = { | |||
373 | .udma_mask = ATA_UDMA6, | 393 | .udma_mask = ATA_UDMA6, |
374 | .port_ops = &k2_sata_ops, | 394 | .port_ops = &k2_sata_ops, |
375 | }, | 395 | }, |
396 | /* chip_svw42 */ | ||
397 | { | ||
398 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
399 | ATA_FLAG_MMIO | K2_FLAG_BAR_POS_3, | ||
400 | .pio_mask = 0x1f, | ||
401 | .mwdma_mask = 0x07, | ||
402 | .udma_mask = ATA_UDMA6, | ||
403 | .port_ops = &k2_sata_ops, | ||
404 | }, | ||
405 | /* chip_svw43 */ | ||
406 | { | ||
407 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
408 | ATA_FLAG_MMIO, | ||
409 | .pio_mask = 0x1f, | ||
410 | .mwdma_mask = 0x07, | ||
411 | .udma_mask = ATA_UDMA6, | ||
412 | .port_ops = &k2_sata_ops, | ||
413 | }, | ||
376 | }; | 414 | }; |
377 | 415 | ||
378 | static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base) | 416 | static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base) |
@@ -402,7 +440,7 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en | |||
402 | { &k2_port_info[ent->driver_data], NULL }; | 440 | { &k2_port_info[ent->driver_data], NULL }; |
403 | struct ata_host *host; | 441 | struct ata_host *host; |
404 | void __iomem *mmio_base; | 442 | void __iomem *mmio_base; |
405 | int n_ports, i, rc; | 443 | int n_ports, i, rc, bar_pos; |
406 | 444 | ||
407 | if (!printed_version++) | 445 | if (!printed_version++) |
408 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); | 446 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); |
@@ -416,6 +454,9 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en | |||
416 | if (!host) | 454 | if (!host) |
417 | return -ENOMEM; | 455 | return -ENOMEM; |
418 | 456 | ||
457 | bar_pos = 5; | ||
458 | if (ppi[0]->flags & K2_FLAG_BAR_POS_3) | ||
459 | bar_pos = 3; | ||
419 | /* | 460 | /* |
420 | * If this driver happens to only be useful on Apple's K2, then | 461 | * If this driver happens to only be useful on Apple's K2, then |
421 | * we should check that here as it has a normal Serverworks ID | 462 | * we should check that here as it has a normal Serverworks ID |
@@ -428,17 +469,23 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en | |||
428 | * Check if we have resources mapped at all (second function may | 469 | * Check if we have resources mapped at all (second function may |
429 | * have been disabled by firmware) | 470 | * have been disabled by firmware) |
430 | */ | 471 | */ |
431 | if (pci_resource_len(pdev, 5) == 0) | 472 | if (pci_resource_len(pdev, bar_pos) == 0) { |
473 | /* In IDE mode we need to pin the device to ensure that | ||
474 | pcim_release does not clear the busmaster bit in config | ||
475 | space, clearing causes busmaster DMA to fail on | ||
476 | ports 3 & 4 */ | ||
477 | pcim_pin_device(pdev); | ||
432 | return -ENODEV; | 478 | return -ENODEV; |
479 | } | ||
433 | 480 | ||
434 | /* Request and iomap PCI regions */ | 481 | /* Request and iomap PCI regions */ |
435 | rc = pcim_iomap_regions(pdev, 1 << 5, DRV_NAME); | 482 | rc = pcim_iomap_regions(pdev, 1 << bar_pos, DRV_NAME); |
436 | if (rc == -EBUSY) | 483 | if (rc == -EBUSY) |
437 | pcim_pin_device(pdev); | 484 | pcim_pin_device(pdev); |
438 | if (rc) | 485 | if (rc) |
439 | return rc; | 486 | return rc; |
440 | host->iomap = pcim_iomap_table(pdev); | 487 | host->iomap = pcim_iomap_table(pdev); |
441 | mmio_base = host->iomap[5]; | 488 | mmio_base = host->iomap[bar_pos]; |
442 | 489 | ||
443 | /* different controllers have different number of ports - currently 4 or 8 */ | 490 | /* different controllers have different number of ports - currently 4 or 8 */ |
444 | /* All ports are on the same function. Multi-function device is no | 491 | /* All ports are on the same function. Multi-function device is no |
@@ -483,11 +530,13 @@ static int k2_sata_init_one(struct pci_dev *pdev, const struct pci_device_id *en | |||
483 | * controller | 530 | * controller |
484 | * */ | 531 | * */ |
485 | static const struct pci_device_id k2_sata_pci_tbl[] = { | 532 | static const struct pci_device_id k2_sata_pci_tbl[] = { |
486 | { PCI_VDEVICE(SERVERWORKS, 0x0240), board_svw4 }, | 533 | { PCI_VDEVICE(SERVERWORKS, 0x0240), chip_svw4 }, |
487 | { PCI_VDEVICE(SERVERWORKS, 0x0241), board_svw4 }, | 534 | { PCI_VDEVICE(SERVERWORKS, 0x0241), chip_svw4 }, |
488 | { PCI_VDEVICE(SERVERWORKS, 0x0242), board_svw8 }, | 535 | { PCI_VDEVICE(SERVERWORKS, 0x0242), chip_svw8 }, |
489 | { PCI_VDEVICE(SERVERWORKS, 0x024a), board_svw4 }, | 536 | { PCI_VDEVICE(SERVERWORKS, 0x024a), chip_svw4 }, |
490 | { PCI_VDEVICE(SERVERWORKS, 0x024b), board_svw4 }, | 537 | { PCI_VDEVICE(SERVERWORKS, 0x024b), chip_svw4 }, |
538 | { PCI_VDEVICE(SERVERWORKS, 0x0410), chip_svw42 }, | ||
539 | { PCI_VDEVICE(SERVERWORKS, 0x0411), chip_svw43 }, | ||
491 | 540 | ||
492 | { } | 541 | { } |
493 | }; | 542 | }; |