Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 806a6e7a authored by Mark Lord's avatar Mark Lord Committed by Jeff Garzik
Browse files

[libata] sata_mv: off-by-1 fix



This patch addresses a number of weird behaviours observed
for the sata_mv driver, by fixing an "off by one" bug in processing
of the EDMA response queue.

Basically, sata_mv was looking in the wrong place for
command results, and this produced a lot of unpredictable behaviour.

Signed-off-by: default avatarMark Lord <mlord@pobox.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent a6cce2a7
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1263,6 +1263,7 @@ static u8 mv_get_crpb_status(struct ata_port *ap)
	void __iomem *port_mmio = mv_ap_base(ap);
	struct mv_port_priv *pp = ap->private_data;
	u32 out_ptr;
	u8 ata_status;

	out_ptr = readl(port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);

@@ -1270,6 +1271,8 @@ static u8 mv_get_crpb_status(struct ata_port *ap)
	WARN_ON(((out_ptr >> EDMA_RSP_Q_PTR_SHIFT) & MV_MAX_Q_DEPTH_MASK) !=
		pp->rsp_consumer);

	ata_status = pp->crpb[pp->rsp_consumer].flags >> CRPB_FLAG_STATUS_SHIFT;

	/* increment our consumer index... */
	pp->rsp_consumer = mv_inc_q_index(&pp->rsp_consumer);

@@ -1284,7 +1287,7 @@ static u8 mv_get_crpb_status(struct ata_port *ap)
	writelfl(out_ptr, port_mmio + EDMA_RSP_Q_OUT_PTR_OFS);

	/* Return ATA status register for completed CRPB */
	return (pp->crpb[pp->rsp_consumer].flags >> CRPB_FLAG_STATUS_SHIFT);
	return ata_status;
}

/**