Lines Matching defs:hostdata

246 NCR_700_offset_period_to_sxfer(struct NCR_700_Host_Parameters *hostdata,
251 __u8 min_xferp = (hostdata->chip710
253 __u8 max_offset = (hostdata->chip710
259 if(period < hostdata->min_period) {
261 period = hostdata->min_period;
263 XFERP = (period*4 * hostdata->sync_clock)/1000 - 4;
278 struct NCR_700_Host_Parameters *hostdata =
279 (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
281 return NCR_700_offset_period_to_sxfer(hostdata,
288 struct NCR_700_Host_Parameters *hostdata, struct device *dev)
300 memory = dma_alloc_noncoherent(hostdata->dev, TOTAL_MEM_SIZE,
308 hostdata->msgin = memory + MSGIN_OFFSET;
309 hostdata->msgout = memory + MSGOUT_OFFSET;
310 hostdata->status = memory + STATUS_OFFSET;
311 hostdata->slots = (struct NCR_700_command_slot *)(memory + SLOTS_OFFSET);
312 hostdata->dev = dev;
339 memset(hostdata->slots, 0, sizeof(struct NCR_700_command_slot)
342 dma_addr_t offset = (dma_addr_t)((unsigned long)&hostdata->slots[j].SG[0]
343 - (unsigned long)&hostdata->slots[0].SG[0]);
344 hostdata->slots[j].pSG = (struct NCR_700_SG_List *)((unsigned long)(pSlots + offset));
346 hostdata->free_list = &hostdata->slots[j];
348 hostdata->slots[j-1].ITL_forw = &hostdata->slots[j];
349 hostdata->slots[j].state = NCR_700_SLOT_FREE;
359 script_patch_32(hostdata->dev, script, MessageLocation,
361 script_patch_32(hostdata->dev, script, StatusAddress,
363 script_patch_32(hostdata->dev, script, ReceiveMsgAddress,
366 hostdata->script = script;
367 hostdata->pScript = pScript;
368 dma_sync_single_for_device(hostdata->dev, pScript, sizeof(SCRIPT), DMA_TO_DEVICE);
369 hostdata->state = NCR_700_HOST_FREE;
370 hostdata->cmd = NULL;
375 host->unique_id = (unsigned long)hostdata->base;
376 hostdata->eh_complete = NULL;
377 host->hostdata[0] = (unsigned long)hostdata;
380 if (hostdata->chip710)
381 hostdata->rev = (NCR_700_readb(host, CTEST8_REG)>>4) & 0x0f;
383 hostdata->rev = (NCR_700_readb(host, CTEST7_REG)>>4) & 0x0f;
384 hostdata->fast = (NCR_700_readb(host, CTEST9_REG) == 0);
390 hostdata->chip710 ? "53c710" :
391 (hostdata->fast ? "53c700-66" : "53c700"),
392 hostdata->rev, hostdata->differential ?
403 spi_signalling(host) = hostdata->differential ? SPI_SIGNAL_HVD :
412 struct NCR_700_Host_Parameters *hostdata =
413 (struct NCR_700_Host_Parameters *)host->hostdata[0];
415 dma_free_noncoherent(hostdata->dev, TOTAL_MEM_SIZE,
416 hostdata->script, hostdata->pScript);
440 struct NCR_700_Host_Parameters *hostdata =
441 (struct NCR_700_Host_Parameters *)host->hostdata[0];
445 if(hostdata->chip710) {
453 if(hostdata->fast)
510 find_empty_slot(struct NCR_700_Host_Parameters *hostdata)
512 struct NCR_700_command_slot *slot = hostdata->free_list;
516 if(hostdata->command_slot_count != NCR_700_COMMAND_SLOTS_PER_HOST)
517 printk(KERN_ERR "SLOTS FULL, but count is %d, should be %d\n", hostdata->command_slot_count, NCR_700_COMMAND_SLOTS_PER_HOST);
526 hostdata->free_list = slot->ITL_forw;
536 hostdata->command_slot_count++;
543 struct NCR_700_Host_Parameters *hostdata)
555 slot->ITL_forw = hostdata->free_list;
556 hostdata->free_list = slot;
557 hostdata->command_slot_count--;
564 save_for_reselection(struct NCR_700_Host_Parameters *hostdata,
574 hostdata->state = NCR_700_HOST_FREE;
575 hostdata->cmd = NULL;
579 NCR_700_unmap(struct NCR_700_Host_Parameters *hostdata, struct scsi_cmnd *SCp,
588 NCR_700_scsi_done(struct NCR_700_Host_Parameters *hostdata,
591 hostdata->state = NCR_700_HOST_FREE;
592 hostdata->cmd = NULL;
598 dma_unmap_single(hostdata->dev, slot->pCmd,
608 dma_unmap_single(hostdata->dev, slot->dma_handle,
617 NCR_700_unmap(hostdata, SCp, slot);
619 free_slot(slot, hostdata);
650 struct NCR_700_Host_Parameters *hostdata =
651 (struct NCR_700_Host_Parameters *)host->hostdata[0];
653 __u8 min_xferp = (hostdata->chip710 ? NCR_710_MIN_XFERP : NCR_700_MIN_XFERP);
655 if(hostdata->chip710) {
659 switch (hostdata->burst_length) {
676 hostdata->dcntl_extra |= COMPAT_700_MODE;
678 NCR_700_writeb(hostdata->dcntl_extra, host, DCNTL_REG);
679 NCR_700_writeb(burst_length | hostdata->dmode_extra,
681 NCR_700_writeb(burst_disable | hostdata->ctest7_extra |
682 (hostdata->differential ? DIFF : 0),
688 NCR_700_writeb(BURST_LENGTH_8 | hostdata->dmode_extra,
690 NCR_700_writeb(hostdata->differential ?
692 if(hostdata->fast) {
712 if(hostdata->clock > 75) {
713 printk(KERN_ERR "53c700: Clock speed %dMHz is too high: 75Mhz is the maximum this chip can be driven at\n", hostdata->clock);
718 NCR_700_writeb(ASYNC_DIV_3_0 | hostdata->dcntl_extra, host, DCNTL_REG);
719 hostdata->sync_clock = hostdata->clock/2;
720 } else if(hostdata->clock > 50 && hostdata->clock <= 75) {
724 NCR_700_writeb(ASYNC_DIV_3_0 | hostdata->dcntl_extra, host, DCNTL_REG);
725 hostdata->sync_clock = hostdata->clock*2;
726 hostdata->sync_clock /= 3;
728 } else if(hostdata->clock > 37 && hostdata->clock <= 50) {
732 NCR_700_writeb(ASYNC_DIV_2_0 | hostdata->dcntl_extra, host, DCNTL_REG);
733 hostdata->sync_clock = hostdata->clock;
734 } else if(hostdata->clock > 25 && hostdata->clock <=37) {
738 NCR_700_writeb(ASYNC_DIV_1_5 | hostdata->dcntl_extra, host, DCNTL_REG);
739 hostdata->sync_clock = hostdata->clock;
743 NCR_700_writeb(ASYNC_DIV_1_0 | hostdata->dcntl_extra, host, DCNTL_REG);
745 hostdata->sync_clock = hostdata->clock;
751 min_period = 1000*(4+min_xferp)/(4*hostdata->sync_clock);
752 hostdata->min_period = NCR_700_MIN_PERIOD;
754 hostdata->min_period = min_period;
760 struct NCR_700_Host_Parameters *hostdata =
761 (struct NCR_700_Host_Parameters *)host->hostdata[0];
762 if(hostdata->chip710) {
787 struct NCR_700_Host_Parameters *hostdata,
798 switch(hostdata->msgin[2]) {
802 __u8 period = hostdata->msgin[3];
803 __u8 offset = hostdata->msgin[4];
828 hostdata->msgout[0] = A_REJECT_MSG;
829 dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE);
830 script_patch_16(hostdata->dev, hostdata->script,
834 resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
841 hostdata->msgout[0] = A_REJECT_MSG;
842 dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE);
843 script_patch_16(hostdata->dev, hostdata->script, MessageCount,
845 resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
853 spi_print_msg(hostdata->msgin);
856 hostdata->msgout[0] = A_REJECT_MSG;
857 dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE);
858 script_patch_16(hostdata->dev, hostdata->script, MessageCount,
862 resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
869 process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata,
884 spi_print_msg(hostdata->msgin);
888 switch(hostdata->msgin[0]) {
891 resume_offset = process_extended_message(host, hostdata, SCp,
908 hostdata->tag_negotiated &= ~(1<<scmd_id(SCp));
927 pun, lun, hostdata->msgin[1],
936 spi_print_msg(hostdata->msgin);
939 hostdata->msgout[0] = A_REJECT_MSG;
940 dma_cache_sync(hostdata->dev, hostdata->msgout, 1, DMA_TO_DEVICE);
941 script_patch_16(hostdata->dev, hostdata->script, MessageCount,
945 resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
951 dma_cache_sync(hostdata->dev, hostdata->msgin, MSG_ARRAY_SIZE, DMA_FROM_DEVICE);
958 struct NCR_700_Host_Parameters *hostdata)
970 hostdata->status[0]));
977 if(status_byte(hostdata->status[0]) == CHECK_CONDITION ||
978 status_byte(hostdata->status[0]) == COMMAND_TERMINATED) {
986 NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]);
993 SCp, hostdata->status[0]);
1002 NCR_700_unmap(hostdata, SCp, slot);
1003 dma_unmap_single(hostdata->dev, slot->pCmd,
1020 cmnd[7] = hostdata->status[0];
1024 slot->pCmd = dma_map_single(hostdata->dev, cmnd, MAX_COMMAND_SIZE, DMA_TO_DEVICE);
1025 slot->dma_handle = dma_map_single(hostdata->dev, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
1030 slot->resume_offset = hostdata->pScript;
1031 dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG[0])*2, DMA_TO_DEVICE);
1032 dma_cache_sync(hostdata->dev, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
1037 hostdata->state = NCR_700_HOST_FREE;
1038 hostdata->cmd = NULL;
1044 //if(status_byte(hostdata->status[0]) == GOOD &&
1048 // dma_sync_single_for_cpu(hostdata->dev,
1055 // hostdata->tag_negotiated |= (1<<scmd_id(SCp));
1059 // hostdata->tag_negotiated &= ~(1<<scmd_id(SCp));
1062 NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]);
1082 hostdata->msgin[0], hostdata->msgin[1]);
1093 save_for_reselection(hostdata, SCp, dsp);
1098 __u8 reselection_id = hostdata->reselection_id;
1101 lun = hostdata->msgin[0] & 0x1f;
1103 hostdata->reselection_id = 0xff;
1113 if(hostdata->msgin[1] == A_SIMPLE_TAG_MSG) {
1114 struct scsi_cmnd *SCp = scsi_find_tag(SDp, hostdata->msgin[2]);
1117 host->host_no, reselection_id, lun, hostdata->msgin[2]);
1124 hostdata->msgin[2], slot, slot->tag);
1138 hostdata->msgin[0], hostdata->msgin[1],
1139 hostdata->msgin[2]);
1141 if(hostdata->state != NCR_700_HOST_BUSY)
1145 hostdata->cmd = slot->cmnd;
1148 script_patch_32_abs(hostdata->dev, hostdata->script,
1150 script_patch_16(hostdata->dev, hostdata->script,
1152 script_patch_32_abs(hostdata->dev, hostdata->script,
1161 NCR_700_writeb(NCR_700_get_SXFER(hostdata->cmd->device),
1163 dma_cache_sync(hostdata->dev, hostdata->msgin,
1165 dma_cache_sync(hostdata->dev, hostdata->msgout,
1169 dma_cache_sync(hostdata->dev, slot->cmnd->cmnd,
1193 host->host_no, reselection_id, lun, dsp, dsp - hostdata->pScript, hostdata->state, hostdata->command_slot_count);
1197 __u32 SG = (__u32)bS_to_cpu(hostdata->script[A_SGScriptStartAddress_used[0]]);
1201 if(SG >= to32bit(&hostdata->slots[i].pSG[0])
1202 && SG <= to32bit(&hostdata->slots[i].pSG[NCR_700_SG_SEGMENTS]))
1205 printk(KERN_INFO "IDENTIFIED SG segment as being %08x in slot %p, cmd %p, slot->resume_offset=%08x\n", SG, &hostdata->slots[i], hostdata->slots[i].cmnd, hostdata->slots[i].resume_offset);
1206 SCp = hostdata->slots[i].cmnd;
1214 hostdata->cmd = NULL;
1217 if(hostdata->reselection_id == 0xff) {
1223 reselection_id = hostdata->reselection_id;
1230 hostdata->reselection_id = reselection_id;
1232 hostdata->msgin[1] = 0;
1233 dma_cache_sync(hostdata->dev, hostdata->msgin,
1235 if(hostdata->tag_negotiated & (1<<reselection_id)) {
1236 resume_offset = hostdata->pScript + Ent_GetReselectionWithTag;
1238 resume_offset = hostdata->pScript + Ent_GetReselectionData;
1246 resume_offset = process_message(host, hostdata, SCp,
1252 NCR_700_phase[j], dsp - hostdata->pScript);
1264 host->host_no, pun, lun, dsps & 0xfff, dsp, dsp - hostdata->pScript);
1268 host->host_no, pun, lun, dsps, dsp - hostdata->pScript);
1287 struct NCR_700_Host_Parameters *hostdata =
1288 (struct NCR_700_Host_Parameters *)host->hostdata[0];
1289 struct scsi_cmnd *SCp = hostdata->cmd;
1293 id = NCR_700_readb(host, hostdata->chip710 ?
1308 hostdata->reselection_id = id = bitmap_to_number(id);
1312 if(hostdata->state == NCR_700_HOST_BUSY && SCp != NULL) {
1315 DEBUG((" ID %d WARNING: RESELECTION OF BUSY HOST, saving cmd %p, slot %p, addr %x [%04x], resume %x!\n", id, hostdata->cmd, slot, dsp, dsp - hostdata->pScript, resume_offset));
1317 switch(dsp - hostdata->pScript) {
1320 save_for_reselection(hostdata, SCp, Ent_Disconnect2 + hostdata->pScript);
1324 save_for_reselection(hostdata, SCp, Ent_Disconnect4 + hostdata->pScript);
1328 save_for_reselection(hostdata, SCp, Ent_Disconnect6 + hostdata->pScript);
1332 save_for_reselection(hostdata, SCp, Ent_Disconnect8 + hostdata->pScript);
1336 process_script_interrupt(A_GOOD_STATUS_AFTER_STATUS, dsp, SCp, host, hostdata);
1344 hostdata->state = NCR_700_HOST_BUSY;
1345 hostdata->cmd = NULL;
1347 hostdata->msgin[1] = 0;
1348 dma_cache_sync(hostdata->dev, hostdata->msgin, MSG_ARRAY_SIZE,
1353 resume_offset = hostdata->pScript + Ent_SelectedAsTarget;
1354 } else if(hostdata->tag_negotiated & (1<<id)) {
1355 resume_offset = hostdata->pScript + Ent_GetReselectionWithTag;
1357 resume_offset = hostdata->pScript + Ent_GetReselectionData;
1364 const struct NCR_700_Host_Parameters *hostdata
1365 = (struct NCR_700_Host_Parameters *)host->hostdata[0];
1366 if(hostdata->chip710) {
1375 const struct NCR_700_Host_Parameters *hostdata
1376 = (struct NCR_700_Host_Parameters *)host->hostdata[0];
1377 if(hostdata->chip710) {
1396 struct NCR_700_Host_Parameters *hostdata =
1397 (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0];
1400 if(hostdata->state != NCR_700_HOST_FREE) {
1410 hostdata->state = NCR_700_HOST_BUSY;
1411 hostdata->cmd = SCp;
1416 hostdata->msgout[0] = NCR_700_identify((SCp->cmnd[0] != REQUEST_SENSE &&
1431 if((hostdata->tag_negotiated & (1<<scmd_id(SCp)))
1434 count += scsi_populate_tag_msg(SCp, &hostdata->msgout[count]);
1437 if(hostdata->fast &&
1439 count += spi_populate_sync_msg(&hostdata->msgout[count],
1445 script_patch_16(hostdata->dev, hostdata->script, MessageCount, count);
1448 script_patch_ID(hostdata->dev, hostdata->script,
1451 script_patch_32_abs(hostdata->dev, hostdata->script, CommandAddress,
1453 script_patch_16(hostdata->dev, hostdata->script, CommandCount,
1457 script_patch_32_abs(hostdata->dev, hostdata->script,
1462 slot->resume_offset = hostdata->pScript;
1464 dma_cache_sync(hostdata->dev, hostdata->msgout, count, DMA_TO_DEVICE);
1465 dma_cache_sync(hostdata->dev, hostdata->msgin, MSG_ARRAY_SIZE,
1467 dma_cache_sync(hostdata->dev, SCp->cmnd, SCp->cmd_len, DMA_TO_DEVICE);
1468 dma_cache_sync(hostdata->dev, hostdata->status, 1, DMA_FROM_DEVICE);
1483 struct NCR_700_Host_Parameters *hostdata =
1484 (struct NCR_700_Host_Parameters *)host->hostdata[0];
1502 struct scsi_cmnd *SCp = hostdata->cmd;
1506 state = hostdata->state;
1507 SCp = hostdata->cmd;
1526 (dsp - (__u32)(hostdata->pScript))/4,
1538 hostdata->state = NCR_700_HOST_BUSY;
1541 host->host_no, SCp, SCp == NULL ? NULL : SCp->host_scribble, dsp, dsp - hostdata->pScript);
1553 &hostdata->slots[i];
1561 free_slot(slot, hostdata);
1569 * hostdata->state_lock */
1576 hostdata->state = NCR_700_HOST_FREE;
1577 hostdata->cmd = NULL;
1579 if(hostdata->eh_complete != NULL)
1580 complete(hostdata->eh_complete);
1585 NCR_700_scsi_done(hostdata, SCp, DID_NO_CONNECT<<16);
1590 if(dsp == Ent_SendMessage + 8 + hostdata->pScript) {
1595 int count = (hostdata->script[Ent_SendMessage/4] & 0xffffff) - ((NCR_700_readl(host, DBC_REG) & 0xffffff) + NCR_700_data_residual(host));
1596 printk("scsi%d (%d:%d) PHASE MISMATCH IN SEND MESSAGE %d remain, return %p[%04x], phase %s\n", host->host_no, pun, lun, count, (void *)temp, temp - hostdata->pScript, sbcl_to_string(NCR_700_readb(host, SBCL_REG)));
1598 resume_offset = hostdata->pScript + Ent_SendMessagePhaseMismatch;
1644 dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG), DMA_TO_DEVICE);
1647 resume_offset = hostdata->pScript + Ent_MsgInDuringData;
1653 host->host_no, pun, lun, dsp - hostdata->pScript, sbcl_to_string(sbcl));
1660 NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
1664 NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
1668 resume_offset = process_script_interrupt(dsps, dsp, SCp, host, hostdata);
1673 dsp, dsp - hostdata->pScript);
1674 NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
1678 NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
1710 if(hostdata->state != NCR_700_HOST_BUSY) {
1712 host->host_no, resume_offset, resume_offset - hostdata->pScript);
1713 hostdata->state = NCR_700_HOST_BUSY;
1725 if(hostdata->state == NCR_700_HOST_FREE) {
1731 int j = (i + hostdata->saved_slot_position)
1734 if(hostdata->slots[j].state != NCR_700_SLOT_QUEUED)
1736 if(NCR_700_start_command(hostdata->slots[j].cmnd)) {
1738 host->host_no, &hostdata->slots[j],
1739 hostdata->slots[j].cmnd));
1740 hostdata->saved_slot_position = j + 1;
1754 struct NCR_700_Host_Parameters *hostdata =
1755 (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0];
1760 if(hostdata->command_slot_count >= NCR_700_COMMAND_SLOTS_PER_HOST) {
1773 && (!(hostdata->tag_negotiated & (1<<scmd_id(SCp)))
1789 slot = find_empty_slot(hostdata);
1803 && (hostdata->tag_negotiated &(1<<scmd_id(SCp))) == 0
1806 hostdata->tag_negotiated |= (1<<scmd_id(SCp));
1817 && (hostdata->tag_negotiated &(1<<scmd_id(SCp)))) {
1819 hostdata->tag_negotiated &= ~(1<<scmd_id(SCp));
1822 if((hostdata->tag_negotiated &(1<<scmd_id(SCp)))
1894 dma_cache_sync(hostdata->dev, slot->SG, sizeof(slot->SG), DMA_TO_DEVICE);
1900 slot->pCmd = dma_map_single(hostdata->dev, SCp->cmnd,
1944 struct NCR_700_Host_Parameters *hostdata =
1945 (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0];
1955 while (hostdata->eh_complete != NULL) {
1961 hostdata->eh_complete = &complete;
1968 hostdata->eh_complete = NULL;
1970 if(hostdata->fast)
1997 struct NCR_700_Host_Parameters *hostdata =
1998 (struct NCR_700_Host_Parameters *)SHp->hostdata[0];
2000 if(!hostdata->fast)
2003 if(period < hostdata->min_period)
2004 period = hostdata->min_period;
2016 struct NCR_700_Host_Parameters *hostdata =
2017 (struct NCR_700_Host_Parameters *)SHp->hostdata[0];
2018 int max_offset = hostdata->chip710
2021 if(!hostdata->fast)
2028 if(spi_offset(STp) == 0 && (spi_period(STp) < hostdata->min_period ||
2030 spi_period(STp) = hostdata->min_period;
2041 SDp->hostdata = kzalloc(sizeof(struct NCR_700_Device_Parameters),
2044 if (!SDp->hostdata)
2053 struct NCR_700_Host_Parameters *hostdata =
2054 (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
2065 if(hostdata->fast) {
2079 kfree(SDp->hostdata);
2080 SDp->hostdata = NULL;
2100 struct NCR_700_Host_Parameters *hostdata =
2101 (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
2116 hostdata->tag_negotiated &= ~(1 << sdev_id(SDp));