diff options
author | ashish kalra <ashish.kalra@freescale.com> | 2009-07-01 11:29:43 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2009-12-03 02:46:35 -0500 |
commit | fd6c29e3dec9e44ecbcba3c57efa08af70a10f1e (patch) | |
tree | 5f6dd6af334b867286c6b258176a7723680bda3a /drivers/ata/sata_fsl.c | |
parent | 10a9c969222de5302cff0bb41dd7f114f9aa8e5d (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.c | 18 |
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)) { |