Commit b5683557 authored by James Bottomley's avatar James Bottomley

[SCSI] atp870u: fix memory addressing bug

From: Alan Cox <alan@redhat.com>

The virt_to_bus() wasn't correctly taken out of this driver.  It needs
to be able to track both physical and virtual addresses for its prd table.
Update the driver to do this with separate tracking entries.
Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 59897dad
...@@ -996,6 +996,7 @@ static void send_s870(struct atp_unit *dev,unsigned char c) ...@@ -996,6 +996,7 @@ static void send_s870(struct atp_unit *dev,unsigned char c)
#ifdef ED_DBGP #ifdef ED_DBGP
printk("send_s870: prdaddr_2 0x%8x tmpcip %x target_id %d\n", dev->id[c][target_id].prdaddr,tmpcip,target_id); printk("send_s870: prdaddr_2 0x%8x tmpcip %x target_id %d\n", dev->id[c][target_id].prdaddr,tmpcip,target_id);
#endif #endif
dev->id[c][target_id].prdaddr = dev->id[c][target_id].prd_bus;
outl(dev->id[c][target_id].prdaddr, tmpcip); outl(dev->id[c][target_id].prdaddr, tmpcip);
tmpcip = tmpcip - 2; tmpcip = tmpcip - 2;
outb(0x06, tmpcip); outb(0x06, tmpcip);
...@@ -2572,7 +2573,7 @@ static void atp870u_free_tables(struct Scsi_Host *host) ...@@ -2572,7 +2573,7 @@ static void atp870u_free_tables(struct Scsi_Host *host)
for (k = 0; k < 16; k++) { for (k = 0; k < 16; k++) {
if (!atp_dev->id[j][k].prd_table) if (!atp_dev->id[j][k].prd_table)
continue; continue;
pci_free_consistent(atp_dev->pdev, 1024, atp_dev->id[j][k].prd_table, atp_dev->id[j][k].prdaddr); pci_free_consistent(atp_dev->pdev, 1024, atp_dev->id[j][k].prd_table, atp_dev->id[j][k].prd_bus);
atp_dev->id[j][k].prd_table = NULL; atp_dev->id[j][k].prd_table = NULL;
} }
} }
...@@ -2584,12 +2585,13 @@ static int atp870u_init_tables(struct Scsi_Host *host) ...@@ -2584,12 +2585,13 @@ static int atp870u_init_tables(struct Scsi_Host *host)
int c,k; int c,k;
for(c=0;c < 2;c++) { for(c=0;c < 2;c++) {
for(k=0;k<16;k++) { for(k=0;k<16;k++) {
atp_dev->id[c][k].prd_table = pci_alloc_consistent(atp_dev->pdev, 1024, &(atp_dev->id[c][k].prdaddr)); atp_dev->id[c][k].prd_table = pci_alloc_consistent(atp_dev->pdev, 1024, &(atp_dev->id[c][k].prd_bus));
if (!atp_dev->id[c][k].prd_table) { if (!atp_dev->id[c][k].prd_table) {
printk("atp870u_init_tables fail\n"); printk("atp870u_init_tables fail\n");
atp870u_free_tables(host); atp870u_free_tables(host);
return -ENOMEM; return -ENOMEM;
} }
atp_dev->id[c][k].prdaddr = atp_dev->id[c][k].prd_bus;
atp_dev->id[c][k].devsp=0x20; atp_dev->id[c][k].devsp=0x20;
atp_dev->id[c][k].devtype = 0x7f; atp_dev->id[c][k].devtype = 0x7f;
atp_dev->id[c][k].curr_req = NULL; atp_dev->id[c][k].curr_req = NULL;
......
...@@ -54,8 +54,9 @@ struct atp_unit ...@@ -54,8 +54,9 @@ struct atp_unit
unsigned long tran_len; unsigned long tran_len;
unsigned long last_len; unsigned long last_len;
unsigned char *prd_pos; unsigned char *prd_pos;
unsigned char *prd_table; unsigned char *prd_table; /* Kernel address of PRD table */
dma_addr_t prdaddr; dma_addr_t prd_bus; /* Bus address of PRD */
dma_addr_t prdaddr; /* Dynamically updated in driver */
struct scsi_cmnd *curr_req; struct scsi_cmnd *curr_req;
} id[2][16]; } id[2][16];
struct Scsi_Host *host; struct Scsi_Host *host;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment