Merge branch 'mv-merge'
Conflicts: drivers/scsi/sata_mv.c
This commit is contained in:
commit
55d8ca4f80
1 changed files with 24 additions and 18 deletions
|
@ -1010,7 +1010,7 @@ static void mv_fill_sg(struct ata_queued_cmd *qc)
|
||||||
|
|
||||||
pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff);
|
pp->sg_tbl[i].addr = cpu_to_le32(addr & 0xffffffff);
|
||||||
pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16);
|
pp->sg_tbl[i].addr_hi = cpu_to_le32((addr >> 16) >> 16);
|
||||||
pp->sg_tbl[i].flags_size = cpu_to_le32(len);
|
pp->sg_tbl[i].flags_size = cpu_to_le32(len & 0xffff);
|
||||||
|
|
||||||
sg_len -= len;
|
sg_len -= len;
|
||||||
addr += len;
|
addr += len;
|
||||||
|
@ -1350,7 +1350,6 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
|
||||||
{
|
{
|
||||||
void __iomem *mmio = host_set->mmio_base;
|
void __iomem *mmio = host_set->mmio_base;
|
||||||
void __iomem *hc_mmio = mv_hc_base(mmio, hc);
|
void __iomem *hc_mmio = mv_hc_base(mmio, hc);
|
||||||
struct ata_port *ap;
|
|
||||||
struct ata_queued_cmd *qc;
|
struct ata_queued_cmd *qc;
|
||||||
u32 hc_irq_cause;
|
u32 hc_irq_cause;
|
||||||
int shift, port, port0, hard_port, handled;
|
int shift, port, port0, hard_port, handled;
|
||||||
|
@ -1373,25 +1372,32 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
|
||||||
|
|
||||||
for (port = port0; port < port0 + MV_PORTS_PER_HC; port++) {
|
for (port = port0; port < port0 + MV_PORTS_PER_HC; port++) {
|
||||||
u8 ata_status = 0;
|
u8 ata_status = 0;
|
||||||
ap = host_set->ports[port];
|
struct ata_port *ap = host_set->ports[port];
|
||||||
|
struct mv_port_priv *pp = ap->private_data;
|
||||||
|
|
||||||
hard_port = port & MV_PORT_MASK; /* range 0-3 */
|
hard_port = port & MV_PORT_MASK; /* range 0-3 */
|
||||||
handled = 0; /* ensure ata_status is set if handled++ */
|
handled = 0; /* ensure ata_status is set if handled++ */
|
||||||
|
|
||||||
if ((CRPB_DMA_DONE << hard_port) & hc_irq_cause) {
|
/* Note that DEV_IRQ might happen spuriously during EDMA,
|
||||||
/* new CRPB on the queue; just one at a time until NCQ
|
* and should be ignored in such cases. We could mask it,
|
||||||
*/
|
* but it's pretty rare and may not be worth the overhead.
|
||||||
ata_status = mv_get_crpb_status(ap);
|
*/
|
||||||
handled++;
|
if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) {
|
||||||
} else if ((DEV_IRQ << hard_port) & hc_irq_cause) {
|
/* EDMA: check for response queue interrupt */
|
||||||
/* received ATA IRQ; read the status reg to clear INTRQ
|
if ((CRPB_DMA_DONE << hard_port) & hc_irq_cause) {
|
||||||
*/
|
ata_status = mv_get_crpb_status(ap);
|
||||||
ata_status = readb((void __iomem *)
|
handled = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* PIO: check for device (drive) interrupt */
|
||||||
|
if ((DEV_IRQ << hard_port) & hc_irq_cause) {
|
||||||
|
ata_status = readb((void __iomem *)
|
||||||
ap->ioaddr.status_addr);
|
ap->ioaddr.status_addr);
|
||||||
handled++;
|
handled = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ap &&
|
if (ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR))
|
||||||
(ap->flags & (ATA_FLAG_PORT_DISABLED | ATA_FLAG_NOINTR)))
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
err_mask = ac_err_mask(ata_status);
|
err_mask = ac_err_mask(ata_status);
|
||||||
|
@ -1403,12 +1409,12 @@ static void mv_host_intr(struct ata_host_set *host_set, u32 relevant,
|
||||||
if ((PORT0_ERR << shift) & relevant) {
|
if ((PORT0_ERR << shift) & relevant) {
|
||||||
mv_err_intr(ap);
|
mv_err_intr(ap);
|
||||||
err_mask |= AC_ERR_OTHER;
|
err_mask |= AC_ERR_OTHER;
|
||||||
handled++;
|
handled = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handled && ap) {
|
if (handled) {
|
||||||
qc = ata_qc_from_tag(ap, ap->active_tag);
|
qc = ata_qc_from_tag(ap, ap->active_tag);
|
||||||
if (NULL != qc) {
|
if (qc && (qc->flags & ATA_QCFLAG_ACTIVE)) {
|
||||||
VPRINTK("port %u IRQ found for qc, "
|
VPRINTK("port %u IRQ found for qc, "
|
||||||
"ata_status 0x%x\n", port,ata_status);
|
"ata_status 0x%x\n", port,ata_status);
|
||||||
/* mark qc status appropriately */
|
/* mark qc status appropriately */
|
||||||
|
|
Loading…
Add table
Reference in a new issue