diff options
author | Tejun Heo <htejun@gmail.com> | 2007-04-17 10:44:08 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-04-28 14:16:06 -0400 |
commit | 4447d35156169cf136e829eb6b5cac2d6370f2d9 (patch) | |
tree | 20be4c582ea4ce1cce1b0f8dbea949a410a72e3c /drivers/ata/sata_svw.c | |
parent | 9a829ccfc833269bdb85751f5048288ab93678ac (diff) |
libata: convert the remaining SATA drivers to new init model
Convert ahci, sata_sil, sata_sil24, sata_svw, sata_qstor, sata_mv,
sata_sx4, sata_vsc and sata_inic162x to new init model.
Now that host and ap are available during intialization, functions are
converted to take either host or ap instead of low level parameters
which were inevitable for functions shared between init and other
paths. This simplifies code quite a bit.
* init_one()'s now follow more consistent init order
* ahci_setup_port() and ahci_host_init() collapsed into
ahci_init_one() for init order consistency
* sata_vsc uses port_info instead of setting fields manually
* in sata_svw, k2_board_info converted to port_info (info is now in
port flags). port number is honored now.
Tested on ICH7/8 AHCI, jmb360, sil3112, 3114, 3124 and 3132.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/sata_svw.c')
-rw-r--r-- | drivers/ata/sata_svw.c | 107 |
1 files changed, 50 insertions, 57 deletions
diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c index b121195cc598..cc07aac10e8c 100644 --- a/drivers/ata/sata_svw.c +++ b/drivers/ata/sata_svw.c | |||
@@ -56,7 +56,9 @@ | |||
56 | #define DRV_VERSION "2.1" | 56 | #define DRV_VERSION "2.1" |
57 | 57 | ||
58 | enum { | 58 | enum { |
59 | K2_FLAG_NO_ATAPI_DMA = (1 << 29), | 59 | /* ap->flags bits */ |
60 | K2_FLAG_SATA_8_PORTS = (1 << 24), | ||
61 | K2_FLAG_NO_ATAPI_DMA = (1 << 25), | ||
60 | 62 | ||
61 | /* Taskfile registers offsets */ | 63 | /* Taskfile registers offsets */ |
62 | K2_SATA_TF_CMD_OFFSET = 0x00, | 64 | K2_SATA_TF_CMD_OFFSET = 0x00, |
@@ -90,17 +92,6 @@ enum { | |||
90 | board_svw8 = 1, | 92 | board_svw8 = 1, |
91 | }; | 93 | }; |
92 | 94 | ||
93 | static const struct k2_board_info { | ||
94 | unsigned int n_ports; | ||
95 | unsigned long port_flags; | ||
96 | } k2_board_info[] = { | ||
97 | /* board_svw4 */ | ||
98 | { 4, K2_FLAG_NO_ATAPI_DMA }, | ||
99 | |||
100 | /* board_svw8 */ | ||
101 | { 8, K2_FLAG_NO_ATAPI_DMA }, | ||
102 | }; | ||
103 | |||
104 | static u8 k2_stat_check_status(struct ata_port *ap); | 95 | static u8 k2_stat_check_status(struct ata_port *ap); |
105 | 96 | ||
106 | 97 | ||
@@ -354,7 +345,6 @@ static const struct ata_port_operations k2_sata_ops = { | |||
354 | .thaw = ata_bmdma_thaw, | 345 | .thaw = ata_bmdma_thaw, |
355 | .error_handler = ata_bmdma_error_handler, | 346 | .error_handler = ata_bmdma_error_handler, |
356 | .post_internal_cmd = ata_bmdma_post_internal_cmd, | 347 | .post_internal_cmd = ata_bmdma_post_internal_cmd, |
357 | .irq_handler = ata_interrupt, | ||
358 | .irq_clear = ata_bmdma_irq_clear, | 348 | .irq_clear = ata_bmdma_irq_clear, |
359 | .irq_on = ata_irq_on, | 349 | .irq_on = ata_irq_on, |
360 | .irq_ack = ata_irq_ack, | 350 | .irq_ack = ata_irq_ack, |
@@ -363,6 +353,28 @@ static const struct ata_port_operations k2_sata_ops = { | |||
363 | .port_start = ata_port_start, | 353 | .port_start = ata_port_start, |
364 | }; | 354 | }; |
365 | 355 | ||
356 | static const struct ata_port_info k2_port_info[] = { | ||
357 | /* board_svw4 */ | ||
358 | { | ||
359 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
360 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA, | ||
361 | .pio_mask = 0x1f, | ||
362 | .mwdma_mask = 0x07, | ||
363 | .udma_mask = 0x7f, | ||
364 | .port_ops = &k2_sata_ops, | ||
365 | }, | ||
366 | /* board_svw8 */ | ||
367 | { | ||
368 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
369 | ATA_FLAG_MMIO | K2_FLAG_NO_ATAPI_DMA | | ||
370 | K2_FLAG_SATA_8_PORTS, | ||
371 | .pio_mask = 0x1f, | ||
372 | .mwdma_mask = 0x07, | ||
373 | .udma_mask = 0x7f, | ||
374 | .port_ops = &k2_sata_ops, | ||
375 | }, | ||
376 | }; | ||
377 | |||
366 | static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base) | 378 | static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base) |
367 | { | 379 | { |
368 | port->cmd_addr = base + K2_SATA_TF_CMD_OFFSET; | 380 | port->cmd_addr = base + K2_SATA_TF_CMD_OFFSET; |
@@ -386,17 +398,24 @@ static void k2_sata_setup_port(struct ata_ioports *port, void __iomem *base) | |||
386 | static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | 398 | static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) |
387 | { | 399 | { |
388 | static int printed_version; | 400 | static int printed_version; |
389 | struct device *dev = &pdev->dev; | 401 | const struct ata_port_info *ppi[] = |
390 | struct ata_probe_ent *probe_ent; | 402 | { &k2_port_info[ent->driver_data], NULL }; |
403 | struct ata_host *host; | ||
391 | void __iomem *mmio_base; | 404 | void __iomem *mmio_base; |
392 | const struct k2_board_info *board_info = | 405 | int n_ports, i, rc; |
393 | &k2_board_info[ent->driver_data]; | ||
394 | int rc; | ||
395 | int i; | ||
396 | 406 | ||
397 | if (!printed_version++) | 407 | if (!printed_version++) |
398 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); | 408 | dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); |
399 | 409 | ||
410 | /* allocate host */ | ||
411 | n_ports = 4; | ||
412 | if (ppi[0]->flags & K2_FLAG_SATA_8_PORTS) | ||
413 | n_ports = 8; | ||
414 | |||
415 | host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports); | ||
416 | if (!host) | ||
417 | return -ENOMEM; | ||
418 | |||
400 | /* | 419 | /* |
401 | * If this driver happens to only be useful on Apple's K2, then | 420 | * If this driver happens to only be useful on Apple's K2, then |
402 | * we should check that here as it has a normal Serverworks ID | 421 | * we should check that here as it has a normal Serverworks ID |
@@ -404,6 +423,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e | |||
404 | rc = pcim_enable_device(pdev); | 423 | rc = pcim_enable_device(pdev); |
405 | if (rc) | 424 | if (rc) |
406 | return rc; | 425 | return rc; |
426 | |||
407 | /* | 427 | /* |
408 | * Check if we have resources mapped at all (second function may | 428 | * Check if we have resources mapped at all (second function may |
409 | * have been disabled by firmware) | 429 | * have been disabled by firmware) |
@@ -417,6 +437,15 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e | |||
417 | pcim_pin_device(pdev); | 437 | pcim_pin_device(pdev); |
418 | if (rc) | 438 | if (rc) |
419 | return rc; | 439 | return rc; |
440 | host->iomap = pcim_iomap_table(pdev); | ||
441 | mmio_base = host->iomap[5]; | ||
442 | |||
443 | /* different controllers have different number of ports - currently 4 or 8 */ | ||
444 | /* All ports are on the same function. Multi-function device is no | ||
445 | * longer available. This should not be seen in any system. */ | ||
446 | for (i = 0; i < host->n_ports; i++) | ||
447 | k2_sata_setup_port(&host->ports[i]->ioaddr, | ||
448 | mmio_base + i * K2_SATA_PORT_OFFSET); | ||
420 | 449 | ||
421 | rc = pci_set_dma_mask(pdev, ATA_DMA_MASK); | 450 | rc = pci_set_dma_mask(pdev, ATA_DMA_MASK); |
422 | if (rc) | 451 | if (rc) |
@@ -425,38 +454,6 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e | |||
425 | if (rc) | 454 | if (rc) |
426 | return rc; | 455 | return rc; |
427 | 456 | ||
428 | probe_ent = devm_kzalloc(dev, sizeof(*probe_ent), GFP_KERNEL); | ||
429 | if (probe_ent == NULL) | ||
430 | return -ENOMEM; | ||
431 | |||
432 | probe_ent->dev = pci_dev_to_dev(pdev); | ||
433 | INIT_LIST_HEAD(&probe_ent->node); | ||
434 | |||
435 | probe_ent->sht = &k2_sata_sht; | ||
436 | probe_ent->port_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
437 | ATA_FLAG_MMIO | board_info->port_flags; | ||
438 | probe_ent->port_ops = &k2_sata_ops; | ||
439 | probe_ent->n_ports = 4; | ||
440 | probe_ent->irq = pdev->irq; | ||
441 | probe_ent->irq_flags = IRQF_SHARED; | ||
442 | probe_ent->iomap = pcim_iomap_table(pdev); | ||
443 | |||
444 | /* We don't care much about the PIO/UDMA masks, but the core won't like us | ||
445 | * if we don't fill these | ||
446 | */ | ||
447 | probe_ent->pio_mask = 0x1f; | ||
448 | probe_ent->mwdma_mask = 0x7; | ||
449 | probe_ent->udma_mask = 0x7f; | ||
450 | |||
451 | mmio_base = probe_ent->iomap[5]; | ||
452 | |||
453 | /* different controllers have different number of ports - currently 4 or 8 */ | ||
454 | /* All ports are on the same function. Multi-function device is no | ||
455 | * longer available. This should not be seen in any system. */ | ||
456 | for (i = 0; i < board_info->n_ports; i++) | ||
457 | k2_sata_setup_port(&probe_ent->port[i], | ||
458 | mmio_base + i * K2_SATA_PORT_OFFSET); | ||
459 | |||
460 | /* Clear a magic bit in SCR1 according to Darwin, those help | 457 | /* Clear a magic bit in SCR1 according to Darwin, those help |
461 | * some funky seagate drives (though so far, those were already | 458 | * some funky seagate drives (though so far, those were already |
462 | * set by the firmware on the machines I had access to) | 459 | * set by the firmware on the machines I had access to) |
@@ -469,12 +466,8 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e | |||
469 | writel(0x0, mmio_base + K2_SATA_SIM_OFFSET); | 466 | writel(0x0, mmio_base + K2_SATA_SIM_OFFSET); |
470 | 467 | ||
471 | pci_set_master(pdev); | 468 | pci_set_master(pdev); |
472 | 469 | return ata_host_activate(host, pdev->irq, ata_interrupt, IRQF_SHARED, | |
473 | if (!ata_device_add(probe_ent)) | 470 | &k2_sata_sht); |
474 | return -ENODEV; | ||
475 | |||
476 | devm_kfree(dev, probe_ent); | ||
477 | return 0; | ||
478 | } | 471 | } |
479 | 472 | ||
480 | /* 0x240 is device ID for Apple K2 device | 473 | /* 0x240 is device ID for Apple K2 device |