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>
This commit is contained in:
parent
10a9c96922
commit
fd6c29e3de
@ -34,7 +34,7 @@ enum {
|
|||||||
|
|
||||||
SATA_FSL_HOST_FLAGS = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
SATA_FSL_HOST_FLAGS = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
||||||
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
|
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
|
||||||
ATA_FLAG_PMP | ATA_FLAG_NCQ),
|
ATA_FLAG_PMP | ATA_FLAG_NCQ | ATA_FLAG_AN),
|
||||||
|
|
||||||
SATA_FSL_MAX_CMDS = SATA_FSL_QUEUE_DEPTH,
|
SATA_FSL_MAX_CMDS = SATA_FSL_QUEUE_DEPTH,
|
||||||
SATA_FSL_CMD_HDR_SIZE = 16, /* 4 DWORDS */
|
SATA_FSL_CMD_HDR_SIZE = 16, /* 4 DWORDS */
|
||||||
@ -132,7 +132,7 @@ enum {
|
|||||||
INT_ON_SINGL_DEVICE_ERR = (1 << 1),
|
INT_ON_SINGL_DEVICE_ERR = (1 << 1),
|
||||||
INT_ON_CMD_COMPLETE = 1,
|
INT_ON_CMD_COMPLETE = 1,
|
||||||
|
|
||||||
INT_ON_ERROR = INT_ON_FATAL_ERR |
|
INT_ON_ERROR = INT_ON_FATAL_ERR | INT_ON_SNOTIFY_UPDATE |
|
||||||
INT_ON_PHYRDY_CHG | INT_ON_SINGL_DEVICE_ERR,
|
INT_ON_PHYRDY_CHG | INT_ON_SINGL_DEVICE_ERR,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -153,7 +153,7 @@ enum {
|
|||||||
IE_ON_CMD_COMPLETE = 1,
|
IE_ON_CMD_COMPLETE = 1,
|
||||||
|
|
||||||
DEFAULT_PORT_IRQ_ENABLE_MASK = IE_ON_FATAL_ERR | IE_ON_PHYRDY_CHG |
|
DEFAULT_PORT_IRQ_ENABLE_MASK = IE_ON_FATAL_ERR | IE_ON_PHYRDY_CHG |
|
||||||
IE_ON_SIGNATURE_UPDATE |
|
IE_ON_SIGNATURE_UPDATE | IE_ON_SNOTIFY_UPDATE |
|
||||||
IE_ON_SINGL_DEVICE_ERR | IE_ON_CMD_COMPLETE,
|
IE_ON_SINGL_DEVICE_ERR | IE_ON_CMD_COMPLETE,
|
||||||
|
|
||||||
EXT_INDIRECT_SEG_PRD_FLAG = (1 << 31),
|
EXT_INDIRECT_SEG_PRD_FLAG = (1 << 31),
|
||||||
@ -992,9 +992,8 @@ static void sata_fsl_error_intr(struct ata_port *ap)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
sata_fsl_scr_read(&ap->link, SCR_ERROR, &SError);
|
sata_fsl_scr_read(&ap->link, SCR_ERROR, &SError);
|
||||||
if (unlikely(SError & 0xFFFF0000)) {
|
if (unlikely(SError & 0xFFFF0000))
|
||||||
sata_fsl_scr_write(&ap->link, SCR_ERROR, SError);
|
sata_fsl_scr_write(&ap->link, SCR_ERROR, SError);
|
||||||
}
|
|
||||||
|
|
||||||
DPRINTK("error_intr,hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n",
|
DPRINTK("error_intr,hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n",
|
||||||
hstatus, cereg, ioread32(hcr_base + DE), SError);
|
hstatus, cereg, ioread32(hcr_base + DE), SError);
|
||||||
@ -1007,6 +1006,10 @@ static void sata_fsl_error_intr(struct ata_port *ap)
|
|||||||
freeze = 1;
|
freeze = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handle SDB FIS receive & notify update */
|
||||||
|
if (hstatus & INT_ON_SNOTIFY_UPDATE)
|
||||||
|
sata_async_notification(ap);
|
||||||
|
|
||||||
/* Handle PHYRDY change notification */
|
/* Handle PHYRDY change notification */
|
||||||
if (hstatus & INT_ON_PHYRDY_CHG) {
|
if (hstatus & INT_ON_PHYRDY_CHG) {
|
||||||
DPRINTK("SATA FSL: PHYRDY change indication\n");
|
DPRINTK("SATA FSL: PHYRDY change indication\n");
|
||||||
@ -1070,9 +1073,9 @@ static void sata_fsl_error_intr(struct ata_port *ap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* record error info */
|
/* record error info */
|
||||||
if (qc) {
|
if (qc)
|
||||||
qc->err_mask |= err_mask;
|
qc->err_mask |= err_mask;
|
||||||
} else
|
else
|
||||||
ehi->err_mask |= err_mask;
|
ehi->err_mask |= err_mask;
|
||||||
|
|
||||||
ehi->action |= action;
|
ehi->action |= action;
|
||||||
@ -1103,7 +1106,6 @@ static void sata_fsl_host_intr(struct ata_port *ap)
|
|||||||
if (unlikely(SError & 0xFFFF0000)) {
|
if (unlikely(SError & 0xFFFF0000)) {
|
||||||
DPRINTK("serror @host_intr : 0x%x\n", SError);
|
DPRINTK("serror @host_intr : 0x%x\n", SError);
|
||||||
sata_fsl_error_intr(ap);
|
sata_fsl_error_intr(ap);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(hstatus & INT_ON_ERROR)) {
|
if (unlikely(hstatus & INT_ON_ERROR)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user