Commit 91af2dd2 authored by Christoph Hellwig's avatar Christoph Hellwig

53c700: improve non-coherent DMA handling

Switch the 53c700 driver to only use non-coherent descriptor memory if it
really has to because dma_alloc_coherent fails.  This doesn't matter for
any of the platforms it runs on currently, but that will change soon.

To help with this two new helpers to transfer ownership to and from the
device are added that abstract the syncing of the non-coherent memory.
The two current bidirectional cases are mapped to transfers to the
device, as that appears to what they are used for.  Note that for parisc,
which is the only architecture this driver needs to use non-coherent
memory on, the direction argument of dma_cache_sync is ignored, so this
will not change behavior in any way.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Tested-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
parent 48d15814
...@@ -269,6 +269,20 @@ NCR_700_get_SXFER(struct scsi_device *SDp) ...@@ -269,6 +269,20 @@ NCR_700_get_SXFER(struct scsi_device *SDp)
spi_period(SDp->sdev_target)); spi_period(SDp->sdev_target));
} }
static inline void dma_sync_to_dev(struct NCR_700_Host_Parameters *h,
void *addr, size_t size)
{
if (h->noncoherent)
dma_cache_sync(h->dev, addr, size, DMA_TO_DEVICE);
}
static inline void dma_sync_from_dev(struct NCR_700_Host_Parameters *h,
void *addr, size_t size)
{
if (h->noncoherent)
dma_cache_sync(h->dev, addr, size, DMA_FROM_DEVICE);
}
struct Scsi_Host * struct Scsi_Host *
NCR_700_detect(struct scsi_host_template *tpnt, NCR_700_detect(struct scsi_host_template *tpnt,
struct NCR_700_Host_Parameters *hostdata, struct device *dev) struct NCR_700_Host_Parameters *hostdata, struct device *dev)
...@@ -283,9 +297,13 @@ NCR_700_detect(struct scsi_host_template *tpnt, ...@@ -283,9 +297,13 @@ NCR_700_detect(struct scsi_host_template *tpnt,
if(tpnt->sdev_attrs == NULL) if(tpnt->sdev_attrs == NULL)
tpnt->sdev_attrs = NCR_700_dev_attrs; tpnt->sdev_attrs = NCR_700_dev_attrs;
memory = dma_alloc_attrs(dev, TOTAL_MEM_SIZE, &pScript, memory = dma_alloc_coherent(dev, TOTAL_MEM_SIZE, &pScript, GFP_KERNEL);
GFP_KERNEL, DMA_ATTR_NON_CONSISTENT); if (!memory) {
if(memory == NULL) { hostdata->noncoherent = 1;
memory = dma_alloc_attrs(dev, TOTAL_MEM_SIZE, &pScript,
GFP_KERNEL, DMA_ATTR_NON_CONSISTENT);
}
if (!memory) {
printk(KERN_ERR "53c700: Failed to allocate memory for driver, detaching\n"); printk(KERN_ERR "53c700: Failed to allocate memory for driver, detaching\n");
return NULL; return NULL;
} }
...@@ -339,11 +357,11 @@ NCR_700_detect(struct scsi_host_template *tpnt, ...@@ -339,11 +357,11 @@ NCR_700_detect(struct scsi_host_template *tpnt,
for (j = 0; j < PATCHES; j++) for (j = 0; j < PATCHES; j++)
script[LABELPATCHES[j]] = bS_to_host(pScript + SCRIPT[LABELPATCHES[j]]); script[LABELPATCHES[j]] = bS_to_host(pScript + SCRIPT[LABELPATCHES[j]]);
/* now patch up fixed addresses. */ /* now patch up fixed addresses. */
script_patch_32(hostdata->dev, script, MessageLocation, script_patch_32(hostdata, script, MessageLocation,
pScript + MSGOUT_OFFSET); pScript + MSGOUT_OFFSET);
script_patch_32(hostdata->dev, script, StatusAddress, script_patch_32(hostdata, script, StatusAddress,
pScript + STATUS_OFFSET); pScript + STATUS_OFFSET);
script_patch_32(hostdata->dev, script, ReceiveMsgAddress, script_patch_32(hostdata, script, ReceiveMsgAddress,
pScript + MSGIN_OFFSET); pScript + MSGIN_OFFSET);
hostdata->script = script; hostdata->script = script;
...@@ -395,8 +413,12 @@ NCR_700_release(struct Scsi_Host *host) ...@@ -395,8 +413,12 @@ NCR_700_release(struct Scsi_Host *host)
struct NCR_700_Host_Parameters *hostdata = struct NCR_700_Host_Parameters *hostdata =
(struct NCR_700_Host_Parameters *)host->hostdata[0]; (struct NCR_700_Host_Parameters *)host->hostdata[0];
dma_free_attrs(hostdata->dev, TOTAL_MEM_SIZE, hostdata->script, if (hostdata->noncoherent)
hostdata->pScript, DMA_ATTR_NON_CONSISTENT); dma_free_attrs(hostdata->dev, TOTAL_MEM_SIZE, hostdata->script,
hostdata->pScript, DMA_ATTR_NON_CONSISTENT);
else
dma_free_coherent(hostdata->dev, TOTAL_MEM_SIZE,
hostdata->script, hostdata->pScript);
return 1; return 1;
} }
...@@ -804,8 +826,8 @@ process_extended_message(struct Scsi_Host *host, ...@@ -804,8 +826,8 @@ process_extended_message(struct Scsi_Host *host,
shost_printk(KERN_WARNING, host, shost_printk(KERN_WARNING, host,
"Unexpected SDTR msg\n"); "Unexpected SDTR msg\n");
hostdata->msgout[0] = A_REJECT_MSG; hostdata->msgout[0] = A_REJECT_MSG;
dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE); dma_sync_to_dev(hostdata, hostdata->msgout, 1);
script_patch_16(hostdata->dev, hostdata->script, script_patch_16(hostdata, hostdata->script,
MessageCount, 1); MessageCount, 1);
/* SendMsgOut returns, so set up the return /* SendMsgOut returns, so set up the return
* address */ * address */
...@@ -817,9 +839,8 @@ process_extended_message(struct Scsi_Host *host, ...@@ -817,9 +839,8 @@ process_extended_message(struct Scsi_Host *host,
printk(KERN_INFO "scsi%d: (%d:%d), Unsolicited WDTR after CMD, Rejecting\n", printk(KERN_INFO "scsi%d: (%d:%d), Unsolicited WDTR after CMD, Rejecting\n",
host->host_no, pun, lun); host->host_no, pun, lun);
hostdata->msgout[0] = A_REJECT_MSG; hostdata->msgout[0] = A_REJECT_MSG;
dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE); dma_sync_to_dev(hostdata, hostdata->msgout, 1);
script_patch_16(hostdata->dev, hostdata->script, MessageCount, script_patch_16(hostdata, hostdata->script, MessageCount, 1);
1);
resume_offset = hostdata->pScript + Ent_SendMessageWithATN; resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
break; break;
...@@ -832,9 +853,8 @@ process_extended_message(struct Scsi_Host *host, ...@@ -832,9 +853,8 @@ process_extended_message(struct Scsi_Host *host,
printk("\n"); printk("\n");
/* just reject it */ /* just reject it */
hostdata->msgout[0] = A_REJECT_MSG; hostdata->msgout[0] = A_REJECT_MSG;
dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE); dma_sync_to_dev(hostdata, hostdata->msgout, 1);
script_patch_16(hostdata->dev, hostdata->script, MessageCount, script_patch_16(hostdata, hostdata->script, MessageCount, 1);
1);
/* SendMsgOut returns, so set up the return /* SendMsgOut returns, so set up the return
* address */ * address */
resume_offset = hostdata->pScript + Ent_SendMessageWithATN; resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
...@@ -917,9 +937,8 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata ...@@ -917,9 +937,8 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata
printk("\n"); printk("\n");
/* just reject it */ /* just reject it */
hostdata->msgout[0] = A_REJECT_MSG; hostdata->msgout[0] = A_REJECT_MSG;
dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE); dma_sync_to_dev(hostdata, hostdata->msgout, 1);
script_patch_16(hostdata->dev, hostdata->script, MessageCount, script_patch_16(hostdata, hostdata->script, MessageCount, 1);
1);
/* SendMsgOut returns, so set up the return /* SendMsgOut returns, so set up the return
* address */ * address */
resume_offset = hostdata->pScript + Ent_SendMessageWithATN; resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
...@@ -928,7 +947,7 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata ...@@ -928,7 +947,7 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata
} }
NCR_700_writel(temp, host, TEMP_REG); NCR_700_writel(temp, host, TEMP_REG);
/* set us up to receive another message */ /* set us up to receive another message */
dma_cache_sync(hostdata->dev, hostdata->msgin, MSG_ARRAY_SIZE, DMA_FROM_DEVICE); dma_sync_from_dev(hostdata, hostdata->msgin, MSG_ARRAY_SIZE);
return resume_offset; return resume_offset;
} }
...@@ -1008,8 +1027,8 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, ...@@ -1008,8 +1027,8 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
slot->SG[1].ins = bS_to_host(SCRIPT_RETURN); slot->SG[1].ins = bS_to_host(SCRIPT_RETURN);
slot->SG[1].pAddr = 0; slot->SG[1].pAddr = 0;
slot->resume_offset = hostdata->pScript; slot->resume_offset = hostdata->pScript;
dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG[0])*2, DMA_TO_DEVICE); dma_sync_to_dev(hostdata, slot->SG, sizeof(slot->SG[0])*2);
dma_cache_sync(hostdata->dev, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE); dma_sync_from_dev(hostdata, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE);
/* queue the command for reissue */ /* queue the command for reissue */
slot->state = NCR_700_SLOT_QUEUED; slot->state = NCR_700_SLOT_QUEUED;
...@@ -1129,11 +1148,11 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, ...@@ -1129,11 +1148,11 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
hostdata->cmd = slot->cmnd; hostdata->cmd = slot->cmnd;
/* re-patch for this command */ /* re-patch for this command */
script_patch_32_abs(hostdata->dev, hostdata->script, script_patch_32_abs(hostdata, hostdata->script,
CommandAddress, slot->pCmd); CommandAddress, slot->pCmd);
script_patch_16(hostdata->dev, hostdata->script, script_patch_16(hostdata, hostdata->script,
CommandCount, slot->cmnd->cmd_len); CommandCount, slot->cmnd->cmd_len);
script_patch_32_abs(hostdata->dev, hostdata->script, script_patch_32_abs(hostdata, hostdata->script,
SGScriptStartAddress, SGScriptStartAddress,
to32bit(&slot->pSG[0].ins)); to32bit(&slot->pSG[0].ins));
...@@ -1144,14 +1163,14 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, ...@@ -1144,14 +1163,14 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
* should therefore always clear ACK */ * should therefore always clear ACK */
NCR_700_writeb(NCR_700_get_SXFER(hostdata->cmd->device), NCR_700_writeb(NCR_700_get_SXFER(hostdata->cmd->device),
host, SXFER_REG); host, SXFER_REG);
dma_cache_sync(hostdata->dev, hostdata->msgin, dma_sync_from_dev(hostdata, hostdata->msgin,
MSG_ARRAY_SIZE, DMA_FROM_DEVICE); MSG_ARRAY_SIZE);
dma_cache_sync(hostdata->dev, hostdata->msgout, dma_sync_to_dev(hostdata, hostdata->msgout,
MSG_ARRAY_SIZE, DMA_TO_DEVICE); MSG_ARRAY_SIZE);
/* I'm just being paranoid here, the command should /* I'm just being paranoid here, the command should
* already have been flushed from the cache */ * already have been flushed from the cache */
dma_cache_sync(hostdata->dev, slot->cmnd->cmnd, dma_sync_to_dev(hostdata, slot->cmnd->cmnd,
slot->cmnd->cmd_len, DMA_TO_DEVICE); slot->cmnd->cmd_len);
...@@ -1214,8 +1233,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp, ...@@ -1214,8 +1233,7 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
hostdata->reselection_id = reselection_id; hostdata->reselection_id = reselection_id;
/* just in case we have a stale simple tag message, clear it */ /* just in case we have a stale simple tag message, clear it */
hostdata->msgin[1] = 0; hostdata->msgin[1] = 0;
dma_cache_sync(hostdata->dev, hostdata->msgin, dma_sync_to_dev(hostdata, hostdata->msgin, MSG_ARRAY_SIZE);
MSG_ARRAY_SIZE, DMA_BIDIRECTIONAL);
if(hostdata->tag_negotiated & (1<<reselection_id)) { if(hostdata->tag_negotiated & (1<<reselection_id)) {
resume_offset = hostdata->pScript + Ent_GetReselectionWithTag; resume_offset = hostdata->pScript + Ent_GetReselectionWithTag;
} else { } else {
...@@ -1329,8 +1347,7 @@ process_selection(struct Scsi_Host *host, __u32 dsp) ...@@ -1329,8 +1347,7 @@ process_selection(struct Scsi_Host *host, __u32 dsp)
hostdata->cmd = NULL; hostdata->cmd = NULL;
/* clear any stale simple tag message */ /* clear any stale simple tag message */
hostdata->msgin[1] = 0; hostdata->msgin[1] = 0;
dma_cache_sync(hostdata->dev, hostdata->msgin, MSG_ARRAY_SIZE, dma_sync_to_dev(hostdata, hostdata->msgin, MSG_ARRAY_SIZE);
DMA_BIDIRECTIONAL);
if(id == 0xff) { if(id == 0xff) {
/* Selected as target, Ignore */ /* Selected as target, Ignore */
...@@ -1427,30 +1444,26 @@ NCR_700_start_command(struct scsi_cmnd *SCp) ...@@ -1427,30 +1444,26 @@ NCR_700_start_command(struct scsi_cmnd *SCp)
NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION); NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
} }
script_patch_16(hostdata->dev, hostdata->script, MessageCount, count); script_patch_16(hostdata, hostdata->script, MessageCount, count);
script_patch_ID(hostdata->dev, hostdata->script, script_patch_ID(hostdata, hostdata->script, Device_ID, 1<<scmd_id(SCp));
Device_ID, 1<<scmd_id(SCp));
script_patch_32_abs(hostdata->dev, hostdata->script, CommandAddress, script_patch_32_abs(hostdata, hostdata->script, CommandAddress,
slot->pCmd); slot->pCmd);
script_patch_16(hostdata->dev, hostdata->script, CommandCount, script_patch_16(hostdata, hostdata->script, CommandCount, SCp->cmd_len);
SCp->cmd_len);
/* finally plumb the beginning of the SG list into the script /* finally plumb the beginning of the SG list into the script
* */ * */
script_patch_32_abs(hostdata->dev, hostdata->script, script_patch_32_abs(hostdata, hostdata->script,
SGScriptStartAddress, to32bit(&slot->pSG[0].ins)); SGScriptStartAddress, to32bit(&slot->pSG[0].ins));
NCR_700_clear_fifo(SCp->device->host); NCR_700_clear_fifo(SCp->device->host);
if(slot->resume_offset == 0) if(slot->resume_offset == 0)
slot->resume_offset = hostdata->pScript; slot->resume_offset = hostdata->pScript;
/* now perform all the writebacks and invalidates */ /* now perform all the writebacks and invalidates */
dma_cache_sync(hostdata->dev, hostdata->msgout, count, DMA_TO_DEVICE); dma_sync_to_dev(hostdata, hostdata->msgout, count);
dma_cache_sync(hostdata->dev, hostdata->msgin, MSG_ARRAY_SIZE, dma_sync_from_dev(hostdata, hostdata->msgin, MSG_ARRAY_SIZE);
DMA_FROM_DEVICE); dma_sync_to_dev(hostdata, SCp->cmnd, SCp->cmd_len);
dma_cache_sync(hostdata->dev, SCp->cmnd, SCp->cmd_len, DMA_TO_DEVICE); dma_sync_from_dev(hostdata, hostdata->status, 1);
dma_cache_sync(hostdata->dev, hostdata->status, 1, DMA_FROM_DEVICE);
/* set the synchronous period/offset */ /* set the synchronous period/offset */
NCR_700_writeb(NCR_700_get_SXFER(SCp->device), NCR_700_writeb(NCR_700_get_SXFER(SCp->device),
...@@ -1626,7 +1639,7 @@ NCR_700_intr(int irq, void *dev_id) ...@@ -1626,7 +1639,7 @@ NCR_700_intr(int irq, void *dev_id)
slot->SG[i].ins = bS_to_host(SCRIPT_NOP); slot->SG[i].ins = bS_to_host(SCRIPT_NOP);
slot->SG[i].pAddr = 0; slot->SG[i].pAddr = 0;
} }
dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG), DMA_TO_DEVICE); dma_sync_to_dev(hostdata, slot->SG, sizeof(slot->SG));
/* and pretend we disconnected after /* and pretend we disconnected after
* the command phase */ * the command phase */
resume_offset = hostdata->pScript + Ent_MsgInDuringData; resume_offset = hostdata->pScript + Ent_MsgInDuringData;
...@@ -1878,7 +1891,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *) ...@@ -1878,7 +1891,7 @@ NCR_700_queuecommand_lck(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *)
} }
slot->SG[i].ins = bS_to_host(SCRIPT_RETURN); slot->SG[i].ins = bS_to_host(SCRIPT_RETURN);
slot->SG[i].pAddr = 0; slot->SG[i].pAddr = 0;
dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG), DMA_TO_DEVICE); dma_sync_to_dev(hostdata, slot->SG, sizeof(slot->SG));
DEBUG((" SETTING %p to %x\n", DEBUG((" SETTING %p to %x\n",
(&slot->pSG[i].ins), (&slot->pSG[i].ins),
slot->SG[i].ins)); slot->SG[i].ins));
......
...@@ -209,6 +209,7 @@ struct NCR_700_Host_Parameters { ...@@ -209,6 +209,7 @@ struct NCR_700_Host_Parameters {
#endif #endif
__u32 chip710:1; /* set if really a 710 not 700 */ __u32 chip710:1; /* set if really a 710 not 700 */
__u32 burst_length:4; /* set to 0 to disable 710 bursting */ __u32 burst_length:4; /* set to 0 to disable 710 bursting */
__u32 noncoherent:1; /* needs to use non-coherent DMA */
/* NOTHING BELOW HERE NEEDS ALTERING */ /* NOTHING BELOW HERE NEEDS ALTERING */
__u32 fast:1; /* if we can alter the SCSI bus clock __u32 fast:1; /* if we can alter the SCSI bus clock
...@@ -422,33 +423,33 @@ struct NCR_700_Host_Parameters { ...@@ -422,33 +423,33 @@ struct NCR_700_Host_Parameters {
#define NCR_710_MIN_XFERP 0 #define NCR_710_MIN_XFERP 0
#define NCR_700_MIN_PERIOD 25 /* for SDTR message, 100ns */ #define NCR_700_MIN_PERIOD 25 /* for SDTR message, 100ns */
#define script_patch_32(dev, script, symbol, value) \ #define script_patch_32(h, script, symbol, value) \
{ \ { \
int i; \ int i; \
dma_addr_t da = value; \ dma_addr_t da = value; \
for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \ for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \
__u32 val = bS_to_cpu((script)[A_##symbol##_used[i]]) + da; \ __u32 val = bS_to_cpu((script)[A_##symbol##_used[i]]) + da; \
(script)[A_##symbol##_used[i]] = bS_to_host(val); \ (script)[A_##symbol##_used[i]] = bS_to_host(val); \
dma_cache_sync((dev), &(script)[A_##symbol##_used[i]], 4, DMA_TO_DEVICE); \ dma_sync_to_dev((h), &(script)[A_##symbol##_used[i]], 4); \
DEBUG((" script, patching %s at %d to %pad\n", \ DEBUG((" script, patching %s at %d to %pad\n", \
#symbol, A_##symbol##_used[i], &da)); \ #symbol, A_##symbol##_used[i], &da)); \
} \ } \
} }
#define script_patch_32_abs(dev, script, symbol, value) \ #define script_patch_32_abs(h, script, symbol, value) \
{ \ { \
int i; \ int i; \
dma_addr_t da = value; \ dma_addr_t da = value; \
for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \ for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \
(script)[A_##symbol##_used[i]] = bS_to_host(da); \ (script)[A_##symbol##_used[i]] = bS_to_host(da); \
dma_cache_sync((dev), &(script)[A_##symbol##_used[i]], 4, DMA_TO_DEVICE); \ dma_sync_to_dev((h), &(script)[A_##symbol##_used[i]], 4); \
DEBUG((" script, patching %s at %d to %pad\n", \ DEBUG((" script, patching %s at %d to %pad\n", \
#symbol, A_##symbol##_used[i], &da)); \ #symbol, A_##symbol##_used[i], &da)); \
} \ } \
} }
/* Used for patching the SCSI ID in the SELECT instruction */ /* Used for patching the SCSI ID in the SELECT instruction */
#define script_patch_ID(dev, script, symbol, value) \ #define script_patch_ID(h, script, symbol, value) \
{ \ { \
int i; \ int i; \
for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \ for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \
...@@ -456,13 +457,13 @@ struct NCR_700_Host_Parameters { ...@@ -456,13 +457,13 @@ struct NCR_700_Host_Parameters {
val &= 0xff00ffff; \ val &= 0xff00ffff; \
val |= ((value) & 0xff) << 16; \ val |= ((value) & 0xff) << 16; \
(script)[A_##symbol##_used[i]] = bS_to_host(val); \ (script)[A_##symbol##_used[i]] = bS_to_host(val); \
dma_cache_sync((dev), &(script)[A_##symbol##_used[i]], 4, DMA_TO_DEVICE); \ dma_sync_to_dev((h), &(script)[A_##symbol##_used[i]], 4); \
DEBUG((" script, patching ID field %s at %d to 0x%x\n", \ DEBUG((" script, patching ID field %s at %d to 0x%x\n", \
#symbol, A_##symbol##_used[i], val)); \ #symbol, A_##symbol##_used[i], val)); \
} \ } \
} }
#define script_patch_16(dev, script, symbol, value) \ #define script_patch_16(h, script, symbol, value) \
{ \ { \
int i; \ int i; \
for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \ for(i=0; i< (sizeof(A_##symbol##_used) / sizeof(__u32)); i++) { \
...@@ -470,7 +471,7 @@ struct NCR_700_Host_Parameters { ...@@ -470,7 +471,7 @@ struct NCR_700_Host_Parameters {
val &= 0xffff0000; \ val &= 0xffff0000; \
val |= ((value) & 0xffff); \ val |= ((value) & 0xffff); \
(script)[A_##symbol##_used[i]] = bS_to_host(val); \ (script)[A_##symbol##_used[i]] = bS_to_host(val); \
dma_cache_sync((dev), &(script)[A_##symbol##_used[i]], 4, DMA_TO_DEVICE); \ dma_sync_to_dev((h), &(script)[A_##symbol##_used[i]], 4); \
DEBUG((" script, patching short field %s at %d to 0x%x\n", \ DEBUG((" script, patching short field %s at %d to 0x%x\n", \
#symbol, A_##symbol##_used[i], val)); \ #symbol, A_##symbol##_used[i], val)); \
} \ } \
......
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