aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/sata_fsl.c
diff options
context:
space:
mode:
authorashish kalra <ashish.kalra@freescale.com>2009-07-01 11:29:43 -0400
committerJeff Garzik <jgarzik@redhat.com>2009-12-03 02:46:35 -0500
commitfd6c29e3dec9e44ecbcba3c57efa08af70a10f1e (patch)
tree5f6dd6af334b867286c6b258176a7723680bda3a /drivers/ata/sata_fsl.c
parent10a9c969222de5302cff0bb41dd7f114f9aa8e5d (diff)
sata_fsl: Add asynchronous notification support
Enable device hot-plug support on Port multiplier fan-out ports Signed-off-by: Ashish Kalra <Ashish.Kalra@freescale.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/ata/sata_fsl.c')
-rw-r--r--drivers/ata/sata_fsl.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
index 172b57e6543f..8a5d35b759dd 100644
--- a/drivers/ata/sata_fsl.c
+++ b/drivers/ata/sata_fsl.c
@@ -34,7 +34,7 @@ enum {
34 34
35 SATA_FSL_HOST_FLAGS = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | 35 SATA_FSL_HOST_FLAGS = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
36 ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | 36 ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
37 ATA_FLAG_PMP | ATA_FLAG_NCQ), 37 ATA_FLAG_PMP | ATA_FLAG_NCQ | ATA_FLAG_AN),
38 38
39 SATA_FSL_MAX_CMDS = SATA_FSL_QUEUE_DEPTH, 39 SATA_FSL_MAX_CMDS = SATA_FSL_QUEUE_DEPTH,
40 SATA_FSL_CMD_HDR_SIZE = 16, /* 4 DWORDS */ 40 SATA_FSL_CMD_HDR_SIZE = 16, /* 4 DWORDS */
@@ -132,7 +132,7 @@ enum {
132 INT_ON_SINGL_DEVICE_ERR = (1 << 1), 132 INT_ON_SINGL_DEVICE_ERR = (1 << 1),
133 INT_ON_CMD_COMPLETE = 1, 133 INT_ON_CMD_COMPLETE = 1,
134 134
135 INT_ON_ERROR = INT_ON_FATAL_ERR | 135 INT_ON_ERROR = INT_ON_FATAL_ERR | INT_ON_SNOTIFY_UPDATE |
136 INT_ON_PHYRDY_CHG | INT_ON_SINGL_DEVICE_ERR, 136 INT_ON_PHYRDY_CHG | INT_ON_SINGL_DEVICE_ERR,
137 137
138 /* 138 /*
@@ -153,7 +153,7 @@ enum {
153 IE_ON_CMD_COMPLETE = 1, 153 IE_ON_CMD_COMPLETE = 1,
154 154
155 DEFAULT_PORT_IRQ_ENABLE_MASK = IE_ON_FATAL_ERR | IE_ON_PHYRDY_CHG | 155 DEFAULT_PORT_IRQ_ENABLE_MASK = IE_ON_FATAL_ERR | IE_ON_PHYRDY_CHG |
156 IE_ON_SIGNATURE_UPDATE | 156 IE_ON_SIGNATURE_UPDATE | IE_ON_SNOTIFY_UPDATE |
157 IE_ON_SINGL_DEVICE_ERR | IE_ON_CMD_COMPLETE, 157 IE_ON_SINGL_DEVICE_ERR | IE_ON_CMD_COMPLETE,
158 158
159 EXT_INDIRECT_SEG_PRD_FLAG = (1 << 31), 159 EXT_INDIRECT_SEG_PRD_FLAG = (1 << 31),
@@ -992,9 +992,8 @@ static void sata_fsl_error_intr(struct ata_port *ap)
992 */ 992 */
993 993
994 sata_fsl_scr_read(&ap->link, SCR_ERROR, &SError); 994 sata_fsl_scr_read(&ap->link, SCR_ERROR, &SError);
995 if (unlikely(SError & 0xFFFF0000)) { 995 if (unlikely(SError & 0xFFFF0000))
996 sata_fsl_scr_write(&ap->link, SCR_ERROR, SError); 996 sata_fsl_scr_write(&ap->link, SCR_ERROR, SError);
997 }
998 997
999 DPRINTK("error_intr,hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n", 998 DPRINTK("error_intr,hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n",
1000 hstatus, cereg, ioread32(hcr_base + DE), SError); 999 hstatus, cereg, ioread32(hcr_base + DE), SError);
@@ -1007,6 +1006,10 @@ static void sata_fsl_error_intr(struct ata_port *ap)
1007 freeze = 1; 1006 freeze = 1;
1008 } 1007 }
1009 1008
1009 /* Handle SDB FIS receive & notify update */
1010 if (hstatus & INT_ON_SNOTIFY_UPDATE)
1011 sata_async_notification(ap);
1012
1010 /* Handle PHYRDY change notification */ 1013 /* Handle PHYRDY change notification */
1011 if (hstatus & INT_ON_PHYRDY_CHG) { 1014 if (hstatus & INT_ON_PHYRDY_CHG) {
1012 DPRINTK("SATA FSL: PHYRDY change indication\n"); 1015 DPRINTK("SATA FSL: PHYRDY change indication\n");
@@ -1070,9 +1073,9 @@ static void sata_fsl_error_intr(struct ata_port *ap)
1070 } 1073 }
1071 1074
1072 /* record error info */ 1075 /* record error info */
1073 if (qc) { 1076 if (qc)
1074 qc->err_mask |= err_mask; 1077 qc->err_mask |= err_mask;
1075 } else 1078 else
1076 ehi->err_mask |= err_mask; 1079 ehi->err_mask |= err_mask;
1077 1080
1078 ehi->action |= action; 1081 ehi->action |= action;
@@ -1103,7 +1106,6 @@ static void sata_fsl_host_intr(struct ata_port *ap)
1103 if (unlikely(SError & 0xFFFF0000)) { 1106 if (unlikely(SError & 0xFFFF0000)) {
1104 DPRINTK("serror @host_intr : 0x%x\n", SError); 1107 DPRINTK("serror @host_intr : 0x%x\n", SError);
1105 sata_fsl_error_intr(ap); 1108 sata_fsl_error_intr(ap);
1106
1107 } 1109 }
1108 1110
1109 if (unlikely(hstatus & INT_ON_ERROR)) { 1111 if (unlikely(hstatus & INT_ON_ERROR)) {