--- sata_sil.c.orig 2005-06-15 17:48:23.000000000 +0900 +++ sata_sil.c 2005-07-06 01:58:28.000000000 +0900 @@ -45,6 +45,7 @@ sil_3114 = 1, SIL_SYSCFG = 0x48, + SIL_GPIO = 0x54, SIL_MASK_IDE0_INT = (1 << 22), SIL_MASK_IDE1_INT = (1 << 23), SIL_MASK_IDE2_INT = (1 << 24), @@ -65,6 +66,8 @@ static u32 sil_scr_read (struct ata_port *ap, unsigned int sc_reg); static void sil_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); static void sil_post_set_mode (struct ata_port *ap); +static void sil_bmdma_start(struct ata_queued_cmd *qc); +static void sil_bmdma_stop(struct ata_port *ap); static struct pci_device_id sil_pci_tbl[] = { { 0x1095, 0x3112, PCI_ANY_ID, PCI_ANY_ID, 0, 0, sil_3112 }, @@ -138,8 +140,8 @@ .phy_reset = sata_phy_reset, .post_set_mode = sil_post_set_mode, .bmdma_setup = ata_bmdma_setup, - .bmdma_start = ata_bmdma_start, - .bmdma_stop = ata_bmdma_stop, + .bmdma_start = sil_bmdma_start, + .bmdma_stop = sil_bmdma_stop, .bmdma_status = ata_bmdma_status, .qc_prep = ata_qc_prep, .qc_issue = ata_qc_issue_prot, @@ -198,6 +200,35 @@ MODULE_DEVICE_TABLE(pci, sil_pci_tbl); MODULE_VERSION(DRV_VERSION); +static void sil_bmdma_start(struct ata_queued_cmd *qc) +{ + void* mmio_base = qc->ap->host_set->mmio_base; + u32 gpio = readl(mmio_base + SIL_GPIO); + + /* setting the lower 8 bits to activate the activity LED */ + gpio |= 0x00ff; + writel(gpio, mmio_base + SIL_GPIO); + readl(mmio_base + SIL_GPIO); /* flush */ + + ata_bmdma_start(qc); +} + +static void sil_bmdma_stop(struct ata_port *ap) +{ + void* mmio_base = ap->host_set->mmio_base; + u32 gpio = readl(mmio_base + SIL_GPIO); + + ata_bmdma_stop(ap); + + /* + * setting bits [8:15] clears the lower 8 bits, + * deactivating the activity LED + */ + gpio |= 0xff00; + writel(gpio, mmio_base + SIL_GPIO); + readl(mmio_base + SIL_GPIO); /* flush */ +} + static void sil_post_set_mode (struct ata_port *ap) { struct ata_host_set *host_set = ap->host_set;