1 /*====================================================================== 2 3 NinjaSCSI-3 / NinjaSCSI-32Bi PCMCIA SCSI host adapter card driver 4 By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> 5 6 Ver.2.8 Support 32bit MMIO mode 7 Support Synchronous Data Transfer Request (SDTR) mode 8 Ver.2.0 Support 32bit PIO mode 9 Ver.1.1.2 Fix for scatter list buffer exceeds 10 Ver.1.1 Support scatter list 11 Ver.0.1 Initial version 12 13 This software may be used and distributed according to the terms of 14 the GNU General Public License. 15 16 ======================================================================*/ 17 18 /*********************************************************************** 19 This driver is for these PCcards. 20 21 I-O DATA PCSC-F (Workbit NinjaSCSI-3) 22 "WBT", "NinjaSCSI-3", "R1.0" 23 I-O DATA CBSC-II (Workbit NinjaSCSI-32Bi in 16bit mode) 24 "IO DATA", "CBSC16 ", "1" 25 26 ***********************************************************************/ 27 28 #include <linux/module.h> 29 #include <linux/kernel.h> 30 #include <linux/init.h> 31 #include <linux/slab.h> 32 #include <linux/string.h> 33 #include <linux/timer.h> 34 #include <linux/ioport.h> 35 #include <linux/delay.h> 36 #include <linux/interrupt.h> 37 #include <linux/major.h> 38 #include <linux/blkdev.h> 39 #include <linux/stat.h> 40 41 #include <asm/io.h> 42 #include <asm/irq.h> 43 44 #include <../drivers/scsi/scsi.h> 45 #include <scsi/scsi_host.h> 46 47 #include <scsi/scsi.h> 48 #include <scsi/scsi_ioctl.h> 49 50 #include <pcmcia/cistpl.h> 51 #include <pcmcia/cisreg.h> 52 #include <pcmcia/ds.h> 53 54 #include "nsp_cs.h" 55 56 MODULE_AUTHOR("YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>"); 57 MODULE_DESCRIPTION("WorkBit NinjaSCSI-3 / NinjaSCSI-32Bi(16bit) PCMCIA SCSI host adapter module"); 58 MODULE_SUPPORTED_DEVICE("sd,sr,sg,st"); 59 MODULE_LICENSE("GPL"); 60 61 #include "nsp_io.h" 62 63 /*====================================================================*/ 64 /* Parameters that can be set with 'insmod' */ 65 66 static int nsp_burst_mode = BURST_MEM32; 67 module_param(nsp_burst_mode, int, 0); 68 MODULE_PARM_DESC(nsp_burst_mode, "Burst transfer mode (0=io8, 1=io32, 2=mem32(default))"); 69 70 /* Release IO ports after configuration? */ 71 static bool free_ports = 0; 72 module_param(free_ports, bool, 0); 73 MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0 (=no))"); 74 75 static struct scsi_host_template nsp_driver_template = { 76 .proc_name = "nsp_cs", 77 .show_info = nsp_show_info, 78 .name = "WorkBit NinjaSCSI-3/32Bi(16bit)", 79 .info = nsp_info, 80 .queuecommand = nsp_queuecommand, 81 /* .eh_abort_handler = nsp_eh_abort,*/ 82 .eh_bus_reset_handler = nsp_eh_bus_reset, 83 .eh_host_reset_handler = nsp_eh_host_reset, 84 .can_queue = 1, 85 .this_id = NSP_INITIATOR_ID, 86 .sg_tablesize = SG_ALL, 87 .dma_boundary = PAGE_SIZE - 1, 88 }; 89 90 static nsp_hw_data nsp_data_base; /* attach <-> detect glue */ 91 92 93 94 /* 95 * debug, error print 96 */ 97 #ifndef NSP_DEBUG 98 # define NSP_DEBUG_MASK 0x000000 99 # define nsp_msg(type, args...) nsp_cs_message("", 0, (type), args) 100 # define nsp_dbg(mask, args...) /* */ 101 #else 102 # define NSP_DEBUG_MASK 0xffffff 103 # define nsp_msg(type, args...) \ 104 nsp_cs_message (__func__, __LINE__, (type), args) 105 # define nsp_dbg(mask, args...) \ 106 nsp_cs_dmessage(__func__, __LINE__, (mask), args) 107 #endif 108 109 #define NSP_DEBUG_QUEUECOMMAND BIT(0) 110 #define NSP_DEBUG_REGISTER BIT(1) 111 #define NSP_DEBUG_AUTOSCSI BIT(2) 112 #define NSP_DEBUG_INTR BIT(3) 113 #define NSP_DEBUG_SGLIST BIT(4) 114 #define NSP_DEBUG_BUSFREE BIT(5) 115 #define NSP_DEBUG_CDB_CONTENTS BIT(6) 116 #define NSP_DEBUG_RESELECTION BIT(7) 117 #define NSP_DEBUG_MSGINOCCUR BIT(8) 118 #define NSP_DEBUG_EEPROM BIT(9) 119 #define NSP_DEBUG_MSGOUTOCCUR BIT(10) 120 #define NSP_DEBUG_BUSRESET BIT(11) 121 #define NSP_DEBUG_RESTART BIT(12) 122 #define NSP_DEBUG_SYNC BIT(13) 123 #define NSP_DEBUG_WAIT BIT(14) 124 #define NSP_DEBUG_TARGETFLAG BIT(15) 125 #define NSP_DEBUG_PROC BIT(16) 126 #define NSP_DEBUG_INIT BIT(17) 127 #define NSP_DEBUG_DATA_IO BIT(18) 128 #define NSP_SPECIAL_PRINT_REGISTER BIT(20) 129 130 #define NSP_DEBUG_BUF_LEN 150 131 132 static inline void nsp_inc_resid(struct scsi_cmnd *SCpnt, int residInc) 133 { 134 scsi_set_resid(SCpnt, scsi_get_resid(SCpnt) + residInc); 135 } 136 137 static void nsp_cs_message(const char *func, int line, char *type, char *fmt, ...) 138 { 139 va_list args; 140 char buf[NSP_DEBUG_BUF_LEN]; 141 142 va_start(args, fmt); 143 vsnprintf(buf, sizeof(buf), fmt, args); 144 va_end(args); 145 146 #ifndef NSP_DEBUG 147 printk("%snsp_cs: %s\n", type, buf); 148 #else 149 printk("%snsp_cs: %s (%d): %s\n", type, func, line, buf); 150 #endif 151 } 152 153 #ifdef NSP_DEBUG 154 static void nsp_cs_dmessage(const char *func, int line, int mask, char *fmt, ...) 155 { 156 va_list args; 157 char buf[NSP_DEBUG_BUF_LEN]; 158 159 va_start(args, fmt); 160 vsnprintf(buf, sizeof(buf), fmt, args); 161 va_end(args); 162 163 if (mask & NSP_DEBUG_MASK) { 164 printk("nsp_cs-debug: 0x%x %s (%d): %s\n", mask, func, line, buf); 165 } 166 } 167 #endif 168 169 /***********************************************************/ 170 171 /*==================================================== 172 * Clenaup parameters and call done() functions. 173 * You must be set SCpnt->result before call this function. 174 */ 175 static void nsp_scsi_done(struct scsi_cmnd *SCpnt) 176 { 177 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 178 179 data->CurrentSC = NULL; 180 181 SCpnt->scsi_done(SCpnt); 182 } 183 184 static int nsp_queuecommand_lck(struct scsi_cmnd *SCpnt, 185 void (*done)(struct scsi_cmnd *)) 186 { 187 #ifdef NSP_DEBUG 188 /*unsigned int host_id = SCpnt->device->host->this_id;*/ 189 /*unsigned int base = SCpnt->device->host->io_port;*/ 190 unsigned char target = scmd_id(SCpnt); 191 #endif 192 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 193 194 nsp_dbg(NSP_DEBUG_QUEUECOMMAND, 195 "SCpnt=0x%p target=%d lun=%llu sglist=0x%p bufflen=%d sg_count=%d", 196 SCpnt, target, SCpnt->device->lun, scsi_sglist(SCpnt), 197 scsi_bufflen(SCpnt), scsi_sg_count(SCpnt)); 198 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "before CurrentSC=0x%p", data->CurrentSC); 199 200 SCpnt->scsi_done = done; 201 202 if (data->CurrentSC != NULL) { 203 nsp_msg(KERN_DEBUG, "CurrentSC!=NULL this can't be happen"); 204 SCpnt->result = DID_BAD_TARGET << 16; 205 nsp_scsi_done(SCpnt); 206 return 0; 207 } 208 209 #if 0 210 /* XXX: pcmcia-cs generates SCSI command with "scsi_info" utility. 211 This makes kernel crash when suspending... */ 212 if (data->ScsiInfo->stop != 0) { 213 nsp_msg(KERN_INFO, "suspending device. reject command."); 214 SCpnt->result = DID_BAD_TARGET << 16; 215 nsp_scsi_done(SCpnt); 216 return SCSI_MLQUEUE_HOST_BUSY; 217 } 218 #endif 219 220 show_command(SCpnt); 221 222 data->CurrentSC = SCpnt; 223 224 SCpnt->SCp.Status = CHECK_CONDITION; 225 SCpnt->SCp.Message = 0; 226 SCpnt->SCp.have_data_in = IO_UNKNOWN; 227 SCpnt->SCp.sent_command = 0; 228 SCpnt->SCp.phase = PH_UNDETERMINED; 229 scsi_set_resid(SCpnt, scsi_bufflen(SCpnt)); 230 231 /* setup scratch area 232 SCp.ptr : buffer pointer 233 SCp.this_residual : buffer length 234 SCp.buffer : next buffer 235 SCp.buffers_residual : left buffers in list 236 SCp.phase : current state of the command */ 237 if (scsi_bufflen(SCpnt)) { 238 SCpnt->SCp.buffer = scsi_sglist(SCpnt); 239 SCpnt->SCp.ptr = BUFFER_ADDR; 240 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; 241 SCpnt->SCp.buffers_residual = scsi_sg_count(SCpnt) - 1; 242 } else { 243 SCpnt->SCp.ptr = NULL; 244 SCpnt->SCp.this_residual = 0; 245 SCpnt->SCp.buffer = NULL; 246 SCpnt->SCp.buffers_residual = 0; 247 } 248 249 if (nsphw_start_selection(SCpnt) == FALSE) { 250 nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "selection fail"); 251 SCpnt->result = DID_BUS_BUSY << 16; 252 nsp_scsi_done(SCpnt); 253 return 0; 254 } 255 256 257 //nsp_dbg(NSP_DEBUG_QUEUECOMMAND, "out"); 258 #ifdef NSP_DEBUG 259 data->CmdId++; 260 #endif 261 return 0; 262 } 263 264 static DEF_SCSI_QCMD(nsp_queuecommand) 265 266 /* 267 * setup PIO FIFO transfer mode and enable/disable to data out 268 */ 269 static void nsp_setup_fifo(nsp_hw_data *data, int enabled) 270 { 271 unsigned int base = data->BaseAddress; 272 unsigned char transfer_mode_reg; 273 274 //nsp_dbg(NSP_DEBUG_DATA_IO, "enabled=%d", enabled); 275 276 if (enabled != FALSE) { 277 transfer_mode_reg = TRANSFER_GO | BRAIND; 278 } else { 279 transfer_mode_reg = 0; 280 } 281 282 transfer_mode_reg |= data->TransferMode; 283 284 nsp_index_write(base, TRANSFERMODE, transfer_mode_reg); 285 } 286 287 static void nsphw_init_sync(nsp_hw_data *data) 288 { 289 sync_data tmp_sync = { .SyncNegotiation = SYNC_NOT_YET, 290 .SyncPeriod = 0, 291 .SyncOffset = 0 292 }; 293 int i; 294 295 /* setup sync data */ 296 for ( i = 0; i < ARRAY_SIZE(data->Sync); i++ ) { 297 data->Sync[i] = tmp_sync; 298 } 299 } 300 301 /* 302 * Initialize Ninja hardware 303 */ 304 static int nsphw_init(nsp_hw_data *data) 305 { 306 unsigned int base = data->BaseAddress; 307 308 nsp_dbg(NSP_DEBUG_INIT, "in base=0x%x", base); 309 310 data->ScsiClockDiv = CLOCK_40M | FAST_20; 311 data->CurrentSC = NULL; 312 data->FifoCount = 0; 313 data->TransferMode = MODE_IO8; 314 315 nsphw_init_sync(data); 316 317 /* block all interrupts */ 318 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK); 319 320 /* setup SCSI interface */ 321 nsp_write(base, IFSELECT, IF_IFSEL); 322 323 nsp_index_write(base, SCSIIRQMODE, 0); 324 325 nsp_index_write(base, TRANSFERMODE, MODE_IO8); 326 nsp_index_write(base, CLOCKDIV, data->ScsiClockDiv); 327 328 nsp_index_write(base, PARITYCTRL, 0); 329 nsp_index_write(base, POINTERCLR, POINTER_CLEAR | 330 ACK_COUNTER_CLEAR | 331 REQ_COUNTER_CLEAR | 332 HOST_COUNTER_CLEAR); 333 334 /* setup fifo asic */ 335 nsp_write(base, IFSELECT, IF_REGSEL); 336 nsp_index_write(base, TERMPWRCTRL, 0); 337 if ((nsp_index_read(base, OTHERCONTROL) & TPWR_SENSE) == 0) { 338 nsp_msg(KERN_INFO, "terminator power on"); 339 nsp_index_write(base, TERMPWRCTRL, POWER_ON); 340 } 341 342 nsp_index_write(base, TIMERCOUNT, 0); 343 nsp_index_write(base, TIMERCOUNT, 0); /* requires 2 times!! */ 344 345 nsp_index_write(base, SYNCREG, 0); 346 nsp_index_write(base, ACKWIDTH, 0); 347 348 /* enable interrupts and ack them */ 349 nsp_index_write(base, SCSIIRQMODE, SCSI_PHASE_CHANGE_EI | 350 RESELECT_EI | 351 SCSI_RESET_IRQ_EI ); 352 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR); 353 354 nsp_setup_fifo(data, FALSE); 355 356 return TRUE; 357 } 358 359 /* 360 * Start selection phase 361 */ 362 static int nsphw_start_selection(struct scsi_cmnd *SCpnt) 363 { 364 unsigned int host_id = SCpnt->device->host->this_id; 365 unsigned int base = SCpnt->device->host->io_port; 366 unsigned char target = scmd_id(SCpnt); 367 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 368 int time_out; 369 unsigned char phase, arbit; 370 371 //nsp_dbg(NSP_DEBUG_RESELECTION, "in"); 372 373 phase = nsp_index_read(base, SCSIBUSMON); 374 if(phase != BUSMON_BUS_FREE) { 375 //nsp_dbg(NSP_DEBUG_RESELECTION, "bus busy"); 376 return FALSE; 377 } 378 379 /* start arbitration */ 380 //nsp_dbg(NSP_DEBUG_RESELECTION, "start arbit"); 381 SCpnt->SCp.phase = PH_ARBSTART; 382 nsp_index_write(base, SETARBIT, ARBIT_GO); 383 384 time_out = 1000; 385 do { 386 /* XXX: what a stupid chip! */ 387 arbit = nsp_index_read(base, ARBITSTATUS); 388 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit=%d, wait_count=%d", arbit, wait_count); 389 udelay(1); /* hold 1.2us */ 390 } while((arbit & (ARBIT_WIN | ARBIT_FAIL)) == 0 && 391 (time_out-- != 0)); 392 393 if (!(arbit & ARBIT_WIN)) { 394 //nsp_dbg(NSP_DEBUG_RESELECTION, "arbit fail"); 395 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR); 396 return FALSE; 397 } 398 399 /* assert select line */ 400 //nsp_dbg(NSP_DEBUG_RESELECTION, "assert SEL line"); 401 SCpnt->SCp.phase = PH_SELSTART; 402 udelay(3); /* wait 2.4us */ 403 nsp_index_write(base, SCSIDATALATCH, BIT(host_id) | BIT(target)); 404 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_ATN); 405 udelay(2); /* wait >1.2us */ 406 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_BSY | SCSI_DATAOUT_ENB | SCSI_ATN); 407 nsp_index_write(base, SETARBIT, ARBIT_FLAG_CLEAR); 408 /*udelay(1);*/ /* wait >90ns */ 409 nsp_index_write(base, SCSIBUSCTRL, SCSI_SEL | SCSI_DATAOUT_ENB | SCSI_ATN); 410 411 /* check selection timeout */ 412 nsp_start_timer(SCpnt, 1000/51); 413 data->SelectionTimeOut = 1; 414 415 return TRUE; 416 } 417 418 struct nsp_sync_table { 419 unsigned int min_period; 420 unsigned int max_period; 421 unsigned int chip_period; 422 unsigned int ack_width; 423 }; 424 425 static struct nsp_sync_table nsp_sync_table_40M[] = { 426 {0x0c, 0x0c, 0x1, 0}, /* 20MB 50ns*/ 427 {0x19, 0x19, 0x3, 1}, /* 10MB 100ns*/ 428 {0x1a, 0x25, 0x5, 2}, /* 7.5MB 150ns*/ 429 {0x26, 0x32, 0x7, 3}, /* 5MB 200ns*/ 430 { 0, 0, 0, 0}, 431 }; 432 433 static struct nsp_sync_table nsp_sync_table_20M[] = { 434 {0x19, 0x19, 0x1, 0}, /* 10MB 100ns*/ 435 {0x1a, 0x25, 0x2, 0}, /* 7.5MB 150ns*/ 436 {0x26, 0x32, 0x3, 1}, /* 5MB 200ns*/ 437 { 0, 0, 0, 0}, 438 }; 439 440 /* 441 * setup synchronous data transfer mode 442 */ 443 static int nsp_analyze_sdtr(struct scsi_cmnd *SCpnt) 444 { 445 unsigned char target = scmd_id(SCpnt); 446 // unsigned char lun = SCpnt->device->lun; 447 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 448 sync_data *sync = &(data->Sync[target]); 449 struct nsp_sync_table *sync_table; 450 unsigned int period, offset; 451 int i; 452 453 454 nsp_dbg(NSP_DEBUG_SYNC, "in"); 455 456 period = sync->SyncPeriod; 457 offset = sync->SyncOffset; 458 459 nsp_dbg(NSP_DEBUG_SYNC, "period=0x%x, offset=0x%x", period, offset); 460 461 if ((data->ScsiClockDiv & (BIT(0)|BIT(1))) == CLOCK_20M) { 462 sync_table = nsp_sync_table_20M; 463 } else { 464 sync_table = nsp_sync_table_40M; 465 } 466 467 for ( i = 0; sync_table->max_period != 0; i++, sync_table++) { 468 if ( period >= sync_table->min_period && 469 period <= sync_table->max_period ) { 470 break; 471 } 472 } 473 474 if (period != 0 && sync_table->max_period == 0) { 475 /* 476 * No proper period/offset found 477 */ 478 nsp_dbg(NSP_DEBUG_SYNC, "no proper period/offset"); 479 480 sync->SyncPeriod = 0; 481 sync->SyncOffset = 0; 482 sync->SyncRegister = 0; 483 sync->AckWidth = 0; 484 485 return FALSE; 486 } 487 488 sync->SyncRegister = (sync_table->chip_period << SYNCREG_PERIOD_SHIFT) | 489 (offset & SYNCREG_OFFSET_MASK); 490 sync->AckWidth = sync_table->ack_width; 491 492 nsp_dbg(NSP_DEBUG_SYNC, "sync_reg=0x%x, ack_width=0x%x", sync->SyncRegister, sync->AckWidth); 493 494 return TRUE; 495 } 496 497 498 /* 499 * start ninja hardware timer 500 */ 501 static void nsp_start_timer(struct scsi_cmnd *SCpnt, int time) 502 { 503 unsigned int base = SCpnt->device->host->io_port; 504 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 505 506 //nsp_dbg(NSP_DEBUG_INTR, "in SCpnt=0x%p, time=%d", SCpnt, time); 507 data->TimerCount = time; 508 nsp_index_write(base, TIMERCOUNT, time); 509 } 510 511 /* 512 * wait for bus phase change 513 */ 514 static int nsp_negate_signal(struct scsi_cmnd *SCpnt, unsigned char mask, 515 char *str) 516 { 517 unsigned int base = SCpnt->device->host->io_port; 518 unsigned char reg; 519 int time_out; 520 521 //nsp_dbg(NSP_DEBUG_INTR, "in"); 522 523 time_out = 100; 524 525 do { 526 reg = nsp_index_read(base, SCSIBUSMON); 527 if (reg == 0xff) { 528 break; 529 } 530 } while ((--time_out != 0) && (reg & mask) != 0); 531 532 if (time_out == 0) { 533 nsp_msg(KERN_DEBUG, " %s signal off timeout", str); 534 } 535 536 return 0; 537 } 538 539 /* 540 * expect Ninja Irq 541 */ 542 static int nsp_expect_signal(struct scsi_cmnd *SCpnt, 543 unsigned char current_phase, 544 unsigned char mask) 545 { 546 unsigned int base = SCpnt->device->host->io_port; 547 int time_out; 548 unsigned char phase, i_src; 549 550 //nsp_dbg(NSP_DEBUG_INTR, "current_phase=0x%x, mask=0x%x", current_phase, mask); 551 552 time_out = 100; 553 do { 554 phase = nsp_index_read(base, SCSIBUSMON); 555 if (phase == 0xff) { 556 //nsp_dbg(NSP_DEBUG_INTR, "ret -1"); 557 return -1; 558 } 559 i_src = nsp_read(base, IRQSTATUS); 560 if (i_src & IRQSTATUS_SCSI) { 561 //nsp_dbg(NSP_DEBUG_INTR, "ret 0 found scsi signal"); 562 return 0; 563 } 564 if ((phase & mask) != 0 && (phase & BUSMON_PHASE_MASK) == current_phase) { 565 //nsp_dbg(NSP_DEBUG_INTR, "ret 1 phase=0x%x", phase); 566 return 1; 567 } 568 } while(time_out-- != 0); 569 570 //nsp_dbg(NSP_DEBUG_INTR, "timeout"); 571 return -1; 572 } 573 574 /* 575 * transfer SCSI message 576 */ 577 static int nsp_xfer(struct scsi_cmnd *SCpnt, int phase) 578 { 579 unsigned int base = SCpnt->device->host->io_port; 580 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 581 char *buf = data->MsgBuffer; 582 int len = min(MSGBUF_SIZE, data->MsgLen); 583 int ptr; 584 int ret; 585 586 //nsp_dbg(NSP_DEBUG_DATA_IO, "in"); 587 for (ptr = 0; len > 0; len--, ptr++) { 588 589 ret = nsp_expect_signal(SCpnt, phase, BUSMON_REQ); 590 if (ret <= 0) { 591 nsp_dbg(NSP_DEBUG_DATA_IO, "xfer quit"); 592 return 0; 593 } 594 595 /* if last byte, negate ATN */ 596 if (len == 1 && SCpnt->SCp.phase == PH_MSG_OUT) { 597 nsp_index_write(base, SCSIBUSCTRL, AUTODIRECTION | ACKENB); 598 } 599 600 /* read & write message */ 601 if (phase & BUSMON_IO) { 602 nsp_dbg(NSP_DEBUG_DATA_IO, "read msg"); 603 buf[ptr] = nsp_index_read(base, SCSIDATAWITHACK); 604 } else { 605 nsp_dbg(NSP_DEBUG_DATA_IO, "write msg"); 606 nsp_index_write(base, SCSIDATAWITHACK, buf[ptr]); 607 } 608 nsp_negate_signal(SCpnt, BUSMON_ACK, "xfer<ack>"); 609 610 } 611 return len; 612 } 613 614 /* 615 * get extra SCSI data from fifo 616 */ 617 static int nsp_dataphase_bypass(struct scsi_cmnd *SCpnt) 618 { 619 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 620 unsigned int count; 621 622 //nsp_dbg(NSP_DEBUG_DATA_IO, "in"); 623 624 if (SCpnt->SCp.have_data_in != IO_IN) { 625 return 0; 626 } 627 628 count = nsp_fifo_count(SCpnt); 629 if (data->FifoCount == count) { 630 //nsp_dbg(NSP_DEBUG_DATA_IO, "not use bypass quirk"); 631 return 0; 632 } 633 634 /* 635 * XXX: NSP_QUIRK 636 * data phase skip only occures in case of SCSI_LOW_READ 637 */ 638 nsp_dbg(NSP_DEBUG_DATA_IO, "use bypass quirk"); 639 SCpnt->SCp.phase = PH_DATA; 640 nsp_pio_read(SCpnt); 641 nsp_setup_fifo(data, FALSE); 642 643 return 0; 644 } 645 646 /* 647 * accept reselection 648 */ 649 static int nsp_reselected(struct scsi_cmnd *SCpnt) 650 { 651 unsigned int base = SCpnt->device->host->io_port; 652 unsigned int host_id = SCpnt->device->host->this_id; 653 //nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 654 unsigned char bus_reg; 655 unsigned char id_reg, tmp; 656 int target; 657 658 nsp_dbg(NSP_DEBUG_RESELECTION, "in"); 659 660 id_reg = nsp_index_read(base, RESELECTID); 661 tmp = id_reg & (~BIT(host_id)); 662 target = 0; 663 while(tmp != 0) { 664 if (tmp & BIT(0)) { 665 break; 666 } 667 tmp >>= 1; 668 target++; 669 } 670 671 if (scmd_id(SCpnt) != target) { 672 nsp_msg(KERN_ERR, "XXX: reselect ID must be %d in this implementation.", target); 673 } 674 675 nsp_negate_signal(SCpnt, BUSMON_SEL, "reselect<SEL>"); 676 677 nsp_nexus(SCpnt); 678 bus_reg = nsp_index_read(base, SCSIBUSCTRL) & ~(SCSI_BSY | SCSI_ATN); 679 nsp_index_write(base, SCSIBUSCTRL, bus_reg); 680 nsp_index_write(base, SCSIBUSCTRL, bus_reg | AUTODIRECTION | ACKENB); 681 682 return TRUE; 683 } 684 685 /* 686 * count how many data transferd 687 */ 688 static int nsp_fifo_count(struct scsi_cmnd *SCpnt) 689 { 690 unsigned int base = SCpnt->device->host->io_port; 691 unsigned int count; 692 unsigned int l, m, h, dummy; 693 694 nsp_index_write(base, POINTERCLR, POINTER_CLEAR | ACK_COUNTER); 695 696 l = nsp_index_read(base, TRANSFERCOUNT); 697 m = nsp_index_read(base, TRANSFERCOUNT); 698 h = nsp_index_read(base, TRANSFERCOUNT); 699 dummy = nsp_index_read(base, TRANSFERCOUNT); /* required this! */ 700 701 count = (h << 16) | (m << 8) | (l << 0); 702 703 //nsp_dbg(NSP_DEBUG_DATA_IO, "count=0x%x", count); 704 705 return count; 706 } 707 708 /* fifo size */ 709 #define RFIFO_CRIT 64 710 #define WFIFO_CRIT 64 711 712 /* 713 * read data in DATA IN phase 714 */ 715 static void nsp_pio_read(struct scsi_cmnd *SCpnt) 716 { 717 unsigned int base = SCpnt->device->host->io_port; 718 unsigned long mmio_base = SCpnt->device->host->base; 719 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 720 long time_out; 721 int ocount, res; 722 unsigned char stat, fifo_stat; 723 724 ocount = data->FifoCount; 725 726 nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p resid=%d ocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d", 727 SCpnt, scsi_get_resid(SCpnt), ocount, SCpnt->SCp.ptr, 728 SCpnt->SCp.this_residual, SCpnt->SCp.buffer, 729 SCpnt->SCp.buffers_residual); 730 731 time_out = 1000; 732 733 while ((time_out-- != 0) && 734 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0 ) ) { 735 736 stat = nsp_index_read(base, SCSIBUSMON); 737 stat &= BUSMON_PHASE_MASK; 738 739 740 res = nsp_fifo_count(SCpnt) - ocount; 741 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x ocount=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount, res); 742 if (res == 0) { /* if some data available ? */ 743 if (stat == BUSPHASE_DATA_IN) { /* phase changed? */ 744 //nsp_dbg(NSP_DEBUG_DATA_IO, " wait for data this=%d", SCpnt->SCp.this_residual); 745 continue; 746 } else { 747 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x", stat); 748 break; 749 } 750 } 751 752 fifo_stat = nsp_read(base, FIFOSTATUS); 753 if ((fifo_stat & FIFOSTATUS_FULL_EMPTY) == 0 && 754 stat == BUSPHASE_DATA_IN) { 755 continue; 756 } 757 758 res = min(res, SCpnt->SCp.this_residual); 759 760 switch (data->TransferMode) { 761 case MODE_IO32: 762 res &= ~(BIT(1)|BIT(0)); /* align 4 */ 763 nsp_fifo32_read(base, SCpnt->SCp.ptr, res >> 2); 764 break; 765 case MODE_IO8: 766 nsp_fifo8_read (base, SCpnt->SCp.ptr, res ); 767 break; 768 769 case MODE_MEM32: 770 res &= ~(BIT(1)|BIT(0)); /* align 4 */ 771 nsp_mmio_fifo32_read(mmio_base, SCpnt->SCp.ptr, res >> 2); 772 break; 773 774 default: 775 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown read mode"); 776 return; 777 } 778 779 nsp_inc_resid(SCpnt, -res); 780 SCpnt->SCp.ptr += res; 781 SCpnt->SCp.this_residual -= res; 782 ocount += res; 783 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this_residual=0x%x ocount=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, ocount); 784 785 /* go to next scatter list if available */ 786 if (SCpnt->SCp.this_residual == 0 && 787 SCpnt->SCp.buffers_residual != 0 ) { 788 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next timeout=%d", time_out); 789 SCpnt->SCp.buffers_residual--; 790 SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer); 791 SCpnt->SCp.ptr = BUFFER_ADDR; 792 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; 793 time_out = 1000; 794 795 //nsp_dbg(NSP_DEBUG_DATA_IO, "page: 0x%p, off: 0x%x", SCpnt->SCp.buffer->page, SCpnt->SCp.buffer->offset); 796 } 797 } 798 799 data->FifoCount = ocount; 800 801 if (time_out < 0) { 802 nsp_msg(KERN_DEBUG, "pio read timeout resid=%d this_residual=%d buffers_residual=%d", 803 scsi_get_resid(SCpnt), SCpnt->SCp.this_residual, 804 SCpnt->SCp.buffers_residual); 805 } 806 nsp_dbg(NSP_DEBUG_DATA_IO, "read ocount=0x%x", ocount); 807 nsp_dbg(NSP_DEBUG_DATA_IO, "r cmd=%d resid=0x%x\n", data->CmdId, 808 scsi_get_resid(SCpnt)); 809 } 810 811 /* 812 * write data in DATA OUT phase 813 */ 814 static void nsp_pio_write(struct scsi_cmnd *SCpnt) 815 { 816 unsigned int base = SCpnt->device->host->io_port; 817 unsigned long mmio_base = SCpnt->device->host->base; 818 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 819 int time_out; 820 int ocount, res; 821 unsigned char stat; 822 823 ocount = data->FifoCount; 824 825 nsp_dbg(NSP_DEBUG_DATA_IO, "in fifocount=%d ptr=0x%p this_residual=%d buffers=0x%p nbuf=%d resid=0x%x", 826 data->FifoCount, SCpnt->SCp.ptr, SCpnt->SCp.this_residual, 827 SCpnt->SCp.buffer, SCpnt->SCp.buffers_residual, 828 scsi_get_resid(SCpnt)); 829 830 time_out = 1000; 831 832 while ((time_out-- != 0) && 833 (SCpnt->SCp.this_residual > 0 || SCpnt->SCp.buffers_residual > 0)) { 834 stat = nsp_index_read(base, SCSIBUSMON); 835 stat &= BUSMON_PHASE_MASK; 836 837 if (stat != BUSPHASE_DATA_OUT) { 838 res = ocount - nsp_fifo_count(SCpnt); 839 840 nsp_dbg(NSP_DEBUG_DATA_IO, "phase changed stat=0x%x, res=%d\n", stat, res); 841 /* Put back pointer */ 842 nsp_inc_resid(SCpnt, res); 843 SCpnt->SCp.ptr -= res; 844 SCpnt->SCp.this_residual += res; 845 ocount -= res; 846 847 break; 848 } 849 850 res = ocount - nsp_fifo_count(SCpnt); 851 if (res > 0) { /* write all data? */ 852 nsp_dbg(NSP_DEBUG_DATA_IO, "wait for all data out. ocount=0x%x res=%d", ocount, res); 853 continue; 854 } 855 856 res = min(SCpnt->SCp.this_residual, WFIFO_CRIT); 857 858 //nsp_dbg(NSP_DEBUG_DATA_IO, "ptr=0x%p this=0x%x res=0x%x", SCpnt->SCp.ptr, SCpnt->SCp.this_residual, res); 859 switch (data->TransferMode) { 860 case MODE_IO32: 861 res &= ~(BIT(1)|BIT(0)); /* align 4 */ 862 nsp_fifo32_write(base, SCpnt->SCp.ptr, res >> 2); 863 break; 864 case MODE_IO8: 865 nsp_fifo8_write (base, SCpnt->SCp.ptr, res ); 866 break; 867 868 case MODE_MEM32: 869 res &= ~(BIT(1)|BIT(0)); /* align 4 */ 870 nsp_mmio_fifo32_write(mmio_base, SCpnt->SCp.ptr, res >> 2); 871 break; 872 873 default: 874 nsp_dbg(NSP_DEBUG_DATA_IO, "unknown write mode"); 875 break; 876 } 877 878 nsp_inc_resid(SCpnt, -res); 879 SCpnt->SCp.ptr += res; 880 SCpnt->SCp.this_residual -= res; 881 ocount += res; 882 883 /* go to next scatter list if available */ 884 if (SCpnt->SCp.this_residual == 0 && 885 SCpnt->SCp.buffers_residual != 0 ) { 886 //nsp_dbg(NSP_DEBUG_DATA_IO, "scatterlist next"); 887 SCpnt->SCp.buffers_residual--; 888 SCpnt->SCp.buffer = sg_next(SCpnt->SCp.buffer); 889 SCpnt->SCp.ptr = BUFFER_ADDR; 890 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length; 891 time_out = 1000; 892 } 893 } 894 895 data->FifoCount = ocount; 896 897 if (time_out < 0) { 898 nsp_msg(KERN_DEBUG, "pio write timeout resid=0x%x", 899 scsi_get_resid(SCpnt)); 900 } 901 nsp_dbg(NSP_DEBUG_DATA_IO, "write ocount=0x%x", ocount); 902 nsp_dbg(NSP_DEBUG_DATA_IO, "w cmd=%d resid=0x%x\n", data->CmdId, 903 scsi_get_resid(SCpnt)); 904 } 905 #undef RFIFO_CRIT 906 #undef WFIFO_CRIT 907 908 /* 909 * setup synchronous/asynchronous data transfer mode 910 */ 911 static int nsp_nexus(struct scsi_cmnd *SCpnt) 912 { 913 unsigned int base = SCpnt->device->host->io_port; 914 unsigned char target = scmd_id(SCpnt); 915 // unsigned char lun = SCpnt->device->lun; 916 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 917 sync_data *sync = &(data->Sync[target]); 918 919 //nsp_dbg(NSP_DEBUG_DATA_IO, "in SCpnt=0x%p", SCpnt); 920 921 /* setup synch transfer registers */ 922 nsp_index_write(base, SYNCREG, sync->SyncRegister); 923 nsp_index_write(base, ACKWIDTH, sync->AckWidth); 924 925 if (scsi_get_resid(SCpnt) % 4 != 0 || 926 scsi_get_resid(SCpnt) <= PAGE_SIZE ) { 927 data->TransferMode = MODE_IO8; 928 } else if (nsp_burst_mode == BURST_MEM32) { 929 data->TransferMode = MODE_MEM32; 930 } else if (nsp_burst_mode == BURST_IO32) { 931 data->TransferMode = MODE_IO32; 932 } else { 933 data->TransferMode = MODE_IO8; 934 } 935 936 /* setup pdma fifo */ 937 nsp_setup_fifo(data, TRUE); 938 939 /* clear ack counter */ 940 data->FifoCount = 0; 941 nsp_index_write(base, POINTERCLR, POINTER_CLEAR | 942 ACK_COUNTER_CLEAR | 943 REQ_COUNTER_CLEAR | 944 HOST_COUNTER_CLEAR); 945 946 return 0; 947 } 948 949 #include "nsp_message.c" 950 /* 951 * interrupt handler 952 */ 953 static irqreturn_t nspintr(int irq, void *dev_id) 954 { 955 unsigned int base; 956 unsigned char irq_status, irq_phase, phase; 957 struct scsi_cmnd *tmpSC; 958 unsigned char target, lun; 959 unsigned int *sync_neg; 960 int i, tmp; 961 nsp_hw_data *data; 962 963 964 //nsp_dbg(NSP_DEBUG_INTR, "dev_id=0x%p", dev_id); 965 //nsp_dbg(NSP_DEBUG_INTR, "host=0x%p", ((scsi_info_t *)dev_id)->host); 966 967 if ( dev_id != NULL && 968 ((scsi_info_t *)dev_id)->host != NULL ) { 969 scsi_info_t *info = (scsi_info_t *)dev_id; 970 971 data = (nsp_hw_data *)info->host->hostdata; 972 } else { 973 nsp_dbg(NSP_DEBUG_INTR, "host data wrong"); 974 return IRQ_NONE; 975 } 976 977 //nsp_dbg(NSP_DEBUG_INTR, "&nsp_data_base=0x%p, dev_id=0x%p", &nsp_data_base, dev_id); 978 979 base = data->BaseAddress; 980 //nsp_dbg(NSP_DEBUG_INTR, "base=0x%x", base); 981 982 /* 983 * interrupt check 984 */ 985 nsp_write(base, IRQCONTROL, IRQCONTROL_IRQDISABLE); 986 irq_status = nsp_read(base, IRQSTATUS); 987 //nsp_dbg(NSP_DEBUG_INTR, "irq_status=0x%x", irq_status); 988 if ((irq_status == 0xff) || ((irq_status & IRQSTATUS_MASK) == 0)) { 989 nsp_write(base, IRQCONTROL, 0); 990 //nsp_dbg(NSP_DEBUG_INTR, "no irq/shared irq"); 991 return IRQ_NONE; 992 } 993 994 /* XXX: IMPORTANT 995 * Do not read an irq_phase register if no scsi phase interrupt. 996 * Unless, you should lose a scsi phase interrupt. 997 */ 998 phase = nsp_index_read(base, SCSIBUSMON); 999 if((irq_status & IRQSTATUS_SCSI) != 0) { 1000 irq_phase = nsp_index_read(base, IRQPHASESENCE); 1001 } else { 1002 irq_phase = 0; 1003 } 1004 1005 //nsp_dbg(NSP_DEBUG_INTR, "irq_phase=0x%x", irq_phase); 1006 1007 /* 1008 * timer interrupt handler (scsi vs timer interrupts) 1009 */ 1010 //nsp_dbg(NSP_DEBUG_INTR, "timercount=%d", data->TimerCount); 1011 if (data->TimerCount != 0) { 1012 //nsp_dbg(NSP_DEBUG_INTR, "stop timer"); 1013 nsp_index_write(base, TIMERCOUNT, 0); 1014 nsp_index_write(base, TIMERCOUNT, 0); 1015 data->TimerCount = 0; 1016 } 1017 1018 if ((irq_status & IRQSTATUS_MASK) == IRQSTATUS_TIMER && 1019 data->SelectionTimeOut == 0) { 1020 //nsp_dbg(NSP_DEBUG_INTR, "timer start"); 1021 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR); 1022 return IRQ_HANDLED; 1023 } 1024 1025 nsp_write(base, IRQCONTROL, IRQCONTROL_TIMER_CLEAR | IRQCONTROL_FIFO_CLEAR); 1026 1027 if ((irq_status & IRQSTATUS_SCSI) && 1028 (irq_phase & SCSI_RESET_IRQ)) { 1029 nsp_msg(KERN_ERR, "bus reset (power off?)"); 1030 1031 nsphw_init(data); 1032 nsp_bus_reset(data); 1033 1034 if(data->CurrentSC != NULL) { 1035 tmpSC = data->CurrentSC; 1036 tmpSC->result = (DID_RESET << 16) | 1037 ((tmpSC->SCp.Message & 0xff) << 8) | 1038 ((tmpSC->SCp.Status & 0xff) << 0); 1039 nsp_scsi_done(tmpSC); 1040 } 1041 return IRQ_HANDLED; 1042 } 1043 1044 if (data->CurrentSC == NULL) { 1045 nsp_msg(KERN_ERR, "CurrentSC==NULL irq_status=0x%x phase=0x%x irq_phase=0x%x this can't be happen. reset everything", irq_status, phase, irq_phase); 1046 nsphw_init(data); 1047 nsp_bus_reset(data); 1048 return IRQ_HANDLED; 1049 } 1050 1051 tmpSC = data->CurrentSC; 1052 target = tmpSC->device->id; 1053 lun = tmpSC->device->lun; 1054 sync_neg = &(data->Sync[target].SyncNegotiation); 1055 1056 /* 1057 * parse hardware SCSI irq reasons register 1058 */ 1059 if (irq_status & IRQSTATUS_SCSI) { 1060 if (irq_phase & RESELECT_IRQ) { 1061 nsp_dbg(NSP_DEBUG_INTR, "reselect"); 1062 nsp_write(base, IRQCONTROL, IRQCONTROL_RESELECT_CLEAR); 1063 if (nsp_reselected(tmpSC) != FALSE) { 1064 return IRQ_HANDLED; 1065 } 1066 } 1067 1068 if ((irq_phase & (PHASE_CHANGE_IRQ | LATCHED_BUS_FREE)) == 0) { 1069 return IRQ_HANDLED; 1070 } 1071 } 1072 1073 //show_phase(tmpSC); 1074 1075 switch(tmpSC->SCp.phase) { 1076 case PH_SELSTART: 1077 // *sync_neg = SYNC_NOT_YET; 1078 if ((phase & BUSMON_BSY) == 0) { 1079 //nsp_dbg(NSP_DEBUG_INTR, "selection count=%d", data->SelectionTimeOut); 1080 if (data->SelectionTimeOut >= NSP_SELTIMEOUT) { 1081 nsp_dbg(NSP_DEBUG_INTR, "selection time out"); 1082 data->SelectionTimeOut = 0; 1083 nsp_index_write(base, SCSIBUSCTRL, 0); 1084 1085 tmpSC->result = DID_TIME_OUT << 16; 1086 nsp_scsi_done(tmpSC); 1087 1088 return IRQ_HANDLED; 1089 } 1090 data->SelectionTimeOut += 1; 1091 nsp_start_timer(tmpSC, 1000/51); 1092 return IRQ_HANDLED; 1093 } 1094 1095 /* attention assert */ 1096 //nsp_dbg(NSP_DEBUG_INTR, "attention assert"); 1097 data->SelectionTimeOut = 0; 1098 tmpSC->SCp.phase = PH_SELECTED; 1099 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN); 1100 udelay(1); 1101 nsp_index_write(base, SCSIBUSCTRL, SCSI_ATN | AUTODIRECTION | ACKENB); 1102 return IRQ_HANDLED; 1103 1104 break; 1105 1106 case PH_RESELECT: 1107 //nsp_dbg(NSP_DEBUG_INTR, "phase reselect"); 1108 // *sync_neg = SYNC_NOT_YET; 1109 if ((phase & BUSMON_PHASE_MASK) != BUSPHASE_MESSAGE_IN) { 1110 1111 tmpSC->result = DID_ABORT << 16; 1112 nsp_scsi_done(tmpSC); 1113 return IRQ_HANDLED; 1114 } 1115 /* fall thru */ 1116 default: 1117 if ((irq_status & (IRQSTATUS_SCSI | IRQSTATUS_FIFO)) == 0) { 1118 return IRQ_HANDLED; 1119 } 1120 break; 1121 } 1122 1123 /* 1124 * SCSI sequencer 1125 */ 1126 //nsp_dbg(NSP_DEBUG_INTR, "start scsi seq"); 1127 1128 /* normal disconnect */ 1129 if (((tmpSC->SCp.phase == PH_MSG_IN) || (tmpSC->SCp.phase == PH_MSG_OUT)) && 1130 (irq_phase & LATCHED_BUS_FREE) != 0 ) { 1131 nsp_dbg(NSP_DEBUG_INTR, "normal disconnect irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase); 1132 1133 //*sync_neg = SYNC_NOT_YET; 1134 1135 /* all command complete and return status */ 1136 if (tmpSC->SCp.Message == MSG_COMMAND_COMPLETE) { 1137 tmpSC->result = (DID_OK << 16) | 1138 ((tmpSC->SCp.Message & 0xff) << 8) | 1139 ((tmpSC->SCp.Status & 0xff) << 0); 1140 nsp_dbg(NSP_DEBUG_INTR, "command complete result=0x%x", tmpSC->result); 1141 nsp_scsi_done(tmpSC); 1142 1143 return IRQ_HANDLED; 1144 } 1145 1146 return IRQ_HANDLED; 1147 } 1148 1149 1150 /* check unexpected bus free state */ 1151 if (phase == 0) { 1152 nsp_msg(KERN_DEBUG, "unexpected bus free. irq_status=0x%x, phase=0x%x, irq_phase=0x%x", irq_status, phase, irq_phase); 1153 1154 *sync_neg = SYNC_NG; 1155 tmpSC->result = DID_ERROR << 16; 1156 nsp_scsi_done(tmpSC); 1157 return IRQ_HANDLED; 1158 } 1159 1160 switch (phase & BUSMON_PHASE_MASK) { 1161 case BUSPHASE_COMMAND: 1162 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_COMMAND"); 1163 if ((phase & BUSMON_REQ) == 0) { 1164 nsp_dbg(NSP_DEBUG_INTR, "REQ == 0"); 1165 return IRQ_HANDLED; 1166 } 1167 1168 tmpSC->SCp.phase = PH_COMMAND; 1169 1170 nsp_nexus(tmpSC); 1171 1172 /* write scsi command */ 1173 nsp_dbg(NSP_DEBUG_INTR, "cmd_len=%d", tmpSC->cmd_len); 1174 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER); 1175 for (i = 0; i < tmpSC->cmd_len; i++) { 1176 nsp_index_write(base, COMMANDDATA, tmpSC->cmnd[i]); 1177 } 1178 nsp_index_write(base, COMMANDCTRL, CLEAR_COMMAND_POINTER | AUTO_COMMAND_GO); 1179 break; 1180 1181 case BUSPHASE_DATA_OUT: 1182 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_OUT"); 1183 1184 tmpSC->SCp.phase = PH_DATA; 1185 tmpSC->SCp.have_data_in = IO_OUT; 1186 1187 nsp_pio_write(tmpSC); 1188 1189 break; 1190 1191 case BUSPHASE_DATA_IN: 1192 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_DATA_IN"); 1193 1194 tmpSC->SCp.phase = PH_DATA; 1195 tmpSC->SCp.have_data_in = IO_IN; 1196 1197 nsp_pio_read(tmpSC); 1198 1199 break; 1200 1201 case BUSPHASE_STATUS: 1202 nsp_dataphase_bypass(tmpSC); 1203 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_STATUS"); 1204 1205 tmpSC->SCp.phase = PH_STATUS; 1206 1207 tmpSC->SCp.Status = nsp_index_read(base, SCSIDATAWITHACK); 1208 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x status=0x%x", tmpSC->SCp.Message, tmpSC->SCp.Status); 1209 1210 break; 1211 1212 case BUSPHASE_MESSAGE_OUT: 1213 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_OUT"); 1214 if ((phase & BUSMON_REQ) == 0) { 1215 goto timer_out; 1216 } 1217 1218 tmpSC->SCp.phase = PH_MSG_OUT; 1219 1220 //*sync_neg = SYNC_NOT_YET; 1221 1222 data->MsgLen = i = 0; 1223 data->MsgBuffer[i] = IDENTIFY(TRUE, lun); i++; 1224 1225 if (*sync_neg == SYNC_NOT_YET) { 1226 data->Sync[target].SyncPeriod = 0; 1227 data->Sync[target].SyncOffset = 0; 1228 1229 /**/ 1230 data->MsgBuffer[i] = MSG_EXTENDED; i++; 1231 data->MsgBuffer[i] = 3; i++; 1232 data->MsgBuffer[i] = MSG_EXT_SDTR; i++; 1233 data->MsgBuffer[i] = 0x0c; i++; 1234 data->MsgBuffer[i] = 15; i++; 1235 /**/ 1236 } 1237 data->MsgLen = i; 1238 1239 nsp_analyze_sdtr(tmpSC); 1240 show_message(data); 1241 nsp_message_out(tmpSC); 1242 break; 1243 1244 case BUSPHASE_MESSAGE_IN: 1245 nsp_dataphase_bypass(tmpSC); 1246 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE_MESSAGE_IN"); 1247 if ((phase & BUSMON_REQ) == 0) { 1248 goto timer_out; 1249 } 1250 1251 tmpSC->SCp.phase = PH_MSG_IN; 1252 nsp_message_in(tmpSC); 1253 1254 /**/ 1255 if (*sync_neg == SYNC_NOT_YET) { 1256 //nsp_dbg(NSP_DEBUG_INTR, "sync target=%d,lun=%d",target,lun); 1257 1258 if (data->MsgLen >= 5 && 1259 data->MsgBuffer[0] == MSG_EXTENDED && 1260 data->MsgBuffer[1] == 3 && 1261 data->MsgBuffer[2] == MSG_EXT_SDTR ) { 1262 data->Sync[target].SyncPeriod = data->MsgBuffer[3]; 1263 data->Sync[target].SyncOffset = data->MsgBuffer[4]; 1264 //nsp_dbg(NSP_DEBUG_INTR, "sync ok, %d %d", data->MsgBuffer[3], data->MsgBuffer[4]); 1265 *sync_neg = SYNC_OK; 1266 } else { 1267 data->Sync[target].SyncPeriod = 0; 1268 data->Sync[target].SyncOffset = 0; 1269 *sync_neg = SYNC_NG; 1270 } 1271 nsp_analyze_sdtr(tmpSC); 1272 } 1273 /**/ 1274 1275 /* search last messeage byte */ 1276 tmp = -1; 1277 for (i = 0; i < data->MsgLen; i++) { 1278 tmp = data->MsgBuffer[i]; 1279 if (data->MsgBuffer[i] == MSG_EXTENDED) { 1280 i += (1 + data->MsgBuffer[i+1]); 1281 } 1282 } 1283 tmpSC->SCp.Message = tmp; 1284 1285 nsp_dbg(NSP_DEBUG_INTR, "message=0x%x len=%d", tmpSC->SCp.Message, data->MsgLen); 1286 show_message(data); 1287 1288 break; 1289 1290 case BUSPHASE_SELECT: 1291 default: 1292 nsp_dbg(NSP_DEBUG_INTR, "BUSPHASE other"); 1293 1294 break; 1295 } 1296 1297 //nsp_dbg(NSP_DEBUG_INTR, "out"); 1298 return IRQ_HANDLED; 1299 1300 timer_out: 1301 nsp_start_timer(tmpSC, 1000/102); 1302 return IRQ_HANDLED; 1303 } 1304 1305 #ifdef NSP_DEBUG 1306 #include "nsp_debug.c" 1307 #endif /* NSP_DEBUG */ 1308 1309 /*----------------------------------------------------------------*/ 1310 /* look for ninja3 card and init if found */ 1311 /*----------------------------------------------------------------*/ 1312 static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht) 1313 { 1314 struct Scsi_Host *host; /* registered host structure */ 1315 nsp_hw_data *data_b = &nsp_data_base, *data; 1316 1317 nsp_dbg(NSP_DEBUG_INIT, "this_id=%d", sht->this_id); 1318 host = scsi_host_alloc(&nsp_driver_template, sizeof(nsp_hw_data)); 1319 if (host == NULL) { 1320 nsp_dbg(NSP_DEBUG_INIT, "host failed"); 1321 return NULL; 1322 } 1323 1324 memcpy(host->hostdata, data_b, sizeof(nsp_hw_data)); 1325 data = (nsp_hw_data *)host->hostdata; 1326 data->ScsiInfo->host = host; 1327 #ifdef NSP_DEBUG 1328 data->CmdId = 0; 1329 #endif 1330 1331 nsp_dbg(NSP_DEBUG_INIT, "irq=%d,%d", data_b->IrqNumber, ((nsp_hw_data *)host->hostdata)->IrqNumber); 1332 1333 host->unique_id = data->BaseAddress; 1334 host->io_port = data->BaseAddress; 1335 host->n_io_port = data->NumAddress; 1336 host->irq = data->IrqNumber; 1337 host->base = data->MmioAddress; 1338 1339 spin_lock_init(&(data->Lock)); 1340 1341 snprintf(data->nspinfo, 1342 sizeof(data->nspinfo), 1343 "NinjaSCSI-3/32Bi Driver $Revision: 1.23 $ IO:0x%04lx-0x%04lx MMIO(virt addr):0x%04lx IRQ:%02d", 1344 host->io_port, host->io_port + host->n_io_port - 1, 1345 host->base, 1346 host->irq); 1347 sht->name = data->nspinfo; 1348 1349 nsp_dbg(NSP_DEBUG_INIT, "end"); 1350 1351 1352 return host; /* detect done. */ 1353 } 1354 1355 /*----------------------------------------------------------------*/ 1356 /* return info string */ 1357 /*----------------------------------------------------------------*/ 1358 static const char *nsp_info(struct Scsi_Host *shpnt) 1359 { 1360 nsp_hw_data *data = (nsp_hw_data *)shpnt->hostdata; 1361 1362 return data->nspinfo; 1363 } 1364 1365 static int nsp_show_info(struct seq_file *m, struct Scsi_Host *host) 1366 { 1367 int id; 1368 int speed; 1369 unsigned long flags; 1370 nsp_hw_data *data; 1371 int hostno; 1372 1373 hostno = host->host_no; 1374 data = (nsp_hw_data *)host->hostdata; 1375 1376 seq_puts(m, "NinjaSCSI status\n\n" 1377 "Driver version: $Revision: 1.23 $\n"); 1378 seq_printf(m, "SCSI host No.: %d\n", hostno); 1379 seq_printf(m, "IRQ: %d\n", host->irq); 1380 seq_printf(m, "IO: 0x%lx-0x%lx\n", host->io_port, host->io_port + host->n_io_port - 1); 1381 seq_printf(m, "MMIO(virtual address): 0x%lx-0x%lx\n", host->base, host->base + data->MmioLength - 1); 1382 seq_printf(m, "sg_tablesize: %d\n", host->sg_tablesize); 1383 1384 seq_puts(m, "burst transfer mode: "); 1385 switch (nsp_burst_mode) { 1386 case BURST_IO8: 1387 seq_puts(m, "io8"); 1388 break; 1389 case BURST_IO32: 1390 seq_puts(m, "io32"); 1391 break; 1392 case BURST_MEM32: 1393 seq_puts(m, "mem32"); 1394 break; 1395 default: 1396 seq_puts(m, "???"); 1397 break; 1398 } 1399 seq_putc(m, '\n'); 1400 1401 1402 spin_lock_irqsave(&(data->Lock), flags); 1403 seq_printf(m, "CurrentSC: 0x%p\n\n", data->CurrentSC); 1404 spin_unlock_irqrestore(&(data->Lock), flags); 1405 1406 seq_puts(m, "SDTR status\n"); 1407 for(id = 0; id < ARRAY_SIZE(data->Sync); id++) { 1408 1409 seq_printf(m, "id %d: ", id); 1410 1411 if (id == host->this_id) { 1412 seq_puts(m, "----- NinjaSCSI-3 host adapter\n"); 1413 continue; 1414 } 1415 1416 switch(data->Sync[id].SyncNegotiation) { 1417 case SYNC_OK: 1418 seq_puts(m, " sync"); 1419 break; 1420 case SYNC_NG: 1421 seq_puts(m, "async"); 1422 break; 1423 case SYNC_NOT_YET: 1424 seq_puts(m, " none"); 1425 break; 1426 default: 1427 seq_puts(m, "?????"); 1428 break; 1429 } 1430 1431 if (data->Sync[id].SyncPeriod != 0) { 1432 speed = 1000000 / (data->Sync[id].SyncPeriod * 4); 1433 1434 seq_printf(m, " transfer %d.%dMB/s, offset %d", 1435 speed / 1000, 1436 speed % 1000, 1437 data->Sync[id].SyncOffset 1438 ); 1439 } 1440 seq_putc(m, '\n'); 1441 } 1442 return 0; 1443 } 1444 1445 /*---------------------------------------------------------------*/ 1446 /* error handler */ 1447 /*---------------------------------------------------------------*/ 1448 1449 /* 1450 static int nsp_eh_abort(struct scsi_cmnd *SCpnt) 1451 { 1452 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); 1453 1454 return nsp_eh_bus_reset(SCpnt); 1455 }*/ 1456 1457 static int nsp_bus_reset(nsp_hw_data *data) 1458 { 1459 unsigned int base = data->BaseAddress; 1460 int i; 1461 1462 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLMASK); 1463 1464 nsp_index_write(base, SCSIBUSCTRL, SCSI_RST); 1465 mdelay(100); /* 100ms */ 1466 nsp_index_write(base, SCSIBUSCTRL, 0); 1467 for(i = 0; i < 5; i++) { 1468 nsp_index_read(base, IRQPHASESENCE); /* dummy read */ 1469 } 1470 1471 nsphw_init_sync(data); 1472 1473 nsp_write(base, IRQCONTROL, IRQCONTROL_ALLCLEAR); 1474 1475 return SUCCESS; 1476 } 1477 1478 static int nsp_eh_bus_reset(struct scsi_cmnd *SCpnt) 1479 { 1480 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 1481 1482 nsp_dbg(NSP_DEBUG_BUSRESET, "SCpnt=0x%p", SCpnt); 1483 1484 return nsp_bus_reset(data); 1485 } 1486 1487 static int nsp_eh_host_reset(struct scsi_cmnd *SCpnt) 1488 { 1489 nsp_hw_data *data = (nsp_hw_data *)SCpnt->device->host->hostdata; 1490 1491 nsp_dbg(NSP_DEBUG_BUSRESET, "in"); 1492 1493 nsphw_init(data); 1494 1495 return SUCCESS; 1496 } 1497 1498 1499 /********************************************************************** 1500 PCMCIA functions 1501 **********************************************************************/ 1502 1503 static int nsp_cs_probe(struct pcmcia_device *link) 1504 { 1505 scsi_info_t *info; 1506 nsp_hw_data *data = &nsp_data_base; 1507 int ret; 1508 1509 nsp_dbg(NSP_DEBUG_INIT, "in"); 1510 1511 /* Create new SCSI device */ 1512 info = kzalloc(sizeof(*info), GFP_KERNEL); 1513 if (info == NULL) { return -ENOMEM; } 1514 info->p_dev = link; 1515 link->priv = info; 1516 data->ScsiInfo = info; 1517 1518 nsp_dbg(NSP_DEBUG_INIT, "info=0x%p", info); 1519 1520 ret = nsp_cs_config(link); 1521 1522 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link); 1523 return ret; 1524 } /* nsp_cs_attach */ 1525 1526 1527 static void nsp_cs_detach(struct pcmcia_device *link) 1528 { 1529 nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link); 1530 1531 ((scsi_info_t *)link->priv)->stop = 1; 1532 nsp_cs_release(link); 1533 1534 kfree(link->priv); 1535 link->priv = NULL; 1536 } /* nsp_cs_detach */ 1537 1538 1539 static int nsp_cs_config_check(struct pcmcia_device *p_dev, void *priv_data) 1540 { 1541 nsp_hw_data *data = priv_data; 1542 1543 if (p_dev->config_index == 0) 1544 return -ENODEV; 1545 1546 /* This reserves IO space but doesn't actually enable it */ 1547 if (pcmcia_request_io(p_dev) != 0) 1548 goto next_entry; 1549 1550 if (resource_size(p_dev->resource[2])) { 1551 p_dev->resource[2]->flags |= (WIN_DATA_WIDTH_16 | 1552 WIN_MEMORY_TYPE_CM | 1553 WIN_ENABLE); 1554 if (p_dev->resource[2]->end < 0x1000) 1555 p_dev->resource[2]->end = 0x1000; 1556 if (pcmcia_request_window(p_dev, p_dev->resource[2], 0) != 0) 1557 goto next_entry; 1558 if (pcmcia_map_mem_page(p_dev, p_dev->resource[2], 1559 p_dev->card_addr) != 0) 1560 goto next_entry; 1561 1562 data->MmioAddress = (unsigned long) 1563 ioremap_nocache(p_dev->resource[2]->start, 1564 resource_size(p_dev->resource[2])); 1565 data->MmioLength = resource_size(p_dev->resource[2]); 1566 } 1567 /* If we got this far, we're cool! */ 1568 return 0; 1569 1570 next_entry: 1571 nsp_dbg(NSP_DEBUG_INIT, "next"); 1572 pcmcia_disable_device(p_dev); 1573 return -ENODEV; 1574 } 1575 1576 static int nsp_cs_config(struct pcmcia_device *link) 1577 { 1578 int ret; 1579 scsi_info_t *info = link->priv; 1580 struct Scsi_Host *host; 1581 nsp_hw_data *data = &nsp_data_base; 1582 1583 nsp_dbg(NSP_DEBUG_INIT, "in"); 1584 1585 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC | 1586 CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IOMEM | 1587 CONF_AUTO_SET_IO; 1588 1589 ret = pcmcia_loop_config(link, nsp_cs_config_check, data); 1590 if (ret) 1591 goto cs_failed; 1592 1593 if (pcmcia_request_irq(link, nspintr)) 1594 goto cs_failed; 1595 1596 ret = pcmcia_enable_device(link); 1597 if (ret) 1598 goto cs_failed; 1599 1600 if (free_ports) { 1601 if (link->resource[0]) { 1602 release_region(link->resource[0]->start, 1603 resource_size(link->resource[0])); 1604 } 1605 if (link->resource[1]) { 1606 release_region(link->resource[1]->start, 1607 resource_size(link->resource[1])); 1608 } 1609 } 1610 1611 /* Set port and IRQ */ 1612 data->BaseAddress = link->resource[0]->start; 1613 data->NumAddress = resource_size(link->resource[0]); 1614 data->IrqNumber = link->irq; 1615 1616 nsp_dbg(NSP_DEBUG_INIT, "I/O[0x%x+0x%x] IRQ %d", 1617 data->BaseAddress, data->NumAddress, data->IrqNumber); 1618 1619 if(nsphw_init(data) == FALSE) { 1620 goto cs_failed; 1621 } 1622 1623 host = nsp_detect(&nsp_driver_template); 1624 1625 if (host == NULL) { 1626 nsp_dbg(NSP_DEBUG_INIT, "detect failed"); 1627 goto cs_failed; 1628 } 1629 1630 1631 ret = scsi_add_host (host, NULL); 1632 if (ret) 1633 goto cs_failed; 1634 1635 scsi_scan_host(host); 1636 1637 info->host = host; 1638 1639 return 0; 1640 1641 cs_failed: 1642 nsp_dbg(NSP_DEBUG_INIT, "config fail"); 1643 nsp_cs_release(link); 1644 1645 return -ENODEV; 1646 } /* nsp_cs_config */ 1647 1648 1649 static void nsp_cs_release(struct pcmcia_device *link) 1650 { 1651 scsi_info_t *info = link->priv; 1652 nsp_hw_data *data = NULL; 1653 1654 if (info->host == NULL) { 1655 nsp_msg(KERN_DEBUG, "unexpected card release call."); 1656 } else { 1657 data = (nsp_hw_data *)info->host->hostdata; 1658 } 1659 1660 nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link); 1661 1662 /* Unlink the device chain */ 1663 if (info->host != NULL) { 1664 scsi_remove_host(info->host); 1665 } 1666 1667 if (resource_size(link->resource[2])) { 1668 if (data != NULL) { 1669 iounmap((void *)(data->MmioAddress)); 1670 } 1671 } 1672 pcmcia_disable_device(link); 1673 1674 if (info->host != NULL) { 1675 scsi_host_put(info->host); 1676 } 1677 } /* nsp_cs_release */ 1678 1679 static int nsp_cs_suspend(struct pcmcia_device *link) 1680 { 1681 scsi_info_t *info = link->priv; 1682 nsp_hw_data *data; 1683 1684 nsp_dbg(NSP_DEBUG_INIT, "event: suspend"); 1685 1686 if (info->host != NULL) { 1687 nsp_msg(KERN_INFO, "clear SDTR status"); 1688 1689 data = (nsp_hw_data *)info->host->hostdata; 1690 1691 nsphw_init_sync(data); 1692 } 1693 1694 info->stop = 1; 1695 1696 return 0; 1697 } 1698 1699 static int nsp_cs_resume(struct pcmcia_device *link) 1700 { 1701 scsi_info_t *info = link->priv; 1702 nsp_hw_data *data; 1703 1704 nsp_dbg(NSP_DEBUG_INIT, "event: resume"); 1705 1706 info->stop = 0; 1707 1708 if (info->host != NULL) { 1709 nsp_msg(KERN_INFO, "reset host and bus"); 1710 1711 data = (nsp_hw_data *)info->host->hostdata; 1712 1713 nsphw_init (data); 1714 nsp_bus_reset(data); 1715 } 1716 1717 return 0; 1718 } 1719 1720 /*======================================================================* 1721 * module entry point 1722 *====================================================================*/ 1723 static const struct pcmcia_device_id nsp_cs_ids[] = { 1724 PCMCIA_DEVICE_PROD_ID123("IO DATA", "CBSC16 ", "1", 0x547e66dc, 0x0d63a3fd, 0x51de003a), 1725 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-001", "1", 0x534c02bc, 0x52008408, 0x51de003a), 1726 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-002", "1", 0x534c02bc, 0xcb09d5b2, 0x51de003a), 1727 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-003", "1", 0x534c02bc, 0xbc0ee524, 0x51de003a), 1728 PCMCIA_DEVICE_PROD_ID123("KME ", "SCSI-CARD-004", "1", 0x534c02bc, 0x226a7087, 0x51de003a), 1729 PCMCIA_DEVICE_PROD_ID123("WBT", "NinjaSCSI-3", "R1.0", 0xc7ba805f, 0xfdc7c97d, 0x6973710e), 1730 PCMCIA_DEVICE_PROD_ID123("WORKBIT", "UltraNinja-16", "1", 0x28191418, 0xb70f4b09, 0x51de003a), 1731 PCMCIA_DEVICE_NULL 1732 }; 1733 MODULE_DEVICE_TABLE(pcmcia, nsp_cs_ids); 1734 1735 static struct pcmcia_driver nsp_driver = { 1736 .owner = THIS_MODULE, 1737 .name = "nsp_cs", 1738 .probe = nsp_cs_probe, 1739 .remove = nsp_cs_detach, 1740 .id_table = nsp_cs_ids, 1741 .suspend = nsp_cs_suspend, 1742 .resume = nsp_cs_resume, 1743 }; 1744 module_pcmcia_driver(nsp_driver); 1745 1746 /* end */ 1747