aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/sata_svw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/sata_svw.c')
-rw-r--r--drivers/scsi/sata_svw.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c
index 8d1a5d25c05..858e07185db 100644
--- a/drivers/scsi/sata_svw.c
+++ b/drivers/scsi/sata_svw.c
@@ -49,7 +49,7 @@
49#endif /* CONFIG_PPC_OF */ 49#endif /* CONFIG_PPC_OF */
50 50
51#define DRV_NAME "sata_svw" 51#define DRV_NAME "sata_svw"
52#define DRV_VERSION "1.05" 52#define DRV_VERSION "1.06"
53 53
54/* Taskfile registers offsets */ 54/* Taskfile registers offsets */
55#define K2_SATA_TF_CMD_OFFSET 0x00 55#define K2_SATA_TF_CMD_OFFSET 0x00
@@ -313,6 +313,7 @@ static struct ata_port_operations k2_sata_ops = {
313 .scr_write = k2_sata_scr_write, 313 .scr_write = k2_sata_scr_write,
314 .port_start = ata_port_start, 314 .port_start = ata_port_start,
315 .port_stop = ata_port_stop, 315 .port_stop = ata_port_stop,
316 .host_stop = ata_host_stop,
316}; 317};
317 318
318static void k2_sata_setup_port(struct ata_ioports *port, unsigned long base) 319static void k2_sata_setup_port(struct ata_ioports *port, unsigned long base)
@@ -343,6 +344,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
343 void *mmio_base; 344 void *mmio_base;
344 int pci_dev_busy = 0; 345 int pci_dev_busy = 0;
345 int rc; 346 int rc;
347 int i;
346 348
347 if (!printed_version++) 349 if (!printed_version++)
348 printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n"); 350 printk(KERN_DEBUG DRV_NAME " version " DRV_VERSION "\n");
@@ -395,7 +397,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
395 397
396 /* Clear a magic bit in SCR1 according to Darwin, those help 398 /* Clear a magic bit in SCR1 according to Darwin, those help
397 * some funky seagate drives (though so far, those were already 399 * some funky seagate drives (though so far, those were already
398 * set by the firmware on the machines I had access to 400 * set by the firmware on the machines I had access to)
399 */ 401 */
400 writel(readl(mmio_base + K2_SATA_SICR1_OFFSET) & ~0x00040000, 402 writel(readl(mmio_base + K2_SATA_SICR1_OFFSET) & ~0x00040000,
401 mmio_base + K2_SATA_SICR1_OFFSET); 403 mmio_base + K2_SATA_SICR1_OFFSET);
@@ -420,11 +422,11 @@ static int k2_sata_init_one (struct pci_dev *pdev, const struct pci_device_id *e
420 probe_ent->mwdma_mask = 0x7; 422 probe_ent->mwdma_mask = 0x7;
421 probe_ent->udma_mask = 0x7f; 423 probe_ent->udma_mask = 0x7f;
422 424
423 /* We have 4 ports per PCI function */ 425 /* different controllers have different number of ports - currently 4 or 8 */
424 k2_sata_setup_port(&probe_ent->port[0], base + 0 * K2_SATA_PORT_OFFSET); 426 /* All ports are on the same function. Multi-function device is no
425 k2_sata_setup_port(&probe_ent->port[1], base + 1 * K2_SATA_PORT_OFFSET); 427 * longer available. This should not be seen in any system. */
426 k2_sata_setup_port(&probe_ent->port[2], base + 2 * K2_SATA_PORT_OFFSET); 428 for (i = 0; i < ent->driver_data; i++)
427 k2_sata_setup_port(&probe_ent->port[3], base + 3 * K2_SATA_PORT_OFFSET); 429 k2_sata_setup_port(&probe_ent->port[i], base + i * K2_SATA_PORT_OFFSET);
428 430
429 pci_set_master(pdev); 431 pci_set_master(pdev);
430 432
@@ -444,11 +446,17 @@ err_out:
444 return rc; 446 return rc;
445} 447}
446 448
447 449/* 0x240 is device ID for Apple K2 device
450 * 0x241 is device ID for Serverworks Frodo4
451 * 0x242 is device ID for Serverworks Frodo8
452 * 0x24a is device ID for BCM5785 (aka HT1000) HT southbridge integrated SATA
453 * controller
454 * */
448static struct pci_device_id k2_sata_pci_tbl[] = { 455static struct pci_device_id k2_sata_pci_tbl[] = {
449 { 0x1166, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, 456 { 0x1166, 0x0240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
450 { 0x1166, 0x0241, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, 457 { 0x1166, 0x0241, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
451 { 0x1166, 0x0242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, 458 { 0x1166, 0x0242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 },
459 { 0x1166, 0x024a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 },
452 { } 460 { }
453}; 461};
454 462