mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
[PATCH] sata_sil24: convert to new probing mechanism and add hotplug support
Convert to new probing mechanism and add hotplug support by enabling PORT_IRQ_PHYRDY_CHG, marking ehi for hotplug and scheduling EH on PORT_IRQ_PHYRDY_CHG or PORT_IRQ_DEV_XCHG. Sil3124/32 family of controllers don't have any mechanism to wait for the first D2H FIS after hotplug, so ATA_FLAG_SKIP_D2H_BSY is used. Signed-off-by: Tejun Heo <htejun@gmail.com>
This commit is contained in:
parent
4296971dd3
commit
0542925b25
@ -159,7 +159,8 @@ enum {
|
|||||||
PORT_IRQ_SDB_NOTIFY = (1 << 11), /* SDB notify received */
|
PORT_IRQ_SDB_NOTIFY = (1 << 11), /* SDB notify received */
|
||||||
|
|
||||||
DEF_PORT_IRQ = PORT_IRQ_COMPLETE | PORT_IRQ_ERROR |
|
DEF_PORT_IRQ = PORT_IRQ_COMPLETE | PORT_IRQ_ERROR |
|
||||||
PORT_IRQ_DEV_XCHG | PORT_IRQ_UNK_FIS,
|
PORT_IRQ_PHYRDY_CHG | PORT_IRQ_DEV_XCHG |
|
||||||
|
PORT_IRQ_UNK_FIS,
|
||||||
|
|
||||||
/* bits[27:16] are unmasked (raw) */
|
/* bits[27:16] are unmasked (raw) */
|
||||||
PORT_IRQ_RAW_SHIFT = 16,
|
PORT_IRQ_RAW_SHIFT = 16,
|
||||||
@ -228,7 +229,7 @@ enum {
|
|||||||
/* host flags */
|
/* host flags */
|
||||||
SIL24_COMMON_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
SIL24_COMMON_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
|
||||||
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
|
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
|
||||||
ATA_FLAG_NCQ,
|
ATA_FLAG_NCQ | ATA_FLAG_SKIP_D2H_BSY,
|
||||||
SIL24_FLAG_PCIX_IRQ_WOC = (1 << 24), /* IRQ loss errata on PCI-X */
|
SIL24_FLAG_PCIX_IRQ_WOC = (1 << 24), /* IRQ loss errata on PCI-X */
|
||||||
|
|
||||||
IRQ_STAT_4PORTS = 0xf,
|
IRQ_STAT_4PORTS = 0xf,
|
||||||
@ -325,7 +326,6 @@ static u8 sil24_check_status(struct ata_port *ap);
|
|||||||
static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg);
|
static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg);
|
||||||
static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val);
|
static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val);
|
||||||
static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
|
static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf);
|
||||||
static int sil24_probe_reset(struct ata_port *ap, unsigned int *classes);
|
|
||||||
static void sil24_qc_prep(struct ata_queued_cmd *qc);
|
static void sil24_qc_prep(struct ata_queued_cmd *qc);
|
||||||
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc);
|
static unsigned int sil24_qc_issue(struct ata_queued_cmd *qc);
|
||||||
static void sil24_irq_clear(struct ata_port *ap);
|
static void sil24_irq_clear(struct ata_port *ap);
|
||||||
@ -385,8 +385,6 @@ static const struct ata_port_operations sil24_ops = {
|
|||||||
|
|
||||||
.tf_read = sil24_tf_read,
|
.tf_read = sil24_tf_read,
|
||||||
|
|
||||||
.probe_reset = sil24_probe_reset,
|
|
||||||
|
|
||||||
.qc_prep = sil24_qc_prep,
|
.qc_prep = sil24_qc_prep,
|
||||||
.qc_issue = sil24_qc_issue,
|
.qc_issue = sil24_qc_issue,
|
||||||
|
|
||||||
@ -635,13 +633,6 @@ static int sil24_hardreset(struct ata_port *ap, unsigned int *class)
|
|||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sil24_probe_reset(struct ata_port *ap, unsigned int *classes)
|
|
||||||
{
|
|
||||||
return ata_drive_probe_reset(ap, ata_std_probeinit,
|
|
||||||
sil24_softreset, sil24_hardreset,
|
|
||||||
ata_std_postreset, classes);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void sil24_fill_sg(struct ata_queued_cmd *qc,
|
static inline void sil24_fill_sg(struct ata_queued_cmd *qc,
|
||||||
struct sil24_sge *sge)
|
struct sil24_sge *sge)
|
||||||
{
|
{
|
||||||
@ -772,13 +763,11 @@ static void sil24_error_intr(struct ata_port *ap)
|
|||||||
|
|
||||||
ata_ehi_push_desc(ehi, "irq_stat 0x%08x", irq_stat);
|
ata_ehi_push_desc(ehi, "irq_stat 0x%08x", irq_stat);
|
||||||
|
|
||||||
if (irq_stat & PORT_IRQ_DEV_XCHG) {
|
if (irq_stat & (PORT_IRQ_PHYRDY_CHG | PORT_IRQ_DEV_XCHG)) {
|
||||||
ehi->err_mask |= AC_ERR_ATA_BUS;
|
ata_ehi_hotplugged(ehi);
|
||||||
/* sil24 doesn't recover very well from phy
|
ata_ehi_push_desc(ehi, ", %s",
|
||||||
* disconnection with a softreset. Force hardreset.
|
irq_stat & PORT_IRQ_PHYRDY_CHG ?
|
||||||
*/
|
"PHY RDY changed" : "device exchanged");
|
||||||
ehi->action |= ATA_EH_HARDRESET;
|
|
||||||
ata_ehi_push_desc(ehi, ", device_exchanged");
|
|
||||||
freeze = 1;
|
freeze = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user