Merge branch 'upstream-fixes' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev

+34 -4
+4 -3
drivers/scsi/libata-core.c
··· 614 614 } else if (lba48 && (qc->ap->flags & ATA_FLAG_PIO_LBA48)) { 615 615 /* Unable to use DMA due to host limitation */ 616 616 tf->protocol = ATA_PROT_PIO; 617 - index = dev->multi_count ? 0 : 4; 617 + index = dev->multi_count ? 0 : 8; 618 618 } else { 619 619 tf->protocol = ATA_PROT_DMA; 620 620 index = 16; ··· 3357 3357 { 3358 3358 struct ata_queued_cmd *qc; 3359 3359 3360 - printk(KERN_WARNING "ata%u: PIO error\n", ap->id); 3361 - 3362 3360 qc = ata_qc_from_tag(ap, ap->active_tag); 3363 3361 assert(qc != NULL); 3362 + 3363 + if (qc->tf.command != ATA_CMD_PACKET) 3364 + printk(KERN_WARNING "ata%u: PIO error\n", ap->id); 3364 3365 3365 3366 /* make sure qc->err_mask is available to 3366 3367 * know what's wrong and recover
+1
drivers/scsi/sata_mv.c
··· 997 997 case ATA_CMD_READ_EXT: 998 998 case ATA_CMD_WRITE: 999 999 case ATA_CMD_WRITE_EXT: 1000 + case ATA_CMD_WRITE_FUA_EXT: 1000 1001 mv_crqb_pack_cmd(cw++, tf->hob_nsect, ATA_REG_NSECT, 0); 1001 1002 break; 1002 1003 #ifdef LIBATA_NCQ /* FIXME: remove this line when NCQ added */
+29 -1
drivers/scsi/sata_vsc.c
··· 81 81 /* Port stride */ 82 82 #define VSC_SATA_PORT_OFFSET 0x200 83 83 84 + /* Error interrupt status bit offsets */ 85 + #define VSC_SATA_INT_ERROR_E_OFFSET 2 86 + #define VSC_SATA_INT_ERROR_P_OFFSET 4 87 + #define VSC_SATA_INT_ERROR_T_OFFSET 5 88 + #define VSC_SATA_INT_ERROR_M_OFFSET 1 89 + #define is_vsc_sata_int_err(port_idx, int_status) \ 90 + (int_status & ((1 << (VSC_SATA_INT_ERROR_E_OFFSET + (8 * port_idx))) | \ 91 + (1 << (VSC_SATA_INT_ERROR_P_OFFSET + (8 * port_idx))) | \ 92 + (1 << (VSC_SATA_INT_ERROR_T_OFFSET + (8 * port_idx))) | \ 93 + (1 << (VSC_SATA_INT_ERROR_M_OFFSET + (8 * port_idx))) \ 94 + )\ 95 + ) 96 + 84 97 85 98 static u32 vsc_sata_scr_read (struct ata_port *ap, unsigned int sc_reg) 86 99 { ··· 214 201 struct ata_port *ap; 215 202 216 203 ap = host_set->ports[i]; 204 + 205 + if (is_vsc_sata_int_err(i, int_status)) { 206 + u32 err_status; 207 + printk(KERN_DEBUG "%s: ignoring interrupt(s)\n", __FUNCTION__); 208 + err_status = ap ? vsc_sata_scr_read(ap, SCR_ERROR) : 0; 209 + vsc_sata_scr_write(ap, SCR_ERROR, err_status); 210 + handled++; 211 + } 212 + 217 213 if (ap && !(ap->flags & 218 214 (ATA_FLAG_PORT_DISABLED|ATA_FLAG_NOINTR))) { 219 215 struct ata_queued_cmd *qc; 220 216 221 217 qc = ata_qc_from_tag(ap, ap->active_tag); 222 - if (qc && (!(qc->tf.ctl & ATA_NIEN))) 218 + if (qc && (!(qc->tf.ctl & ATA_NIEN))) { 223 219 handled += ata_host_intr(ap, qc); 220 + } else { 221 + printk(KERN_DEBUG "%s: ignoring interrupt(s)\n", __FUNCTION__); 222 + ata_chk_status(ap); 223 + handled++; 224 + } 225 + 224 226 } 225 227 } 226 228 }