0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102 #define NCR_700_VERSION "2.8"
0103
0104 #include <linux/kernel.h>
0105 #include <linux/types.h>
0106 #include <linux/string.h>
0107 #include <linux/slab.h>
0108 #include <linux/ioport.h>
0109 #include <linux/delay.h>
0110 #include <linux/spinlock.h>
0111 #include <linux/completion.h>
0112 #include <linux/init.h>
0113 #include <linux/proc_fs.h>
0114 #include <linux/blkdev.h>
0115 #include <linux/module.h>
0116 #include <linux/interrupt.h>
0117 #include <linux/device.h>
0118 #include <linux/pgtable.h>
0119 #include <asm/dma.h>
0120 #include <asm/io.h>
0121 #include <asm/byteorder.h>
0122
0123 #include <scsi/scsi.h>
0124 #include <scsi/scsi_cmnd.h>
0125 #include <scsi/scsi_dbg.h>
0126 #include <scsi/scsi_eh.h>
0127 #include <scsi/scsi_host.h>
0128 #include <scsi/scsi_tcq.h>
0129 #include <scsi/scsi_transport.h>
0130 #include <scsi/scsi_transport_spi.h>
0131
0132 #include "53c700.h"
0133
0134
0135
0136
0137
0138
0139
0140 #define to32bit(x) ((__u32)((unsigned long)(x)))
0141
0142 #ifdef NCR_700_DEBUG
0143 #define STATIC
0144 #else
0145 #define STATIC static
0146 #endif
0147
0148 MODULE_AUTHOR("James Bottomley");
0149 MODULE_DESCRIPTION("53c700 and 53c700-66 Driver");
0150 MODULE_LICENSE("GPL");
0151
0152
0153 #include "53c700_d.h"
0154
0155
0156 STATIC int NCR_700_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *);
0157 STATIC int NCR_700_abort(struct scsi_cmnd * SCpnt);
0158 STATIC int NCR_700_host_reset(struct scsi_cmnd * SCpnt);
0159 STATIC void NCR_700_chip_setup(struct Scsi_Host *host);
0160 STATIC void NCR_700_chip_reset(struct Scsi_Host *host);
0161 STATIC int NCR_700_slave_alloc(struct scsi_device *SDpnt);
0162 STATIC int NCR_700_slave_configure(struct scsi_device *SDpnt);
0163 STATIC void NCR_700_slave_destroy(struct scsi_device *SDpnt);
0164 static int NCR_700_change_queue_depth(struct scsi_device *SDpnt, int depth);
0165
0166 STATIC const struct attribute_group *NCR_700_dev_groups[];
0167
0168 STATIC struct scsi_transport_template *NCR_700_transport_template = NULL;
0169
0170 static char *NCR_700_phase[] = {
0171 "",
0172 "after selection",
0173 "before command phase",
0174 "after command phase",
0175 "after status phase",
0176 "after data in phase",
0177 "after data out phase",
0178 "during data phase",
0179 };
0180
0181 static char *NCR_700_condition[] = {
0182 "",
0183 "NOT MSG_OUT",
0184 "UNEXPECTED PHASE",
0185 "NOT MSG_IN",
0186 "UNEXPECTED MSG",
0187 "MSG_IN",
0188 "SDTR_MSG RECEIVED",
0189 "REJECT_MSG RECEIVED",
0190 "DISCONNECT_MSG RECEIVED",
0191 "MSG_OUT",
0192 "DATA_IN",
0193
0194 };
0195
0196 static char *NCR_700_fatal_messages[] = {
0197 "unexpected message after reselection",
0198 "still MSG_OUT after message injection",
0199 "not MSG_IN after selection",
0200 "Illegal message length received",
0201 };
0202
0203 static char *NCR_700_SBCL_bits[] = {
0204 "IO ",
0205 "CD ",
0206 "MSG ",
0207 "ATN ",
0208 "SEL ",
0209 "BSY ",
0210 "ACK ",
0211 "REQ ",
0212 };
0213
0214 static char *NCR_700_SBCL_to_phase[] = {
0215 "DATA_OUT",
0216 "DATA_IN",
0217 "CMD_OUT",
0218 "STATE",
0219 "ILLEGAL PHASE",
0220 "ILLEGAL PHASE",
0221 "MSG OUT",
0222 "MSG IN",
0223 };
0224
0225
0226
0227
0228
0229
0230 static inline __u8
0231 NCR_700_offset_period_to_sxfer(struct NCR_700_Host_Parameters *hostdata,
0232 __u8 offset, __u8 period)
0233 {
0234 int XFERP;
0235
0236 __u8 min_xferp = (hostdata->chip710
0237 ? NCR_710_MIN_XFERP : NCR_700_MIN_XFERP);
0238 __u8 max_offset = (hostdata->chip710
0239 ? NCR_710_MAX_OFFSET : NCR_700_MAX_OFFSET);
0240
0241 if(offset == 0)
0242 return 0;
0243
0244 if(period < hostdata->min_period) {
0245 printk(KERN_WARNING "53c700: Period %dns is less than this chip's minimum, setting to %d\n", period*4, NCR_700_MIN_PERIOD*4);
0246 period = hostdata->min_period;
0247 }
0248 XFERP = (period*4 * hostdata->sync_clock)/1000 - 4;
0249 if(offset > max_offset) {
0250 printk(KERN_WARNING "53c700: Offset %d exceeds chip maximum, setting to %d\n",
0251 offset, max_offset);
0252 offset = max_offset;
0253 }
0254 if(XFERP < min_xferp) {
0255 XFERP = min_xferp;
0256 }
0257 return (offset & 0x0f) | (XFERP & 0x07)<<4;
0258 }
0259
0260 static inline __u8
0261 NCR_700_get_SXFER(struct scsi_device *SDp)
0262 {
0263 struct NCR_700_Host_Parameters *hostdata =
0264 (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
0265
0266 return NCR_700_offset_period_to_sxfer(hostdata,
0267 spi_offset(SDp->sdev_target),
0268 spi_period(SDp->sdev_target));
0269 }
0270
0271 static inline dma_addr_t virt_to_dma(struct NCR_700_Host_Parameters *h, void *p)
0272 {
0273 return h->pScript + ((uintptr_t)p - (uintptr_t)h->script);
0274 }
0275
0276 static inline void dma_sync_to_dev(struct NCR_700_Host_Parameters *h,
0277 void *addr, size_t size)
0278 {
0279 if (h->noncoherent)
0280 dma_sync_single_for_device(h->dev, virt_to_dma(h, addr),
0281 size, DMA_BIDIRECTIONAL);
0282 }
0283
0284 static inline void dma_sync_from_dev(struct NCR_700_Host_Parameters *h,
0285 void *addr, size_t size)
0286 {
0287 if (h->noncoherent)
0288 dma_sync_single_for_device(h->dev, virt_to_dma(h, addr), size,
0289 DMA_BIDIRECTIONAL);
0290 }
0291
0292 struct Scsi_Host *
0293 NCR_700_detect(struct scsi_host_template *tpnt,
0294 struct NCR_700_Host_Parameters *hostdata, struct device *dev)
0295 {
0296 dma_addr_t pScript, pSlots;
0297 __u8 *memory;
0298 __u32 *script;
0299 struct Scsi_Host *host;
0300 static int banner = 0;
0301 int j;
0302
0303 if (tpnt->sdev_groups == NULL)
0304 tpnt->sdev_groups = NCR_700_dev_groups;
0305
0306 memory = dma_alloc_coherent(dev, TOTAL_MEM_SIZE, &pScript, GFP_KERNEL);
0307 if (!memory) {
0308 hostdata->noncoherent = 1;
0309 memory = dma_alloc_noncoherent(dev, TOTAL_MEM_SIZE, &pScript,
0310 DMA_BIDIRECTIONAL, GFP_KERNEL);
0311 }
0312 if (!memory) {
0313 printk(KERN_ERR "53c700: Failed to allocate memory for driver, detaching\n");
0314 return NULL;
0315 }
0316
0317 script = (__u32 *)memory;
0318 hostdata->msgin = memory + MSGIN_OFFSET;
0319 hostdata->msgout = memory + MSGOUT_OFFSET;
0320 hostdata->status = memory + STATUS_OFFSET;
0321 hostdata->slots = (struct NCR_700_command_slot *)(memory + SLOTS_OFFSET);
0322 hostdata->dev = dev;
0323
0324 pSlots = pScript + SLOTS_OFFSET;
0325
0326
0327 tpnt->queuecommand = NCR_700_queuecommand;
0328 tpnt->eh_abort_handler = NCR_700_abort;
0329 tpnt->eh_host_reset_handler = NCR_700_host_reset;
0330 tpnt->can_queue = NCR_700_COMMAND_SLOTS_PER_HOST;
0331 tpnt->sg_tablesize = NCR_700_SG_SEGMENTS;
0332 tpnt->cmd_per_lun = NCR_700_CMD_PER_LUN;
0333 tpnt->slave_configure = NCR_700_slave_configure;
0334 tpnt->slave_destroy = NCR_700_slave_destroy;
0335 tpnt->slave_alloc = NCR_700_slave_alloc;
0336 tpnt->change_queue_depth = NCR_700_change_queue_depth;
0337
0338 if(tpnt->name == NULL)
0339 tpnt->name = "53c700";
0340 if(tpnt->proc_name == NULL)
0341 tpnt->proc_name = "53c700";
0342
0343 host = scsi_host_alloc(tpnt, 4);
0344 if (!host)
0345 return NULL;
0346 memset(hostdata->slots, 0, sizeof(struct NCR_700_command_slot)
0347 * NCR_700_COMMAND_SLOTS_PER_HOST);
0348 for (j = 0; j < NCR_700_COMMAND_SLOTS_PER_HOST; j++) {
0349 dma_addr_t offset = (dma_addr_t)((unsigned long)&hostdata->slots[j].SG[0]
0350 - (unsigned long)&hostdata->slots[0].SG[0]);
0351 hostdata->slots[j].pSG = (struct NCR_700_SG_List *)((unsigned long)(pSlots + offset));
0352 if(j == 0)
0353 hostdata->free_list = &hostdata->slots[j];
0354 else
0355 hostdata->slots[j-1].ITL_forw = &hostdata->slots[j];
0356 hostdata->slots[j].state = NCR_700_SLOT_FREE;
0357 }
0358
0359 for (j = 0; j < ARRAY_SIZE(SCRIPT); j++)
0360 script[j] = bS_to_host(SCRIPT[j]);
0361
0362
0363 for (j = 0; j < PATCHES; j++)
0364 script[LABELPATCHES[j]] = bS_to_host(pScript + SCRIPT[LABELPATCHES[j]]);
0365
0366 script_patch_32(hostdata, script, MessageLocation,
0367 pScript + MSGOUT_OFFSET);
0368 script_patch_32(hostdata, script, StatusAddress,
0369 pScript + STATUS_OFFSET);
0370 script_patch_32(hostdata, script, ReceiveMsgAddress,
0371 pScript + MSGIN_OFFSET);
0372
0373 hostdata->script = script;
0374 hostdata->pScript = pScript;
0375 dma_sync_single_for_device(hostdata->dev, pScript, sizeof(SCRIPT), DMA_TO_DEVICE);
0376 hostdata->state = NCR_700_HOST_FREE;
0377 hostdata->cmd = NULL;
0378 host->max_id = 8;
0379 host->max_lun = NCR_700_MAX_LUNS;
0380 BUG_ON(NCR_700_transport_template == NULL);
0381 host->transportt = NCR_700_transport_template;
0382 host->unique_id = (unsigned long)hostdata->base;
0383 hostdata->eh_complete = NULL;
0384 host->hostdata[0] = (unsigned long)hostdata;
0385
0386 NCR_700_writeb(0xff, host, CTEST9_REG);
0387 if (hostdata->chip710)
0388 hostdata->rev = (NCR_700_readb(host, CTEST8_REG)>>4) & 0x0f;
0389 else
0390 hostdata->rev = (NCR_700_readb(host, CTEST7_REG)>>4) & 0x0f;
0391 hostdata->fast = (NCR_700_readb(host, CTEST9_REG) == 0);
0392 if (banner == 0) {
0393 printk(KERN_NOTICE "53c700: Version " NCR_700_VERSION " By James.Bottomley@HansenPartnership.com\n");
0394 banner = 1;
0395 }
0396 printk(KERN_NOTICE "scsi%d: %s rev %d %s\n", host->host_no,
0397 hostdata->chip710 ? "53c710" :
0398 (hostdata->fast ? "53c700-66" : "53c700"),
0399 hostdata->rev, hostdata->differential ?
0400 "(Differential)" : "");
0401
0402 NCR_700_chip_reset(host);
0403
0404 if (scsi_add_host(host, dev)) {
0405 dev_printk(KERN_ERR, dev, "53c700: scsi_add_host failed\n");
0406 scsi_host_put(host);
0407 return NULL;
0408 }
0409
0410 spi_signalling(host) = hostdata->differential ? SPI_SIGNAL_HVD :
0411 SPI_SIGNAL_SE;
0412
0413 return host;
0414 }
0415
0416 int
0417 NCR_700_release(struct Scsi_Host *host)
0418 {
0419 struct NCR_700_Host_Parameters *hostdata =
0420 (struct NCR_700_Host_Parameters *)host->hostdata[0];
0421
0422 if (hostdata->noncoherent)
0423 dma_free_noncoherent(hostdata->dev, TOTAL_MEM_SIZE,
0424 hostdata->script, hostdata->pScript,
0425 DMA_BIDIRECTIONAL);
0426 else
0427 dma_free_coherent(hostdata->dev, TOTAL_MEM_SIZE,
0428 hostdata->script, hostdata->pScript);
0429 return 1;
0430 }
0431
0432 static inline __u8
0433 NCR_700_identify(int can_disconnect, __u8 lun)
0434 {
0435 return IDENTIFY_BASE |
0436 ((can_disconnect) ? 0x40 : 0) |
0437 (lun & NCR_700_LUN_MASK);
0438 }
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450 static inline int
0451 NCR_700_data_residual (struct Scsi_Host *host) {
0452 struct NCR_700_Host_Parameters *hostdata =
0453 (struct NCR_700_Host_Parameters *)host->hostdata[0];
0454 int count, synchronous = 0;
0455 unsigned int ddir;
0456
0457 if(hostdata->chip710) {
0458 count = ((NCR_700_readb(host, DFIFO_REG) & 0x7f) -
0459 (NCR_700_readl(host, DBC_REG) & 0x7f)) & 0x7f;
0460 } else {
0461 count = ((NCR_700_readb(host, DFIFO_REG) & 0x3f) -
0462 (NCR_700_readl(host, DBC_REG) & 0x3f)) & 0x3f;
0463 }
0464
0465 if(hostdata->fast)
0466 synchronous = NCR_700_readb(host, SXFER_REG) & 0x0f;
0467
0468
0469 ddir = NCR_700_readb(host, CTEST0_REG) & 0x01;
0470
0471 if (ddir) {
0472
0473 if (synchronous)
0474 count += (NCR_700_readb(host, SSTAT2_REG) & 0xf0) >> 4;
0475 else
0476 if (NCR_700_readb(host, SSTAT1_REG) & SIDL_REG_FULL)
0477 ++count;
0478 } else {
0479
0480 __u8 sstat = NCR_700_readb(host, SSTAT1_REG);
0481 if (sstat & SODL_REG_FULL)
0482 ++count;
0483 if (synchronous && (sstat & SODR_REG_FULL))
0484 ++count;
0485 }
0486 #ifdef NCR_700_DEBUG
0487 if(count)
0488 printk("RESIDUAL IS %d (ddir %d)\n", count, ddir);
0489 #endif
0490 return count;
0491 }
0492
0493
0494
0495 static inline char *
0496 sbcl_to_string(__u8 sbcl)
0497 {
0498 int i;
0499 static char ret[256];
0500
0501 ret[0]='\0';
0502 for(i=0; i<8; i++) {
0503 if((1<<i) & sbcl)
0504 strcat(ret, NCR_700_SBCL_bits[i]);
0505 }
0506 strcat(ret, NCR_700_SBCL_to_phase[sbcl & 0x07]);
0507 return ret;
0508 }
0509
0510 static inline __u8
0511 bitmap_to_number(__u8 bitmap)
0512 {
0513 __u8 i;
0514
0515 for(i=0; i<8 && !(bitmap &(1<<i)); i++)
0516 ;
0517 return i;
0518 }
0519
0520
0521 STATIC struct NCR_700_command_slot *
0522 find_empty_slot(struct NCR_700_Host_Parameters *hostdata)
0523 {
0524 struct NCR_700_command_slot *slot = hostdata->free_list;
0525
0526 if(slot == NULL) {
0527
0528 if(hostdata->command_slot_count != NCR_700_COMMAND_SLOTS_PER_HOST)
0529 printk(KERN_ERR "SLOTS FULL, but count is %d, should be %d\n", hostdata->command_slot_count, NCR_700_COMMAND_SLOTS_PER_HOST);
0530 return NULL;
0531 }
0532
0533 if(slot->state != NCR_700_SLOT_FREE)
0534
0535 printk(KERN_ERR "BUSY SLOT ON FREE LIST!!!\n");
0536
0537
0538 hostdata->free_list = slot->ITL_forw;
0539 slot->ITL_forw = NULL;
0540
0541
0542
0543
0544
0545
0546 slot->state = NCR_700_SLOT_BUSY;
0547 slot->flags = 0;
0548 hostdata->command_slot_count++;
0549
0550 return slot;
0551 }
0552
0553 STATIC void
0554 free_slot(struct NCR_700_command_slot *slot,
0555 struct NCR_700_Host_Parameters *hostdata)
0556 {
0557 if((slot->state & NCR_700_SLOT_MASK) != NCR_700_SLOT_MAGIC) {
0558 printk(KERN_ERR "53c700: SLOT %p is not MAGIC!!!\n", slot);
0559 }
0560 if(slot->state == NCR_700_SLOT_FREE) {
0561 printk(KERN_ERR "53c700: SLOT %p is FREE!!!\n", slot);
0562 }
0563
0564 slot->resume_offset = 0;
0565 slot->cmnd = NULL;
0566 slot->state = NCR_700_SLOT_FREE;
0567 slot->ITL_forw = hostdata->free_list;
0568 hostdata->free_list = slot;
0569 hostdata->command_slot_count--;
0570 }
0571
0572
0573
0574
0575 STATIC void
0576 save_for_reselection(struct NCR_700_Host_Parameters *hostdata,
0577 struct scsi_cmnd *SCp, __u32 dsp)
0578 {
0579
0580 if(SCp != NULL) {
0581 struct NCR_700_command_slot *slot =
0582 (struct NCR_700_command_slot *)SCp->host_scribble;
0583
0584 slot->resume_offset = dsp;
0585 }
0586 hostdata->state = NCR_700_HOST_FREE;
0587 hostdata->cmd = NULL;
0588 }
0589
0590 STATIC inline void
0591 NCR_700_unmap(struct NCR_700_Host_Parameters *hostdata, struct scsi_cmnd *SCp,
0592 struct NCR_700_command_slot *slot)
0593 {
0594 if(SCp->sc_data_direction != DMA_NONE &&
0595 SCp->sc_data_direction != DMA_BIDIRECTIONAL)
0596 scsi_dma_unmap(SCp);
0597 }
0598
0599 STATIC inline void
0600 NCR_700_scsi_done(struct NCR_700_Host_Parameters *hostdata,
0601 struct scsi_cmnd *SCp, int result)
0602 {
0603 hostdata->state = NCR_700_HOST_FREE;
0604 hostdata->cmd = NULL;
0605
0606 if(SCp != NULL) {
0607 struct NCR_700_command_slot *slot =
0608 (struct NCR_700_command_slot *)SCp->host_scribble;
0609
0610 dma_unmap_single(hostdata->dev, slot->pCmd,
0611 MAX_COMMAND_SIZE, DMA_TO_DEVICE);
0612 if (slot->flags == NCR_700_FLAG_AUTOSENSE) {
0613 char *cmnd = NCR_700_get_sense_cmnd(SCp->device);
0614
0615 dma_unmap_single(hostdata->dev, slot->dma_handle,
0616 SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
0617
0618
0619 if (result == 0)
0620 result = cmnd[7];
0621
0622 SCp->cmd_len = cmnd[8];
0623 } else
0624 NCR_700_unmap(hostdata, SCp, slot);
0625
0626 free_slot(slot, hostdata);
0627 #ifdef NCR_700_DEBUG
0628 if(NCR_700_get_depth(SCp->device) == 0 ||
0629 NCR_700_get_depth(SCp->device) > SCp->device->queue_depth)
0630 printk(KERN_ERR "Invalid depth in NCR_700_scsi_done(): %d\n",
0631 NCR_700_get_depth(SCp->device));
0632 #endif
0633 NCR_700_set_depth(SCp->device, NCR_700_get_depth(SCp->device) - 1);
0634
0635 SCp->host_scribble = NULL;
0636 SCp->result = result;
0637 scsi_done(SCp);
0638 } else {
0639 printk(KERN_ERR "53c700: SCSI DONE HAS NULL SCp\n");
0640 }
0641 }
0642
0643
0644 STATIC void
0645 NCR_700_internal_bus_reset(struct Scsi_Host *host)
0646 {
0647
0648 NCR_700_writeb(ASSERT_RST, host, SCNTL1_REG);
0649 udelay(50);
0650 NCR_700_writeb(0, host, SCNTL1_REG);
0651
0652 }
0653
0654 STATIC void
0655 NCR_700_chip_setup(struct Scsi_Host *host)
0656 {
0657 struct NCR_700_Host_Parameters *hostdata =
0658 (struct NCR_700_Host_Parameters *)host->hostdata[0];
0659 __u8 min_period;
0660 __u8 min_xferp = (hostdata->chip710 ? NCR_710_MIN_XFERP : NCR_700_MIN_XFERP);
0661
0662 if(hostdata->chip710) {
0663 __u8 burst_disable = 0;
0664 __u8 burst_length = 0;
0665
0666 switch (hostdata->burst_length) {
0667 case 1:
0668 burst_length = BURST_LENGTH_1;
0669 break;
0670 case 2:
0671 burst_length = BURST_LENGTH_2;
0672 break;
0673 case 4:
0674 burst_length = BURST_LENGTH_4;
0675 break;
0676 case 8:
0677 burst_length = BURST_LENGTH_8;
0678 break;
0679 default:
0680 burst_disable = BURST_DISABLE;
0681 break;
0682 }
0683 hostdata->dcntl_extra |= COMPAT_700_MODE;
0684
0685 NCR_700_writeb(hostdata->dcntl_extra, host, DCNTL_REG);
0686 NCR_700_writeb(burst_length | hostdata->dmode_extra,
0687 host, DMODE_710_REG);
0688 NCR_700_writeb(burst_disable | hostdata->ctest7_extra |
0689 (hostdata->differential ? DIFF : 0),
0690 host, CTEST7_REG);
0691 NCR_700_writeb(BTB_TIMER_DISABLE, host, CTEST0_REG);
0692 NCR_700_writeb(FULL_ARBITRATION | ENABLE_PARITY | PARITY
0693 | AUTO_ATN, host, SCNTL0_REG);
0694 } else {
0695 NCR_700_writeb(BURST_LENGTH_8 | hostdata->dmode_extra,
0696 host, DMODE_700_REG);
0697 NCR_700_writeb(hostdata->differential ?
0698 DIFF : 0, host, CTEST7_REG);
0699 if(hostdata->fast) {
0700
0701 NCR_700_writeb(LAST_DIS_ENBL | ENABLE_ACTIVE_NEGATION
0702 | GENERATE_RECEIVE_PARITY, host,
0703 CTEST8_REG);
0704 } else {
0705 NCR_700_writeb(FULL_ARBITRATION | ENABLE_PARITY
0706 | PARITY | AUTO_ATN, host, SCNTL0_REG);
0707 }
0708 }
0709
0710 NCR_700_writeb(1 << host->this_id, host, SCID_REG);
0711 NCR_700_writeb(0, host, SBCL_REG);
0712 NCR_700_writeb(ASYNC_OPERATION, host, SXFER_REG);
0713
0714 NCR_700_writeb(PHASE_MM_INT | SEL_TIMEOUT_INT | GROSS_ERR_INT | UX_DISC_INT
0715 | RST_INT | PAR_ERR_INT | SELECT_INT, host, SIEN_REG);
0716
0717 NCR_700_writeb(ABORT_INT | INT_INST_INT | ILGL_INST_INT, host, DIEN_REG);
0718 NCR_700_writeb(ENABLE_SELECT, host, SCNTL1_REG);
0719 if(hostdata->clock > 75) {
0720 printk(KERN_ERR "53c700: Clock speed %dMHz is too high: 75Mhz is the maximum this chip can be driven at\n", hostdata->clock);
0721
0722
0723 DEBUG(("53c700: sync 2 async 3\n"));
0724 NCR_700_writeb(SYNC_DIV_2_0, host, SBCL_REG);
0725 NCR_700_writeb(ASYNC_DIV_3_0 | hostdata->dcntl_extra, host, DCNTL_REG);
0726 hostdata->sync_clock = hostdata->clock/2;
0727 } else if(hostdata->clock > 50 && hostdata->clock <= 75) {
0728
0729 DEBUG(("53c700: sync 1.5 async 3\n"));
0730 NCR_700_writeb(SYNC_DIV_1_5, host, SBCL_REG);
0731 NCR_700_writeb(ASYNC_DIV_3_0 | hostdata->dcntl_extra, host, DCNTL_REG);
0732 hostdata->sync_clock = hostdata->clock*2;
0733 hostdata->sync_clock /= 3;
0734
0735 } else if(hostdata->clock > 37 && hostdata->clock <= 50) {
0736
0737 DEBUG(("53c700: sync 1 async 2\n"));
0738 NCR_700_writeb(SYNC_DIV_1_0, host, SBCL_REG);
0739 NCR_700_writeb(ASYNC_DIV_2_0 | hostdata->dcntl_extra, host, DCNTL_REG);
0740 hostdata->sync_clock = hostdata->clock;
0741 } else if(hostdata->clock > 25 && hostdata->clock <=37) {
0742
0743 DEBUG(("53c700: sync 1 async 1.5\n"));
0744 NCR_700_writeb(SYNC_DIV_1_0, host, SBCL_REG);
0745 NCR_700_writeb(ASYNC_DIV_1_5 | hostdata->dcntl_extra, host, DCNTL_REG);
0746 hostdata->sync_clock = hostdata->clock;
0747 } else {
0748 DEBUG(("53c700: sync 1 async 1\n"));
0749 NCR_700_writeb(SYNC_DIV_1_0, host, SBCL_REG);
0750 NCR_700_writeb(ASYNC_DIV_1_0 | hostdata->dcntl_extra, host, DCNTL_REG);
0751
0752 hostdata->sync_clock = hostdata->clock;
0753 }
0754
0755
0756
0757
0758 min_period = 1000*(4+min_xferp)/(4*hostdata->sync_clock);
0759 hostdata->min_period = NCR_700_MIN_PERIOD;
0760 if(min_period > NCR_700_MIN_PERIOD)
0761 hostdata->min_period = min_period;
0762 }
0763
0764 STATIC void
0765 NCR_700_chip_reset(struct Scsi_Host *host)
0766 {
0767 struct NCR_700_Host_Parameters *hostdata =
0768 (struct NCR_700_Host_Parameters *)host->hostdata[0];
0769 if(hostdata->chip710) {
0770 NCR_700_writeb(SOFTWARE_RESET_710, host, ISTAT_REG);
0771 udelay(100);
0772
0773 NCR_700_writeb(0, host, ISTAT_REG);
0774 } else {
0775 NCR_700_writeb(SOFTWARE_RESET, host, DCNTL_REG);
0776 udelay(100);
0777
0778 NCR_700_writeb(0, host, DCNTL_REG);
0779 }
0780
0781 mdelay(1000);
0782
0783 NCR_700_chip_setup(host);
0784 }
0785
0786
0787
0788
0789
0790
0791
0792 STATIC __u32
0793 process_extended_message(struct Scsi_Host *host,
0794 struct NCR_700_Host_Parameters *hostdata,
0795 struct scsi_cmnd *SCp, __u32 dsp, __u32 dsps)
0796 {
0797 __u32 resume_offset = dsp, temp = dsp + 8;
0798 __u8 pun = 0xff, lun = 0xff;
0799
0800 if(SCp != NULL) {
0801 pun = SCp->device->id;
0802 lun = SCp->device->lun;
0803 }
0804
0805 switch(hostdata->msgin[2]) {
0806 case A_SDTR_MSG:
0807 if(SCp != NULL && NCR_700_is_flag_set(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION)) {
0808 struct scsi_target *starget = SCp->device->sdev_target;
0809 __u8 period = hostdata->msgin[3];
0810 __u8 offset = hostdata->msgin[4];
0811
0812 if(offset == 0 || period == 0) {
0813 offset = 0;
0814 period = 0;
0815 }
0816
0817 spi_offset(starget) = offset;
0818 spi_period(starget) = period;
0819
0820 if(NCR_700_is_flag_set(SCp->device, NCR_700_DEV_PRINT_SYNC_NEGOTIATION)) {
0821 spi_display_xfer_agreement(starget);
0822 NCR_700_clear_flag(SCp->device, NCR_700_DEV_PRINT_SYNC_NEGOTIATION);
0823 }
0824
0825 NCR_700_set_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC);
0826 NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
0827
0828 NCR_700_writeb(NCR_700_get_SXFER(SCp->device),
0829 host, SXFER_REG);
0830
0831 } else {
0832
0833 shost_printk(KERN_WARNING, host,
0834 "Unexpected SDTR msg\n");
0835 hostdata->msgout[0] = A_REJECT_MSG;
0836 dma_sync_to_dev(hostdata, hostdata->msgout, 1);
0837 script_patch_16(hostdata, hostdata->script,
0838 MessageCount, 1);
0839
0840
0841 resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
0842 }
0843 break;
0844
0845 case A_WDTR_MSG:
0846 printk(KERN_INFO "scsi%d: (%d:%d), Unsolicited WDTR after CMD, Rejecting\n",
0847 host->host_no, pun, lun);
0848 hostdata->msgout[0] = A_REJECT_MSG;
0849 dma_sync_to_dev(hostdata, hostdata->msgout, 1);
0850 script_patch_16(hostdata, hostdata->script, MessageCount, 1);
0851 resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
0852
0853 break;
0854
0855 default:
0856 printk(KERN_INFO "scsi%d (%d:%d): Unexpected message %s: ",
0857 host->host_no, pun, lun,
0858 NCR_700_phase[(dsps & 0xf00) >> 8]);
0859 spi_print_msg(hostdata->msgin);
0860 printk("\n");
0861
0862 hostdata->msgout[0] = A_REJECT_MSG;
0863 dma_sync_to_dev(hostdata, hostdata->msgout, 1);
0864 script_patch_16(hostdata, hostdata->script, MessageCount, 1);
0865
0866
0867 resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
0868 }
0869 NCR_700_writel(temp, host, TEMP_REG);
0870 return resume_offset;
0871 }
0872
0873 STATIC __u32
0874 process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata,
0875 struct scsi_cmnd *SCp, __u32 dsp, __u32 dsps)
0876 {
0877
0878 __u32 temp = dsp + 8, resume_offset = dsp;
0879 __u8 pun = 0xff, lun = 0xff;
0880
0881 if(SCp != NULL) {
0882 pun = SCp->device->id;
0883 lun = SCp->device->lun;
0884 }
0885
0886 #ifdef NCR_700_DEBUG
0887 printk("scsi%d (%d:%d): message %s: ", host->host_no, pun, lun,
0888 NCR_700_phase[(dsps & 0xf00) >> 8]);
0889 spi_print_msg(hostdata->msgin);
0890 printk("\n");
0891 #endif
0892
0893 switch(hostdata->msgin[0]) {
0894
0895 case A_EXTENDED_MSG:
0896 resume_offset = process_extended_message(host, hostdata, SCp,
0897 dsp, dsps);
0898 break;
0899
0900 case A_REJECT_MSG:
0901 if(SCp != NULL && NCR_700_is_flag_set(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION)) {
0902
0903 spi_period(SCp->device->sdev_target) =
0904 spi_offset(SCp->device->sdev_target) = 0;
0905 NCR_700_set_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC);
0906 NCR_700_clear_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
0907 } else if(SCp != NULL && NCR_700_get_tag_neg_state(SCp->device) == NCR_700_DURING_TAG_NEGOTIATION) {
0908
0909 scmd_printk(KERN_WARNING, SCp,
0910 "Rejected first tag queue attempt, turning off tag queueing\n");
0911
0912 NCR_700_set_tag_neg_state(SCp->device, NCR_700_FINISHED_TAG_NEGOTIATION);
0913 hostdata->tag_negotiated &= ~(1<<scmd_id(SCp));
0914
0915 SCp->device->tagged_supported = 0;
0916 SCp->device->simple_tags = 0;
0917 scsi_change_queue_depth(SCp->device, host->cmd_per_lun);
0918 } else {
0919 shost_printk(KERN_WARNING, host,
0920 "(%d:%d) Unexpected REJECT Message %s\n",
0921 pun, lun,
0922 NCR_700_phase[(dsps & 0xf00) >> 8]);
0923
0924 }
0925 break;
0926
0927 case A_PARITY_ERROR_MSG:
0928 printk(KERN_ERR "scsi%d (%d:%d) Parity Error!\n", host->host_no,
0929 pun, lun);
0930 NCR_700_internal_bus_reset(host);
0931 break;
0932 case A_SIMPLE_TAG_MSG:
0933 printk(KERN_INFO "scsi%d (%d:%d) SIMPLE TAG %d %s\n", host->host_no,
0934 pun, lun, hostdata->msgin[1],
0935 NCR_700_phase[(dsps & 0xf00) >> 8]);
0936
0937 break;
0938 default:
0939 printk(KERN_INFO "scsi%d (%d:%d): Unexpected message %s: ",
0940 host->host_no, pun, lun,
0941 NCR_700_phase[(dsps & 0xf00) >> 8]);
0942
0943 spi_print_msg(hostdata->msgin);
0944 printk("\n");
0945
0946 hostdata->msgout[0] = A_REJECT_MSG;
0947 dma_sync_to_dev(hostdata, hostdata->msgout, 1);
0948 script_patch_16(hostdata, hostdata->script, MessageCount, 1);
0949
0950
0951 resume_offset = hostdata->pScript + Ent_SendMessageWithATN;
0952
0953 break;
0954 }
0955 NCR_700_writel(temp, host, TEMP_REG);
0956
0957 dma_sync_from_dev(hostdata, hostdata->msgin, MSG_ARRAY_SIZE);
0958 return resume_offset;
0959 }
0960
0961 STATIC __u32
0962 process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
0963 struct Scsi_Host *host,
0964 struct NCR_700_Host_Parameters *hostdata)
0965 {
0966 __u32 resume_offset = 0;
0967 __u8 pun = 0xff, lun=0xff;
0968
0969 if(SCp != NULL) {
0970 pun = SCp->device->id;
0971 lun = SCp->device->lun;
0972 }
0973
0974 if(dsps == A_GOOD_STATUS_AFTER_STATUS) {
0975 DEBUG((" COMMAND COMPLETE, status=%02x\n",
0976 hostdata->status[0]));
0977
0978 if (NCR_700_get_tag_neg_state(SCp->device) == NCR_700_DURING_TAG_NEGOTIATION)
0979 NCR_700_set_tag_neg_state(SCp->device,
0980 NCR_700_FINISHED_TAG_NEGOTIATION);
0981
0982
0983 if (hostdata->status[0] == SAM_STAT_CHECK_CONDITION ||
0984 hostdata->status[0] == SAM_STAT_COMMAND_TERMINATED) {
0985 struct NCR_700_command_slot *slot =
0986 (struct NCR_700_command_slot *)SCp->host_scribble;
0987 if(slot->flags == NCR_700_FLAG_AUTOSENSE) {
0988
0989
0990 scmd_printk(KERN_ERR, SCp,
0991 "broken device is looping in contingent allegiance: ignoring\n");
0992 NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]);
0993 } else {
0994 char *cmnd =
0995 NCR_700_get_sense_cmnd(SCp->device);
0996 #ifdef NCR_DEBUG
0997 scsi_print_command(SCp);
0998 printk(" cmd %p has status %d, requesting sense\n",
0999 SCp, hostdata->status[0]);
1000 #endif
1001
1002
1003
1004
1005
1006
1007
1008 NCR_700_unmap(hostdata, SCp, slot);
1009 dma_unmap_single(hostdata->dev, slot->pCmd,
1010 MAX_COMMAND_SIZE,
1011 DMA_TO_DEVICE);
1012
1013 cmnd[0] = REQUEST_SENSE;
1014 cmnd[1] = (lun & 0x7) << 5;
1015 cmnd[2] = 0;
1016 cmnd[3] = 0;
1017 cmnd[4] = SCSI_SENSE_BUFFERSIZE;
1018 cmnd[5] = 0;
1019
1020
1021
1022
1023
1024
1025 cmnd[6] = NCR_700_INTERNAL_SENSE_MAGIC;
1026 cmnd[7] = hostdata->status[0];
1027 cmnd[8] = SCp->cmd_len;
1028 SCp->cmd_len = 6;
1029
1030 slot->pCmd = dma_map_single(hostdata->dev, cmnd, MAX_COMMAND_SIZE, DMA_TO_DEVICE);
1031 slot->dma_handle = dma_map_single(hostdata->dev, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
1032 slot->SG[0].ins = bS_to_host(SCRIPT_MOVE_DATA_IN | SCSI_SENSE_BUFFERSIZE);
1033 slot->SG[0].pAddr = bS_to_host(slot->dma_handle);
1034 slot->SG[1].ins = bS_to_host(SCRIPT_RETURN);
1035 slot->SG[1].pAddr = 0;
1036 slot->resume_offset = hostdata->pScript;
1037 dma_sync_to_dev(hostdata, slot->SG, sizeof(slot->SG[0])*2);
1038 dma_sync_from_dev(hostdata, SCp->sense_buffer, SCSI_SENSE_BUFFERSIZE);
1039
1040
1041 slot->state = NCR_700_SLOT_QUEUED;
1042 slot->flags = NCR_700_FLAG_AUTOSENSE;
1043 hostdata->state = NCR_700_HOST_FREE;
1044 hostdata->cmd = NULL;
1045 }
1046 } else {
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068 NCR_700_scsi_done(hostdata, SCp, hostdata->status[0]);
1069 }
1070 } else if((dsps & 0xfffff0f0) == A_UNEXPECTED_PHASE) {
1071 __u8 i = (dsps & 0xf00) >> 8;
1072
1073 scmd_printk(KERN_ERR, SCp, "UNEXPECTED PHASE %s (%s)\n",
1074 NCR_700_phase[i],
1075 sbcl_to_string(NCR_700_readb(host, SBCL_REG)));
1076 scmd_printk(KERN_ERR, SCp, " len = %d, cmd =",
1077 SCp->cmd_len);
1078 scsi_print_command(SCp);
1079
1080 NCR_700_internal_bus_reset(host);
1081 } else if((dsps & 0xfffff000) == A_FATAL) {
1082 int i = (dsps & 0xfff);
1083
1084 printk(KERN_ERR "scsi%d: (%d:%d) FATAL ERROR: %s\n",
1085 host->host_no, pun, lun, NCR_700_fatal_messages[i]);
1086 if(dsps == A_FATAL_ILLEGAL_MSG_LENGTH) {
1087 printk(KERN_ERR " msg begins %02x %02x\n",
1088 hostdata->msgin[0], hostdata->msgin[1]);
1089 }
1090 NCR_700_internal_bus_reset(host);
1091 } else if((dsps & 0xfffff0f0) == A_DISCONNECT) {
1092 #ifdef NCR_700_DEBUG
1093 __u8 i = (dsps & 0xf00) >> 8;
1094
1095 printk("scsi%d: (%d:%d), DISCONNECTED (%d) %s\n",
1096 host->host_no, pun, lun,
1097 i, NCR_700_phase[i]);
1098 #endif
1099 save_for_reselection(hostdata, SCp, dsp);
1100
1101 } else if(dsps == A_RESELECTION_IDENTIFIED) {
1102 __u8 lun;
1103 struct NCR_700_command_slot *slot;
1104 __u8 reselection_id = hostdata->reselection_id;
1105 struct scsi_device *SDp;
1106
1107 lun = hostdata->msgin[0] & 0x1f;
1108
1109 hostdata->reselection_id = 0xff;
1110 DEBUG(("scsi%d: (%d:%d) RESELECTED!\n",
1111 host->host_no, reselection_id, lun));
1112
1113 SDp = __scsi_device_lookup(host, 0, reselection_id, lun);
1114 if(unlikely(SDp == NULL)) {
1115 printk(KERN_ERR "scsi%d: (%d:%d) HAS NO device\n",
1116 host->host_no, reselection_id, lun);
1117 BUG();
1118 }
1119 if(hostdata->msgin[1] == A_SIMPLE_TAG_MSG) {
1120 struct scsi_cmnd *SCp;
1121
1122 SCp = scsi_host_find_tag(SDp->host, hostdata->msgin[2]);
1123 if(unlikely(SCp == NULL)) {
1124 printk(KERN_ERR "scsi%d: (%d:%d) no saved request for tag %d\n",
1125 host->host_no, reselection_id, lun, hostdata->msgin[2]);
1126 BUG();
1127 }
1128
1129 slot = (struct NCR_700_command_slot *)SCp->host_scribble;
1130 DDEBUG(KERN_DEBUG, SDp,
1131 "reselection is tag %d, slot %p(%d)\n",
1132 hostdata->msgin[2], slot, slot->tag);
1133 } else {
1134 struct NCR_700_Device_Parameters *p = SDp->hostdata;
1135 struct scsi_cmnd *SCp = p->current_cmnd;
1136
1137 if(unlikely(SCp == NULL)) {
1138 sdev_printk(KERN_ERR, SDp,
1139 "no saved request for untagged cmd\n");
1140 BUG();
1141 }
1142 slot = (struct NCR_700_command_slot *)SCp->host_scribble;
1143 }
1144
1145 if(slot == NULL) {
1146 printk(KERN_ERR "scsi%d: (%d:%d) RESELECTED but no saved command (MSG = %02x %02x %02x)!!\n",
1147 host->host_no, reselection_id, lun,
1148 hostdata->msgin[0], hostdata->msgin[1],
1149 hostdata->msgin[2]);
1150 } else {
1151 if(hostdata->state != NCR_700_HOST_BUSY)
1152 printk(KERN_ERR "scsi%d: FATAL, host not busy during valid reselection!\n",
1153 host->host_no);
1154 resume_offset = slot->resume_offset;
1155 hostdata->cmd = slot->cmnd;
1156
1157
1158 script_patch_32_abs(hostdata, hostdata->script,
1159 CommandAddress, slot->pCmd);
1160 script_patch_16(hostdata, hostdata->script,
1161 CommandCount, slot->cmnd->cmd_len);
1162 script_patch_32_abs(hostdata, hostdata->script,
1163 SGScriptStartAddress,
1164 to32bit(&slot->pSG[0].ins));
1165
1166
1167
1168
1169
1170
1171 NCR_700_writeb(NCR_700_get_SXFER(hostdata->cmd->device),
1172 host, SXFER_REG);
1173 dma_sync_from_dev(hostdata, hostdata->msgin,
1174 MSG_ARRAY_SIZE);
1175 dma_sync_to_dev(hostdata, hostdata->msgout,
1176 MSG_ARRAY_SIZE);
1177
1178
1179 dma_sync_to_dev(hostdata, slot->cmnd->cmnd,
1180 slot->cmnd->cmd_len);
1181
1182
1183
1184 }
1185 } else if(dsps == A_RESELECTED_DURING_SELECTION) {
1186
1187
1188
1189
1190
1191
1192
1193
1194 __u8 reselection_id = NCR_700_readb(host, SFBR_REG);
1195 struct NCR_700_command_slot *slot;
1196
1197
1198 reselection_id &= ~(1<<host->this_id);
1199
1200
1201
1202 printk(KERN_INFO "scsi%d: (%d:%d) RESELECTION DURING SELECTION, dsp=%08x[%04x] state=%d, count=%d\n",
1203 host->host_no, reselection_id, lun, dsp, dsp - hostdata->pScript, hostdata->state, hostdata->command_slot_count);
1204
1205 {
1206
1207 __u32 SG = (__u32)bS_to_cpu(hostdata->script[A_SGScriptStartAddress_used[0]]);
1208 int i;
1209
1210 for(i=0; i< NCR_700_COMMAND_SLOTS_PER_HOST; i++) {
1211 if(SG >= to32bit(&hostdata->slots[i].pSG[0])
1212 && SG <= to32bit(&hostdata->slots[i].pSG[NCR_700_SG_SEGMENTS]))
1213 break;
1214 }
1215 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);
1216 SCp = hostdata->slots[i].cmnd;
1217 }
1218
1219 if(SCp != NULL) {
1220 slot = (struct NCR_700_command_slot *)SCp->host_scribble;
1221
1222 slot->state = NCR_700_SLOT_QUEUED;
1223 }
1224 hostdata->cmd = NULL;
1225
1226 if(reselection_id == 0) {
1227 if(hostdata->reselection_id == 0xff) {
1228 printk(KERN_ERR "scsi%d: Invalid reselection during selection!!\n", host->host_no);
1229 return 0;
1230 } else {
1231 printk(KERN_ERR "scsi%d: script reselected and we took a selection interrupt\n",
1232 host->host_no);
1233 reselection_id = hostdata->reselection_id;
1234 }
1235 } else {
1236
1237
1238 reselection_id = bitmap_to_number(reselection_id);
1239 }
1240 hostdata->reselection_id = reselection_id;
1241
1242 hostdata->msgin[1] = 0;
1243 dma_sync_to_dev(hostdata, hostdata->msgin, MSG_ARRAY_SIZE);
1244 if(hostdata->tag_negotiated & (1<<reselection_id)) {
1245 resume_offset = hostdata->pScript + Ent_GetReselectionWithTag;
1246 } else {
1247 resume_offset = hostdata->pScript + Ent_GetReselectionData;
1248 }
1249 } else if(dsps == A_COMPLETED_SELECTION_AS_TARGET) {
1250
1251
1252
1253 DEBUG((" SELECTION COMPLETED\n"));
1254 } else if((dsps & 0xfffff0f0) == A_MSG_IN) {
1255 resume_offset = process_message(host, hostdata, SCp,
1256 dsp, dsps);
1257 } else if((dsps & 0xfffff000) == 0) {
1258 __u8 i = (dsps & 0xf0) >> 4, j = (dsps & 0xf00) >> 8;
1259 printk(KERN_ERR "scsi%d: (%d:%d), unhandled script condition %s %s at %04x\n",
1260 host->host_no, pun, lun, NCR_700_condition[i],
1261 NCR_700_phase[j], dsp - hostdata->pScript);
1262 if(SCp != NULL) {
1263 struct scatterlist *sg;
1264
1265 scsi_print_command(SCp);
1266 scsi_for_each_sg(SCp, sg, scsi_sg_count(SCp) + 1, i) {
1267 printk(KERN_INFO " SG[%d].length = %d, move_insn=%08x, addr %08x\n", i, sg->length, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].ins, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].pAddr);
1268 }
1269 }
1270 NCR_700_internal_bus_reset(host);
1271 } else if((dsps & 0xfffff000) == A_DEBUG_INTERRUPT) {
1272 printk(KERN_NOTICE "scsi%d (%d:%d) DEBUG INTERRUPT %d AT %08x[%04x], continuing\n",
1273 host->host_no, pun, lun, dsps & 0xfff, dsp, dsp - hostdata->pScript);
1274 resume_offset = dsp;
1275 } else {
1276 printk(KERN_ERR "scsi%d: (%d:%d), unidentified script interrupt 0x%x at %04x\n",
1277 host->host_no, pun, lun, dsps, dsp - hostdata->pScript);
1278 NCR_700_internal_bus_reset(host);
1279 }
1280 return resume_offset;
1281 }
1282
1283
1284
1285
1286
1287
1288
1289
1290 STATIC inline __u32
1291 process_selection(struct Scsi_Host *host, __u32 dsp)
1292 {
1293 __u8 id = 0;
1294 int count = 0;
1295 __u32 resume_offset = 0;
1296 struct NCR_700_Host_Parameters *hostdata =
1297 (struct NCR_700_Host_Parameters *)host->hostdata[0];
1298 struct scsi_cmnd *SCp = hostdata->cmd;
1299 __u8 sbcl;
1300
1301 for(count = 0; count < 5; count++) {
1302 id = NCR_700_readb(host, hostdata->chip710 ?
1303 CTEST9_REG : SFBR_REG);
1304
1305
1306 id &= ~(1<<host->this_id);
1307 if(id != 0)
1308 break;
1309 udelay(5);
1310 }
1311 sbcl = NCR_700_readb(host, SBCL_REG);
1312 if((sbcl & SBCL_IO) == 0) {
1313
1314 id = 0xff;
1315 } else {
1316
1317 hostdata->reselection_id = id = bitmap_to_number(id);
1318 DEBUG(("scsi%d: Reselected by %d\n",
1319 host->host_no, id));
1320 }
1321 if(hostdata->state == NCR_700_HOST_BUSY && SCp != NULL) {
1322 struct NCR_700_command_slot *slot =
1323 (struct NCR_700_command_slot *)SCp->host_scribble;
1324 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));
1325
1326 switch(dsp - hostdata->pScript) {
1327 case Ent_Disconnect1:
1328 case Ent_Disconnect2:
1329 save_for_reselection(hostdata, SCp, Ent_Disconnect2 + hostdata->pScript);
1330 break;
1331 case Ent_Disconnect3:
1332 case Ent_Disconnect4:
1333 save_for_reselection(hostdata, SCp, Ent_Disconnect4 + hostdata->pScript);
1334 break;
1335 case Ent_Disconnect5:
1336 case Ent_Disconnect6:
1337 save_for_reselection(hostdata, SCp, Ent_Disconnect6 + hostdata->pScript);
1338 break;
1339 case Ent_Disconnect7:
1340 case Ent_Disconnect8:
1341 save_for_reselection(hostdata, SCp, Ent_Disconnect8 + hostdata->pScript);
1342 break;
1343 case Ent_Finish1:
1344 case Ent_Finish2:
1345 process_script_interrupt(A_GOOD_STATUS_AFTER_STATUS, dsp, SCp, host, hostdata);
1346 break;
1347
1348 default:
1349 slot->state = NCR_700_SLOT_QUEUED;
1350 break;
1351 }
1352 }
1353 hostdata->state = NCR_700_HOST_BUSY;
1354 hostdata->cmd = NULL;
1355
1356 hostdata->msgin[1] = 0;
1357 dma_sync_to_dev(hostdata, hostdata->msgin, MSG_ARRAY_SIZE);
1358
1359 if(id == 0xff) {
1360
1361 resume_offset = hostdata->pScript + Ent_SelectedAsTarget;
1362 } else if(hostdata->tag_negotiated & (1<<id)) {
1363 resume_offset = hostdata->pScript + Ent_GetReselectionWithTag;
1364 } else {
1365 resume_offset = hostdata->pScript + Ent_GetReselectionData;
1366 }
1367 return resume_offset;
1368 }
1369
1370 static inline void
1371 NCR_700_clear_fifo(struct Scsi_Host *host) {
1372 const struct NCR_700_Host_Parameters *hostdata
1373 = (struct NCR_700_Host_Parameters *)host->hostdata[0];
1374 if(hostdata->chip710) {
1375 NCR_700_writeb(CLR_FIFO_710, host, CTEST8_REG);
1376 } else {
1377 NCR_700_writeb(CLR_FIFO, host, DFIFO_REG);
1378 }
1379 }
1380
1381 static inline void
1382 NCR_700_flush_fifo(struct Scsi_Host *host) {
1383 const struct NCR_700_Host_Parameters *hostdata
1384 = (struct NCR_700_Host_Parameters *)host->hostdata[0];
1385 if(hostdata->chip710) {
1386 NCR_700_writeb(FLUSH_DMA_FIFO_710, host, CTEST8_REG);
1387 udelay(10);
1388 NCR_700_writeb(0, host, CTEST8_REG);
1389 } else {
1390 NCR_700_writeb(FLUSH_DMA_FIFO, host, DFIFO_REG);
1391 udelay(10);
1392 NCR_700_writeb(0, host, DFIFO_REG);
1393 }
1394 }
1395
1396
1397
1398
1399 STATIC int
1400 NCR_700_start_command(struct scsi_cmnd *SCp)
1401 {
1402 struct NCR_700_command_slot *slot =
1403 (struct NCR_700_command_slot *)SCp->host_scribble;
1404 struct NCR_700_Host_Parameters *hostdata =
1405 (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0];
1406 __u16 count = 1;
1407 u8 lun = SCp->device->lun;
1408
1409 if(hostdata->state != NCR_700_HOST_FREE) {
1410
1411
1412
1413 slot->state = NCR_700_SLOT_QUEUED;
1414
1415 DEBUG(("scsi%d: host busy, queueing command %p, slot %p\n",
1416 SCp->device->host->host_no, slot->cmnd, slot));
1417 return 0;
1418 }
1419 hostdata->state = NCR_700_HOST_BUSY;
1420 hostdata->cmd = SCp;
1421 slot->state = NCR_700_SLOT_BUSY;
1422
1423
1424
1425 hostdata->msgout[0] = NCR_700_identify((SCp->cmnd[0] != REQUEST_SENSE &&
1426 slot->flags != NCR_700_FLAG_AUTOSENSE),
1427 lun);
1428
1429
1430
1431 if(SCp->cmnd[0] == INQUIRY || SCp->cmnd[0] == REQUEST_SENSE ||
1432 slot->flags == NCR_700_FLAG_AUTOSENSE) {
1433 NCR_700_clear_flag(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC);
1434 }
1435
1436
1437
1438
1439
1440 if((hostdata->tag_negotiated & (1<<scmd_id(SCp)))
1441 && (slot->tag != SCSI_NO_TAG && SCp->cmnd[0] != REQUEST_SENSE &&
1442 slot->flags != NCR_700_FLAG_AUTOSENSE)) {
1443 count += spi_populate_tag_msg(&hostdata->msgout[count], SCp);
1444 }
1445
1446 if(hostdata->fast &&
1447 NCR_700_is_flag_clear(SCp->device, NCR_700_DEV_NEGOTIATED_SYNC)) {
1448 count += spi_populate_sync_msg(&hostdata->msgout[count],
1449 spi_period(SCp->device->sdev_target),
1450 spi_offset(SCp->device->sdev_target));
1451 NCR_700_set_flag(SCp->device, NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
1452 }
1453
1454 script_patch_16(hostdata, hostdata->script, MessageCount, count);
1455
1456 script_patch_ID(hostdata, hostdata->script, Device_ID, 1<<scmd_id(SCp));
1457
1458 script_patch_32_abs(hostdata, hostdata->script, CommandAddress,
1459 slot->pCmd);
1460 script_patch_16(hostdata, hostdata->script, CommandCount, SCp->cmd_len);
1461
1462
1463 script_patch_32_abs(hostdata, hostdata->script,
1464 SGScriptStartAddress, to32bit(&slot->pSG[0].ins));
1465 NCR_700_clear_fifo(SCp->device->host);
1466
1467 if(slot->resume_offset == 0)
1468 slot->resume_offset = hostdata->pScript;
1469
1470 dma_sync_to_dev(hostdata, hostdata->msgout, count);
1471 dma_sync_from_dev(hostdata, hostdata->msgin, MSG_ARRAY_SIZE);
1472 dma_sync_to_dev(hostdata, SCp->cmnd, SCp->cmd_len);
1473 dma_sync_from_dev(hostdata, hostdata->status, 1);
1474
1475
1476 NCR_700_writeb(NCR_700_get_SXFER(SCp->device),
1477 SCp->device->host, SXFER_REG);
1478 NCR_700_writel(slot->temp, SCp->device->host, TEMP_REG);
1479 NCR_700_writel(slot->resume_offset, SCp->device->host, DSP_REG);
1480
1481 return 1;
1482 }
1483
1484 irqreturn_t
1485 NCR_700_intr(int irq, void *dev_id)
1486 {
1487 struct Scsi_Host *host = (struct Scsi_Host *)dev_id;
1488 struct NCR_700_Host_Parameters *hostdata =
1489 (struct NCR_700_Host_Parameters *)host->hostdata[0];
1490 __u8 istat;
1491 __u32 resume_offset = 0;
1492 __u8 pun = 0xff, lun = 0xff;
1493 unsigned long flags;
1494 int handled = 0;
1495
1496
1497
1498
1499
1500
1501 spin_lock_irqsave(host->host_lock, flags);
1502 if((istat = NCR_700_readb(host, ISTAT_REG))
1503 & (SCSI_INT_PENDING | DMA_INT_PENDING)) {
1504 __u32 dsps;
1505 __u8 sstat0 = 0, dstat = 0;
1506 __u32 dsp;
1507 struct scsi_cmnd *SCp = hostdata->cmd;
1508
1509 handled = 1;
1510
1511 if(istat & SCSI_INT_PENDING) {
1512 udelay(10);
1513
1514 sstat0 = NCR_700_readb(host, SSTAT0_REG);
1515 }
1516
1517 if(istat & DMA_INT_PENDING) {
1518 udelay(10);
1519
1520 dstat = NCR_700_readb(host, DSTAT_REG);
1521 }
1522
1523 dsps = NCR_700_readl(host, DSPS_REG);
1524 dsp = NCR_700_readl(host, DSP_REG);
1525
1526 DEBUG(("scsi%d: istat %02x sstat0 %02x dstat %02x dsp %04x[%08x] dsps 0x%x\n",
1527 host->host_no, istat, sstat0, dstat,
1528 (dsp - (__u32)(hostdata->pScript))/4,
1529 dsp, dsps));
1530
1531 if(SCp != NULL) {
1532 pun = SCp->device->id;
1533 lun = SCp->device->lun;
1534 }
1535
1536 if(sstat0 & SCSI_RESET_DETECTED) {
1537 struct scsi_device *SDp;
1538 int i;
1539
1540 hostdata->state = NCR_700_HOST_BUSY;
1541
1542 printk(KERN_ERR "scsi%d: Bus Reset detected, executing command %p, slot %p, dsp %08x[%04x]\n",
1543 host->host_no, SCp, SCp == NULL ? NULL : SCp->host_scribble, dsp, dsp - hostdata->pScript);
1544
1545 scsi_report_bus_reset(host, 0);
1546
1547
1548 __shost_for_each_device(SDp, host)
1549 NCR_700_clear_flag(SDp, ~0);
1550
1551
1552 for(i = 0; i < NCR_700_COMMAND_SLOTS_PER_HOST; i++) {
1553 struct scsi_cmnd *SCp;
1554 struct NCR_700_command_slot *slot =
1555 &hostdata->slots[i];
1556
1557 if(slot->state == NCR_700_SLOT_FREE)
1558 continue;
1559
1560 SCp = slot->cmnd;
1561 printk(KERN_ERR " failing command because of reset, slot %p, cmnd %p\n",
1562 slot, SCp);
1563 free_slot(slot, hostdata);
1564 SCp->host_scribble = NULL;
1565 NCR_700_set_depth(SCp->device, 0);
1566
1567
1568
1569
1570
1571
1572 SCp->result = DID_RESET << 16;
1573 scsi_done(SCp);
1574 }
1575 mdelay(25);
1576 NCR_700_chip_setup(host);
1577
1578 hostdata->state = NCR_700_HOST_FREE;
1579 hostdata->cmd = NULL;
1580
1581 if(hostdata->eh_complete != NULL)
1582 complete(hostdata->eh_complete);
1583 goto out_unlock;
1584 } else if(sstat0 & SELECTION_TIMEOUT) {
1585 DEBUG(("scsi%d: (%d:%d) selection timeout\n",
1586 host->host_no, pun, lun));
1587 NCR_700_scsi_done(hostdata, SCp, DID_NO_CONNECT<<16);
1588 } else if(sstat0 & PHASE_MISMATCH) {
1589 struct NCR_700_command_slot *slot = (SCp == NULL) ? NULL :
1590 (struct NCR_700_command_slot *)SCp->host_scribble;
1591
1592 if(dsp == Ent_SendMessage + 8 + hostdata->pScript) {
1593
1594
1595 #ifdef NCR_700_DEBUG
1596 __u32 temp = NCR_700_readl(host, TEMP_REG);
1597 int count = (hostdata->script[Ent_SendMessage/4] & 0xffffff) - ((NCR_700_readl(host, DBC_REG) & 0xffffff) + NCR_700_data_residual(host));
1598 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)));
1599 #endif
1600 resume_offset = hostdata->pScript + Ent_SendMessagePhaseMismatch;
1601 } else if(dsp >= to32bit(&slot->pSG[0].ins) &&
1602 dsp <= to32bit(&slot->pSG[NCR_700_SG_SEGMENTS].ins)) {
1603 int data_transfer = NCR_700_readl(host, DBC_REG) & 0xffffff;
1604 int SGcount = (dsp - to32bit(&slot->pSG[0].ins))/sizeof(struct NCR_700_SG_List);
1605 int residual = NCR_700_data_residual(host);
1606 int i;
1607 #ifdef NCR_700_DEBUG
1608 __u32 naddr = NCR_700_readl(host, DNAD_REG);
1609
1610 printk("scsi%d: (%d:%d) Expected phase mismatch in slot->SG[%d], transferred 0x%x\n",
1611 host->host_no, pun, lun,
1612 SGcount, data_transfer);
1613 scsi_print_command(SCp);
1614 if(residual) {
1615 printk("scsi%d: (%d:%d) Expected phase mismatch in slot->SG[%d], transferred 0x%x, residual %d\n",
1616 host->host_no, pun, lun,
1617 SGcount, data_transfer, residual);
1618 }
1619 #endif
1620 data_transfer += residual;
1621
1622 if(data_transfer != 0) {
1623 int count;
1624 __u32 pAddr;
1625
1626 SGcount--;
1627
1628 count = (bS_to_cpu(slot->SG[SGcount].ins) & 0x00ffffff);
1629 DEBUG(("DATA TRANSFER MISMATCH, count = %d, transferred %d\n", count, count-data_transfer));
1630 slot->SG[SGcount].ins &= bS_to_host(0xff000000);
1631 slot->SG[SGcount].ins |= bS_to_host(data_transfer);
1632 pAddr = bS_to_cpu(slot->SG[SGcount].pAddr);
1633 pAddr += (count - data_transfer);
1634 #ifdef NCR_700_DEBUG
1635 if(pAddr != naddr) {
1636 printk("scsi%d (%d:%d) transfer mismatch pAddr=%lx, naddr=%lx, data_transfer=%d, residual=%d\n", host->host_no, pun, lun, (unsigned long)pAddr, (unsigned long)naddr, data_transfer, residual);
1637 }
1638 #endif
1639 slot->SG[SGcount].pAddr = bS_to_host(pAddr);
1640 }
1641
1642 for(i=0; i<SGcount; i++) {
1643 slot->SG[i].ins = bS_to_host(SCRIPT_NOP);
1644 slot->SG[i].pAddr = 0;
1645 }
1646 dma_sync_to_dev(hostdata, slot->SG, sizeof(slot->SG));
1647
1648
1649 resume_offset = hostdata->pScript + Ent_MsgInDuringData;
1650
1651 NCR_700_flush_fifo(host);
1652 } else {
1653 __u8 sbcl = NCR_700_readb(host, SBCL_REG);
1654 printk(KERN_ERR "scsi%d: (%d:%d) phase mismatch at %04x, phase %s\n",
1655 host->host_no, pun, lun, dsp - hostdata->pScript, sbcl_to_string(sbcl));
1656 NCR_700_internal_bus_reset(host);
1657 }
1658
1659 } else if(sstat0 & SCSI_GROSS_ERROR) {
1660 printk(KERN_ERR "scsi%d: (%d:%d) GROSS ERROR\n",
1661 host->host_no, pun, lun);
1662 NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
1663 } else if(sstat0 & PARITY_ERROR) {
1664 printk(KERN_ERR "scsi%d: (%d:%d) PARITY ERROR\n",
1665 host->host_no, pun, lun);
1666 NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
1667 } else if(dstat & SCRIPT_INT_RECEIVED) {
1668 DEBUG(("scsi%d: (%d:%d) ====>SCRIPT INTERRUPT<====\n",
1669 host->host_no, pun, lun));
1670 resume_offset = process_script_interrupt(dsps, dsp, SCp, host, hostdata);
1671 } else if(dstat & (ILGL_INST_DETECTED)) {
1672 printk(KERN_ERR "scsi%d: (%d:%d) Illegal Instruction detected at 0x%08x[0x%x]!!!\n"
1673 " Please email James.Bottomley@HansenPartnership.com with the details\n",
1674 host->host_no, pun, lun,
1675 dsp, dsp - hostdata->pScript);
1676 NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
1677 } else if(dstat & (WATCH_DOG_INTERRUPT|ABORTED)) {
1678 printk(KERN_ERR "scsi%d: (%d:%d) serious DMA problem, dstat=%02x\n",
1679 host->host_no, pun, lun, dstat);
1680 NCR_700_scsi_done(hostdata, SCp, DID_ERROR<<16);
1681 }
1682
1683
1684
1685
1686
1687
1688
1689 if(sstat0 & SELECTED) {
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705 resume_offset = process_selection(host, dsp);
1706
1707 }
1708
1709 }
1710
1711 if(resume_offset) {
1712 if(hostdata->state != NCR_700_HOST_BUSY) {
1713 printk(KERN_ERR "scsi%d: Driver error: resume at 0x%08x [0x%04x] with non busy host!\n",
1714 host->host_no, resume_offset, resume_offset - hostdata->pScript);
1715 hostdata->state = NCR_700_HOST_BUSY;
1716 }
1717
1718 DEBUG(("Attempting to resume at %x\n", resume_offset));
1719 NCR_700_clear_fifo(host);
1720 NCR_700_writel(resume_offset, host, DSP_REG);
1721 }
1722
1723
1724
1725
1726
1727 if(hostdata->state == NCR_700_HOST_FREE) {
1728 int i;
1729
1730 for(i = 0; i < NCR_700_COMMAND_SLOTS_PER_HOST; i++) {
1731
1732
1733 int j = (i + hostdata->saved_slot_position)
1734 % NCR_700_COMMAND_SLOTS_PER_HOST;
1735
1736 if(hostdata->slots[j].state != NCR_700_SLOT_QUEUED)
1737 continue;
1738 if(NCR_700_start_command(hostdata->slots[j].cmnd)) {
1739 DEBUG(("scsi%d: Issuing saved command slot %p, cmd %p\t\n",
1740 host->host_no, &hostdata->slots[j],
1741 hostdata->slots[j].cmnd));
1742 hostdata->saved_slot_position = j + 1;
1743 }
1744
1745 break;
1746 }
1747 }
1748 out_unlock:
1749 spin_unlock_irqrestore(host->host_lock, flags);
1750 return IRQ_RETVAL(handled);
1751 }
1752
1753 static int NCR_700_queuecommand_lck(struct scsi_cmnd *SCp)
1754 {
1755 struct NCR_700_Host_Parameters *hostdata =
1756 (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0];
1757 __u32 move_ins;
1758 struct NCR_700_command_slot *slot;
1759
1760 if(hostdata->command_slot_count >= NCR_700_COMMAND_SLOTS_PER_HOST) {
1761
1762
1763 printk(KERN_WARNING "scsi%d: Command depth has gone over queue depth\n", SCp->device->host->host_no);
1764 return 1;
1765 }
1766
1767
1768
1769
1770
1771
1772 if(NCR_700_get_depth(SCp->device) != 0
1773 && (!(hostdata->tag_negotiated & (1<<scmd_id(SCp)))
1774 || !(SCp->flags & SCMD_TAGGED))) {
1775 CDEBUG(KERN_ERR, SCp, "has non zero depth %d\n",
1776 NCR_700_get_depth(SCp->device));
1777 return SCSI_MLQUEUE_DEVICE_BUSY;
1778 }
1779 if(NCR_700_get_depth(SCp->device) >= SCp->device->queue_depth) {
1780 CDEBUG(KERN_ERR, SCp, "has max tag depth %d\n",
1781 NCR_700_get_depth(SCp->device));
1782 return SCSI_MLQUEUE_DEVICE_BUSY;
1783 }
1784 NCR_700_set_depth(SCp->device, NCR_700_get_depth(SCp->device) + 1);
1785
1786
1787
1788
1789 slot = find_empty_slot(hostdata);
1790
1791 slot->cmnd = SCp;
1792
1793 SCp->host_scribble = (unsigned char *)slot;
1794
1795 #ifdef NCR_700_DEBUG
1796 printk("53c700: scsi%d, command ", SCp->device->host->host_no);
1797 scsi_print_command(SCp);
1798 #endif
1799 if ((SCp->flags & SCMD_TAGGED)
1800 && (hostdata->tag_negotiated &(1<<scmd_id(SCp))) == 0
1801 && NCR_700_get_tag_neg_state(SCp->device) == NCR_700_START_TAG_NEGOTIATION) {
1802 scmd_printk(KERN_ERR, SCp, "Enabling Tag Command Queuing\n");
1803 hostdata->tag_negotiated |= (1<<scmd_id(SCp));
1804 NCR_700_set_tag_neg_state(SCp->device, NCR_700_DURING_TAG_NEGOTIATION);
1805 }
1806
1807
1808
1809
1810
1811
1812
1813 if (!(SCp->flags & SCMD_TAGGED)
1814 && (hostdata->tag_negotiated &(1<<scmd_id(SCp)))) {
1815 scmd_printk(KERN_INFO, SCp, "Disabling Tag Command Queuing\n");
1816 hostdata->tag_negotiated &= ~(1<<scmd_id(SCp));
1817 }
1818
1819 if ((hostdata->tag_negotiated & (1<<scmd_id(SCp))) &&
1820 SCp->device->simple_tags) {
1821 slot->tag = scsi_cmd_to_rq(SCp)->tag;
1822 CDEBUG(KERN_DEBUG, SCp, "sending out tag %d, slot %p\n",
1823 slot->tag, slot);
1824 } else {
1825 struct NCR_700_Device_Parameters *p = SCp->device->hostdata;
1826
1827 slot->tag = SCSI_NO_TAG;
1828
1829 p->current_cmnd = SCp;
1830 }
1831
1832
1833 if(!scsi_sg_count(SCp) && !scsi_bufflen(SCp) &&
1834 SCp->sc_data_direction != DMA_NONE) {
1835 #ifdef NCR_700_DEBUG
1836 printk("53c700: Command");
1837 scsi_print_command(SCp);
1838 printk("Has wrong data direction %d\n", SCp->sc_data_direction);
1839 #endif
1840 SCp->sc_data_direction = DMA_NONE;
1841 }
1842
1843 switch (SCp->cmnd[0]) {
1844 case REQUEST_SENSE:
1845
1846 SCp->cmnd[6] = 0;
1847 fallthrough;
1848 default:
1849
1850 switch(SCp->sc_data_direction) {
1851 case DMA_BIDIRECTIONAL:
1852 default:
1853 printk(KERN_ERR "53c700: Unknown command for data direction ");
1854 scsi_print_command(SCp);
1855
1856 move_ins = 0;
1857 break;
1858 case DMA_NONE:
1859 move_ins = 0;
1860 break;
1861 case DMA_FROM_DEVICE:
1862 move_ins = SCRIPT_MOVE_DATA_IN;
1863 break;
1864 case DMA_TO_DEVICE:
1865 move_ins = SCRIPT_MOVE_DATA_OUT;
1866 break;
1867 }
1868 }
1869
1870
1871 if(move_ins != 0) {
1872 int i;
1873 int sg_count;
1874 dma_addr_t vPtr = 0;
1875 struct scatterlist *sg;
1876 __u32 count = 0;
1877
1878 sg_count = scsi_dma_map(SCp);
1879 BUG_ON(sg_count < 0);
1880
1881 scsi_for_each_sg(SCp, sg, sg_count, i) {
1882 vPtr = sg_dma_address(sg);
1883 count = sg_dma_len(sg);
1884
1885 slot->SG[i].ins = bS_to_host(move_ins | count);
1886 DEBUG((" scatter block %d: move %d[%08x] from 0x%lx\n",
1887 i, count, slot->SG[i].ins, (unsigned long)vPtr));
1888 slot->SG[i].pAddr = bS_to_host(vPtr);
1889 }
1890 slot->SG[i].ins = bS_to_host(SCRIPT_RETURN);
1891 slot->SG[i].pAddr = 0;
1892 dma_sync_to_dev(hostdata, slot->SG, sizeof(slot->SG));
1893 DEBUG((" SETTING %p to %x\n",
1894 (&slot->pSG[i].ins),
1895 slot->SG[i].ins));
1896 }
1897 slot->resume_offset = 0;
1898 slot->pCmd = dma_map_single(hostdata->dev, SCp->cmnd,
1899 MAX_COMMAND_SIZE, DMA_TO_DEVICE);
1900 NCR_700_start_command(SCp);
1901 return 0;
1902 }
1903
1904 STATIC DEF_SCSI_QCMD(NCR_700_queuecommand)
1905
1906 STATIC int
1907 NCR_700_abort(struct scsi_cmnd * SCp)
1908 {
1909 struct NCR_700_command_slot *slot;
1910
1911 scmd_printk(KERN_INFO, SCp, "abort command\n");
1912
1913 slot = (struct NCR_700_command_slot *)SCp->host_scribble;
1914
1915 if(slot == NULL)
1916
1917 return SUCCESS;
1918 if(SCp->cmnd[0] == TEST_UNIT_READY) {
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929 NCR_700_internal_bus_reset(SCp->device->host);
1930
1931 }
1932 return FAILED;
1933
1934 }
1935
1936 STATIC int
1937 NCR_700_host_reset(struct scsi_cmnd * SCp)
1938 {
1939 DECLARE_COMPLETION_ONSTACK(complete);
1940 struct NCR_700_Host_Parameters *hostdata =
1941 (struct NCR_700_Host_Parameters *)SCp->device->host->hostdata[0];
1942
1943 scmd_printk(KERN_INFO, SCp,
1944 "New error handler wants HOST reset, cmd %p\n\t", SCp);
1945 scsi_print_command(SCp);
1946
1947
1948
1949
1950 spin_lock_irq(SCp->device->host->host_lock);
1951 while (hostdata->eh_complete != NULL) {
1952 spin_unlock_irq(SCp->device->host->host_lock);
1953 msleep_interruptible(100);
1954 spin_lock_irq(SCp->device->host->host_lock);
1955 }
1956
1957 hostdata->eh_complete = &complete;
1958 NCR_700_internal_bus_reset(SCp->device->host);
1959 NCR_700_chip_reset(SCp->device->host);
1960
1961 spin_unlock_irq(SCp->device->host->host_lock);
1962 wait_for_completion(&complete);
1963 spin_lock_irq(SCp->device->host->host_lock);
1964
1965 hostdata->eh_complete = NULL;
1966
1967 if(hostdata->fast)
1968 spi_schedule_dv_device(SCp->device);
1969
1970 spin_unlock_irq(SCp->device->host->host_lock);
1971 return SUCCESS;
1972 }
1973
1974 STATIC void
1975 NCR_700_set_period(struct scsi_target *STp, int period)
1976 {
1977 struct Scsi_Host *SHp = dev_to_shost(STp->dev.parent);
1978 struct NCR_700_Host_Parameters *hostdata =
1979 (struct NCR_700_Host_Parameters *)SHp->hostdata[0];
1980
1981 if(!hostdata->fast)
1982 return;
1983
1984 if(period < hostdata->min_period)
1985 period = hostdata->min_period;
1986
1987 spi_period(STp) = period;
1988 spi_flags(STp) &= ~(NCR_700_DEV_NEGOTIATED_SYNC |
1989 NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
1990 spi_flags(STp) |= NCR_700_DEV_PRINT_SYNC_NEGOTIATION;
1991 }
1992
1993 STATIC void
1994 NCR_700_set_offset(struct scsi_target *STp, int offset)
1995 {
1996 struct Scsi_Host *SHp = dev_to_shost(STp->dev.parent);
1997 struct NCR_700_Host_Parameters *hostdata =
1998 (struct NCR_700_Host_Parameters *)SHp->hostdata[0];
1999 int max_offset = hostdata->chip710
2000 ? NCR_710_MAX_OFFSET : NCR_700_MAX_OFFSET;
2001
2002 if(!hostdata->fast)
2003 return;
2004
2005 if(offset > max_offset)
2006 offset = max_offset;
2007
2008
2009 if(spi_offset(STp) == 0 && (spi_period(STp) < hostdata->min_period ||
2010 spi_period(STp) > 0xff))
2011 spi_period(STp) = hostdata->min_period;
2012
2013 spi_offset(STp) = offset;
2014 spi_flags(STp) &= ~(NCR_700_DEV_NEGOTIATED_SYNC |
2015 NCR_700_DEV_BEGIN_SYNC_NEGOTIATION);
2016 spi_flags(STp) |= NCR_700_DEV_PRINT_SYNC_NEGOTIATION;
2017 }
2018
2019 STATIC int
2020 NCR_700_slave_alloc(struct scsi_device *SDp)
2021 {
2022 SDp->hostdata = kzalloc(sizeof(struct NCR_700_Device_Parameters),
2023 GFP_KERNEL);
2024
2025 if (!SDp->hostdata)
2026 return -ENOMEM;
2027
2028 return 0;
2029 }
2030
2031 STATIC int
2032 NCR_700_slave_configure(struct scsi_device *SDp)
2033 {
2034 struct NCR_700_Host_Parameters *hostdata =
2035 (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
2036
2037
2038 if(SDp->tagged_supported) {
2039 scsi_change_queue_depth(SDp, NCR_700_DEFAULT_TAGS);
2040 NCR_700_set_tag_neg_state(SDp, NCR_700_START_TAG_NEGOTIATION);
2041 }
2042
2043 if(hostdata->fast) {
2044
2045 if (!spi_initial_dv(SDp->sdev_target))
2046 spi_dv_device(SDp);
2047 } else {
2048 spi_offset(SDp->sdev_target) = 0;
2049 spi_period(SDp->sdev_target) = 0;
2050 }
2051 return 0;
2052 }
2053
2054 STATIC void
2055 NCR_700_slave_destroy(struct scsi_device *SDp)
2056 {
2057 kfree(SDp->hostdata);
2058 SDp->hostdata = NULL;
2059 }
2060
2061 static int
2062 NCR_700_change_queue_depth(struct scsi_device *SDp, int depth)
2063 {
2064 if (depth > NCR_700_MAX_TAGS)
2065 depth = NCR_700_MAX_TAGS;
2066 return scsi_change_queue_depth(SDp, depth);
2067 }
2068
2069 static ssize_t
2070 NCR_700_show_active_tags(struct device *dev, struct device_attribute *attr, char *buf)
2071 {
2072 struct scsi_device *SDp = to_scsi_device(dev);
2073
2074 return snprintf(buf, 20, "%d\n", NCR_700_get_depth(SDp));
2075 }
2076
2077 static struct device_attribute NCR_700_active_tags_attr = {
2078 .attr = {
2079 .name = "active_tags",
2080 .mode = S_IRUGO,
2081 },
2082 .show = NCR_700_show_active_tags,
2083 };
2084
2085 STATIC struct attribute *NCR_700_dev_attrs[] = {
2086 &NCR_700_active_tags_attr.attr,
2087 NULL,
2088 };
2089
2090 ATTRIBUTE_GROUPS(NCR_700_dev);
2091
2092 EXPORT_SYMBOL(NCR_700_detect);
2093 EXPORT_SYMBOL(NCR_700_release);
2094 EXPORT_SYMBOL(NCR_700_intr);
2095
2096 static struct spi_function_template NCR_700_transport_functions = {
2097 .set_period = NCR_700_set_period,
2098 .show_period = 1,
2099 .set_offset = NCR_700_set_offset,
2100 .show_offset = 1,
2101 };
2102
2103 static int __init NCR_700_init(void)
2104 {
2105 NCR_700_transport_template = spi_attach_transport(&NCR_700_transport_functions);
2106 if(!NCR_700_transport_template)
2107 return -ENODEV;
2108 return 0;
2109 }
2110
2111 static void __exit NCR_700_exit(void)
2112 {
2113 spi_release_transport(NCR_700_transport_template);
2114 }
2115
2116 module_init(NCR_700_init);
2117 module_exit(NCR_700_exit);
2118