--- linux/drivers/scsi/sata_sil.c.orig	2005-06-15 17:48:23.000000000 +0900
+++ linux/drivers/scsi/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;
