diff options
Diffstat (limited to 'drivers/scsi/sata_sil.c')
| -rw-r--r-- | drivers/scsi/sata_sil.c | 221 |
1 files changed, 184 insertions, 37 deletions
diff --git a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c index 106627299d55..bc9f918a7f28 100644 --- a/drivers/scsi/sata_sil.c +++ b/drivers/scsi/sata_sil.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | #include <linux/libata.h> | 46 | #include <linux/libata.h> |
| 47 | 47 | ||
| 48 | #define DRV_NAME "sata_sil" | 48 | #define DRV_NAME "sata_sil" |
| 49 | #define DRV_VERSION "0.9" | 49 | #define DRV_VERSION "1.0" |
| 50 | 50 | ||
| 51 | enum { | 51 | enum { |
| 52 | /* | 52 | /* |
| @@ -54,8 +54,9 @@ enum { | |||
| 54 | */ | 54 | */ |
| 55 | SIL_FLAG_RERR_ON_DMA_ACT = (1 << 29), | 55 | SIL_FLAG_RERR_ON_DMA_ACT = (1 << 29), |
| 56 | SIL_FLAG_MOD15WRITE = (1 << 30), | 56 | SIL_FLAG_MOD15WRITE = (1 << 30), |
| 57 | |||
| 57 | SIL_DFL_HOST_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 58 | SIL_DFL_HOST_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
| 58 | ATA_FLAG_MMIO, | 59 | ATA_FLAG_MMIO | ATA_FLAG_HRST_TO_RESUME, |
| 59 | 60 | ||
| 60 | /* | 61 | /* |
| 61 | * Controller IDs | 62 | * Controller IDs |
| @@ -84,6 +85,20 @@ enum { | |||
| 84 | /* BMDMA/BMDMA2 */ | 85 | /* BMDMA/BMDMA2 */ |
| 85 | SIL_INTR_STEERING = (1 << 1), | 86 | SIL_INTR_STEERING = (1 << 1), |
| 86 | 87 | ||
| 88 | SIL_DMA_ENABLE = (1 << 0), /* DMA run switch */ | ||
| 89 | SIL_DMA_RDWR = (1 << 3), /* DMA Rd-Wr */ | ||
| 90 | SIL_DMA_SATA_IRQ = (1 << 4), /* OR of all SATA IRQs */ | ||
| 91 | SIL_DMA_ACTIVE = (1 << 16), /* DMA running */ | ||
| 92 | SIL_DMA_ERROR = (1 << 17), /* PCI bus error */ | ||
| 93 | SIL_DMA_COMPLETE = (1 << 18), /* cmd complete / IRQ pending */ | ||
| 94 | SIL_DMA_N_SATA_IRQ = (1 << 6), /* SATA_IRQ for the next channel */ | ||
| 95 | SIL_DMA_N_ACTIVE = (1 << 24), /* ACTIVE for the next channel */ | ||
| 96 | SIL_DMA_N_ERROR = (1 << 25), /* ERROR for the next channel */ | ||
| 97 | SIL_DMA_N_COMPLETE = (1 << 26), /* COMPLETE for the next channel */ | ||
| 98 | |||
| 99 | /* SIEN */ | ||
| 100 | SIL_SIEN_N = (1 << 16), /* triggered by SError.N */ | ||
| 101 | |||
| 87 | /* | 102 | /* |
| 88 | * Others | 103 | * Others |
| 89 | */ | 104 | */ |
| @@ -96,6 +111,10 @@ static void sil_dev_config(struct ata_port *ap, struct ata_device *dev); | |||
| 96 | static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg); | 111 | static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg); |
| 97 | static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); | 112 | static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); |
| 98 | static void sil_post_set_mode (struct ata_port *ap); | 113 | static void sil_post_set_mode (struct ata_port *ap); |
| 114 | static irqreturn_t sil_interrupt(int irq, void *dev_instance, | ||
| 115 | struct pt_regs *regs); | ||
| 116 | static void sil_freeze(struct ata_port *ap); | ||
| 117 | static void sil_thaw(struct ata_port *ap); | ||
| 99 | 118 | ||
| 100 | 119 | ||
| 101 | static const struct pci_device_id sil_pci_tbl[] = { | 120 | static const struct pci_device_id sil_pci_tbl[] = { |
| @@ -155,6 +174,7 @@ static struct scsi_host_template sil_sht = { | |||
| 155 | .proc_name = DRV_NAME, | 174 | .proc_name = DRV_NAME, |
| 156 | .dma_boundary = ATA_DMA_BOUNDARY, | 175 | .dma_boundary = ATA_DMA_BOUNDARY, |
| 157 | .slave_configure = ata_scsi_slave_config, | 176 | .slave_configure = ata_scsi_slave_config, |
| 177 | .slave_destroy = ata_scsi_slave_destroy, | ||
| 158 | .bios_param = ata_std_bios_param, | 178 | .bios_param = ata_std_bios_param, |
| 159 | }; | 179 | }; |
| 160 | 180 | ||
| @@ -166,7 +186,6 @@ static const struct ata_port_operations sil_ops = { | |||
| 166 | .check_status = ata_check_status, | 186 | .check_status = ata_check_status, |
| 167 | .exec_command = ata_exec_command, | 187 | .exec_command = ata_exec_command, |
| 168 | .dev_select = ata_std_dev_select, | 188 | .dev_select = ata_std_dev_select, |
| 169 | .probe_reset = ata_std_probe_reset, | ||
| 170 | .post_set_mode = sil_post_set_mode, | 189 | .post_set_mode = sil_post_set_mode, |
| 171 | .bmdma_setup = ata_bmdma_setup, | 190 | .bmdma_setup = ata_bmdma_setup, |
| 172 | .bmdma_start = ata_bmdma_start, | 191 | .bmdma_start = ata_bmdma_start, |
| @@ -174,8 +193,12 @@ static const struct ata_port_operations sil_ops = { | |||
| 174 | .bmdma_status = ata_bmdma_status, | 193 | .bmdma_status = ata_bmdma_status, |
| 175 | .qc_prep = ata_qc_prep, | 194 | .qc_prep = ata_qc_prep, |
| 176 | .qc_issue = ata_qc_issue_prot, | 195 | .qc_issue = ata_qc_issue_prot, |
| 177 | .eng_timeout = ata_eng_timeout, | 196 | .data_xfer = ata_mmio_data_xfer, |
| 178 | .irq_handler = ata_interrupt, | 197 | .freeze = sil_freeze, |
| 198 | .thaw = sil_thaw, | ||
| 199 | .error_handler = ata_bmdma_error_handler, | ||
| 200 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | ||
| 201 | .irq_handler = sil_interrupt, | ||
| 179 | .irq_clear = ata_bmdma_irq_clear, | 202 | .irq_clear = ata_bmdma_irq_clear, |
| 180 | .scr_read = sil_scr_read, | 203 | .scr_read = sil_scr_read, |
| 181 | .scr_write = sil_scr_write, | 204 | .scr_write = sil_scr_write, |
| @@ -220,6 +243,7 @@ static const struct { | |||
| 220 | unsigned long tf; /* ATA taskfile register block */ | 243 | unsigned long tf; /* ATA taskfile register block */ |
| 221 | unsigned long ctl; /* ATA control/altstatus register block */ | 244 | unsigned long ctl; /* ATA control/altstatus register block */ |
| 222 | unsigned long bmdma; /* DMA register block */ | 245 | unsigned long bmdma; /* DMA register block */ |
| 246 | unsigned long bmdma2; /* DMA register block #2 */ | ||
| 223 | unsigned long fifo_cfg; /* FIFO Valid Byte Count and Control */ | 247 | unsigned long fifo_cfg; /* FIFO Valid Byte Count and Control */ |
| 224 | unsigned long scr; /* SATA control register block */ | 248 | unsigned long scr; /* SATA control register block */ |
| 225 | unsigned long sien; /* SATA Interrupt Enable register */ | 249 | unsigned long sien; /* SATA Interrupt Enable register */ |
| @@ -227,10 +251,10 @@ static const struct { | |||
| 227 | unsigned long sfis_cfg; /* SATA FIS reception config register */ | 251 | unsigned long sfis_cfg; /* SATA FIS reception config register */ |
| 228 | } sil_port[] = { | 252 | } sil_port[] = { |
| 229 | /* port 0 ... */ | 253 | /* port 0 ... */ |
| 230 | { 0x80, 0x8A, 0x00, 0x40, 0x100, 0x148, 0xb4, 0x14c }, | 254 | { 0x80, 0x8A, 0x00, 0x10, 0x40, 0x100, 0x148, 0xb4, 0x14c }, |
| 231 | { 0xC0, 0xCA, 0x08, 0x44, 0x180, 0x1c8, 0xf4, 0x1cc }, | 255 | { 0xC0, 0xCA, 0x08, 0x18, 0x44, 0x180, 0x1c8, 0xf4, 0x1cc }, |
| 232 | { 0x280, 0x28A, 0x200, 0x240, 0x300, 0x348, 0x2b4, 0x34c }, | 256 | { 0x280, 0x28A, 0x200, 0x210, 0x240, 0x300, 0x348, 0x2b4, 0x34c }, |
| 233 | { 0x2C0, 0x2CA, 0x208, 0x244, 0x380, 0x3c8, 0x2f4, 0x3cc }, | 257 | { 0x2C0, 0x2CA, 0x208, 0x218, 0x244, 0x380, 0x3c8, 0x2f4, 0x3cc }, |
| 234 | /* ... port 3 */ | 258 | /* ... port 3 */ |
| 235 | }; | 259 | }; |
| 236 | 260 | ||
| @@ -263,7 +287,7 @@ static void sil_post_set_mode (struct ata_port *ap) | |||
| 263 | 287 | ||
| 264 | for (i = 0; i < 2; i++) { | 288 | for (i = 0; i < 2; i++) { |
| 265 | dev = &ap->device[i]; | 289 | dev = &ap->device[i]; |
| 266 | if (!ata_dev_present(dev)) | 290 | if (!ata_dev_enabled(dev)) |
| 267 | dev_mode[i] = 0; /* PIO0/1/2 */ | 291 | dev_mode[i] = 0; /* PIO0/1/2 */ |
| 268 | else if (dev->flags & ATA_DFLAG_PIO) | 292 | else if (dev->flags & ATA_DFLAG_PIO) |
| 269 | dev_mode[i] = 1; /* PIO3/4 */ | 293 | dev_mode[i] = 1; /* PIO3/4 */ |
| @@ -314,6 +338,151 @@ static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) | |||
| 314 | writel(val, mmio); | 338 | writel(val, mmio); |
| 315 | } | 339 | } |
| 316 | 340 | ||
| 341 | static void sil_host_intr(struct ata_port *ap, u32 bmdma2) | ||
| 342 | { | ||
| 343 | struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->active_tag); | ||
| 344 | u8 status; | ||
| 345 | |||
| 346 | if (unlikely(bmdma2 & SIL_DMA_SATA_IRQ)) { | ||
| 347 | u32 serror; | ||
| 348 | |||
| 349 | /* SIEN doesn't mask SATA IRQs on some 3112s. Those | ||
| 350 | * controllers continue to assert IRQ as long as | ||
| 351 | * SError bits are pending. Clear SError immediately. | ||
| 352 | */ | ||
| 353 | serror = sil_scr_read(ap, SCR_ERROR); | ||
| 354 | sil_scr_write(ap, SCR_ERROR, serror); | ||
| 355 | |||
| 356 | /* Trigger hotplug and accumulate SError only if the | ||
| 357 | * port isn't already frozen. Otherwise, PHY events | ||
| 358 | * during hardreset makes controllers with broken SIEN | ||
| 359 | * repeat probing needlessly. | ||
| 360 | */ | ||
| 361 | if (!(ap->flags & ATA_FLAG_FROZEN)) { | ||
| 362 | ata_ehi_hotplugged(&ap->eh_info); | ||
| 363 | ap->eh_info.serror |= serror; | ||
| 364 | } | ||
| 365 | |||
| 366 | goto freeze; | ||
| 367 | } | ||
| 368 | |||
| 369 | if (unlikely(!qc || qc->tf.ctl & ATA_NIEN)) | ||
| 370 | goto freeze; | ||
| 371 | |||
| 372 | /* Check whether we are expecting interrupt in this state */ | ||
| 373 | switch (ap->hsm_task_state) { | ||
| 374 | case HSM_ST_FIRST: | ||
| 375 | /* Some pre-ATAPI-4 devices assert INTRQ | ||
| 376 | * at this state when ready to receive CDB. | ||
| 377 | */ | ||
| 378 | |||
| 379 | /* Check the ATA_DFLAG_CDB_INTR flag is enough here. | ||
| 380 | * The flag was turned on only for atapi devices. | ||
| 381 | * No need to check is_atapi_taskfile(&qc->tf) again. | ||
| 382 | */ | ||
| 383 | if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR)) | ||
| 384 | goto err_hsm; | ||
| 385 | break; | ||
| 386 | case HSM_ST_LAST: | ||
| 387 | if (qc->tf.protocol == ATA_PROT_DMA || | ||
| 388 | qc->tf.protocol == ATA_PROT_ATAPI_DMA) { | ||
| 389 | /* clear DMA-Start bit */ | ||
| 390 | ap->ops->bmdma_stop(qc); | ||
| 391 | |||
| 392 | if (bmdma2 & SIL_DMA_ERROR) { | ||
| 393 | qc->err_mask |= AC_ERR_HOST_BUS; | ||
| 394 | ap->hsm_task_state = HSM_ST_ERR; | ||
| 395 | } | ||
| 396 | } | ||
| 397 | break; | ||
| 398 | case HSM_ST: | ||
| 399 | break; | ||
| 400 | default: | ||
| 401 | goto err_hsm; | ||
| 402 | } | ||
| 403 | |||
| 404 | /* check main status, clearing INTRQ */ | ||
| 405 | status = ata_chk_status(ap); | ||
| 406 | if (unlikely(status & ATA_BUSY)) | ||
| 407 | goto err_hsm; | ||
| 408 | |||
| 409 | /* ack bmdma irq events */ | ||
| 410 | ata_bmdma_irq_clear(ap); | ||
| 411 | |||
| 412 | /* kick HSM in the ass */ | ||
| 413 | ata_hsm_move(ap, qc, status, 0); | ||
| 414 | |||
| 415 | return; | ||
| 416 | |||
| 417 | err_hsm: | ||
| 418 | qc->err_mask |= AC_ERR_HSM; | ||
| 419 | freeze: | ||
| 420 | ata_port_freeze(ap); | ||
| 421 | } | ||
| 422 | |||
| 423 | static irqreturn_t sil_interrupt(int irq, void *dev_instance, | ||
| 424 | struct pt_regs *regs) | ||
| 425 | { | ||
| 426 | struct ata_host_set *host_set = dev_instance; | ||
| 427 | void __iomem *mmio_base = host_set->mmio_base; | ||
| 428 | int handled = 0; | ||
| 429 | int i; | ||
| 430 | |||
| 431 | spin_lock(&host_set->lock); | ||
| 432 | |||
| 433 | for (i = 0; i < host_set->n_ports; i++) { | ||
| 434 | struct ata_port *ap = host_set->ports[i]; | ||
| 435 | u32 bmdma2 = readl(mmio_base + sil_port[ap->port_no].bmdma2); | ||
| 436 | |||
| 437 | if (unlikely(!ap || ap->flags & ATA_FLAG_DISABLED)) | ||
| 438 | continue; | ||
| 439 | |||
| 440 | if (bmdma2 == 0xffffffff || | ||
| 441 | !(bmdma2 & (SIL_DMA_COMPLETE | SIL_DMA_SATA_IRQ))) | ||
| 442 | continue; | ||
| 443 | |||
| 444 | sil_host_intr(ap, bmdma2); | ||
| 445 | handled = 1; | ||
| 446 | } | ||
| 447 | |||
| 448 | spin_unlock(&host_set->lock); | ||
| 449 | |||
| 450 | return IRQ_RETVAL(handled); | ||
| 451 | } | ||
| 452 | |||
| 453 | static void sil_freeze(struct ata_port *ap) | ||
| 454 | { | ||
| 455 | void __iomem *mmio_base = ap->host_set->mmio_base; | ||
| 456 | u32 tmp; | ||
| 457 | |||
| 458 | /* global IRQ mask doesn't block SATA IRQ, turn off explicitly */ | ||
| 459 | writel(0, mmio_base + sil_port[ap->port_no].sien); | ||
| 460 | |||
| 461 | /* plug IRQ */ | ||
| 462 | tmp = readl(mmio_base + SIL_SYSCFG); | ||
| 463 | tmp |= SIL_MASK_IDE0_INT << ap->port_no; | ||
| 464 | writel(tmp, mmio_base + SIL_SYSCFG); | ||
| 465 | readl(mmio_base + SIL_SYSCFG); /* flush */ | ||
| 466 | } | ||
| 467 | |||
| 468 | static void sil_thaw(struct ata_port *ap) | ||
| 469 | { | ||
| 470 | void __iomem *mmio_base = ap->host_set->mmio_base; | ||
| 471 | u32 tmp; | ||
| 472 | |||
| 473 | /* clear IRQ */ | ||
| 474 | ata_chk_status(ap); | ||
| 475 | ata_bmdma_irq_clear(ap); | ||
| 476 | |||
| 477 | /* turn on SATA IRQ */ | ||
| 478 | writel(SIL_SIEN_N, mmio_base + sil_port[ap->port_no].sien); | ||
| 479 | |||
| 480 | /* turn on IRQ */ | ||
| 481 | tmp = readl(mmio_base + SIL_SYSCFG); | ||
| 482 | tmp &= ~(SIL_MASK_IDE0_INT << ap->port_no); | ||
| 483 | writel(tmp, mmio_base + SIL_SYSCFG); | ||
| 484 | } | ||
| 485 | |||
| 317 | /** | 486 | /** |
| 318 | * sil_dev_config - Apply device/host-specific errata fixups | 487 | * sil_dev_config - Apply device/host-specific errata fixups |
| 319 | * @ap: Port containing device to be examined | 488 | * @ap: Port containing device to be examined |
| @@ -360,16 +529,16 @@ static void sil_dev_config(struct ata_port *ap, struct ata_device *dev) | |||
| 360 | if (slow_down || | 529 | if (slow_down || |
| 361 | ((ap->flags & SIL_FLAG_MOD15WRITE) && | 530 | ((ap->flags & SIL_FLAG_MOD15WRITE) && |
| 362 | (quirks & SIL_QUIRK_MOD15WRITE))) { | 531 | (quirks & SIL_QUIRK_MOD15WRITE))) { |
| 363 | printk(KERN_INFO "ata%u(%u): applying Seagate errata fix (mod15write workaround)\n", | 532 | ata_dev_printk(dev, KERN_INFO, "applying Seagate errata fix " |
| 364 | ap->id, dev->devno); | 533 | "(mod15write workaround)\n"); |
| 365 | dev->max_sectors = 15; | 534 | dev->max_sectors = 15; |
| 366 | return; | 535 | return; |
| 367 | } | 536 | } |
| 368 | 537 | ||
| 369 | /* limit to udma5 */ | 538 | /* limit to udma5 */ |
| 370 | if (quirks & SIL_QUIRK_UDMA5MAX) { | 539 | if (quirks & SIL_QUIRK_UDMA5MAX) { |
| 371 | printk(KERN_INFO "ata%u(%u): applying Maxtor errata fix %s\n", | 540 | ata_dev_printk(dev, KERN_INFO, |
| 372 | ap->id, dev->devno, model_num); | 541 | "applying Maxtor errata fix %s\n", model_num); |
| 373 | dev->udma_mask &= ATA_UDMA5; | 542 | dev->udma_mask &= ATA_UDMA5; |
| 374 | return; | 543 | return; |
| 375 | } | 544 | } |
| @@ -384,16 +553,12 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 384 | int rc; | 553 | int rc; |
| 385 | unsigned int i; | 554 | unsigned int i; |
| 386 | int pci_dev_busy = 0; | 555 | int pci_dev_busy = 0; |
| 387 | u32 tmp, irq_mask; | 556 | u32 tmp; |
| 388 | u8 cls; | 557 | u8 cls; |
| 389 | 558 | ||
| 390 | if (!printed_version++) | 559 | if (!printed_version++) |
| 391 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); | 560 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); |
| 392 | 561 | ||
| 393 | /* | ||
| 394 | * If this driver happens to only be useful on Apple's K2, then | ||
| 395 | * we should check that here as it has a normal Serverworks ID | ||
| 396 | */ | ||
| 397 | rc = pci_enable_device(pdev); | 562 | rc = pci_enable_device(pdev); |
| 398 | if (rc) | 563 | if (rc) |
| 399 | return rc; | 564 | return rc; |
| @@ -478,31 +643,13 @@ static int sil_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 478 | } | 643 | } |
| 479 | 644 | ||
| 480 | if (ent->driver_data == sil_3114) { | 645 | if (ent->driver_data == sil_3114) { |
| 481 | irq_mask = SIL_MASK_4PORT; | ||
| 482 | |||
| 483 | /* flip the magic "make 4 ports work" bit */ | 646 | /* flip the magic "make 4 ports work" bit */ |
| 484 | tmp = readl(mmio_base + sil_port[2].bmdma); | 647 | tmp = readl(mmio_base + sil_port[2].bmdma); |
| 485 | if ((tmp & SIL_INTR_STEERING) == 0) | 648 | if ((tmp & SIL_INTR_STEERING) == 0) |
| 486 | writel(tmp | SIL_INTR_STEERING, | 649 | writel(tmp | SIL_INTR_STEERING, |
| 487 | mmio_base + sil_port[2].bmdma); | 650 | mmio_base + sil_port[2].bmdma); |
| 488 | |||
| 489 | } else { | ||
| 490 | irq_mask = SIL_MASK_2PORT; | ||
| 491 | } | ||
| 492 | |||
| 493 | /* make sure IDE0/1/2/3 interrupts are not masked */ | ||
| 494 | tmp = readl(mmio_base + SIL_SYSCFG); | ||
| 495 | if (tmp & irq_mask) { | ||
| 496 | tmp &= ~irq_mask; | ||
| 497 | writel(tmp, mmio_base + SIL_SYSCFG); | ||
| 498 | readl(mmio_base + SIL_SYSCFG); /* flush */ | ||
| 499 | } | 651 | } |
| 500 | 652 | ||
| 501 | /* mask all SATA phy-related interrupts */ | ||
| 502 | /* TODO: unmask bit 6 (SError N bit) for hotplug */ | ||
| 503 | for (i = 0; i < probe_ent->n_ports; i++) | ||
| 504 | writel(0, mmio_base + sil_port[i].sien); | ||
| 505 | |||
| 506 | pci_set_master(pdev); | 653 | pci_set_master(pdev); |
| 507 | 654 | ||
| 508 | /* FIXME: check ata_device_add return value */ | 655 | /* FIXME: check ata_device_add return value */ |
