|
@@ -500,7 +500,7 @@ static int pdc_sata_scr_write(struct ata_link *link,
|
|
static void pdc_atapi_pkt(struct ata_queued_cmd *qc)
|
|
static void pdc_atapi_pkt(struct ata_queued_cmd *qc)
|
|
{
|
|
{
|
|
struct ata_port *ap = qc->ap;
|
|
struct ata_port *ap = qc->ap;
|
|
- dma_addr_t sg_table = ap->prd_dma;
|
|
|
|
|
|
+ dma_addr_t sg_table = ap->bmdma_prd_dma;
|
|
unsigned int cdb_len = qc->dev->cdb_len;
|
|
unsigned int cdb_len = qc->dev->cdb_len;
|
|
u8 *cdb = qc->cdb;
|
|
u8 *cdb = qc->cdb;
|
|
struct pdc_port_priv *pp = ap->private_data;
|
|
struct pdc_port_priv *pp = ap->private_data;
|
|
@@ -588,6 +588,7 @@ static void pdc_atapi_pkt(struct ata_queued_cmd *qc)
|
|
static void pdc_fill_sg(struct ata_queued_cmd *qc)
|
|
static void pdc_fill_sg(struct ata_queued_cmd *qc)
|
|
{
|
|
{
|
|
struct ata_port *ap = qc->ap;
|
|
struct ata_port *ap = qc->ap;
|
|
|
|
+ struct ata_bmdma_prd *prd = ap->bmdma_prd;
|
|
struct scatterlist *sg;
|
|
struct scatterlist *sg;
|
|
const u32 SG_COUNT_ASIC_BUG = 41*4;
|
|
const u32 SG_COUNT_ASIC_BUG = 41*4;
|
|
unsigned int si, idx;
|
|
unsigned int si, idx;
|
|
@@ -614,8 +615,8 @@ static void pdc_fill_sg(struct ata_queued_cmd *qc)
|
|
if ((offset + sg_len) > 0x10000)
|
|
if ((offset + sg_len) > 0x10000)
|
|
len = 0x10000 - offset;
|
|
len = 0x10000 - offset;
|
|
|
|
|
|
- ap->prd[idx].addr = cpu_to_le32(addr);
|
|
|
|
- ap->prd[idx].flags_len = cpu_to_le32(len & 0xffff);
|
|
|
|
|
|
+ prd[idx].addr = cpu_to_le32(addr);
|
|
|
|
+ prd[idx].flags_len = cpu_to_le32(len & 0xffff);
|
|
VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
|
|
VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
|
|
|
|
|
|
idx++;
|
|
idx++;
|
|
@@ -624,27 +625,27 @@ static void pdc_fill_sg(struct ata_queued_cmd *qc)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- len = le32_to_cpu(ap->prd[idx - 1].flags_len);
|
|
|
|
|
|
+ len = le32_to_cpu(prd[idx - 1].flags_len);
|
|
|
|
|
|
if (len > SG_COUNT_ASIC_BUG) {
|
|
if (len > SG_COUNT_ASIC_BUG) {
|
|
u32 addr;
|
|
u32 addr;
|
|
|
|
|
|
VPRINTK("Splitting last PRD.\n");
|
|
VPRINTK("Splitting last PRD.\n");
|
|
|
|
|
|
- addr = le32_to_cpu(ap->prd[idx - 1].addr);
|
|
|
|
- ap->prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG);
|
|
|
|
|
|
+ addr = le32_to_cpu(prd[idx - 1].addr);
|
|
|
|
+ prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG);
|
|
VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx - 1, addr, SG_COUNT_ASIC_BUG);
|
|
VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx - 1, addr, SG_COUNT_ASIC_BUG);
|
|
|
|
|
|
addr = addr + len - SG_COUNT_ASIC_BUG;
|
|
addr = addr + len - SG_COUNT_ASIC_BUG;
|
|
len = SG_COUNT_ASIC_BUG;
|
|
len = SG_COUNT_ASIC_BUG;
|
|
- ap->prd[idx].addr = cpu_to_le32(addr);
|
|
|
|
- ap->prd[idx].flags_len = cpu_to_le32(len);
|
|
|
|
|
|
+ prd[idx].addr = cpu_to_le32(addr);
|
|
|
|
+ prd[idx].flags_len = cpu_to_le32(len);
|
|
VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
|
|
VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
|
|
|
|
|
|
idx++;
|
|
idx++;
|
|
}
|
|
}
|
|
|
|
|
|
- ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
|
|
|
|
|
+ prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
|
|
}
|
|
}
|
|
|
|
|
|
static void pdc_qc_prep(struct ata_queued_cmd *qc)
|
|
static void pdc_qc_prep(struct ata_queued_cmd *qc)
|
|
@@ -659,7 +660,7 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
|
|
pdc_fill_sg(qc);
|
|
pdc_fill_sg(qc);
|
|
/*FALLTHROUGH*/
|
|
/*FALLTHROUGH*/
|
|
case ATA_PROT_NODATA:
|
|
case ATA_PROT_NODATA:
|
|
- i = pdc_pkt_header(&qc->tf, qc->ap->prd_dma,
|
|
|
|
|
|
+ i = pdc_pkt_header(&qc->tf, qc->ap->bmdma_prd_dma,
|
|
qc->dev->devno, pp->pkt);
|
|
qc->dev->devno, pp->pkt);
|
|
if (qc->tf.flags & ATA_TFLAG_LBA48)
|
|
if (qc->tf.flags & ATA_TFLAG_LBA48)
|
|
i = pdc_prep_lba48(&qc->tf, pp->pkt, i);
|
|
i = pdc_prep_lba48(&qc->tf, pp->pkt, i);
|