Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev: sata_mv: safer logic for limit_warnings libata-sff: improve HSM violation reporting ahci: always clear all bits in irq_stat sata_sil24: add DID for another adaptec flavor sata_uli: hardreset is broken
This commit is contained in:
commit
a926c06373
|
@ -1777,7 +1777,7 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
|
|||
struct ahci_host_priv *hpriv;
|
||||
unsigned int i, handled = 0;
|
||||
void __iomem *mmio;
|
||||
u32 irq_stat, irq_ack = 0;
|
||||
u32 irq_stat;
|
||||
|
||||
VPRINTK("ENTER\n");
|
||||
|
||||
|
@ -1809,14 +1809,11 @@ static irqreturn_t ahci_interrupt(int irq, void *dev_instance)
|
|||
"interrupt on disabled port %u\n", i);
|
||||
}
|
||||
|
||||
irq_ack |= (1 << i);
|
||||
}
|
||||
|
||||
if (irq_ack) {
|
||||
writel(irq_ack, mmio + HOST_IRQ_STAT);
|
||||
handled = 1;
|
||||
}
|
||||
|
||||
writel(irq_stat, mmio + HOST_IRQ_STAT);
|
||||
|
||||
spin_unlock(&host->lock);
|
||||
|
||||
VPRINTK("EXIT\n");
|
||||
|
|
|
@ -1094,6 +1094,7 @@ static void ata_hsm_qc_complete(struct ata_queued_cmd *qc, int in_wq)
|
|||
int ata_sff_hsm_move(struct ata_port *ap, struct ata_queued_cmd *qc,
|
||||
u8 status, int in_wq)
|
||||
{
|
||||
struct ata_eh_info *ehi = &ap->link.eh_info;
|
||||
unsigned long flags = 0;
|
||||
int poll_next;
|
||||
|
||||
|
@ -1125,9 +1126,12 @@ fsm_start:
|
|||
if (likely(status & (ATA_ERR | ATA_DF)))
|
||||
/* device stops HSM for abort/error */
|
||||
qc->err_mask |= AC_ERR_DEV;
|
||||
else
|
||||
else {
|
||||
/* HSM violation. Let EH handle this */
|
||||
ata_ehi_push_desc(ehi,
|
||||
"ST_FIRST: !(DRQ|ERR|DF)");
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
}
|
||||
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
|
@ -1146,9 +1150,9 @@ fsm_start:
|
|||
* the CDB.
|
||||
*/
|
||||
if (!(qc->dev->horkage & ATA_HORKAGE_STUCK_ERR)) {
|
||||
ata_port_printk(ap, KERN_WARNING,
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X\n", status);
|
||||
ata_ehi_push_desc(ehi, "ST_FIRST: "
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
|
@ -1205,9 +1209,9 @@ fsm_start:
|
|||
* let the EH abort the command or reset the device.
|
||||
*/
|
||||
if (unlikely(status & (ATA_ERR | ATA_DF))) {
|
||||
ata_port_printk(ap, KERN_WARNING, "DRQ=1 with "
|
||||
"device error, dev_stat 0x%X\n",
|
||||
status);
|
||||
ata_ehi_push_desc(ehi, "ST-ATAPI: "
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
|
@ -1226,13 +1230,17 @@ fsm_start:
|
|||
if (likely(status & (ATA_ERR | ATA_DF)))
|
||||
/* device stops HSM for abort/error */
|
||||
qc->err_mask |= AC_ERR_DEV;
|
||||
else
|
||||
else {
|
||||
/* HSM violation. Let EH handle this.
|
||||
* Phantom devices also trigger this
|
||||
* condition. Mark hint.
|
||||
*/
|
||||
ata_ehi_push_desc(ehi, "ST-ATA: "
|
||||
"DRQ=1 with device error, "
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM |
|
||||
AC_ERR_NODEV_HINT;
|
||||
}
|
||||
|
||||
ap->hsm_task_state = HSM_ST_ERR;
|
||||
goto fsm_start;
|
||||
|
@ -1257,8 +1265,12 @@ fsm_start:
|
|||
status = ata_wait_idle(ap);
|
||||
}
|
||||
|
||||
if (status & (ATA_BUSY | ATA_DRQ))
|
||||
if (status & (ATA_BUSY | ATA_DRQ)) {
|
||||
ata_ehi_push_desc(ehi, "ST-ATA: "
|
||||
"BUSY|DRQ persists on ERR|DF, "
|
||||
"dev_stat 0x%X", status);
|
||||
qc->err_mask |= AC_ERR_HSM;
|
||||
}
|
||||
|
||||
/* ata_pio_sectors() might change the
|
||||
* state to HSM_ST_LAST. so, the state
|
||||
|
|
|
@ -1607,7 +1607,7 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc)
|
|||
* Much of the time, this could just work regardless.
|
||||
* So for now, just log the incident, and allow the attempt.
|
||||
*/
|
||||
if (limit_warnings && (qc->nbytes / qc->sect_size) > 1) {
|
||||
if (limit_warnings > 0 && (qc->nbytes / qc->sect_size) > 1) {
|
||||
--limit_warnings;
|
||||
ata_link_printk(qc->dev->link, KERN_WARNING, DRV_NAME
|
||||
": attempting PIO w/multiple DRQ: "
|
||||
|
|
|
@ -370,6 +370,7 @@ static const struct pci_device_id sil24_pci_tbl[] = {
|
|||
{ PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 },
|
||||
{ PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 },
|
||||
{ PCI_VDEVICE(CMD, 0x0242), BID_SIL3132 },
|
||||
{ PCI_VDEVICE(CMD, 0x0244), BID_SIL3132 },
|
||||
{ PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 },
|
||||
{ PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 },
|
||||
|
||||
|
|
|
@ -83,6 +83,7 @@ static struct ata_port_operations uli_ops = {
|
|||
.inherits = &ata_bmdma_port_ops,
|
||||
.scr_read = uli_scr_read,
|
||||
.scr_write = uli_scr_write,
|
||||
.hardreset = ATA_OP_NULL,
|
||||
};
|
||||
|
||||
static const struct ata_port_info uli_port_info = {
|
||||
|
|
Loading…
Reference in New Issue