1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 27 /* 28 * ISSUES 29 * 30 * - more consistent error messages 31 * - report name of device on errors? 32 * - if wide target renegotiates sync, back to narrow? 33 * - last_msgout is not accurate ???? 34 * - resolve XXXX 35 * - improve msg reject code (use special msg reject handler) 36 * - better use of IDE message 37 * - keep track if ATN remains asserted and target not going into 38 * a msg-out phase 39 * - improve comments 40 * - no slave accesses when start address is odd and dma hasn't started 41 * this affect asserting ATN 42 */ 43 44 /* 45 * fas - QLogic fas366 wide/fast SCSI Processor HBA driver with 46 * tagged and non-tagged queueing support 47 */ 48 #if defined(lint) && !defined(DEBUG) 49 #define DEBUG 1 50 #define FASDEBUG 51 #endif 52 53 #define DMA_REG_TRACING /* enable dma register access tracing */ 54 55 56 /* 57 * standard header files 58 */ 59 #include <sys/note.h> 60 #include <sys/scsi/scsi.h> 61 #include <sys/file.h> 62 #include <sys/vtrace.h> 63 64 /* 65 * private header files 66 */ 67 #include <sys/scsi/adapters/fasdma.h> 68 #include <sys/scsi/adapters/fasreg.h> 69 #include <sys/scsi/adapters/fasvar.h> 70 #include <sys/scsi/adapters/fascmd.h> 71 #include <sys/scsi/impl/scsi_reset_notify.h> 72 73 /* 74 * tunables 75 */ 76 static int fas_selection_timeout = 250; /* 250 milliseconds */ 77 static uchar_t fas_default_offset = DEFAULT_OFFSET; 78 79 /* 80 * needed for presto support, do not remove 81 */ 82 static int fas_enable_sbus64 = 1; 83 84 #ifdef FASDEBUG 85 int fasdebug = 0; 86 int fasdebug_instance = -1; /* debug all instances */ 87 static int fas_burstsizes_limit = -1; 88 static int fas_no_sync_wide_backoff = 0; 89 #endif /* FASDEBUG */ 90 91 /* 92 * Local static data protected by global mutex 93 */ 94 static kmutex_t fas_global_mutex; /* to allow concurrent attach */ 95 96 static int fas_scsi_watchdog_tick; /* in seconds, for all */ 97 /* instances */ 98 static clock_t fas_tick; /* fas_watch() interval in Hz */ 99 static timeout_id_t fas_reset_watch; /* timeout id for reset watch */ 100 static timeout_id_t fas_timeout_id = 0; 101 static int fas_timeout_initted = 0; 102 103 static krwlock_t fas_global_rwlock; 104 105 static void *fas_state; /* soft state ptr */ 106 static struct fas *fas_head; /* link all softstate structures */ 107 static struct fas *fas_tail; /* for fas_watch() */ 108 109 static kmutex_t fas_log_mutex; 110 static char fas_log_buf[256]; 111 _NOTE(MUTEX_PROTECTS_DATA(fas_global_mutex, fas_reset_watch)) 112 _NOTE(DATA_READABLE_WITHOUT_LOCK(fas_state fas_head fas_tail \ 113 fas_scsi_watchdog_tick fas_tick)) 114 _NOTE(SCHEME_PROTECTS_DATA("safe sharing", fas::f_quiesce_timeid)) 115 116 /* 117 * dma attribute structure for scsi engine 118 */ 119 static ddi_dma_attr_t dma_fasattr = { 120 DMA_ATTR_V0, (unsigned long long)0, 121 (unsigned long long)0xffffffff, (unsigned long long)((1<<24)-1), 122 1, DEFAULT_BURSTSIZE, 1, 123 (unsigned long long)0xffffffff, (unsigned long long)0xffffffff, 124 1, 512, 0 125 }; 126 127 /* 128 * optional torture test stuff 129 */ 130 #ifdef FASDEBUG 131 #define FAS_TEST 132 static int fas_ptest_emsgin; 133 static int fas_ptest_msgin; 134 static int fas_ptest_msg = -1; 135 static int fas_ptest_status; 136 static int fas_ptest_data_in; 137 static int fas_atest; 138 static int fas_atest_disc; 139 static int fas_atest_reconn; 140 static void fas_test_abort(struct fas *fas, int slot); 141 static int fas_rtest; 142 static int fas_rtest_type; 143 static void fas_test_reset(struct fas *fas, int slot); 144 static int fas_force_timeout; 145 static int fas_btest; 146 static int fas_test_stop; 147 static int fas_transport_busy; 148 static int fas_transport_busy_rqs; 149 static int fas_transport_reject; 150 static int fas_arqs_failure; 151 static int fas_tran_err; 152 static int fas_test_untagged; 153 static int fas_enable_untagged; 154 #endif 155 156 /* 157 * warlock directives 158 */ 159 _NOTE(DATA_READABLE_WITHOUT_LOCK(dma fasdebug)) 160 _NOTE(SCHEME_PROTECTS_DATA("just test variables", fas_transport_busy)) 161 _NOTE(SCHEME_PROTECTS_DATA("just test variables", fas_transport_busy_rqs)) 162 _NOTE(SCHEME_PROTECTS_DATA("just test variables", fas_transport_reject)) 163 _NOTE(SCHEME_PROTECTS_DATA("just test variables", fas_arqs_failure)) 164 _NOTE(SCHEME_PROTECTS_DATA("just test variables", fas_tran_err)) 165 _NOTE(MUTEX_PROTECTS_DATA(fas_log_mutex, fas_log_buf)) 166 _NOTE(MUTEX_PROTECTS_DATA(fas_global_mutex, fas_reset_watch)) 167 _NOTE(DATA_READABLE_WITHOUT_LOCK(fas_state fas_head fas_tail \ 168 fas_scsi_watchdog_tick fas_tick)) 169 170 /* 171 * function prototypes 172 * 173 * scsa functions are exported by means of the transport table: 174 */ 175 static int fas_scsi_tgt_probe(struct scsi_device *sd, 176 int (*waitfunc)(void)); 177 static int fas_scsi_tgt_init(dev_info_t *, dev_info_t *, 178 scsi_hba_tran_t *, struct scsi_device *); 179 static int fas_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt); 180 static int fas_scsi_abort(struct scsi_address *ap, struct scsi_pkt *pkt); 181 static int fas_scsi_reset(struct scsi_address *ap, int level); 182 static int fas_scsi_getcap(struct scsi_address *ap, char *cap, int whom); 183 static int fas_scsi_setcap(struct scsi_address *ap, char *cap, int value, 184 int whom); 185 static struct scsi_pkt *fas_scsi_init_pkt(struct scsi_address *ap, 186 struct scsi_pkt *pkt, struct buf *bp, int cmdlen, int statuslen, 187 int tgtlen, int flags, int (*callback)(), caddr_t arg); 188 static void fas_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt); 189 static void fas_scsi_dmafree(struct scsi_address *ap, 190 struct scsi_pkt *pkt); 191 static void fas_scsi_sync_pkt(struct scsi_address *ap, 192 struct scsi_pkt *pkt); 193 194 /* 195 * internal functions: 196 */ 197 static int fas_prepare_pkt(struct fas *fas, struct fas_cmd *sp); 198 static int fas_alloc_tag(struct fas *fas, struct fas_cmd *sp); 199 static int fas_accept_pkt(struct fas *fas, struct fas_cmd *sp, int flag); 200 static void fas_empty_waitQ(struct fas *fas); 201 static void fas_move_waitQ_to_readyQ(struct fas *fas); 202 static void fas_check_waitQ_and_mutex_exit(struct fas *fas); 203 static int fas_istart(struct fas *fas); 204 static int fas_ustart(struct fas *fas); 205 static int fas_startcmd(struct fas *fas, struct fas_cmd *sp); 206 207 static int fas_pkt_alloc_extern(struct fas *fas, struct fas_cmd *sp, 208 int cmdlen, int tgtlen, int statuslen, int kf); 209 static void fas_pkt_destroy_extern(struct fas *fas, struct fas_cmd *sp); 210 static int fas_kmem_cache_constructor(void *buf, void *cdrarg, int kmflags); 211 static void fas_kmem_cache_destructor(void *buf, void *cdrarg); 212 213 static int fas_finish(struct fas *fas); 214 static void fas_handle_qfull(struct fas *fas, struct fas_cmd *sp); 215 static void fas_restart_cmd(void *); 216 static int fas_dopoll(struct fas *fas, int timeout); 217 static void fas_runpoll(struct fas *fas, short slot, struct fas_cmd *sp); 218 static uint_t fas_intr(caddr_t arg); 219 static int fas_intr_svc(struct fas *fas); 220 static int fas_phasemanage(struct fas *fas); 221 static int fas_handle_unknown(struct fas *fas); 222 static int fas_handle_cmd_start(struct fas *fas); 223 static int fas_handle_cmd_done(struct fas *fas); 224 static int fas_handle_msg_out_start(struct fas *fas); 225 static int fas_handle_msg_out_done(struct fas *fas); 226 static int fas_handle_clearing(struct fas *fas); 227 static int fas_handle_data_start(struct fas *fas); 228 static int fas_handle_data_done(struct fas *fas); 229 static int fas_handle_c_cmplt(struct fas *fas); 230 static int fas_handle_msg_in_start(struct fas *fas); 231 static int fas_handle_more_msgin(struct fas *fas); 232 static int fas_handle_msg_in_done(struct fas *fas); 233 static int fas_onebyte_msg(struct fas *fas); 234 static int fas_twobyte_msg(struct fas *fas); 235 static int fas_multibyte_msg(struct fas *fas); 236 static void fas_revert_to_async(struct fas *fas, int tgt); 237 static int fas_finish_select(struct fas *fas); 238 static int fas_reselect_preempt(struct fas *fas); 239 static int fas_reconnect(struct fas *fas); 240 static int fas_handle_selection(struct fas *fas); 241 static void fas_head_of_readyQ(struct fas *fas, struct fas_cmd *sp); 242 static int fas_handle_gross_err(struct fas *fas); 243 static int fas_illegal_cmd_or_bus_reset(struct fas *fas); 244 static int fas_check_dma_error(struct fas *fas); 245 246 static void fas_make_sdtr(struct fas *fas, int msgout_offset, int target); 247 static void fas_make_wdtr(struct fas *fas, int msgout_offset, int target, 248 int width); 249 static void fas_update_props(struct fas *fas, int tgt); 250 static void fas_update_this_prop(struct fas *fas, char *property, int value); 251 252 static int fas_commoncap(struct scsi_address *ap, char *cap, int val, 253 int tgtonly, int doset); 254 255 static void fas_watch(void *arg); 256 static void fas_watchsubr(struct fas *fas); 257 static void fas_cmd_timeout(struct fas *fas, int slot); 258 static void fas_sync_wide_backoff(struct fas *fas, struct fas_cmd *sp, 259 int slot); 260 static void fas_reset_sync_wide(struct fas *fas); 261 static void fas_set_wide_conf3(struct fas *fas, int target, int width); 262 static void fas_force_renegotiation(struct fas *fas, int target); 263 264 static int fas_set_new_window(struct fas *fas, struct fas_cmd *sp); 265 static int fas_restore_pointers(struct fas *fas, struct fas_cmd *sp); 266 static int fas_next_window(struct fas *fas, struct fas_cmd *sp, uint64_t end); 267 268 /*PRINTFLIKE3*/ 269 static void fas_log(struct fas *fas, int level, const char *fmt, ...); 270 /*PRINTFLIKE2*/ 271 static void fas_printf(struct fas *fas, const char *fmt, ...); 272 static void fas_printstate(struct fas *fas, char *msg); 273 static void fas_dump_cmd(struct fas *fas, struct fas_cmd *sp); 274 static void fas_short_dump_cmd(struct fas *fas, struct fas_cmd *sp); 275 static char *fas_state_name(ushort_t state); 276 277 static void fas_makeproxy_cmd(struct fas_cmd *sp, 278 struct scsi_address *ap, struct scsi_pkt *pkt, int nmsg, ...); 279 static int fas_do_proxy_cmd(struct fas *fas, struct fas_cmd *sp, 280 struct scsi_address *ap, char *what); 281 282 static void fas_internal_reset(struct fas *fas, int reset_action); 283 static int fas_alloc_active_slots(struct fas *fas, int slot, int flag); 284 285 static int fas_abort_curcmd(struct fas *fas); 286 static int fas_abort_cmd(struct fas *fas, struct fas_cmd *sp, int slot); 287 static int fas_do_scsi_abort(struct scsi_address *ap, struct scsi_pkt *pkt); 288 static int fas_do_scsi_reset(struct scsi_address *ap, int level); 289 static int fas_remove_from_readyQ(struct fas *fas, struct fas_cmd *sp, 290 int slot); 291 static void fas_flush_readyQ(struct fas *fas, int slot); 292 static void fas_flush_tagQ(struct fas *fas, int slot); 293 static void fas_flush_cmd(struct fas *fas, struct fas_cmd *sp, 294 uchar_t reason, uint_t stat); 295 static int fas_abort_connected_cmd(struct fas *fas, struct fas_cmd *sp, 296 uchar_t msg); 297 static int fas_abort_disconnected_cmd(struct fas *fas, struct scsi_address *ap, 298 struct fas_cmd *sp, uchar_t msg, int slot); 299 static void fas_mark_packets(struct fas *fas, int slot, uchar_t reason, 300 uint_t stat); 301 static void fas_set_pkt_reason(struct fas *fas, struct fas_cmd *sp, 302 uchar_t reason, uint_t stat); 303 304 static int fas_reset_bus(struct fas *fas); 305 static int fas_reset_recovery(struct fas *fas); 306 static int fas_reset_connected_cmd(struct fas *fas, struct scsi_address *ap); 307 static int fas_reset_disconnected_cmd(struct fas *fas, struct scsi_address *ap); 308 static void fas_start_watch_reset_delay(struct fas *); 309 static void fas_setup_reset_delay(struct fas *fas); 310 static void fas_watch_reset_delay(void *arg); 311 static int fas_watch_reset_delay_subr(struct fas *fas); 312 static void fas_reset_cleanup(struct fas *fas, int slot); 313 static int fas_scsi_reset_notify(struct scsi_address *ap, int flag, 314 void (*callback)(caddr_t), caddr_t arg); 315 static int fas_scsi_quiesce(dev_info_t *hba_dip); 316 static int fas_scsi_unquiesce(dev_info_t *hba_dip); 317 318 static void fas_set_throttles(struct fas *fas, int slot, 319 int n, int what); 320 static void fas_set_all_lun_throttles(struct fas *fas, int slot, int what); 321 static void fas_full_throttle(struct fas *fas, int slot); 322 static void fas_remove_cmd(struct fas *fas, struct fas_cmd *sp, int timeout); 323 static void fas_decrement_ncmds(struct fas *fas, struct fas_cmd *sp); 324 325 static int fas_quiesce_bus(struct fas *fas); 326 static int fas_unquiesce_bus(struct fas *fas); 327 static void fas_ncmds_checkdrain(void *arg); 328 static int fas_check_outstanding(struct fas *fas); 329 330 static int fas_create_arq_pkt(struct fas *fas, struct scsi_address *ap); 331 static int fas_delete_arq_pkt(struct fas *fas, struct scsi_address *ap); 332 static int fas_handle_sts_chk(struct fas *fas, struct fas_cmd *sp); 333 void fas_complete_arq_pkt(struct scsi_pkt *pkt); 334 335 void fas_call_pkt_comp(struct fas *fas, struct fas_cmd *sp); 336 void fas_empty_callbackQ(struct fas *fas); 337 int fas_init_callbacks(struct fas *fas); 338 void fas_destroy_callbacks(struct fas *fas); 339 340 static int fas_check_dma_error(struct fas *fas); 341 static int fas_init_chip(struct fas *fas, uchar_t id); 342 343 static void fas_read_fifo(struct fas *fas); 344 static void fas_write_fifo(struct fas *fas, uchar_t *buf, int length, int pad); 345 346 #ifdef FASDEBUG 347 static void fas_reg_cmd_write(struct fas *fas, uint8_t cmd); 348 static void fas_reg_write(struct fas *fas, volatile uint8_t *p, uint8_t what); 349 static uint8_t fas_reg_read(struct fas *fas, volatile uint8_t *p); 350 351 static void fas_dma_reg_write(struct fas *fas, volatile uint32_t *p, 352 uint32_t what); 353 static uint32_t fas_dma_reg_read(struct fas *fas, volatile uint32_t *p); 354 #else 355 #define fas_reg_cmd_write(fas, cmd) \ 356 fas->f_reg->fas_cmd = (cmd), fas->f_last_cmd = (cmd) 357 #define fas_reg_write(fas, p, what) *(p) = (what) 358 #define fas_reg_read(fas, p) *(p) 359 #define fas_dma_reg_write(fas, p, what) *(p) = (what) 360 #define fas_dma_reg_read(fas, p) *(p) 361 #endif 362 363 /* 364 * autoconfiguration data and routines. 365 */ 366 static int fas_attach(dev_info_t *dev, ddi_attach_cmd_t cmd); 367 static int fas_detach(dev_info_t *dev, ddi_detach_cmd_t cmd); 368 static int fas_dr_detach(dev_info_t *dev); 369 370 static struct dev_ops fas_ops = { 371 DEVO_REV, /* devo_rev, */ 372 0, /* refcnt */ 373 ddi_no_info, /* info */ 374 nulldev, /* identify */ 375 nulldev, /* probe */ 376 fas_attach, /* attach */ 377 fas_detach, /* detach */ 378 nodev, /* reset */ 379 NULL, /* driver operations */ 380 NULL, /* bus operations */ 381 NULL, /* power */ 382 ddi_quiesce_not_supported, /* devo_quiesce */ 383 }; 384 385 char _depends_on[] = "misc/scsi"; 386 387 static struct modldrv modldrv = { 388 &mod_driverops, /* Type of module. This one is a driver */ 389 "FAS SCSI HBA Driver", /* Name of the module. */ 390 &fas_ops, /* driver ops */ 391 }; 392 393 static struct modlinkage modlinkage = { 394 MODREV_1, (void *)&modldrv, NULL 395 }; 396 397 int 398 _init(void) 399 { 400 int rval; 401 /* CONSTCOND */ 402 ASSERT(NO_COMPETING_THREADS); 403 404 rval = ddi_soft_state_init(&fas_state, sizeof (struct fas), 405 FAS_INITIAL_SOFT_SPACE); 406 if (rval != 0) { 407 return (rval); 408 } 409 410 if ((rval = scsi_hba_init(&modlinkage)) != 0) { 411 ddi_soft_state_fini(&fas_state); 412 return (rval); 413 } 414 415 mutex_init(&fas_global_mutex, NULL, MUTEX_DRIVER, NULL); 416 rw_init(&fas_global_rwlock, NULL, RW_DRIVER, NULL); 417 418 mutex_init(&fas_log_mutex, NULL, MUTEX_DRIVER, NULL); 419 420 if ((rval = mod_install(&modlinkage)) != 0) { 421 mutex_destroy(&fas_log_mutex); 422 rw_destroy(&fas_global_rwlock); 423 mutex_destroy(&fas_global_mutex); 424 ddi_soft_state_fini(&fas_state); 425 scsi_hba_fini(&modlinkage); 426 return (rval); 427 } 428 429 return (rval); 430 } 431 432 int 433 _fini(void) 434 { 435 int rval; 436 /* CONSTCOND */ 437 ASSERT(NO_COMPETING_THREADS); 438 439 if ((rval = mod_remove(&modlinkage)) == 0) { 440 ddi_soft_state_fini(&fas_state); 441 scsi_hba_fini(&modlinkage); 442 mutex_destroy(&fas_log_mutex); 443 rw_destroy(&fas_global_rwlock); 444 mutex_destroy(&fas_global_mutex); 445 } 446 return (rval); 447 } 448 449 int 450 _info(struct modinfo *modinfop) 451 { 452 /* CONSTCOND */ 453 ASSERT(NO_COMPETING_THREADS); 454 455 return (mod_info(&modlinkage, modinfop)); 456 } 457 458 static int 459 fas_scsi_tgt_probe(struct scsi_device *sd, 460 int (*waitfunc)(void)) 461 { 462 dev_info_t *dip = ddi_get_parent(sd->sd_dev); 463 int rval = SCSIPROBE_FAILURE; 464 scsi_hba_tran_t *tran; 465 struct fas *fas; 466 int tgt = sd->sd_address.a_target; 467 468 tran = ddi_get_driver_private(dip); 469 ASSERT(tran != NULL); 470 fas = TRAN2FAS(tran); 471 472 /* 473 * force renegotiation since inquiry cmds do not cause 474 * check conditions 475 */ 476 mutex_enter(FAS_MUTEX(fas)); 477 fas_force_renegotiation(fas, tgt); 478 mutex_exit(FAS_MUTEX(fas)); 479 rval = scsi_hba_probe(sd, waitfunc); 480 481 /* 482 * the scsi-options precedence is: 483 * target-scsi-options highest 484 * device-type-scsi-options 485 * per bus scsi-options 486 * global scsi-options lowest 487 */ 488 mutex_enter(FAS_MUTEX(fas)); 489 if ((rval == SCSIPROBE_EXISTS) && 490 ((fas->f_target_scsi_options_defined & (1 << tgt)) == 0)) { 491 int options; 492 493 options = scsi_get_device_type_scsi_options(dip, sd, -1); 494 if (options != -1) { 495 fas->f_target_scsi_options[tgt] = options; 496 fas_log(fas, CE_NOTE, 497 "?target%x-scsi-options = 0x%x\n", tgt, 498 fas->f_target_scsi_options[tgt]); 499 fas_force_renegotiation(fas, tgt); 500 } 501 } 502 mutex_exit(FAS_MUTEX(fas)); 503 504 IPRINTF2("target%x-scsi-options= 0x%x\n", 505 tgt, fas->f_target_scsi_options[tgt]); 506 507 return (rval); 508 } 509 510 511 /*ARGSUSED*/ 512 static int 513 fas_scsi_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip, 514 scsi_hba_tran_t *hba_tran, struct scsi_device *sd) 515 { 516 return (((sd->sd_address.a_target < NTARGETS_WIDE) && 517 (sd->sd_address.a_lun < NLUNS_PER_TARGET)) ? 518 DDI_SUCCESS : DDI_FAILURE); 519 } 520 521 /*ARGSUSED*/ 522 static int 523 fas_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 524 { 525 struct fas *fas = NULL; 526 volatile struct dma *dmar = NULL; 527 volatile struct fasreg *fasreg; 528 ddi_dma_attr_t *fas_dma_attr; 529 ddi_device_acc_attr_t dev_attr; 530 531 int instance, id, slot, i, hm_rev; 532 size_t rlen; 533 uint_t count; 534 char buf[64]; 535 scsi_hba_tran_t *tran = NULL; 536 char intr_added = 0; 537 char mutex_init_done = 0; 538 char hba_attached = 0; 539 char bound_handle = 0; 540 char *prop_template = "target%d-scsi-options"; 541 char prop_str[32]; 542 543 /* CONSTCOND */ 544 ASSERT(NO_COMPETING_THREADS); 545 546 switch (cmd) { 547 case DDI_ATTACH: 548 break; 549 550 case DDI_RESUME: 551 if ((tran = ddi_get_driver_private(dip)) == NULL) 552 return (DDI_FAILURE); 553 554 fas = TRAN2FAS(tran); 555 if (!fas) { 556 return (DDI_FAILURE); 557 } 558 /* 559 * Reset hardware and softc to "no outstanding commands" 560 * Note that a check condition can result on first command 561 * to a target. 562 */ 563 mutex_enter(FAS_MUTEX(fas)); 564 fas_internal_reset(fas, 565 FAS_RESET_SOFTC|FAS_RESET_FAS|FAS_RESET_DMA); 566 567 (void) fas_reset_bus(fas); 568 569 fas->f_suspended = 0; 570 571 /* make sure that things get started */ 572 (void) fas_istart(fas); 573 fas_check_waitQ_and_mutex_exit(fas); 574 575 mutex_enter(&fas_global_mutex); 576 if (fas_timeout_id == 0) { 577 fas_timeout_id = timeout(fas_watch, NULL, fas_tick); 578 fas_timeout_initted = 1; 579 } 580 mutex_exit(&fas_global_mutex); 581 582 return (DDI_SUCCESS); 583 584 default: 585 return (DDI_FAILURE); 586 } 587 588 instance = ddi_get_instance(dip); 589 590 /* 591 * Since we know that some instantiations of this device can 592 * be plugged into slave-only SBus slots, check to see whether 593 * this is one such. 594 */ 595 if (ddi_slaveonly(dip) == DDI_SUCCESS) { 596 cmn_err(CE_WARN, 597 "fas%d: device in slave-only slot", instance); 598 return (DDI_FAILURE); 599 } 600 601 if (ddi_intr_hilevel(dip, 0)) { 602 /* 603 * Interrupt number '0' is a high-level interrupt. 604 * At this point you either add a special interrupt 605 * handler that triggers a soft interrupt at a lower level, 606 * or - more simply and appropriately here - you just 607 * fail the attach. 608 */ 609 cmn_err(CE_WARN, 610 "fas%d: Device is using a hilevel intr", instance); 611 return (DDI_FAILURE); 612 } 613 614 /* 615 * Allocate softc information. 616 */ 617 if (ddi_soft_state_zalloc(fas_state, instance) != DDI_SUCCESS) { 618 cmn_err(CE_WARN, 619 "fas%d: cannot allocate soft state", instance); 620 goto fail; 621 } 622 623 fas = (struct fas *)ddi_get_soft_state(fas_state, instance); 624 625 if (fas == NULL) { 626 goto fail; 627 } 628 629 /* 630 * map in device registers 631 */ 632 dev_attr.devacc_attr_version = DDI_DEVICE_ATTR_V0; 633 dev_attr.devacc_attr_endian_flags = DDI_NEVERSWAP_ACC; 634 dev_attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC; 635 636 if (ddi_regs_map_setup(dip, (uint_t)0, (caddr_t *)&dmar, 637 (off_t)0, (off_t)sizeof (struct dma), 638 &dev_attr, &fas->f_dmar_acc_handle) != DDI_SUCCESS) { 639 cmn_err(CE_WARN, "fas%d: cannot map dma", instance); 640 goto fail; 641 } 642 643 if (ddi_regs_map_setup(dip, (uint_t)1, (caddr_t *)&fasreg, 644 (off_t)0, (off_t)sizeof (struct fasreg), 645 &dev_attr, &fas->f_regs_acc_handle) != DDI_SUCCESS) { 646 cmn_err(CE_WARN, 647 "fas%d: unable to map fas366 registers", instance); 648 goto fail; 649 } 650 651 fas_dma_attr = &dma_fasattr; 652 if (ddi_dma_alloc_handle(dip, fas_dma_attr, 653 DDI_DMA_SLEEP, NULL, &fas->f_dmahandle) != DDI_SUCCESS) { 654 cmn_err(CE_WARN, 655 "fas%d: cannot alloc dma handle", instance); 656 goto fail; 657 } 658 659 /* 660 * allocate cmdarea and its dma handle 661 */ 662 if (ddi_dma_mem_alloc(fas->f_dmahandle, 663 (uint_t)2*FIFOSIZE, 664 &dev_attr, DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, 665 NULL, (caddr_t *)&fas->f_cmdarea, &rlen, 666 &fas->f_cmdarea_acc_handle) != DDI_SUCCESS) { 667 cmn_err(CE_WARN, 668 "fas%d: cannot alloc cmd area", instance); 669 goto fail; 670 } 671 672 fas->f_reg = fasreg; 673 fas->f_dma = dmar; 674 fas->f_instance = instance; 675 676 if (ddi_dma_addr_bind_handle(fas->f_dmahandle, 677 NULL, (caddr_t)fas->f_cmdarea, 678 rlen, DDI_DMA_RDWR|DDI_DMA_CONSISTENT, DDI_DMA_SLEEP, NULL, 679 &fas->f_dmacookie, &count) != DDI_DMA_MAPPED) { 680 cmn_err(CE_WARN, 681 "fas%d: cannot bind cmdarea", instance); 682 goto fail; 683 } 684 bound_handle++; 685 686 ASSERT(count == 1); 687 688 /* 689 * Allocate a transport structure 690 */ 691 tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP); 692 693 /* Indicate that we are 'sizeof (scsi_*(9S))' clean. */ 694 scsi_size_clean(dip); /* SCSI_SIZE_CLEAN_VERIFY ok */ 695 696 /* 697 * initialize transport structure 698 */ 699 fas->f_tran = tran; 700 fas->f_dev = dip; 701 tran->tran_hba_private = fas; 702 tran->tran_tgt_private = NULL; 703 tran->tran_tgt_init = fas_scsi_tgt_init; 704 tran->tran_tgt_probe = fas_scsi_tgt_probe; 705 tran->tran_tgt_free = NULL; 706 tran->tran_start = fas_scsi_start; 707 tran->tran_abort = fas_scsi_abort; 708 tran->tran_reset = fas_scsi_reset; 709 tran->tran_getcap = fas_scsi_getcap; 710 tran->tran_setcap = fas_scsi_setcap; 711 tran->tran_init_pkt = fas_scsi_init_pkt; 712 tran->tran_destroy_pkt = fas_scsi_destroy_pkt; 713 tran->tran_dmafree = fas_scsi_dmafree; 714 tran->tran_sync_pkt = fas_scsi_sync_pkt; 715 tran->tran_reset_notify = fas_scsi_reset_notify; 716 tran->tran_get_bus_addr = NULL; 717 tran->tran_get_name = NULL; 718 tran->tran_quiesce = fas_scsi_quiesce; 719 tran->tran_unquiesce = fas_scsi_unquiesce; 720 tran->tran_bus_reset = NULL; 721 tran->tran_add_eventcall = NULL; 722 tran->tran_get_eventcookie = NULL; 723 tran->tran_post_event = NULL; 724 tran->tran_remove_eventcall = NULL; 725 726 fas->f_force_async = 0; 727 728 /* 729 * disable tagged queuing and wide for all targets 730 * (will be enabled by target driver if required) 731 * sync is enabled by default 732 */ 733 fas->f_nowide = fas->f_notag = ALL_TARGETS; 734 fas->f_force_narrow = ALL_TARGETS; 735 736 /* 737 * By default we assume embedded devices and save time 738 * checking for timeouts in fas_watch() by skipping 739 * the rest of luns 740 * If we're talking to any non-embedded devices, 741 * we can't cheat and skip over non-zero luns anymore 742 * in fas_watch() and fas_ustart(). 743 */ 744 fas->f_dslot = NLUNS_PER_TARGET; 745 746 /* 747 * f_active is used for saving disconnected cmds; 748 * For tagged targets, we need to increase the size later 749 * Only allocate for Lun == 0, if we probe a lun > 0 then 750 * we allocate an active structure 751 * If TQ gets enabled then we need to increase the size 752 * to hold 256 cmds 753 */ 754 for (slot = 0; slot < N_SLOTS; slot += NLUNS_PER_TARGET) { 755 (void) fas_alloc_active_slots(fas, slot, KM_SLEEP); 756 } 757 758 /* 759 * initialize the qfull retry counts 760 */ 761 for (i = 0; i < NTARGETS_WIDE; i++) { 762 fas->f_qfull_retries[i] = QFULL_RETRIES; 763 fas->f_qfull_retry_interval[i] = 764 drv_usectohz(QFULL_RETRY_INTERVAL * 1000); 765 766 } 767 768 /* 769 * Initialize throttles. 770 */ 771 fas_set_throttles(fas, 0, N_SLOTS, MAX_THROTTLE); 772 773 /* 774 * Initialize mask of deferred property updates 775 */ 776 fas->f_props_update = 0; 777 778 /* 779 * set host ID 780 */ 781 fas->f_fasconf = DEFAULT_HOSTID; 782 id = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, "initiator-id", -1); 783 if (id == -1) { 784 id = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 785 "scsi-initiator-id", -1); 786 } 787 if (id != DEFAULT_HOSTID && id >= 0 && id < NTARGETS_WIDE) { 788 fas_log(fas, CE_NOTE, "?initiator SCSI ID now %d\n", id); 789 fas->f_fasconf = (uchar_t)id; 790 } 791 792 /* 793 * find the burstsize and reduce ours if necessary 794 */ 795 fas->f_dma_attr = fas_dma_attr; 796 fas->f_dma_attr->dma_attr_burstsizes &= 797 ddi_dma_burstsizes(fas->f_dmahandle); 798 799 #ifdef FASDEBUG 800 fas->f_dma_attr->dma_attr_burstsizes &= fas_burstsizes_limit; 801 IPRINTF1("dma burstsize=%x\n", fas->f_dma_attr->dma_attr_burstsizes); 802 #endif 803 /* 804 * Attach this instance of the hba 805 */ 806 if (scsi_hba_attach_setup(dip, fas->f_dma_attr, tran, 0) != 807 DDI_SUCCESS) { 808 fas_log(fas, CE_WARN, "scsi_hba_attach_setup failed"); 809 goto fail; 810 } 811 hba_attached++; 812 813 /* 814 * if scsi-options property exists, use it 815 */ 816 fas->f_scsi_options = ddi_prop_get_int(DDI_DEV_T_ANY, 817 dip, 0, "scsi-options", DEFAULT_SCSI_OPTIONS); 818 819 /* 820 * if scsi-selection-timeout property exists, use it 821 */ 822 fas_selection_timeout = ddi_prop_get_int(DDI_DEV_T_ANY, 823 dip, 0, "scsi-selection-timeout", SCSI_DEFAULT_SELECTION_TIMEOUT); 824 825 /* 826 * if hm-rev property doesn't exist, use old scheme for rev 827 */ 828 hm_rev = ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, 829 "hm-rev", -1); 830 831 if (hm_rev == 0xa0 || hm_rev == -1) { 832 if (DMAREV(dmar) != 0) { 833 fas->f_hm_rev = 0x20; 834 fas_log(fas, CE_WARN, 835 "obsolete rev 2.0 FEPS chip, " 836 "possible data corruption"); 837 } else { 838 fas->f_hm_rev = 0x10; 839 fas_log(fas, CE_WARN, 840 "obsolete and unsupported rev 1.0 FEPS chip"); 841 goto fail; 842 } 843 } else if (hm_rev == 0x20) { 844 fas->f_hm_rev = 0x21; 845 fas_log(fas, CE_WARN, "obsolete rev 2.1 FEPS chip"); 846 } else { 847 fas->f_hm_rev = (uchar_t)hm_rev; 848 fas_log(fas, CE_NOTE, "?rev %x.%x FEPS chip\n", 849 (hm_rev >> 4) & 0xf, hm_rev & 0xf); 850 } 851 852 if ((fas->f_scsi_options & SCSI_OPTIONS_SYNC) == 0) { 853 fas->f_nosync = ALL_TARGETS; 854 } 855 856 if ((fas->f_scsi_options & SCSI_OPTIONS_WIDE) == 0) { 857 fas->f_nowide = ALL_TARGETS; 858 } 859 860 /* 861 * if target<n>-scsi-options property exists, use it; 862 * otherwise use the f_scsi_options 863 */ 864 for (i = 0; i < NTARGETS_WIDE; i++) { 865 (void) sprintf(prop_str, prop_template, i); 866 fas->f_target_scsi_options[i] = ddi_prop_get_int( 867 DDI_DEV_T_ANY, dip, 0, prop_str, -1); 868 869 if (fas->f_target_scsi_options[i] != -1) { 870 fas_log(fas, CE_NOTE, "?target%x-scsi-options=0x%x\n", 871 i, fas->f_target_scsi_options[i]); 872 fas->f_target_scsi_options_defined |= 1 << i; 873 } else { 874 fas->f_target_scsi_options[i] = fas->f_scsi_options; 875 } 876 if (((fas->f_target_scsi_options[i] & 877 SCSI_OPTIONS_DR) == 0) && 878 (fas->f_target_scsi_options[i] & SCSI_OPTIONS_TAG)) { 879 fas->f_target_scsi_options[i] &= ~SCSI_OPTIONS_TAG; 880 fas_log(fas, CE_WARN, 881 "Disabled TQ since disconnects are disabled"); 882 } 883 } 884 885 fas->f_scsi_tag_age_limit = 886 ddi_prop_get_int(DDI_DEV_T_ANY, dip, 0, "scsi-tag-age-limit", 887 DEFAULT_TAG_AGE_LIMIT); 888 889 fas->f_scsi_reset_delay = ddi_prop_get_int(DDI_DEV_T_ANY, 890 dip, 0, "scsi-reset-delay", SCSI_DEFAULT_RESET_DELAY); 891 if (fas->f_scsi_reset_delay == 0) { 892 fas_log(fas, CE_NOTE, 893 "scsi_reset_delay of 0 is not recommended," 894 " resetting to SCSI_DEFAULT_RESET_DELAY\n"); 895 fas->f_scsi_reset_delay = SCSI_DEFAULT_RESET_DELAY; 896 } 897 898 /* 899 * get iblock cookie and initialize mutexes 900 */ 901 if (ddi_get_iblock_cookie(dip, (uint_t)0, &fas->f_iblock) 902 != DDI_SUCCESS) { 903 cmn_err(CE_WARN, "fas_attach: cannot get iblock cookie"); 904 goto fail; 905 } 906 907 mutex_init(&fas->f_mutex, NULL, MUTEX_DRIVER, fas->f_iblock); 908 cv_init(&fas->f_cv, NULL, CV_DRIVER, NULL); 909 910 /* 911 * initialize mutex for waitQ 912 */ 913 mutex_init(&fas->f_waitQ_mutex, NULL, MUTEX_DRIVER, fas->f_iblock); 914 mutex_init_done++; 915 916 /* 917 * initialize callback mechanism (immediate callback) 918 */ 919 mutex_enter(&fas_global_mutex); 920 if (fas_init_callbacks(fas)) { 921 mutex_exit(&fas_global_mutex); 922 goto fail; 923 } 924 mutex_exit(&fas_global_mutex); 925 926 /* 927 * kstat_intr support 928 */ 929 (void) sprintf(buf, "fas%d", instance); 930 fas->f_intr_kstat = kstat_create("fas", instance, buf, "controller", \ 931 KSTAT_TYPE_INTR, 1, KSTAT_FLAG_PERSISTENT); 932 if (fas->f_intr_kstat) 933 kstat_install(fas->f_intr_kstat); 934 935 /* 936 * install interrupt handler 937 */ 938 mutex_enter(FAS_MUTEX(fas)); 939 if (ddi_add_intr(dip, (uint_t)0, &fas->f_iblock, NULL, 940 fas_intr, (caddr_t)fas)) { 941 cmn_err(CE_WARN, "fas: cannot add intr"); 942 mutex_exit(FAS_MUTEX(fas)); 943 goto fail; 944 } 945 intr_added++; 946 947 /* 948 * initialize fas chip 949 */ 950 if (fas_init_chip(fas, id)) { 951 cmn_err(CE_WARN, "fas: cannot initialize"); 952 mutex_exit(FAS_MUTEX(fas)); 953 goto fail; 954 } 955 mutex_exit(FAS_MUTEX(fas)); 956 957 /* 958 * create kmem cache for packets 959 */ 960 (void) sprintf(buf, "fas%d_cache", instance); 961 fas->f_kmem_cache = kmem_cache_create(buf, 962 EXTCMD_SIZE, 8, 963 fas_kmem_cache_constructor, fas_kmem_cache_destructor, 964 NULL, (void *)fas, NULL, 0); 965 if (fas->f_kmem_cache == NULL) { 966 cmn_err(CE_WARN, "fas: cannot create kmem_cache"); 967 goto fail; 968 } 969 970 /* 971 * at this point, we are not going to fail the attach 972 * so there is no need to undo the rest: 973 * 974 * add this fas to the list, this makes debugging easier 975 * and fas_watch() needs it to walk thru all fas's 976 */ 977 rw_enter(&fas_global_rwlock, RW_WRITER); 978 if (fas_head == NULL) { 979 fas_head = fas; 980 } else { 981 fas_tail->f_next = fas; 982 } 983 fas_tail = fas; /* point to last fas in list */ 984 rw_exit(&fas_global_rwlock); 985 986 /* 987 * there is one watchdog handler for all driver instances. 988 * start the watchdog if it hasn't been done yet 989 */ 990 mutex_enter(&fas_global_mutex); 991 if (fas_scsi_watchdog_tick == 0) { 992 fas_scsi_watchdog_tick = ddi_prop_get_int(DDI_DEV_T_ANY, 993 dip, 0, "scsi-watchdog-tick", DEFAULT_WD_TICK); 994 if (fas_scsi_watchdog_tick != DEFAULT_WD_TICK) { 995 fas_log(fas, CE_NOTE, "?scsi-watchdog-tick=%d\n", 996 fas_scsi_watchdog_tick); 997 } 998 fas_tick = drv_usectohz((clock_t) 999 fas_scsi_watchdog_tick * 1000000); 1000 IPRINTF2("fas scsi watchdog tick=%x, fas_tick=%lx\n", 1001 fas_scsi_watchdog_tick, fas_tick); 1002 if (fas_timeout_id == 0) { 1003 fas_timeout_id = timeout(fas_watch, NULL, fas_tick); 1004 fas_timeout_initted = 1; 1005 } 1006 } 1007 mutex_exit(&fas_global_mutex); 1008 1009 ddi_report_dev(dip); 1010 1011 return (DDI_SUCCESS); 1012 1013 fail: 1014 cmn_err(CE_WARN, "fas%d: cannot attach", instance); 1015 if (fas) { 1016 for (slot = 0; slot < N_SLOTS; slot++) { 1017 struct f_slots *active = fas->f_active[slot]; 1018 if (active) { 1019 kmem_free(active, active->f_size); 1020 fas->f_active[slot] = NULL; 1021 } 1022 } 1023 if (mutex_init_done) { 1024 mutex_destroy(&fas->f_mutex); 1025 mutex_destroy(&fas->f_waitQ_mutex); 1026 cv_destroy(&fas->f_cv); 1027 } 1028 if (intr_added) { 1029 ddi_remove_intr(dip, (uint_t)0, fas->f_iblock); 1030 } 1031 /* 1032 * kstat_intr support 1033 */ 1034 if (fas->f_intr_kstat) { 1035 kstat_delete(fas->f_intr_kstat); 1036 } 1037 if (hba_attached) { 1038 (void) scsi_hba_detach(dip); 1039 } 1040 if (tran) { 1041 scsi_hba_tran_free(tran); 1042 } 1043 if (fas->f_kmem_cache) { 1044 kmem_cache_destroy(fas->f_kmem_cache); 1045 } 1046 if (fas->f_cmdarea) { 1047 if (bound_handle) { 1048 (void) ddi_dma_unbind_handle(fas->f_dmahandle); 1049 } 1050 ddi_dma_mem_free(&fas->f_cmdarea_acc_handle); 1051 } 1052 if (fas->f_dmahandle) { 1053 ddi_dma_free_handle(&fas->f_dmahandle); 1054 } 1055 fas_destroy_callbacks(fas); 1056 if (fas->f_regs_acc_handle) { 1057 ddi_regs_map_free(&fas->f_regs_acc_handle); 1058 } 1059 if (fas->f_dmar_acc_handle) { 1060 ddi_regs_map_free(&fas->f_dmar_acc_handle); 1061 } 1062 ddi_soft_state_free(fas_state, instance); 1063 1064 ddi_remove_minor_node(dip, NULL); 1065 } 1066 return (DDI_FAILURE); 1067 } 1068 1069 /*ARGSUSED*/ 1070 static int 1071 fas_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 1072 { 1073 struct fas *fas, *nfas; 1074 scsi_hba_tran_t *tran; 1075 1076 /* CONSTCOND */ 1077 ASSERT(NO_COMPETING_THREADS); 1078 1079 switch (cmd) { 1080 case DDI_DETACH: 1081 return (fas_dr_detach(dip)); 1082 1083 case DDI_SUSPEND: 1084 if ((tran = ddi_get_driver_private(dip)) == NULL) 1085 return (DDI_FAILURE); 1086 1087 fas = TRAN2FAS(tran); 1088 if (!fas) { 1089 return (DDI_FAILURE); 1090 } 1091 1092 mutex_enter(FAS_MUTEX(fas)); 1093 1094 fas->f_suspended = 1; 1095 1096 if (fas->f_ncmds) { 1097 (void) fas_reset_bus(fas); 1098 (void) fas_dopoll(fas, SHORT_POLL_TIMEOUT); 1099 } 1100 /* 1101 * disable dma and fas interrupt 1102 */ 1103 fas->f_dma_csr &= ~DMA_INTEN; 1104 fas->f_dma_csr &= ~DMA_ENDVMA; 1105 fas_dma_reg_write(fas, &fas->f_dma->dma_csr, fas->f_dma_csr); 1106 1107 mutex_exit(FAS_MUTEX(fas)); 1108 1109 if (fas->f_quiesce_timeid) { 1110 (void) untimeout(fas->f_quiesce_timeid); 1111 fas->f_quiesce_timeid = 0; 1112 } 1113 1114 if (fas->f_restart_cmd_timeid) { 1115 (void) untimeout(fas->f_restart_cmd_timeid); 1116 fas->f_restart_cmd_timeid = 0; 1117 } 1118 1119 /* Last fas? */ 1120 rw_enter(&fas_global_rwlock, RW_WRITER); 1121 for (nfas = fas_head; nfas; nfas = nfas->f_next) { 1122 if (!nfas->f_suspended) { 1123 rw_exit(&fas_global_rwlock); 1124 return (DDI_SUCCESS); 1125 } 1126 } 1127 rw_exit(&fas_global_rwlock); 1128 1129 mutex_enter(&fas_global_mutex); 1130 if (fas_timeout_id != 0) { 1131 timeout_id_t tid = fas_timeout_id; 1132 fas_timeout_id = 0; 1133 fas_timeout_initted = 0; 1134 mutex_exit(&fas_global_mutex); 1135 (void) untimeout(tid); 1136 } else { 1137 mutex_exit(&fas_global_mutex); 1138 } 1139 1140 mutex_enter(&fas_global_mutex); 1141 if (fas_reset_watch) { 1142 timeout_id_t tid = fas_reset_watch; 1143 fas_reset_watch = 0; 1144 mutex_exit(&fas_global_mutex); 1145 (void) untimeout(tid); 1146 } else { 1147 mutex_exit(&fas_global_mutex); 1148 } 1149 1150 return (DDI_SUCCESS); 1151 1152 default: 1153 return (DDI_FAILURE); 1154 } 1155 _NOTE(NOT_REACHED) 1156 /* NOTREACHED */ 1157 } 1158 1159 static int 1160 fas_dr_detach(dev_info_t *dip) 1161 { 1162 struct fas *fas, *f; 1163 scsi_hba_tran_t *tran; 1164 short slot; 1165 int i, j; 1166 1167 if ((tran = ddi_get_driver_private(dip)) == NULL) 1168 return (DDI_FAILURE); 1169 1170 fas = TRAN2FAS(tran); 1171 if (!fas) { 1172 return (DDI_FAILURE); 1173 } 1174 1175 /* 1176 * disable interrupts 1177 */ 1178 fas->f_dma_csr &= ~DMA_INTEN; 1179 fas->f_dma->dma_csr = fas->f_dma_csr; 1180 ddi_remove_intr(dip, (uint_t)0, fas->f_iblock); 1181 1182 /* 1183 * Remove device instance from the global linked list 1184 */ 1185 rw_enter(&fas_global_rwlock, RW_WRITER); 1186 1187 if (fas_head == fas) { 1188 f = fas_head = fas->f_next; 1189 } else { 1190 for (f = fas_head; f != (struct fas *)NULL; f = f->f_next) { 1191 if (f->f_next == fas) { 1192 f->f_next = fas->f_next; 1193 break; 1194 } 1195 } 1196 1197 /* 1198 * Instance not in softc list. Since the 1199 * instance is not there in softc list, don't 1200 * enable interrupts, the instance is effectively 1201 * unusable. 1202 */ 1203 if (f == (struct fas *)NULL) { 1204 cmn_err(CE_WARN, "fas_dr_detach: fas instance not" 1205 " in softc list!"); 1206 rw_exit(&fas_global_rwlock); 1207 return (DDI_FAILURE); 1208 } 1209 1210 1211 } 1212 1213 if (fas_tail == fas) 1214 fas_tail = f; 1215 1216 rw_exit(&fas_global_rwlock); 1217 1218 if (fas->f_intr_kstat) 1219 kstat_delete(fas->f_intr_kstat); 1220 1221 fas_destroy_callbacks(fas); 1222 1223 scsi_hba_reset_notify_tear_down(fas->f_reset_notify_listf); 1224 1225 mutex_enter(&fas_global_mutex); 1226 /* 1227 * destroy any outstanding tagged command info 1228 */ 1229 for (slot = 0; slot < N_SLOTS; slot++) { 1230 struct f_slots *active = fas->f_active[slot]; 1231 if (active) { 1232 ushort_t tag; 1233 for (tag = 0; tag < active->f_n_slots; tag++) { 1234 struct fas_cmd *sp = active->f_slot[tag]; 1235 if (sp) { 1236 struct scsi_pkt *pkt = sp->cmd_pkt; 1237 if (pkt) { 1238 (void) fas_scsi_destroy_pkt( 1239 &pkt->pkt_address, pkt); 1240 } 1241 /* sp freed in fas_scsi_destroy_pkt */ 1242 active->f_slot[tag] = NULL; 1243 } 1244 } 1245 kmem_free(active, active->f_size); 1246 fas->f_active[slot] = NULL; 1247 } 1248 ASSERT(fas->f_tcmds[slot] == 0); 1249 } 1250 1251 /* 1252 * disallow timeout thread rescheduling 1253 */ 1254 fas->f_flags |= FAS_FLG_NOTIMEOUTS; 1255 mutex_exit(&fas_global_mutex); 1256 1257 if (fas->f_quiesce_timeid) { 1258 (void) untimeout(fas->f_quiesce_timeid); 1259 } 1260 1261 /* 1262 * last fas? ... if active, CANCEL watch threads. 1263 */ 1264 mutex_enter(&fas_global_mutex); 1265 if (fas_head == (struct fas *)NULL) { 1266 if (fas_timeout_initted) { 1267 timeout_id_t tid = fas_timeout_id; 1268 fas_timeout_initted = 0; 1269 fas_timeout_id = 0; /* don't resched */ 1270 mutex_exit(&fas_global_mutex); 1271 (void) untimeout(tid); 1272 mutex_enter(&fas_global_mutex); 1273 } 1274 1275 if (fas_reset_watch) { 1276 mutex_exit(&fas_global_mutex); 1277 (void) untimeout(fas_reset_watch); 1278 mutex_enter(&fas_global_mutex); 1279 fas_reset_watch = 0; 1280 } 1281 } 1282 mutex_exit(&fas_global_mutex); 1283 1284 if (fas->f_restart_cmd_timeid) { 1285 (void) untimeout(fas->f_restart_cmd_timeid); 1286 fas->f_restart_cmd_timeid = 0; 1287 } 1288 1289 /* 1290 * destroy outstanding ARQ pkts 1291 */ 1292 for (i = 0; i < NTARGETS_WIDE; i++) { 1293 for (j = 0; j < NLUNS_PER_TARGET; j++) { 1294 int slot = i * NLUNS_PER_TARGET | j; 1295 if (fas->f_arq_pkt[slot]) { 1296 struct scsi_address sa; 1297 sa.a_hba_tran = NULL; /* not used */ 1298 sa.a_target = (ushort_t)i; 1299 sa.a_lun = (uchar_t)j; 1300 (void) fas_delete_arq_pkt(fas, &sa); 1301 } 1302 } 1303 } 1304 1305 /* 1306 * Remove device MT locks and CV 1307 */ 1308 mutex_destroy(&fas->f_waitQ_mutex); 1309 mutex_destroy(&fas->f_mutex); 1310 cv_destroy(&fas->f_cv); 1311 1312 /* 1313 * Release miscellaneous device resources 1314 */ 1315 1316 if (fas->f_kmem_cache) { 1317 kmem_cache_destroy(fas->f_kmem_cache); 1318 } 1319 1320 if (fas->f_cmdarea != (uchar_t *)NULL) { 1321 (void) ddi_dma_unbind_handle(fas->f_dmahandle); 1322 ddi_dma_mem_free(&fas->f_cmdarea_acc_handle); 1323 } 1324 1325 if (fas->f_dmahandle != (ddi_dma_handle_t)NULL) { 1326 ddi_dma_free_handle(&fas->f_dmahandle); 1327 } 1328 1329 if (fas->f_regs_acc_handle) { 1330 ddi_regs_map_free(&fas->f_regs_acc_handle); 1331 } 1332 if (fas->f_dmar_acc_handle) { 1333 ddi_regs_map_free(&fas->f_dmar_acc_handle); 1334 } 1335 1336 /* 1337 * Remove properties created during attach() 1338 */ 1339 ddi_prop_remove_all(dip); 1340 1341 /* 1342 * Delete the DMA limits, transport vectors and remove the device 1343 * links to the scsi_transport layer. 1344 * -- ddi_set_driver_private(dip, NULL) 1345 */ 1346 (void) scsi_hba_detach(dip); 1347 1348 /* 1349 * Free the scsi_transport structure for this device. 1350 */ 1351 scsi_hba_tran_free(tran); 1352 1353 ddi_soft_state_free(fas_state, ddi_get_instance(dip)); 1354 1355 return (DDI_SUCCESS); 1356 } 1357 1358 static int 1359 fas_quiesce_bus(struct fas *fas) 1360 { 1361 mutex_enter(FAS_MUTEX(fas)); 1362 IPRINTF("fas_quiesce: QUIESCEing\n"); 1363 IPRINTF3("fas_quiesce: ncmds (%d) ndisc (%d) state (%d)\n", 1364 fas->f_ncmds, fas->f_ndisc, fas->f_softstate); 1365 fas_set_throttles(fas, 0, N_SLOTS, HOLD_THROTTLE); 1366 if (fas_check_outstanding(fas)) { 1367 fas->f_softstate |= FAS_SS_DRAINING; 1368 fas->f_quiesce_timeid = timeout(fas_ncmds_checkdrain, 1369 fas, (FAS_QUIESCE_TIMEOUT * drv_usectohz(1000000))); 1370 if (cv_wait_sig(FAS_CV(fas), FAS_MUTEX(fas)) == 0) { 1371 /* 1372 * quiesce has been interrupted. 1373 */ 1374 IPRINTF("fas_quiesce: abort QUIESCE\n"); 1375 fas->f_softstate &= ~FAS_SS_DRAINING; 1376 fas_set_throttles(fas, 0, N_SLOTS, MAX_THROTTLE); 1377 (void) fas_istart(fas); 1378 if (fas->f_quiesce_timeid != 0) { 1379 mutex_exit(FAS_MUTEX(fas)); 1380 #ifndef __lock_lint /* warlock complains but there is a NOTE on this */ 1381 (void) untimeout(fas->f_quiesce_timeid); 1382 fas->f_quiesce_timeid = 0; 1383 #endif 1384 return (-1); 1385 } 1386 mutex_exit(FAS_MUTEX(fas)); 1387 return (-1); 1388 } else { 1389 IPRINTF("fas_quiesce: bus is QUIESCED\n"); 1390 ASSERT(fas->f_quiesce_timeid == 0); 1391 fas->f_softstate &= ~FAS_SS_DRAINING; 1392 fas->f_softstate |= FAS_SS_QUIESCED; 1393 mutex_exit(FAS_MUTEX(fas)); 1394 return (0); 1395 } 1396 } 1397 IPRINTF("fas_quiesce: bus was not busy QUIESCED\n"); 1398 mutex_exit(FAS_MUTEX(fas)); 1399 return (0); 1400 } 1401 1402 static int 1403 fas_unquiesce_bus(struct fas *fas) 1404 { 1405 mutex_enter(FAS_MUTEX(fas)); 1406 fas->f_softstate &= ~FAS_SS_QUIESCED; 1407 fas_set_throttles(fas, 0, N_SLOTS, MAX_THROTTLE); 1408 (void) fas_istart(fas); 1409 IPRINTF("fas_quiesce: bus has been UNQUIESCED\n"); 1410 mutex_exit(FAS_MUTEX(fas)); 1411 1412 return (0); 1413 } 1414 1415 /* 1416 * invoked from timeout() to check the number of outstanding commands 1417 */ 1418 static void 1419 fas_ncmds_checkdrain(void *arg) 1420 { 1421 struct fas *fas = arg; 1422 1423 mutex_enter(FAS_MUTEX(fas)); 1424 IPRINTF3("fas_checkdrain: ncmds (%d) ndisc (%d) state (%d)\n", 1425 fas->f_ncmds, fas->f_ndisc, fas->f_softstate); 1426 if (fas->f_softstate & FAS_SS_DRAINING) { 1427 fas->f_quiesce_timeid = 0; 1428 if (fas_check_outstanding(fas) == 0) { 1429 IPRINTF("fas_drain: bus has drained\n"); 1430 cv_signal(FAS_CV(fas)); 1431 } else { 1432 /* 1433 * throttle may have been reset by a bus reset 1434 * or fas_runpoll() 1435 * XXX shouldn't be necessary 1436 */ 1437 fas_set_throttles(fas, 0, N_SLOTS, HOLD_THROTTLE); 1438 IPRINTF("fas_drain: rescheduling timeout\n"); 1439 fas->f_quiesce_timeid = timeout(fas_ncmds_checkdrain, 1440 fas, (FAS_QUIESCE_TIMEOUT * drv_usectohz(1000000))); 1441 } 1442 } 1443 mutex_exit(FAS_MUTEX(fas)); 1444 } 1445 1446 static int 1447 fas_check_outstanding(struct fas *fas) 1448 { 1449 uint_t slot; 1450 uint_t d = ((fas->f_dslot == 0)? 1 : fas->f_dslot); 1451 int ncmds = 0; 1452 1453 ASSERT(mutex_owned(FAS_MUTEX(fas))); 1454 1455 for (slot = 0; slot < N_SLOTS; slot += d) 1456 ncmds += fas->f_tcmds[slot]; 1457 1458 return (ncmds); 1459 } 1460 1461 1462 #ifdef FASDEBUG 1463 /* 1464 * fas register read/write functions with tracing 1465 */ 1466 static void 1467 fas_reg_tracing(struct fas *fas, int type, int regno, uint32_t what) 1468 { 1469 fas->f_reg_trace[fas->f_reg_trace_index++] = type; 1470 fas->f_reg_trace[fas->f_reg_trace_index++] = regno; 1471 fas->f_reg_trace[fas->f_reg_trace_index++] = what; 1472 fas->f_reg_trace[fas->f_reg_trace_index++] = gethrtime(); 1473 fas->f_reg_trace[fas->f_reg_trace_index] = 0xff; 1474 if (fas->f_reg_trace_index >= REG_TRACE_BUF_SIZE) { 1475 fas->f_reg_trace_index = 0; 1476 } 1477 } 1478 1479 static void 1480 fas_reg_cmd_write(struct fas *fas, uint8_t cmd) 1481 { 1482 volatile struct fasreg *fasreg = fas->f_reg; 1483 int regno = (uintptr_t)&fasreg->fas_cmd - (uintptr_t)fasreg; 1484 1485 fasreg->fas_cmd = cmd; 1486 fas->f_last_cmd = cmd; 1487 1488 EPRINTF1("issuing cmd %x\n", (uchar_t)cmd); 1489 fas_reg_tracing(fas, 0, regno, cmd); 1490 1491 fas->f_reg_cmds++; 1492 } 1493 1494 static void 1495 fas_reg_write(struct fas *fas, volatile uint8_t *p, uint8_t what) 1496 { 1497 int regno = (uintptr_t)p - (uintptr_t)fas->f_reg; 1498 1499 *p = what; 1500 1501 EPRINTF2("writing reg%x = %x\n", regno, what); 1502 fas_reg_tracing(fas, 1, regno, what); 1503 1504 fas->f_reg_writes++; 1505 } 1506 1507 static uint8_t 1508 fas_reg_read(struct fas *fas, volatile uint8_t *p) 1509 { 1510 uint8_t what; 1511 int regno = (uintptr_t)p - (uintptr_t)fas->f_reg; 1512 1513 what = *p; 1514 1515 EPRINTF2("reading reg%x => %x\n", regno, what); 1516 fas_reg_tracing(fas, 2, regno, what); 1517 1518 fas->f_reg_reads++; 1519 1520 return (what); 1521 } 1522 1523 /* 1524 * dma register access routines 1525 */ 1526 static void 1527 fas_dma_reg_write(struct fas *fas, volatile uint32_t *p, uint32_t what) 1528 { 1529 *p = what; 1530 fas->f_reg_dma_writes++; 1531 1532 #ifdef DMA_REG_TRACING 1533 { 1534 int regno = (uintptr_t)p - (uintptr_t)fas->f_dma; 1535 EPRINTF2("writing dma reg%x = %x\n", regno, what); 1536 fas_reg_tracing(fas, 3, regno, what); 1537 } 1538 #endif 1539 } 1540 1541 static uint32_t 1542 fas_dma_reg_read(struct fas *fas, volatile uint32_t *p) 1543 { 1544 uint32_t what = *p; 1545 fas->f_reg_dma_reads++; 1546 1547 #ifdef DMA_REG_TRACING 1548 { 1549 int regno = (uintptr_t)p - (uintptr_t)fas->f_dma; 1550 EPRINTF2("reading dma reg%x => %x\n", regno, what); 1551 fas_reg_tracing(fas, 4, regno, what); 1552 } 1553 #endif 1554 return (what); 1555 } 1556 #endif 1557 1558 #define FIFO_EMPTY(fas) (fas_reg_read(fas, &fas->f_reg->fas_stat2) & \ 1559 FAS_STAT2_EMPTY) 1560 #define FIFO_CNT(fas) \ 1561 (fas_reg_read(fas, &fas->f_reg->fas_fifo_flag) & FIFO_CNT_MASK) 1562 1563 #ifdef FASDEBUG 1564 static void 1565 fas_assert_atn(struct fas *fas) 1566 { 1567 fas_reg_cmd_write(fas, CMD_SET_ATN); 1568 #ifdef FAS_TEST 1569 if (fas_test_stop > 1) 1570 debug_enter("asserted atn"); 1571 #endif 1572 } 1573 #else 1574 #define fas_assert_atn(fas) fas_reg_cmd_write(fas, CMD_SET_ATN) 1575 #endif 1576 1577 /* 1578 * DMA macros; we use a shadow copy of the dma_csr to save unnecessary 1579 * reads 1580 */ 1581 #define FAS_DMA_WRITE(fas, count, base, cmd) { \ 1582 volatile struct fasreg *fasreg = fas->f_reg; \ 1583 volatile struct dma *dmar = fas->f_dma; \ 1584 ASSERT((fas_dma_reg_read(fas, &dmar->dma_csr) & DMA_ENDVMA) == 0); \ 1585 SET_FAS_COUNT(fasreg, count); \ 1586 fas_reg_cmd_write(fas, cmd); \ 1587 fas_dma_reg_write(fas, &dmar->dma_count, count); \ 1588 fas->f_dma_csr |= \ 1589 DMA_WRITE | DMA_ENDVMA | DMA_DSBL_DRAIN; \ 1590 fas_dma_reg_write(fas, &dmar->dma_addr, (fas->f_lastdma = base)); \ 1591 fas_dma_reg_write(fas, &dmar->dma_csr, fas->f_dma_csr); \ 1592 } 1593 1594 #define FAS_DMA_WRITE_SETUP(fas, count, base) { \ 1595 volatile struct fasreg *fasreg = fas->f_reg; \ 1596 volatile struct dma *dmar = fas->f_dma; \ 1597 ASSERT((fas_dma_reg_read(fas, &dmar->dma_csr) & DMA_ENDVMA) == 0); \ 1598 SET_FAS_COUNT(fasreg, count); \ 1599 fas_dma_reg_write(fas, &dmar->dma_count, count); \ 1600 fas->f_dma_csr |= \ 1601 DMA_WRITE | DMA_ENDVMA | DMA_DSBL_DRAIN; \ 1602 fas_dma_reg_write(fas, &dmar->dma_addr, (fas->f_lastdma = base)); \ 1603 } 1604 1605 1606 #define FAS_DMA_READ(fas, count, base, dmacount, cmd) { \ 1607 volatile struct fasreg *fasreg = fas->f_reg; \ 1608 volatile struct dma *dmar = fas->f_dma; \ 1609 ASSERT((fas_dma_reg_read(fas, &dmar->dma_csr) & DMA_ENDVMA) == 0); \ 1610 SET_FAS_COUNT(fasreg, count); \ 1611 fas_reg_cmd_write(fas, cmd); \ 1612 fas->f_dma_csr |= \ 1613 (fas->f_dma_csr & ~DMA_WRITE) | DMA_ENDVMA | DMA_DSBL_DRAIN; \ 1614 fas_dma_reg_write(fas, &dmar->dma_count, dmacount); \ 1615 fas_dma_reg_write(fas, &dmar->dma_addr, (fas->f_lastdma = base)); \ 1616 fas_dma_reg_write(fas, &dmar->dma_csr, fas->f_dma_csr); \ 1617 } 1618 1619 static void 1620 FAS_FLUSH_DMA(struct fas *fas) 1621 { 1622 fas_dma_reg_write(fas, &fas->f_dma->dma_csr, DMA_RESET); 1623 fas->f_dma_csr |= (DMA_INTEN|DMA_TWO_CYCLE|DMA_DSBL_PARITY| 1624 DMA_DSBL_DRAIN); 1625 fas->f_dma_csr &= ~(DMA_ENDVMA | DMA_WRITE); 1626 fas_dma_reg_write(fas, &fas->f_dma->dma_csr, 0); 1627 fas_dma_reg_write(fas, &fas->f_dma->dma_csr, fas->f_dma_csr); 1628 fas_dma_reg_write(fas, &fas->f_dma->dma_addr, 0); 1629 } 1630 1631 /* 1632 * FAS_FLUSH_DMA_HARD checks on REQPEND before taking away the reset 1633 */ 1634 static void 1635 FAS_FLUSH_DMA_HARD(struct fas *fas) 1636 { 1637 fas_dma_reg_write(fas, &fas->f_dma->dma_csr, DMA_RESET); 1638 fas->f_dma_csr |= (DMA_INTEN|DMA_TWO_CYCLE|DMA_DSBL_PARITY| 1639 DMA_DSBL_DRAIN); 1640 fas->f_dma_csr &= ~(DMA_ENDVMA | DMA_WRITE); 1641 while (fas_dma_reg_read(fas, &fas->f_dma->dma_csr) & DMA_REQPEND) 1642 ; 1643 fas_dma_reg_write(fas, &fas->f_dma->dma_csr, 0); 1644 fas_dma_reg_write(fas, &fas->f_dma->dma_csr, fas->f_dma_csr); 1645 fas_dma_reg_write(fas, &fas->f_dma->dma_addr, 0); 1646 } 1647 1648 /* 1649 * update period, conf3, offset reg, if necessary 1650 */ 1651 #define FAS_SET_PERIOD_OFFSET_CONF3_REGS(fas, target) \ 1652 { \ 1653 uchar_t period, offset, conf3; \ 1654 period = fas->f_sync_period[target] & SYNC_PERIOD_MASK; \ 1655 offset = fas->f_offset[target]; \ 1656 conf3 = fas->f_fasconf3[target]; \ 1657 if ((period != fas->f_period_reg_last) || \ 1658 (offset != fas->f_offset_reg_last) || \ 1659 (conf3 != fas->f_fasconf3_reg_last)) { \ 1660 fas->f_period_reg_last = period; \ 1661 fas->f_offset_reg_last = offset; \ 1662 fas->f_fasconf3_reg_last = conf3; \ 1663 fas_reg_write(fas, &fasreg->fas_sync_period, period); \ 1664 fas_reg_write(fas, &fasreg->fas_sync_offset, offset); \ 1665 fas_reg_write(fas, &fasreg->fas_conf3, conf3); \ 1666 } \ 1667 } 1668 1669 /* 1670 * fifo read/write routines 1671 * always read the fifo bytes before reading the interrupt register 1672 */ 1673 1674 static void 1675 fas_read_fifo(struct fas *fas) 1676 { 1677 int stat = fas->f_stat; 1678 volatile struct fasreg *fasreg = fas->f_reg; 1679 int i; 1680 1681 i = fas_reg_read(fas, &fasreg->fas_fifo_flag) & FIFO_CNT_MASK; 1682 EPRINTF2("fas_read_fifo: fifo cnt=%x, stat=%x\n", i, stat); 1683 ASSERT(i <= FIFOSIZE); 1684 1685 fas->f_fifolen = 0; 1686 while (i-- > 0) { 1687 fas->f_fifo[fas->f_fifolen++] = fas_reg_read(fas, 1688 &fasreg->fas_fifo_data); 1689 fas->f_fifo[fas->f_fifolen++] = fas_reg_read(fas, 1690 &fasreg->fas_fifo_data); 1691 } 1692 if (fas->f_stat2 & FAS_STAT2_ISHUTTLE) { 1693 1694 /* write pad byte */ 1695 fas_reg_write(fas, &fasreg->fas_fifo_data, 0); 1696 fas->f_fifo[fas->f_fifolen++] = fas_reg_read(fas, 1697 &fasreg->fas_fifo_data); 1698 /* flush pad byte */ 1699 fas_reg_cmd_write(fas, CMD_FLUSH); 1700 } 1701 EPRINTF2("fas_read_fifo: fifo len=%x, stat2=%x\n", 1702 fas->f_fifolen, stat); 1703 } /* fas_read_fifo */ 1704 1705 static void 1706 fas_write_fifo(struct fas *fas, uchar_t *buf, int length, int pad) 1707 { 1708 int i; 1709 volatile struct fasreg *fasreg = fas->f_reg; 1710 1711 EPRINTF1("writing fifo %x bytes\n", length); 1712 ASSERT(length <= 15); 1713 fas_reg_cmd_write(fas, CMD_FLUSH); 1714 for (i = 0; i < length; i++) { 1715 fas_reg_write(fas, &fasreg->fas_fifo_data, buf[i]); 1716 if (pad) { 1717 fas_reg_write(fas, &fasreg->fas_fifo_data, 0); 1718 } 1719 } 1720 } 1721 1722 /* 1723 * Hardware and Software internal reset routines 1724 */ 1725 static int 1726 fas_init_chip(struct fas *fas, uchar_t initiator_id) 1727 { 1728 int i; 1729 uchar_t clock_conv; 1730 uchar_t initial_conf3; 1731 uint_t ticks; 1732 static char *prop_cfreq = "clock-frequency"; 1733 1734 /* 1735 * Determine clock frequency of attached FAS chip. 1736 */ 1737 i = ddi_prop_get_int(DDI_DEV_T_ANY, 1738 fas->f_dev, DDI_PROP_DONTPASS, prop_cfreq, -1); 1739 clock_conv = (i + FIVE_MEG - 1) / FIVE_MEG; 1740 if (clock_conv != CLOCK_40MHZ) { 1741 fas_log(fas, CE_WARN, "Bad clock frequency"); 1742 return (-1); 1743 } 1744 1745 fas->f_clock_conv = clock_conv; 1746 fas->f_clock_cycle = CLOCK_PERIOD(i); 1747 ticks = FAS_CLOCK_TICK(fas); 1748 fas->f_stval = FAS_CLOCK_TIMEOUT(ticks, fas_selection_timeout); 1749 1750 DPRINTF5("%d mhz, clock_conv %d, clock_cycle %d, ticks %d, stval %d\n", 1751 i, fas->f_clock_conv, fas->f_clock_cycle, 1752 ticks, fas->f_stval); 1753 /* 1754 * set up conf registers 1755 */ 1756 fas->f_fasconf |= FAS_CONF_PAREN; 1757 fas->f_fasconf2 = (uchar_t)(FAS_CONF2_FENABLE | FAS_CONF2_XL32); 1758 1759 if (initiator_id < NTARGETS) { 1760 initial_conf3 = FAS_CONF3_FASTCLK | FAS_CONF3_ODDBYTE_AUTO; 1761 } else { 1762 initial_conf3 = FAS_CONF3_FASTCLK | FAS_CONF3_ODDBYTE_AUTO | 1763 FAS_CONF3_IDBIT3; 1764 } 1765 1766 for (i = 0; i < NTARGETS_WIDE; i++) { 1767 fas->f_fasconf3[i] = initial_conf3; 1768 } 1769 1770 /* 1771 * Avoid resetting the scsi bus since this causes a few seconds 1772 * delay per fas in boot and also causes busy conditions in some 1773 * tape devices. 1774 */ 1775 fas_internal_reset(fas, FAS_RESET_SOFTC|FAS_RESET_FAS|FAS_RESET_DMA); 1776 1777 /* 1778 * initialize period and offset for each target 1779 */ 1780 for (i = 0; i < NTARGETS_WIDE; i++) { 1781 if (fas->f_target_scsi_options[i] & SCSI_OPTIONS_SYNC) { 1782 fas->f_offset[i] = fas_default_offset | 1783 fas->f_req_ack_delay; 1784 } else { 1785 fas->f_offset[i] = 0; 1786 } 1787 if (fas->f_target_scsi_options[i] & SCSI_OPTIONS_FAST) { 1788 fas->f_neg_period[i] = 1789 (uchar_t)MIN_SYNC_PERIOD(fas); 1790 } else { 1791 fas->f_neg_period[i] = 1792 (uchar_t)CONVERT_PERIOD(DEFAULT_SYNC_PERIOD); 1793 } 1794 } 1795 return (0); 1796 } 1797 1798 /* 1799 * reset bus, chip, dma, or soft state 1800 */ 1801 static void 1802 fas_internal_reset(struct fas *fas, int reset_action) 1803 { 1804 volatile struct fasreg *fasreg = fas->f_reg; 1805 volatile struct dma *dmar = fas->f_dma; 1806 1807 if (reset_action & FAS_RESET_SCSIBUS) { 1808 fas_reg_cmd_write(fas, CMD_RESET_SCSI); 1809 fas_setup_reset_delay(fas); 1810 } 1811 1812 FAS_FLUSH_DMA_HARD(fas); /* resets and reinits the dma */ 1813 1814 /* 1815 * NOTE: if dma is aborted while active, indefinite hangs 1816 * may occur; it is preferable to stop the target first before 1817 * flushing the dma 1818 */ 1819 if (reset_action & FAS_RESET_DMA) { 1820 int burstsizes = fas->f_dma_attr->dma_attr_burstsizes; 1821 if (burstsizes & BURST64) { 1822 IPRINTF("64 byte burstsize\n"); 1823 fas->f_dma_csr |= DMA_BURST64; 1824 } else if (burstsizes & BURST32) { 1825 IPRINTF("32 byte burstsize\n"); 1826 fas->f_dma_csr |= DMA_BURST32; 1827 } else { 1828 IPRINTF("16 byte burstsize\n"); 1829 } 1830 if ((fas->f_hm_rev > 0x20) && (fas_enable_sbus64) && 1831 (ddi_dma_set_sbus64(fas->f_dmahandle, burstsizes) == 1832 DDI_SUCCESS)) { 1833 IPRINTF("enabled 64 bit sbus\n"); 1834 fas->f_dma_csr |= DMA_WIDE_EN; 1835 } 1836 } 1837 1838 if (reset_action & FAS_RESET_FAS) { 1839 /* 1840 * 2 NOPs with DMA are required here 1841 * id_code is unreliable if we don't do this) 1842 */ 1843 uchar_t idcode, fcode; 1844 int dmarev; 1845 1846 fas_reg_cmd_write(fas, CMD_RESET_FAS); 1847 fas_reg_cmd_write(fas, CMD_NOP | CMD_DMA); 1848 fas_reg_cmd_write(fas, CMD_NOP | CMD_DMA); 1849 1850 /* 1851 * Re-load chip configurations 1852 * Only load registers which are not loaded in fas_startcmd() 1853 */ 1854 fas_reg_write(fas, &fasreg->fas_clock_conv, 1855 (fas->f_clock_conv & CLOCK_MASK)); 1856 1857 fas_reg_write(fas, &fasreg->fas_timeout, fas->f_stval); 1858 1859 /* 1860 * enable default configurations 1861 */ 1862 fas->f_idcode = idcode = 1863 fas_reg_read(fas, &fasreg->fas_id_code); 1864 fcode = (uchar_t)(idcode & FAS_FCODE_MASK) >> (uchar_t)3; 1865 fas->f_type = FAS366; 1866 IPRINTF2("Family code %d, revision %d\n", 1867 fcode, (idcode & FAS_REV_MASK)); 1868 dmarev = fas_dma_reg_read(fas, &dmar->dma_csr); 1869 dmarev = (dmarev >> 11) & 0xf; 1870 IPRINTF1("DMA channel revision %d\n", dmarev); 1871 1872 fas_reg_write(fas, &fasreg->fas_conf, fas->f_fasconf); 1873 fas_reg_write(fas, &fasreg->fas_conf2, fas->f_fasconf2); 1874 1875 fas->f_req_ack_delay = DEFAULT_REQ_ACK_DELAY; 1876 1877 /* 1878 * Just in case... clear interrupt 1879 */ 1880 (void) fas_reg_read(fas, &fasreg->fas_intr); 1881 } 1882 1883 if (reset_action & FAS_RESET_SOFTC) { 1884 fas->f_wdtr_sent = fas->f_sdtr_sent = 0; 1885 fas->f_wide_known = fas->f_sync_known = 0; 1886 fas->f_wide_enabled = fas->f_sync_enabled = 0; 1887 fas->f_omsglen = 0; 1888 fas->f_cur_msgout[0] = fas->f_last_msgout = 1889 fas->f_last_msgin = INVALID_MSG; 1890 fas->f_abort_msg_sent = fas->f_reset_msg_sent = 0; 1891 fas->f_next_slot = 0; 1892 fas->f_current_sp = NULL; 1893 fas->f_fifolen = 0; 1894 fas->f_fasconf3_reg_last = fas->f_offset_reg_last = 1895 fas->f_period_reg_last = 0xff; 1896 1897 New_state(fas, STATE_FREE); 1898 } 1899 } 1900 1901 1902 #ifdef FASDEBUG 1903 /* 1904 * check if ncmds still reflects the truth 1905 * count all cmds for this driver instance and compare with ncmds 1906 */ 1907 static void 1908 fas_check_ncmds(struct fas *fas) 1909 { 1910 int slot = 0; 1911 ushort_t tag, t; 1912 int n, total = 0; 1913 1914 do { 1915 if (fas->f_active[slot]) { 1916 struct fas_cmd *sp = fas->f_readyf[slot]; 1917 t = fas->f_active[slot]->f_n_slots; 1918 while (sp != 0) { 1919 sp = sp->cmd_forw; 1920 total++; 1921 } 1922 for (n = tag = 0; tag < t; tag++) { 1923 if (fas->f_active[slot]->f_slot[tag] != 0) { 1924 n++; 1925 total++; 1926 } 1927 } 1928 ASSERT(n == fas->f_tcmds[slot]); 1929 } 1930 slot = NEXTSLOT(slot, fas->f_dslot); 1931 } while (slot != 0); 1932 1933 if (total != fas->f_ncmds) { 1934 IPRINTF2("fas_check_ncmds: total=%x, ncmds=%x\n", 1935 total, fas->f_ncmds); 1936 } 1937 ASSERT(fas->f_ncmds >= fas->f_ndisc); 1938 } 1939 #else 1940 #define fas_check_ncmds(fas) 1941 #endif 1942 1943 /* 1944 * SCSA Interface functions 1945 * 1946 * Visible to the external world via the transport structure. 1947 * 1948 * fas_scsi_abort: abort a current cmd or all cmds for a target 1949 */ 1950 /*ARGSUSED*/ 1951 static int 1952 fas_scsi_abort(struct scsi_address *ap, struct scsi_pkt *pkt) 1953 { 1954 struct fas *fas = ADDR2FAS(ap); 1955 int rval; 1956 1957 IPRINTF2("fas_scsi_abort: target %d.%d\n", ap->a_target, ap->a_lun); 1958 1959 mutex_enter(FAS_MUTEX(fas)); 1960 rval = fas_do_scsi_abort(ap, pkt); 1961 fas_check_waitQ_and_mutex_exit(fas); 1962 return (rval); 1963 } 1964 1965 /* 1966 * reset handling: reset bus or target 1967 */ 1968 /*ARGSUSED*/ 1969 static int 1970 fas_scsi_reset(struct scsi_address *ap, int level) 1971 { 1972 struct fas *fas = ADDR2FAS(ap); 1973 int rval; 1974 1975 IPRINTF3("fas_scsi_reset: target %d.%d, level %d\n", 1976 ap->a_target, ap->a_lun, level); 1977 1978 mutex_enter(FAS_MUTEX(fas)); 1979 rval = fas_do_scsi_reset(ap, level); 1980 fas_check_waitQ_and_mutex_exit(fas); 1981 return (rval); 1982 } 1983 1984 /* 1985 * entry point for reset notification setup, to register or to cancel. 1986 */ 1987 static int 1988 fas_scsi_reset_notify(struct scsi_address *ap, int flag, 1989 void (*callback)(caddr_t), caddr_t arg) 1990 { 1991 struct fas *fas = ADDR2FAS(ap); 1992 1993 return (scsi_hba_reset_notify_setup(ap, flag, callback, arg, 1994 &fas->f_mutex, &fas->f_reset_notify_listf)); 1995 } 1996 1997 /* 1998 * capability interface 1999 */ 2000 /*ARGSUSED*/ 2001 static int 2002 fas_scsi_getcap(struct scsi_address *ap, char *cap, int whom) 2003 { 2004 struct fas *fas = ADDR2FAS(ap); 2005 DPRINTF3("fas_scsi_getcap: tgt=%x, cap=%s, whom=%x\n", 2006 ap->a_target, cap, whom); 2007 return (fas_commoncap(ap, cap, 0, whom, 0)); 2008 } 2009 2010 /*ARGSUSED*/ 2011 static int 2012 fas_scsi_setcap(struct scsi_address *ap, char *cap, int value, int whom) 2013 { 2014 struct fas *fas = ADDR2FAS(ap); 2015 IPRINTF4("fas_scsi_setcap: tgt=%x, cap=%s, value=%x, whom=%x\n", 2016 ap->a_target, cap, value, whom); 2017 return (fas_commoncap(ap, cap, value, whom, 1)); 2018 } 2019 2020 /* 2021 * pkt and dma allocation and deallocation 2022 */ 2023 /*ARGSUSED*/ 2024 static void 2025 fas_scsi_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt) 2026 { 2027 struct fas_cmd *cmd = PKT2CMD(pkt); 2028 2029 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_DMAFREE_START, 2030 "fas_scsi_dmafree_start"); 2031 2032 if (cmd->cmd_flags & CFLAG_DMAVALID) { 2033 /* 2034 * Free the mapping. 2035 */ 2036 (void) ddi_dma_unbind_handle(cmd->cmd_dmahandle); 2037 cmd->cmd_flags ^= CFLAG_DMAVALID; 2038 } 2039 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_DMAFREE_END, 2040 "fas_scsi_dmafree_end"); 2041 } 2042 2043 /*ARGSUSED*/ 2044 static void 2045 fas_scsi_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt) 2046 { 2047 struct fas_cmd *sp = PKT2CMD(pkt); 2048 2049 if (sp->cmd_flags & CFLAG_DMAVALID) { 2050 if (ddi_dma_sync(sp->cmd_dmahandle, 0, 0, 2051 (sp->cmd_flags & CFLAG_DMASEND) ? 2052 DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU) != 2053 DDI_SUCCESS) { 2054 fas_log(ADDR2FAS(ap), CE_WARN, 2055 "sync of pkt (%p) failed", (void *)pkt); 2056 } 2057 } 2058 } 2059 2060 /* 2061 * initialize pkt and allocate DVMA resources 2062 */ 2063 static struct scsi_pkt * 2064 fas_scsi_init_pkt(struct scsi_address *ap, struct scsi_pkt *pkt, 2065 struct buf *bp, int cmdlen, int statuslen, int tgtlen, 2066 int flags, int (*callback)(), caddr_t arg) 2067 { 2068 int kf; 2069 int failure = 1; 2070 struct fas_cmd *cmd; 2071 struct fas *fas = ADDR2FAS(ap); 2072 struct fas_cmd *new_cmd; 2073 int rval; 2074 2075 /* #define FAS_TEST_EXTRN_ALLOC */ 2076 #ifdef FAS_TEST_EXTRN_ALLOC 2077 cmdlen *= 4; statuslen *= 4; tgtlen *= 4; 2078 #endif 2079 /* 2080 * if no pkt was passed then allocate a pkt first 2081 */ 2082 if (pkt == NULL) { 2083 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_PKTALLOC_START, 2084 "fas_scsi_impl_pktalloc_start"); 2085 2086 kf = (callback == SLEEP_FUNC)? KM_SLEEP: KM_NOSLEEP; 2087 2088 /* 2089 * only one size of pkt (with arq). 2090 */ 2091 cmd = kmem_cache_alloc(fas->f_kmem_cache, kf); 2092 2093 if (cmd) { 2094 2095 ddi_dma_handle_t save_dma_handle; 2096 2097 save_dma_handle = cmd->cmd_dmahandle; 2098 bzero(cmd, EXTCMD_SIZE); 2099 cmd->cmd_dmahandle = save_dma_handle; 2100 2101 pkt = (struct scsi_pkt *)((uchar_t *)cmd + 2102 sizeof (struct fas_cmd)); 2103 cmd->cmd_pkt = pkt; 2104 pkt->pkt_ha_private = (opaque_t)cmd; 2105 pkt->pkt_scbp = (opaque_t)&cmd->cmd_scb; 2106 pkt->pkt_cdbp = (opaque_t)&cmd->cmd_cdb; 2107 pkt->pkt_address = *ap; 2108 2109 pkt->pkt_cdbp = (opaque_t)&cmd->cmd_cdb; 2110 pkt->pkt_private = cmd->cmd_pkt_private; 2111 2112 cmd->cmd_cdblen = cmdlen; 2113 cmd->cmd_scblen = statuslen; 2114 cmd->cmd_privlen = tgtlen; 2115 cmd->cmd_slot = 2116 (Tgt(cmd) * NLUNS_PER_TARGET) | Lun(cmd); 2117 failure = 0; 2118 } 2119 if (failure || (cmdlen > sizeof (cmd->cmd_cdb)) || 2120 (tgtlen > PKT_PRIV_LEN) || 2121 (statuslen > EXTCMDS_STATUS_SIZE)) { 2122 if (failure == 0) { 2123 /* 2124 * if extern alloc fails, all will be 2125 * deallocated, including cmd 2126 */ 2127 failure = fas_pkt_alloc_extern(fas, cmd, 2128 cmdlen, tgtlen, statuslen, kf); 2129 } 2130 if (failure) { 2131 /* 2132 * nothing to deallocate so just return 2133 */ 2134 TRACE_0(TR_FAC_SCSI_FAS, 2135 TR_FAS_SCSI_IMPL_PKTALLOC_END, 2136 "fas_scsi_impl_pktalloc_end"); 2137 return (NULL); 2138 } 2139 } 2140 2141 new_cmd = cmd; 2142 2143 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_PKTALLOC_END, 2144 "fas_scsi_impl_pktalloc_end"); 2145 } else { 2146 cmd = PKT2CMD(pkt); 2147 new_cmd = NULL; 2148 } 2149 2150 /* 2151 * Second step of fas_scsi_init_pkt: 2152 * bind the buf to the handle 2153 */ 2154 if (bp && bp->b_bcount != 0 && 2155 (cmd->cmd_flags & CFLAG_DMAVALID) == 0) { 2156 2157 int cmd_flags, dma_flags; 2158 uint_t dmacookie_count; 2159 2160 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_DMAGET_START, 2161 "fas_scsi_impl_dmaget_start"); 2162 2163 cmd_flags = cmd->cmd_flags; 2164 2165 if (bp->b_flags & B_READ) { 2166 cmd_flags &= ~CFLAG_DMASEND; 2167 dma_flags = DDI_DMA_READ | DDI_DMA_PARTIAL; 2168 } else { 2169 cmd_flags |= CFLAG_DMASEND; 2170 dma_flags = DDI_DMA_WRITE | DDI_DMA_PARTIAL; 2171 } 2172 if (flags & PKT_CONSISTENT) { 2173 cmd_flags |= CFLAG_CMDIOPB; 2174 dma_flags |= DDI_DMA_CONSISTENT; 2175 } 2176 2177 /* 2178 * bind the handle to the buf 2179 */ 2180 ASSERT(cmd->cmd_dmahandle != NULL); 2181 rval = ddi_dma_buf_bind_handle(cmd->cmd_dmahandle, bp, 2182 dma_flags, callback, arg, &cmd->cmd_dmacookie, 2183 &dmacookie_count); 2184 2185 if (rval && rval != DDI_DMA_PARTIAL_MAP) { 2186 switch (rval) { 2187 case DDI_DMA_NORESOURCES: 2188 bioerror(bp, 0); 2189 break; 2190 case DDI_DMA_BADATTR: 2191 case DDI_DMA_NOMAPPING: 2192 bioerror(bp, EFAULT); 2193 break; 2194 case DDI_DMA_TOOBIG: 2195 default: 2196 bioerror(bp, EINVAL); 2197 break; 2198 } 2199 cmd->cmd_flags = cmd_flags & ~CFLAG_DMAVALID; 2200 if (new_cmd) { 2201 fas_scsi_destroy_pkt(ap, pkt); 2202 } 2203 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_DMAGET_END, 2204 "fas_scsi_impl_dmaget_end"); 2205 return ((struct scsi_pkt *)NULL); 2206 } 2207 ASSERT(dmacookie_count == 1); 2208 cmd->cmd_dmacount = bp->b_bcount; 2209 cmd->cmd_flags = cmd_flags | CFLAG_DMAVALID; 2210 2211 ASSERT(cmd->cmd_dmahandle != NULL); 2212 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_DMAGET_END, 2213 "fas_scsi_impl_dmaget_end"); 2214 } 2215 2216 return (pkt); 2217 } 2218 2219 /* 2220 * unbind dma resources and deallocate the pkt 2221 */ 2222 static void 2223 fas_scsi_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt) 2224 { 2225 struct fas_cmd *sp = PKT2CMD(pkt); 2226 struct fas *fas = ADDR2FAS(ap); 2227 2228 /* 2229 * fas_scsi_impl_dmafree inline to speed things up 2230 */ 2231 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_DMAFREE_START, 2232 "fas_scsi_impl_dmafree_start"); 2233 2234 if (sp->cmd_flags & CFLAG_DMAVALID) { 2235 /* 2236 * Free the mapping. 2237 */ 2238 (void) ddi_dma_unbind_handle(sp->cmd_dmahandle); 2239 sp->cmd_flags ^= CFLAG_DMAVALID; 2240 } 2241 2242 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_DMAFREE_END, 2243 "fas_scsi_impl_dmafree_end"); 2244 2245 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_PKTFREE_START, 2246 "fas_scsi_impl_pktfree_start"); 2247 2248 if ((sp->cmd_flags & 2249 (CFLAG_FREE | CFLAG_CDBEXTERN | CFLAG_PRIVEXTERN | 2250 CFLAG_SCBEXTERN)) == 0) { 2251 sp->cmd_flags = CFLAG_FREE; 2252 kmem_cache_free(fas->f_kmem_cache, (void *)sp); 2253 } else { 2254 fas_pkt_destroy_extern(fas, sp); 2255 } 2256 2257 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_SCSI_IMPL_PKTFREE_END, 2258 "fas_scsi_impl_pktfree_end"); 2259 } 2260 2261 /* 2262 * allocate and deallocate external pkt space (ie. not part of fas_cmd) for 2263 * non-standard length cdb, pkt_private, status areas 2264 * if allocation fails, then deallocate all external space and the pkt 2265 */ 2266 /* ARGSUSED */ 2267 static int 2268 fas_pkt_alloc_extern(struct fas *fas, struct fas_cmd *sp, 2269 int cmdlen, int tgtlen, int statuslen, int kf) 2270 { 2271 caddr_t cdbp, scbp, tgt; 2272 int failure = 0; 2273 2274 tgt = cdbp = scbp = NULL; 2275 if (cmdlen > sizeof (sp->cmd_cdb)) { 2276 if ((cdbp = kmem_zalloc((size_t)cmdlen, kf)) == NULL) { 2277 failure++; 2278 } else { 2279 sp->cmd_pkt->pkt_cdbp = (opaque_t)cdbp; 2280 sp->cmd_flags |= CFLAG_CDBEXTERN; 2281 } 2282 } 2283 if (tgtlen > PKT_PRIV_LEN) { 2284 if ((tgt = kmem_zalloc(tgtlen, kf)) == NULL) { 2285 failure++; 2286 } else { 2287 sp->cmd_flags |= CFLAG_PRIVEXTERN; 2288 sp->cmd_pkt->pkt_private = tgt; 2289 } 2290 } 2291 if (statuslen > EXTCMDS_STATUS_SIZE) { 2292 if ((scbp = kmem_zalloc((size_t)statuslen, kf)) == NULL) { 2293 failure++; 2294 } else { 2295 sp->cmd_flags |= CFLAG_SCBEXTERN; 2296 sp->cmd_pkt->pkt_scbp = (opaque_t)scbp; 2297 } 2298 } 2299 if (failure) { 2300 fas_pkt_destroy_extern(fas, sp); 2301 } 2302 return (failure); 2303 } 2304 2305 /* 2306 * deallocate external pkt space and deallocate the pkt 2307 */ 2308 static void 2309 fas_pkt_destroy_extern(struct fas *fas, struct fas_cmd *sp) 2310 { 2311 if (sp->cmd_flags & CFLAG_FREE) { 2312 panic("fas_pkt_destroy_extern: freeing free packet"); 2313 _NOTE(NOT_REACHED) 2314 /* NOTREACHED */ 2315 } 2316 if (sp->cmd_flags & CFLAG_CDBEXTERN) { 2317 kmem_free((caddr_t)sp->cmd_pkt->pkt_cdbp, 2318 (size_t)sp->cmd_cdblen); 2319 } 2320 if (sp->cmd_flags & CFLAG_SCBEXTERN) { 2321 kmem_free((caddr_t)sp->cmd_pkt->pkt_scbp, 2322 (size_t)sp->cmd_scblen); 2323 } 2324 if (sp->cmd_flags & CFLAG_PRIVEXTERN) { 2325 kmem_free((caddr_t)sp->cmd_pkt->pkt_private, 2326 (size_t)sp->cmd_privlen); 2327 } 2328 sp->cmd_flags = CFLAG_FREE; 2329 kmem_cache_free(fas->f_kmem_cache, (void *)sp); 2330 } 2331 2332 /* 2333 * kmem cache constructor and destructor: 2334 * When constructing, we bzero the cmd and allocate the dma handle 2335 * When destructing, just free the dma handle 2336 */ 2337 static int 2338 fas_kmem_cache_constructor(void *buf, void *cdrarg, int kmflags) 2339 { 2340 struct fas_cmd *cmd = buf; 2341 struct fas *fas = cdrarg; 2342 int (*callback)(caddr_t) = (kmflags == KM_SLEEP) ? DDI_DMA_SLEEP: 2343 DDI_DMA_DONTWAIT; 2344 2345 bzero(buf, EXTCMD_SIZE); 2346 2347 /* 2348 * allocate a dma handle 2349 */ 2350 if ((ddi_dma_alloc_handle(fas->f_dev, fas->f_dma_attr, callback, 2351 NULL, &cmd->cmd_dmahandle)) != DDI_SUCCESS) { 2352 return (-1); 2353 } 2354 return (0); 2355 } 2356 2357 /*ARGSUSED*/ 2358 static void 2359 fas_kmem_cache_destructor(void *buf, void *cdrarg) 2360 { 2361 struct fas_cmd *cmd = buf; 2362 if (cmd->cmd_dmahandle) { 2363 ddi_dma_free_handle(&cmd->cmd_dmahandle); 2364 } 2365 } 2366 2367 /* 2368 * fas_scsi_start - Accept commands for transport 2369 */ 2370 static int 2371 fas_scsi_start(struct scsi_address *ap, struct scsi_pkt *pkt) 2372 { 2373 struct fas_cmd *sp = PKT2CMD(pkt); 2374 struct fas *fas = ADDR2FAS(ap); 2375 int rval; 2376 int intr = 0; 2377 2378 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_START_START, "fas_scsi_start_start"); 2379 2380 #ifdef FAS_TEST 2381 if (fas_transport_busy > 0) { 2382 fas_transport_busy--; 2383 return (TRAN_BUSY); 2384 } 2385 if ((fas_transport_busy_rqs > 0) && 2386 (*(sp->cmd_pkt->pkt_cdbp) == SCMD_REQUEST_SENSE)) { 2387 fas_transport_busy_rqs--; 2388 return (TRAN_BUSY); 2389 } 2390 if (fas_transport_reject > 0) { 2391 fas_transport_reject--; 2392 return (TRAN_BADPKT); 2393 } 2394 #endif 2395 /* 2396 * prepare packet before taking the mutex 2397 */ 2398 rval = fas_prepare_pkt(fas, sp); 2399 if (rval != TRAN_ACCEPT) { 2400 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_START_PREPARE_PKT_END, 2401 "fas_scsi_start_end (prepare_pkt)"); 2402 return (rval); 2403 } 2404 2405 /* 2406 * fas mutex can be held for a long time; therefore, if the mutex is 2407 * held, we queue the packet in a waitQ; we now should check 2408 * the waitQ on every mutex_exit(FAS_MUTEX(fas)) but we really only 2409 * need to do this when the bus is free 2410 * don't put NOINTR cmds including proxy cmds in waitQ! These 2411 * cmds are handled by fas_runpoll() 2412 * if the waitQ is non-empty, queue the pkt anyway to preserve 2413 * order 2414 * the goal is to queue in waitQ as much as possible so at 2415 * interrupt time, we can move the packets to readyQ or start 2416 * a packet immediately. It helps to do this at interrupt 2417 * time because we can then field more interrupts 2418 */ 2419 if ((sp->cmd_pkt_flags & FLAG_NOINTR) == 0) { 2420 2421 /* 2422 * if the bus is not free, we will get an interrupt shortly 2423 * so we don't want to take the fas mutex but queue up 2424 * the packet in the waitQ 2425 * also, if the waitQ is non-empty or there is an interrupt 2426 * pending then queue up the packet in the waitQ and let the 2427 * interrupt handler empty the waitQ 2428 */ 2429 mutex_enter(&fas->f_waitQ_mutex); 2430 2431 if ((fas->f_state != STATE_FREE) || 2432 fas->f_waitf || (intr = INTPENDING(fas))) { 2433 goto queue_in_waitQ; 2434 } 2435 2436 /* 2437 * we didn't queue up in the waitQ, so now try to accept 2438 * the packet. if we fail to get the fas mutex, go back to 2439 * the waitQ again 2440 * do not release the waitQ mutex yet because that 2441 * leaves a window where the interrupt handler has 2442 * emptied the waitQ but not released the fas mutex yet 2443 * 2444 * the interrupt handler gets the locks in opposite order 2445 * but because we do a tryenter, there is no deadlock 2446 * 2447 * if another thread has the fas mutex then either this 2448 * thread or the other may find the bus free and 2449 * empty the waitQ 2450 */ 2451 if (mutex_tryenter(FAS_MUTEX(fas))) { 2452 mutex_exit(&fas->f_waitQ_mutex); 2453 rval = fas_accept_pkt(fas, sp, TRAN_BUSY_OK); 2454 } else { 2455 /* 2456 * we didn't get the fas mutex so 2457 * the packet has to go in the waitQ now 2458 */ 2459 goto queue_in_waitQ; 2460 } 2461 } else { 2462 /* 2463 * for polled cmds, we have to take the mutex and 2464 * start the packet using fas_runpoll() 2465 */ 2466 mutex_enter(FAS_MUTEX(fas)); 2467 rval = fas_accept_pkt(fas, sp, TRAN_BUSY_OK); 2468 } 2469 2470 /* 2471 * if the bus is free then empty waitQ and release the mutex 2472 * (this should be unlikely that the bus is still free after 2473 * accepting the packet. it may be the relatively unusual case 2474 * that we are throttling) 2475 */ 2476 if (fas->f_state == STATE_FREE) { 2477 FAS_CHECK_WAITQ_AND_FAS_MUTEX_EXIT(fas); 2478 } else { 2479 mutex_exit(FAS_MUTEX(fas)); 2480 } 2481 2482 done: 2483 TRACE_1(TR_FAC_SCSI_FAS, TR_FAS_START_END, 2484 "fas_scsi_start_end: fas 0x%p", fas); 2485 return (rval); 2486 2487 queue_in_waitQ: 2488 if (fas->f_waitf == NULL) { 2489 fas->f_waitb = fas->f_waitf = sp; 2490 sp->cmd_forw = NULL; 2491 } else { 2492 struct fas_cmd *dp = fas->f_waitb; 2493 dp->cmd_forw = fas->f_waitb = sp; 2494 sp->cmd_forw = NULL; 2495 } 2496 2497 /* 2498 * check again the fas mutex 2499 * if there was an interrupt then the interrupt 2500 * handler will eventually empty the waitQ 2501 */ 2502 if ((intr == 0) && (fas->f_state == STATE_FREE) && 2503 mutex_tryenter(FAS_MUTEX(fas))) { 2504 /* 2505 * double check if the bus is still free 2506 * (this actually reduced mutex contention a bit) 2507 */ 2508 if (fas->f_state == STATE_FREE) { 2509 fas_empty_waitQ(fas); 2510 } 2511 mutex_exit(FAS_MUTEX(fas)); 2512 } 2513 mutex_exit(&fas->f_waitQ_mutex); 2514 2515 TRACE_1(TR_FAC_SCSI_FAS, TR_FAS_START_END, 2516 "fas_scsi_start_end: fas 0x%p", fas); 2517 return (rval); 2518 } 2519 2520 /* 2521 * prepare the pkt: 2522 * the pkt may have been resubmitted or just reused so 2523 * initialize some fields, reset the dma window, and do some checks 2524 */ 2525 static int 2526 fas_prepare_pkt(struct fas *fas, struct fas_cmd *sp) 2527 { 2528 struct scsi_pkt *pkt = CMD2PKT(sp); 2529 2530 /* 2531 * Reinitialize some fields that need it; the packet may 2532 * have been resubmitted 2533 */ 2534 pkt->pkt_reason = CMD_CMPLT; 2535 pkt->pkt_state = 0; 2536 pkt->pkt_statistics = 0; 2537 pkt->pkt_resid = 0; 2538 sp->cmd_age = 0; 2539 sp->cmd_pkt_flags = pkt->pkt_flags; 2540 2541 /* 2542 * Copy the cdb pointer to the pkt wrapper area as we 2543 * might modify this pointer. Zero status byte 2544 */ 2545 sp->cmd_cdbp = pkt->pkt_cdbp; 2546 *(pkt->pkt_scbp) = 0; 2547 2548 if (sp->cmd_flags & CFLAG_DMAVALID) { 2549 pkt->pkt_resid = sp->cmd_dmacount; 2550 2551 /* 2552 * if the pkt was resubmitted then the 2553 * windows may be at the wrong number 2554 */ 2555 if (sp->cmd_cur_win) { 2556 sp->cmd_cur_win = 0; 2557 if (fas_set_new_window(fas, sp)) { 2558 IPRINTF("cannot reset window\n"); 2559 return (TRAN_BADPKT); 2560 } 2561 } 2562 sp->cmd_saved_cur_addr = 2563 sp->cmd_cur_addr = sp->cmd_dmacookie.dmac_address; 2564 2565 /* 2566 * the common case is just one window, we worry 2567 * about multiple windows when we run out of the 2568 * current window 2569 */ 2570 sp->cmd_nwin = sp->cmd_saved_win = 0; 2571 sp->cmd_data_count = sp->cmd_saved_data_count = 0; 2572 2573 /* 2574 * consistent packets need to be sync'ed first 2575 * (only for data going out) 2576 */ 2577 if ((sp->cmd_flags & (CFLAG_CMDIOPB | CFLAG_DMASEND)) == 2578 (CFLAG_CMDIOPB | CFLAG_DMASEND)) { 2579 (void) ddi_dma_sync(sp->cmd_dmahandle, 0, (uint_t)0, 2580 DDI_DMA_SYNC_FORDEV); 2581 } 2582 } 2583 2584 sp->cmd_actual_cdblen = sp->cmd_cdblen; 2585 2586 #ifdef FAS_TEST 2587 #ifndef __lock_lint 2588 if (fas_test_untagged > 0) { 2589 if (TAGGED(Tgt(sp))) { 2590 int slot = sp->cmd_slot; 2591 sp->cmd_pkt_flags &= ~FLAG_TAGMASK; 2592 sp->cmd_pkt_flags &= ~FLAG_NODISCON; 2593 sp->cmd_pkt_flags |= 0x80000000; 2594 fas_log(fas, CE_NOTE, 2595 "starting untagged cmd, target=%d," 2596 " tcmds=%d, sp=0x%p, throttle=%d\n", 2597 Tgt(sp), fas->f_tcmds[slot], (void *)sp, 2598 fas->f_throttle[slot]); 2599 fas_test_untagged = -10; 2600 } 2601 } 2602 #endif 2603 #endif 2604 2605 #ifdef FASDEBUG 2606 if (NOTAG(Tgt(sp)) && (pkt->pkt_flags & FLAG_TAGMASK)) { 2607 IPRINTF2("tagged packet for non-tagged target %d.%d\n", 2608 Tgt(sp), Lun(sp)); 2609 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_PREPARE_PKT_TRAN_BADPKT_END, 2610 "fas_prepare_pkt_end (tran_badpkt)"); 2611 return (TRAN_BADPKT); 2612 } 2613 2614 /* 2615 * the SCSA spec states that it is an error to have no 2616 * completion function when FLAG_NOINTR is not set 2617 */ 2618 if ((pkt->pkt_comp == NULL) && 2619 ((pkt->pkt_flags & FLAG_NOINTR) == 0)) { 2620 IPRINTF("intr packet with pkt_comp == 0\n"); 2621 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_PREPARE_PKT_TRAN_BADPKT_END, 2622 "fas_prepare_pkt_end (tran_badpkt)"); 2623 return (TRAN_BADPKT); 2624 } 2625 #endif /* FASDEBUG */ 2626 2627 if ((fas->f_target_scsi_options[Tgt(sp)] & SCSI_OPTIONS_DR) == 0) { 2628 /* 2629 * no need to reset tag bits since tag queueing will 2630 * not be enabled if disconnects are disabled 2631 */ 2632 sp->cmd_pkt_flags |= FLAG_NODISCON; 2633 } 2634 2635 sp->cmd_flags = (sp->cmd_flags & ~CFLAG_TRANFLAG) | 2636 CFLAG_PREPARED | CFLAG_IN_TRANSPORT; 2637 2638 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_PREPARE_PKT_TRAN_ACCEPT_END, 2639 "fas_prepare_pkt_end (tran_accept)"); 2640 return (TRAN_ACCEPT); 2641 } 2642 2643 /* 2644 * emptying the waitQ just before releasing FAS_MUTEX is a bit 2645 * tricky; if we release the waitQ mutex and then the FAS_MUTEX, 2646 * another thread could queue a cmd in the waitQ, just before 2647 * the FAS_MUTEX is released. This cmd is then stuck in the waitQ unless 2648 * another cmd comes in or fas_intr() or fas_watch() checks the waitQ. 2649 * Therefore, by releasing the FAS_MUTEX before releasing the waitQ mutex, 2650 * we prevent fas_scsi_start() filling the waitQ 2651 * 2652 * By setting NO_TRAN_BUSY, we force fas_accept_pkt() to queue up 2653 * the waitQ pkts in the readyQ. 2654 * If a QFull condition occurs, the target driver may set its throttle 2655 * too high because of the requests queued up in the readyQ but this 2656 * is not a big problem. The throttle should be periodically reset anyway. 2657 */ 2658 static void 2659 fas_empty_waitQ(struct fas *fas) 2660 { 2661 struct fas_cmd *sp; 2662 int rval; 2663 struct fas_cmd *waitf, *waitb; 2664 2665 ASSERT(mutex_owned(&fas->f_waitQ_mutex)); 2666 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_EMPTY_WAITQ_START, 2667 "fas_empty_waitQ_start"); 2668 2669 while (fas->f_waitf) { 2670 2671 /* copy waitQ, zero the waitQ and release the mutex */ 2672 waitf = fas->f_waitf; 2673 waitb = fas->f_waitb; 2674 fas->f_waitf = fas->f_waitb = NULL; 2675 mutex_exit(&fas->f_waitQ_mutex); 2676 2677 do { 2678 sp = waitf; 2679 waitf = sp->cmd_forw; 2680 if (waitb == sp) { 2681 waitb = NULL; 2682 } 2683 2684 rval = fas_accept_pkt(fas, sp, NO_TRAN_BUSY); 2685 2686 /* 2687 * If the packet was rejected for other reasons then 2688 * complete it here 2689 */ 2690 if (rval != TRAN_ACCEPT) { 2691 ASSERT(rval != TRAN_BUSY); 2692 fas_set_pkt_reason(fas, sp, CMD_TRAN_ERR, 0); 2693 if (sp->cmd_pkt->pkt_comp) { 2694 sp->cmd_flags |= CFLAG_FINISHED; 2695 fas_call_pkt_comp(fas, sp); 2696 } 2697 } 2698 2699 if (INTPENDING(fas)) { 2700 /* 2701 * stop processing the waitQ and put back 2702 * the remaining packets on the waitQ 2703 */ 2704 mutex_enter(&fas->f_waitQ_mutex); 2705 if (waitf) { 2706 ASSERT(waitb != NULL); 2707 waitb->cmd_forw = fas->f_waitf; 2708 fas->f_waitf = waitf; 2709 if (fas->f_waitb == NULL) { 2710 fas->f_waitb = waitb; 2711 } 2712 } 2713 return; 2714 } 2715 } while (waitf); 2716 2717 mutex_enter(&fas->f_waitQ_mutex); 2718 } 2719 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_EMPTY_WAITQ_END, 2720 "fas_empty_waitQ_end"); 2721 } 2722 2723 static void 2724 fas_move_waitQ_to_readyQ(struct fas *fas) 2725 { 2726 /* 2727 * this may actually start cmds but it is most likely 2728 * that if waitQ is not empty that the bus is not free 2729 */ 2730 ASSERT(mutex_owned(FAS_MUTEX(fas))); 2731 mutex_enter(&fas->f_waitQ_mutex); 2732 fas_empty_waitQ(fas); 2733 mutex_exit(&fas->f_waitQ_mutex); 2734 } 2735 2736 2737 /* 2738 * function wrapper for two frequently used macros. for the non-critical 2739 * path we use the function 2740 */ 2741 static void 2742 fas_check_waitQ_and_mutex_exit(struct fas *fas) 2743 { 2744 _NOTE(LOCK_RELEASED_AS_SIDE_EFFECT(fas->f_mutex)) 2745 FAS_CHECK_WAITQ_AND_FAS_MUTEX_EXIT(fas); 2746 FAS_EMPTY_CALLBACKQ(fas); 2747 } 2748 2749 /* 2750 * fas_accept_pkt(): 2751 * the flag argument is to force fas_accept_pkt to accept the pkt; 2752 * the caller cannot take the pkt back and it has to be queued up in 2753 * the readyQ 2754 */ 2755 static int 2756 fas_accept_pkt(struct fas *fas, struct fas_cmd *sp, int flag) 2757 { 2758 short slot = sp->cmd_slot; 2759 int rval = TRAN_ACCEPT; 2760 2761 TRACE_0(TR_FAC_SCSI_FAS, TR__FAS_START_START, "fas_accept_pkt_start"); 2762 ASSERT(mutex_owned(FAS_MUTEX(fas))); 2763 ASSERT(fas->f_ncmds >= 0 && fas->f_ndisc >= 0); 2764 ASSERT(fas->f_ncmds >= fas->f_ndisc); 2765 ASSERT(fas->f_tcmds[slot] >= 0); 2766 2767 /* 2768 * prepare packet for transport if this hasn't been done yet and 2769 * do some checks 2770 */ 2771 if ((sp->cmd_flags & CFLAG_PREPARED) == 0) { 2772 rval = fas_prepare_pkt(fas, sp); 2773 if (rval != TRAN_ACCEPT) { 2774 IPRINTF1("prepare pkt failed, slot=%x\n", slot); 2775 sp->cmd_flags &= ~CFLAG_TRANFLAG; 2776 goto done; 2777 } 2778 } 2779 2780 if (Lun(sp)) { 2781 EPRINTF("fas_accept_pkt: switching target and lun slot scan\n"); 2782 fas->f_dslot = 1; 2783 2784 if ((fas->f_active[slot] == NULL) || 2785 ((fas->f_active[slot]->f_n_slots != NTAGS) && 2786 TAGGED(Tgt(sp)))) { 2787 (void) fas_alloc_active_slots(fas, slot, KM_NOSLEEP); 2788 } 2789 if ((fas->f_active[slot] == NULL) || 2790 (NOTAG(Tgt(sp)) && (sp->cmd_pkt_flags & FLAG_TAGMASK))) { 2791 IPRINTF("fatal error on non-zero lun pkt\n"); 2792 return (TRAN_FATAL_ERROR); 2793 } 2794 } 2795 2796 /* 2797 * we accepted the command; increment the count 2798 * (we may still reject later if TRAN_BUSY_OK) 2799 */ 2800 fas_check_ncmds(fas); 2801 fas->f_ncmds++; 2802 2803 /* 2804 * if it is a nointr packet, start it now 2805 * (NO_INTR pkts are not queued in the waitQ) 2806 */ 2807 if (sp->cmd_pkt_flags & FLAG_NOINTR) { 2808 EPRINTF("starting a nointr cmd\n"); 2809 fas_runpoll(fas, slot, sp); 2810 sp->cmd_flags &= ~CFLAG_TRANFLAG; 2811 goto done; 2812 } 2813 2814 /* 2815 * reset the throttle if we were draining 2816 */ 2817 if ((fas->f_tcmds[slot] == 0) && 2818 (fas->f_throttle[slot] == DRAIN_THROTTLE)) { 2819 DPRINTF("reset throttle\n"); 2820 ASSERT(fas->f_reset_delay[Tgt(sp)] == 0); 2821 fas_full_throttle(fas, slot); 2822 } 2823 2824 /* 2825 * accept the command: 2826 * If no readyQ and no bus free, and throttle is OK, 2827 * run cmd immediately. 2828 */ 2829 #ifdef FASDEBUG 2830 fas->f_total_cmds++; 2831 #endif 2832 2833 if ((fas->f_readyf[slot] == NULL) && (fas->f_state == STATE_FREE) && 2834 (fas->f_throttle[slot] > fas->f_tcmds[slot])) { 2835 ASSERT(fas->f_current_sp == 0); 2836 (void) fas_startcmd(fas, sp); 2837 goto exit; 2838 } else { 2839 /* 2840 * If FLAG_HEAD is set, run cmd if target and bus are 2841 * available. if first cmd in ready Q is request sense 2842 * then insert after this command, there shouldn't be more 2843 * than one request sense. 2844 */ 2845 if (sp->cmd_pkt_flags & FLAG_HEAD) { 2846 struct fas_cmd *ssp = fas->f_readyf[slot]; 2847 EPRINTF("que head\n"); 2848 if (ssp && 2849 *(ssp->cmd_pkt->pkt_cdbp) != SCMD_REQUEST_SENSE) { 2850 fas_head_of_readyQ(fas, sp); 2851 } else if (ssp) { 2852 struct fas_cmd *dp = ssp->cmd_forw; 2853 ssp->cmd_forw = sp; 2854 sp->cmd_forw = dp; 2855 if (fas->f_readyb[slot] == ssp) { 2856 fas->f_readyb[slot] = sp; 2857 } 2858 } else { 2859 fas->f_readyf[slot] = fas->f_readyb[slot] = sp; 2860 sp->cmd_forw = NULL; 2861 } 2862 2863 /* 2864 * for tagged targets, check for qfull condition and 2865 * return TRAN_BUSY (if permitted), if throttle has been 2866 * exceeded 2867 */ 2868 } else if (TAGGED(Tgt(sp)) && 2869 (fas->f_tcmds[slot] >= fas->f_throttle[slot]) && 2870 (fas->f_throttle[slot] > HOLD_THROTTLE) && 2871 (flag == TRAN_BUSY_OK)) { 2872 IPRINTF2( 2873 "transport busy, slot=%x, ncmds=%x\n", 2874 slot, fas->f_ncmds); 2875 rval = TRAN_BUSY; 2876 fas->f_ncmds--; 2877 sp->cmd_flags &= 2878 ~(CFLAG_PREPARED | CFLAG_IN_TRANSPORT); 2879 goto done; 2880 /* 2881 * append to readyQ or start a new readyQ 2882 */ 2883 } else if (fas->f_readyf[slot]) { 2884 struct fas_cmd *dp = fas->f_readyb[slot]; 2885 ASSERT(dp != 0); 2886 fas->f_readyb[slot] = sp; 2887 sp->cmd_forw = NULL; 2888 dp->cmd_forw = sp; 2889 } else { 2890 fas->f_readyf[slot] = fas->f_readyb[slot] = sp; 2891 sp->cmd_forw = NULL; 2892 } 2893 2894 } 2895 2896 done: 2897 /* 2898 * just in case that the bus is free and we haven't 2899 * been able to restart for some reason 2900 */ 2901 if (fas->f_state == STATE_FREE) { 2902 (void) fas_istart(fas); 2903 } 2904 2905 exit: 2906 fas_check_ncmds(fas); 2907 ASSERT(mutex_owned(FAS_MUTEX(fas))); 2908 TRACE_0(TR_FAC_SCSI_FAS, TR__FAS_START_END, "fas_accept_pkt_end"); 2909 return (rval); 2910 } 2911 2912 /* 2913 * allocate a tag byte and check for tag aging 2914 */ 2915 static char fas_tag_lookup[] = 2916 {0, MSG_HEAD_QTAG, MSG_ORDERED_QTAG, 0, MSG_SIMPLE_QTAG}; 2917 2918 static int 2919 fas_alloc_tag(struct fas *fas, struct fas_cmd *sp) 2920 { 2921 struct f_slots *tag_slots; 2922 int tag; 2923 short slot = sp->cmd_slot; 2924 2925 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_ALLOC_TAG_START, "fas_alloc_tag_start"); 2926 ASSERT(mutex_owned(FAS_MUTEX(fas))); 2927 2928 tag_slots = fas->f_active[slot]; 2929 ASSERT(tag_slots->f_n_slots == NTAGS); 2930 2931 alloc_tag: 2932 tag = (fas->f_active[slot]->f_tags)++; 2933 if (fas->f_active[slot]->f_tags >= NTAGS) { 2934 /* 2935 * we reserve tag 0 for non-tagged cmds 2936 */ 2937 fas->f_active[slot]->f_tags = 1; 2938 } 2939 EPRINTF1("tagged cmd, tag = %d\n", tag); 2940 2941 /* Validate tag, should never fail. */ 2942 if (tag_slots->f_slot[tag] == 0) { 2943 /* 2944 * Store assigned tag and tag queue type. 2945 * Note, in case of multiple choice, default to simple queue. 2946 */ 2947 ASSERT(tag < NTAGS); 2948 sp->cmd_tag[1] = (uchar_t)tag; 2949 sp->cmd_tag[0] = fas_tag_lookup[((sp->cmd_pkt_flags & 2950 FLAG_TAGMASK) >> 12)]; 2951 EPRINTF1("tag= %d\n", tag); 2952 tag_slots->f_slot[tag] = sp; 2953 (fas->f_tcmds[slot])++; 2954 ASSERT(mutex_owned(FAS_MUTEX(fas))); 2955 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_ALLOC_TAG_END, 2956 "fas_alloc_tag_end"); 2957 return (0); 2958 2959 } else { 2960 int age, i; 2961 2962 /* 2963 * Check tag age. If timeouts enabled and 2964 * tag age greater than 1, print warning msg. 2965 * If timeouts enabled and tag age greater than 2966 * age limit, begin draining tag que to check for 2967 * lost tag cmd. 2968 */ 2969 age = tag_slots->f_slot[tag]->cmd_age++; 2970 if (age >= fas->f_scsi_tag_age_limit && 2971 tag_slots->f_slot[tag]->cmd_pkt->pkt_time) { 2972 IPRINTF2("tag %d in use, age= %d\n", tag, age); 2973 DPRINTF("draining tag queue\n"); 2974 if (fas->f_reset_delay[Tgt(sp)] == 0) { 2975 fas->f_throttle[slot] = DRAIN_THROTTLE; 2976 } 2977 } 2978 2979 /* If tag in use, scan until a free one is found. */ 2980 for (i = 1; i < NTAGS; i++) { 2981 tag = fas->f_active[slot]->f_tags; 2982 if (!tag_slots->f_slot[tag]) { 2983 EPRINTF1("found free tag %d\n", tag); 2984 break; 2985 } 2986 if (++(fas->f_active[slot]->f_tags) >= NTAGS) { 2987 /* 2988 * we reserve tag 0 for non-tagged cmds 2989 */ 2990 fas->f_active[slot]->f_tags = 1; 2991 } 2992 EPRINTF1("found in use tag %d\n", tag); 2993 } 2994 2995 /* 2996 * If no free tags, we're in serious trouble. 2997 * the target driver submitted more than 255 2998 * requests 2999 */ 3000 if (tag_slots->f_slot[tag]) { 3001 IPRINTF1("slot %x: All tags in use!!!\n", slot); 3002 goto fail; 3003 } 3004 goto alloc_tag; 3005 } 3006 3007 fail: 3008 fas_head_of_readyQ(fas, sp); 3009 3010 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_ALLOC_TAG_END, 3011 "fas_alloc_tag_end"); 3012 return (-1); 3013 } 3014 3015 /* 3016 * Internal Search Routine. 3017 * 3018 * Search for a command to start. 3019 */ 3020 static int 3021 fas_istart(struct fas *fas) 3022 { 3023 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_ISTART_START, 3024 "fas_istart_start"); 3025 EPRINTF("fas_istart:\n"); 3026 3027 if (fas->f_state == STATE_FREE && fas->f_ncmds > fas->f_ndisc) { 3028 (void) fas_ustart(fas); 3029 } 3030 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_ISTART_END, 3031 "fas_istart_end"); 3032 return (ACTION_RETURN); 3033 } 3034 3035 static int 3036 fas_ustart(struct fas *fas) 3037 { 3038 struct fas_cmd *sp; 3039 short slot = fas->f_next_slot; 3040 short start_slot = slot; 3041 short dslot = fas->f_dslot; 3042 3043 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_USTART_START, "fas_ustart_start"); 3044 EPRINTF1("fas_ustart: start_slot=%x\n", fas->f_next_slot); 3045 ASSERT(fas->f_current_sp == NULL); 3046 ASSERT(dslot != 0); 3047 if (dslot == NLUNS_PER_TARGET) { 3048 ASSERT((slot % NLUNS_PER_TARGET) == 0); 3049 } 3050 3051 /* 3052 * if readyQ not empty and we are not draining, then we 3053 * can start another cmd 3054 */ 3055 do { 3056 /* 3057 * If all cmds drained from tag Q, back to full throttle and 3058 * start queueing up new cmds again. 3059 */ 3060 if (fas->f_throttle[slot] == DRAIN_THROTTLE && 3061 fas->f_tcmds[slot] == 0) { 3062 fas_full_throttle(fas, slot); 3063 } 3064 3065 if (fas->f_readyf[slot] && 3066 (fas->f_throttle[slot] > fas->f_tcmds[slot])) { 3067 sp = fas->f_readyf[slot]; 3068 fas->f_readyf[slot] = sp->cmd_forw; 3069 if (sp->cmd_forw == NULL) { 3070 fas->f_readyb[slot] = NULL; 3071 } 3072 fas->f_next_slot = NEXTSLOT(slot, dslot); 3073 ASSERT((sp->cmd_pkt_flags & FLAG_NOINTR) == 0); 3074 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_USTART_END, 3075 "fas_ustart_end"); 3076 return (fas_startcmd(fas, sp)); 3077 } else { 3078 slot = NEXTSLOT(slot, dslot); 3079 } 3080 } while (slot != start_slot); 3081 3082 EPRINTF("fas_ustart: no cmds to start\n"); 3083 fas->f_next_slot = NEXTSLOT(slot, dslot); 3084 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_USTART_NOT_FOUND_END, 3085 "fas_ustart_end (not_found)"); 3086 return (FALSE); 3087 } 3088 3089 /* 3090 * Start a command off 3091 */ 3092 static int 3093 fas_startcmd(struct fas *fas, struct fas_cmd *sp) 3094 { 3095 volatile struct fasreg *fasreg = fas->f_reg; 3096 ushort_t nstate; 3097 uchar_t cmd, target, lun; 3098 ushort_t tshift; 3099 volatile uchar_t *tp = fas->f_cmdarea; 3100 struct scsi_pkt *pkt = CMD2PKT(sp); 3101 int slot = sp->cmd_slot; 3102 struct f_slots *slots = fas->f_active[slot]; 3103 int i, cdb_len; 3104 3105 #define LOAD_CMDP *(tp++) 3106 3107 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_STARTCMD_START, "fas_startcmd_start"); 3108 3109 EPRINTF2("fas_startcmd: sp=0x%p flags=%x\n", 3110 (void *)sp, sp->cmd_pkt_flags); 3111 ASSERT((sp->cmd_flags & CFLAG_FREE) == 0); 3112 ASSERT((sp->cmd_flags & CFLAG_COMPLETED) == 0); 3113 ASSERT(fas->f_current_sp == NULL && fas->f_state == STATE_FREE); 3114 if ((sp->cmd_pkt_flags & FLAG_NOINTR) == 0) { 3115 ASSERT(fas->f_throttle[slot] > 0); 3116 ASSERT(fas->f_reset_delay[Tgt(sp)] == 0); 3117 } 3118 3119 target = Tgt(sp); 3120 lun = Lun(sp); 3121 3122 /* 3123 * if a non-tagged cmd is submitted to an active tagged target 3124 * then drain before submitting this cmd; SCSI-2 allows RQSENSE 3125 * to be untagged 3126 */ 3127 if (((sp->cmd_pkt_flags & FLAG_TAGMASK) == 0) && 3128 TAGGED(target) && fas->f_tcmds[slot] && 3129 ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) && 3130 (*(sp->cmd_pkt->pkt_cdbp) != SCMD_REQUEST_SENSE)) { 3131 if ((sp->cmd_pkt_flags & FLAG_NOINTR) == 0) { 3132 struct fas_cmd *dp; 3133 3134 IPRINTF("untagged cmd, start draining\n"); 3135 3136 if (fas->f_reset_delay[Tgt(sp)] == 0) { 3137 fas->f_throttle[slot] = DRAIN_THROTTLE; 3138 } 3139 dp = fas->f_readyf[slot]; 3140 fas->f_readyf[slot] = sp; 3141 sp->cmd_forw = dp; 3142 if (fas->f_readyb[slot] == NULL) { 3143 fas->f_readyb[slot] = sp; 3144 } 3145 } 3146 return (FALSE); 3147 } 3148 3149 /* 3150 * allocate a tag; if no tag available then put request back 3151 * on the ready queue and return; eventually a cmd returns and we 3152 * get going again or we timeout 3153 */ 3154 if (TAGGED(target) && (sp->cmd_pkt_flags & FLAG_TAGMASK)) { 3155 if (fas_alloc_tag(fas, sp)) { 3156 return (FALSE); 3157 } 3158 } else { 3159 /* 3160 * tag slot 0 is reserved for non-tagged cmds 3161 * and should be empty because we have drained 3162 */ 3163 if ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) { 3164 ASSERT(fas->f_active[slot]->f_slot[0] == NULL); 3165 fas->f_active[slot]->f_slot[0] = sp; 3166 sp->cmd_tag[1] = 0; 3167 if (*(sp->cmd_pkt->pkt_cdbp) != SCMD_REQUEST_SENSE) { 3168 ASSERT(fas->f_tcmds[slot] == 0); 3169 /* 3170 * don't start any other cmd until this 3171 * one is finished. The throttle is reset 3172 * later in fas_watch() 3173 */ 3174 fas->f_throttle[slot] = 1; 3175 } 3176 (fas->f_tcmds[slot])++; 3177 3178 } 3179 } 3180 3181 fas->f_current_sp = sp; 3182 fas->f_omsglen = 0; 3183 tshift = 1<<target; 3184 fas->f_sdtr_sent = fas->f_wdtr_sent = 0; 3185 cdb_len = sp->cmd_actual_cdblen; 3186 3187 if (sp->cmd_pkt_flags & FLAG_RENEGOTIATE_WIDE_SYNC) { 3188 fas_force_renegotiation(fas, Tgt(sp)); 3189 } 3190 3191 /* 3192 * first send identify message, with or without disconnect priv. 3193 */ 3194 if (sp->cmd_pkt_flags & FLAG_NODISCON) { 3195 LOAD_CMDP = fas->f_last_msgout = MSG_IDENTIFY | lun; 3196 ASSERT((sp->cmd_pkt_flags & FLAG_TAGMASK) == 0); 3197 } else { 3198 LOAD_CMDP = fas->f_last_msgout = MSG_DR_IDENTIFY | lun; 3199 } 3200 3201 /* 3202 * normal case, tagQ and we have negotiated wide and sync 3203 * or we don't need to renegotiate because wide and sync 3204 * have been disabled 3205 * (proxy msg's don't have tag flag set) 3206 */ 3207 if ((sp->cmd_pkt_flags & FLAG_TAGMASK) && 3208 ((fas->f_wide_known | fas->f_nowide) & 3209 (fas->f_sync_known | fas->f_nosync) & tshift)) { 3210 3211 EPRINTF("tag cmd\n"); 3212 ASSERT((sp->cmd_pkt_flags & FLAG_NODISCON) == 0); 3213 3214 fas->f_last_msgout = LOAD_CMDP = sp->cmd_tag[0]; 3215 LOAD_CMDP = sp->cmd_tag[1]; 3216 3217 nstate = STATE_SELECT_NORMAL; 3218 cmd = CMD_SEL_ATN3 | CMD_DMA; 3219 3220 /* 3221 * is this a proxy message 3222 */ 3223 } else if (sp->cmd_flags & CFLAG_CMDPROXY) { 3224 3225 IPRINTF2("proxy cmd, len=%x, msg=%x\n", 3226 sp->cmd_cdb[FAS_PROXY_DATA], 3227 sp->cmd_cdb[FAS_PROXY_DATA+1]); 3228 /* 3229 * This is a proxy command. It will have 3230 * a message to send as part of post-selection 3231 * (e.g, MSG_ABORT or MSG_DEVICE_RESET) 3232 */ 3233 fas->f_omsglen = sp->cmd_cdb[FAS_PROXY_DATA]; 3234 for (i = 0; i < (uint_t)fas->f_omsglen; i++) { 3235 fas->f_cur_msgout[i] = 3236 sp->cmd_cdb[FAS_PROXY_DATA+1+i]; 3237 } 3238 sp->cmd_cdb[FAS_PROXY_RESULT] = FALSE; 3239 cdb_len = 0; 3240 cmd = CMD_SEL_STOP | CMD_DMA; 3241 nstate = STATE_SELECT_N_SENDMSG; 3242 3243 /* 3244 * always negotiate wide first and sync after wide 3245 */ 3246 } else if (((fas->f_wide_known | fas->f_nowide) & tshift) == 0) { 3247 int i = 0; 3248 3249 /* First the tag message bytes */ 3250 if (sp->cmd_pkt_flags & FLAG_TAGMASK) { 3251 fas->f_cur_msgout[i++] = sp->cmd_tag[0]; 3252 fas->f_cur_msgout[i++] = sp->cmd_tag[1]; 3253 } 3254 3255 /* 3256 * Set up to send wide negotiating message. This is getting 3257 * a bit tricky as we dma out the identify message and 3258 * send the other messages via the fifo buffer. 3259 */ 3260 EPRINTF1("cmd with wdtr msg, tag=%x\n", sp->cmd_tag[1]); 3261 3262 fas_make_wdtr(fas, i, target, FAS_XFER_WIDTH); 3263 3264 cdb_len = 0; 3265 nstate = STATE_SELECT_N_SENDMSG; 3266 cmd = CMD_SEL_STOP | CMD_DMA; 3267 3268 /* 3269 * negotiate sync xfer rate 3270 */ 3271 } else if (((fas->f_sync_known | fas->f_nosync) & tshift) == 0) { 3272 int i = 0; 3273 /* 3274 * Set up to send sync negotiating message. This is getting 3275 * a bit tricky as we dma out the identify message and 3276 * send the other messages via the fifo buffer. 3277 */ 3278 if (sp->cmd_pkt_flags & FLAG_TAGMASK) { 3279 fas->f_cur_msgout[i++] = sp->cmd_tag[0]; 3280 fas->f_cur_msgout[i++] = sp->cmd_tag[1]; 3281 } 3282 3283 fas_make_sdtr(fas, i, target); 3284 3285 cdb_len = 0; 3286 cmd = CMD_SEL_STOP | CMD_DMA; 3287 nstate = STATE_SELECT_N_SENDMSG; 3288 3289 /* 3290 * normal cmds, no negotiations and not a proxy and no TQ 3291 */ 3292 } else { 3293 3294 ASSERT((sp->cmd_pkt_flags & FLAG_TAGMASK) == 0); 3295 EPRINTF("std. cmd\n"); 3296 3297 nstate = STATE_SELECT_NORMAL; 3298 cmd = CMD_SEL_ATN | CMD_DMA; 3299 } 3300 3301 /* 3302 * Now load cdb (if any) 3303 */ 3304 for (i = 0; i < cdb_len; i++) { 3305 LOAD_CMDP = sp->cmd_cdbp[i]; 3306 } 3307 3308 /* 3309 * calculate total dma amount: 3310 */ 3311 fas->f_lastcount = (uintptr_t)tp - (uintptr_t)fas->f_cmdarea; 3312 3313 /* 3314 * load target id and enable bus id encoding and 32 bit counter 3315 */ 3316 fas_reg_write(fas, (uchar_t *)&fasreg->fas_busid, 3317 (target & 0xf) | FAS_BUSID_ENCODID | FAS_BUSID_32BIT_COUNTER); 3318 3319 FAS_SET_PERIOD_OFFSET_CONF3_REGS(fas, target); 3320 3321 fas_reg_cmd_write(fas, CMD_FLUSH); 3322 3323 FAS_DMA_READ(fas, fas->f_lastcount, 3324 fas->f_dmacookie.dmac_address, 16, cmd); 3325 3326 New_state(fas, (int)nstate); 3327 3328 #ifdef FASDEBUG 3329 if (DDEBUGGING) { 3330 fas_dump_cmd(fas, sp); 3331 } 3332 #endif /* FASDEBUG */ 3333 3334 /* 3335 * if timeout == 0, then it has no effect on the timeout 3336 * handling; we deal with this when an actual timeout occurs. 3337 */ 3338 if ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) { 3339 ASSERT(fas->f_tcmds[slot] >= 1); 3340 } 3341 i = pkt->pkt_time - slots->f_timebase; 3342 3343 if (i == 0) { 3344 EPRINTF("dup timeout\n"); 3345 (slots->f_dups)++; 3346 slots->f_timeout = slots->f_timebase; 3347 } else if (i > 0) { 3348 EPRINTF("new timeout\n"); 3349 slots->f_timeout = slots->f_timebase = pkt->pkt_time; 3350 slots->f_dups = 1; 3351 } 3352 3353 fas_check_ncmds(fas); 3354 3355 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_STARTCMD_END, "fas_startcmd_end"); 3356 3357 return (TRUE); 3358 } 3359 3360 /* 3361 * Interrupt Entry Point. 3362 * Poll interrupts until they go away 3363 */ 3364 static uint_t 3365 fas_intr(caddr_t arg) 3366 { 3367 struct fas *fas = (struct fas *)arg; 3368 int rval = DDI_INTR_UNCLAIMED; 3369 int kstat_updated = 0; 3370 3371 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_POLL_START, "fas_intr_start"); 3372 3373 do { 3374 mutex_enter(FAS_MUTEX(fas)); 3375 3376 do { 3377 if (fas_intr_svc(fas)) { 3378 /* 3379 * do not return immediately here because 3380 * we have to guarantee to always empty 3381 * the waitQ and callbackQ in the interrupt 3382 * handler 3383 */ 3384 if (fas->f_polled_intr) { 3385 rval = DDI_INTR_CLAIMED; 3386 fas->f_polled_intr = 0; 3387 } 3388 } else { 3389 rval = DDI_INTR_CLAIMED; 3390 } 3391 } while (INTPENDING(fas)); 3392 3393 if (!kstat_updated && fas->f_intr_kstat && 3394 rval == DDI_INTR_CLAIMED) { 3395 FAS_KSTAT_INTR(fas); 3396 kstat_updated++; 3397 } 3398 3399 /* 3400 * check and empty the waitQ and the callbackQ 3401 */ 3402 FAS_CHECK_WAITQ_AND_FAS_MUTEX_EXIT(fas); 3403 FAS_EMPTY_CALLBACKQ(fas); 3404 3405 } while (INTPENDING(fas)); 3406 3407 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_POLL_END, "fas_intr_end"); 3408 3409 return (rval); 3410 } 3411 3412 /* 3413 * General interrupt service routine. 3414 */ 3415 static char *dma_bits = DMA_BITS; 3416 3417 static int 3418 fas_intr_svc(struct fas *fas) 3419 { 3420 static int (*evec[])(struct fas *fas) = { 3421 fas_finish_select, 3422 fas_reconnect, 3423 fas_phasemanage, 3424 fas_finish, 3425 fas_reset_recovery, 3426 fas_istart, 3427 fas_abort_curcmd, 3428 fas_reset_bus, 3429 fas_reset_bus, 3430 fas_handle_selection 3431 }; 3432 int action; 3433 uchar_t intr, stat; 3434 volatile struct fasreg *fasreg = fas->f_reg; 3435 int i = 0; 3436 3437 TRACE_0(TR_FAC_SCSI_FAS, TR_FASSVC_START, "fas_intr_svc_start"); 3438 3439 /* 3440 * A read of FAS interrupt register clears interrupt, 3441 * so any other volatile information needs to be latched 3442 * up prior to reading the interrupt register. 3443 */ 3444 fas->f_stat = fas_reg_read(fas, &fasreg->fas_stat); 3445 3446 EPRINTF2("fas_intr_svc: state=%x stat=%x\n", fas->f_state, 3447 fas->f_stat); 3448 3449 /* 3450 * this wasn't our interrupt? 3451 */ 3452 if ((fas->f_stat & FAS_STAT_IPEND) == 0) { 3453 if (fas_check_dma_error(fas)) { 3454 action = ACTION_RESET; 3455 goto start_action; 3456 } 3457 return (-1); 3458 } 3459 3460 /* 3461 * if we are reset state, handle this first 3462 */ 3463 if (fas->f_state == ACTS_RESET) { 3464 action = ACTION_FINRST; 3465 goto start_action; 3466 } 3467 3468 /* 3469 * check for gross error. fas366 hardware seems to register 3470 * the gross error bit when a parity error is found. Make sure 3471 * to ignore the gross error bit when a parity error is detected. 3472 */ 3473 if ((fas->f_stat & FAS_STAT_GERR) && 3474 (fas->f_stat & FAS_STAT_PERR) == 0) { 3475 action = fas_handle_gross_err(fas); 3476 goto start_action; 3477 } 3478 3479 /* 3480 * now it is finally safe to read the interrupt register 3481 * if we haven't done so yet 3482 * Note: we don't read step register here but only in 3483 * fas_finish_select(). It is not entirely safe but saves 3484 * redundant PIOs or extra code in this critical path 3485 */ 3486 fas->f_intr = 3487 intr = fas_reg_read(fas, (uchar_t *)&fasreg->fas_intr); 3488 3489 /* 3490 * read the fifo if there is something there or still in the 3491 * input shuttle 3492 */ 3493 stat = fas->f_stat & FAS_PHASE_MASK; 3494 3495 if ((intr & FAS_INT_RESEL) || 3496 ((stat != FAS_PHASE_DATA_IN) && (stat != FAS_PHASE_DATA_OUT) && 3497 ((fas->f_state & STATE_SELECTING) == 0) && 3498 (fas->f_state != ACTS_DATA_DONE) && 3499 (fas->f_state != ACTS_C_CMPLT))) { 3500 3501 fas->f_stat2 = fas_reg_read(fas, &fasreg->fas_stat2); 3502 3503 if (((fas->f_stat2 & FAS_STAT2_EMPTY) == 0) || 3504 (fas->f_stat2 & FAS_STAT2_ISHUTTLE)) { 3505 fas_read_fifo(fas); 3506 } 3507 } 3508 3509 EPRINTF2("fas_intr_svc: intr=%x, stat=%x\n", fas->f_intr, fas->f_stat); 3510 EPRINTF2("dmacsr=%b\n", fas->f_dma->dma_csr, dma_bits); 3511 3512 /* 3513 * Based upon the current state of the host adapter driver 3514 * we should be able to figure out what to do with an interrupt. 3515 * 3516 * The FAS asserts an interrupt with one or more of 8 possible 3517 * bits set in its interrupt register. These conditions are 3518 * SCSI bus reset detected, an illegal command fed to the FAS, 3519 * one of DISCONNECT, BUS SERVICE, FUNCTION COMPLETE conditions 3520 * for the FAS, a Reselection interrupt, or one of Selection 3521 * or Selection with Attention. 3522 * 3523 * Of these possible interrupts, we can deal with some right 3524 * here and now, irrespective of the current state of the driver. 3525 * 3526 * take care of the most likely interrupts first and call the action 3527 * immediately 3528 */ 3529 if ((intr & (FAS_INT_RESET|FAS_INT_ILLEGAL|FAS_INT_SEL|FAS_INT_SELATN| 3530 FAS_INT_RESEL)) == 0) { 3531 /* 3532 * The rest of the reasons for an interrupt can 3533 * be handled based purely on the state that the driver 3534 * is currently in now. 3535 */ 3536 if (fas->f_state & STATE_SELECTING) { 3537 action = fas_finish_select(fas); 3538 3539 } else if (fas->f_state & STATE_ITPHASES) { 3540 action = fas_phasemanage(fas); 3541 3542 } else { 3543 fas_log(fas, CE_WARN, "spurious interrupt"); 3544 action = ACTION_RETURN; 3545 } 3546 3547 } else if ((intr & FAS_INT_RESEL) && ((intr & 3548 (FAS_INT_RESET|FAS_INT_ILLEGAL|FAS_INT_SEL|FAS_INT_SELATN)) == 0)) { 3549 3550 if ((fas->f_state & STATE_SELECTING) == 0) { 3551 ASSERT(fas->f_state == STATE_FREE); 3552 action = fas_reconnect(fas); 3553 } else { 3554 action = fas_reselect_preempt(fas); 3555 } 3556 3557 } else if (intr & (FAS_INT_RESET | FAS_INT_ILLEGAL)) { 3558 action = fas_illegal_cmd_or_bus_reset(fas); 3559 3560 } else if (intr & (FAS_INT_SEL|FAS_INT_SELATN)) { 3561 action = ACTION_SELECT; 3562 } 3563 3564 start_action: 3565 while (action != ACTION_RETURN) { 3566 ASSERT((action >= 0) && (action <= ACTION_SELECT)); 3567 TRACE_3(TR_FAC_SCSI_FAS, TR_FASSVC_ACTION_CALL, 3568 "fas_intr_svc call: fas 0x%p, action %d (%d)", 3569 fas, action, i); 3570 i++; 3571 action = (*evec[action])(fas); 3572 } 3573 exit: 3574 TRACE_0(TR_FAC_SCSI_FAS, TR_FASSVC_END, "fas_intr_svc_end"); 3575 3576 return (0); 3577 } 3578 3579 /* 3580 * Manage phase transitions. 3581 */ 3582 static int 3583 fas_phasemanage(struct fas *fas) 3584 { 3585 ushort_t state; 3586 int action; 3587 static int (*pvecs[])(struct fas *fas) = { 3588 fas_handle_cmd_start, 3589 fas_handle_cmd_done, 3590 fas_handle_msg_out_start, 3591 fas_handle_msg_out_done, 3592 fas_handle_msg_in_start, 3593 fas_handle_more_msgin, 3594 fas_handle_msg_in_done, 3595 fas_handle_clearing, 3596 fas_handle_data_start, 3597 fas_handle_data_done, 3598 fas_handle_c_cmplt, 3599 fas_reconnect, 3600 fas_handle_unknown, 3601 fas_reset_recovery 3602 }; 3603 int i = 0; 3604 3605 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_PHASEMANAGE_START, 3606 "fas_phasemanage_start"); 3607 3608 do { 3609 EPRINTF1("fas_phasemanage: %s\n", 3610 fas_state_name(fas->f_state & STATE_ITPHASES)); 3611 3612 TRACE_2(TR_FAC_SCSI_FAS, TR_FAS_PHASEMANAGE_CALL, 3613 "fas_phasemanage_call: fas 0x%p (%d)", fas, i++); 3614 3615 state = fas->f_state; 3616 3617 if (!(state == STATE_FREE || state > ACTS_ENDVEC)) { 3618 ASSERT(pvecs[state-1] != NULL); 3619 action = (*pvecs[state-1]) (fas); 3620 } else { 3621 fas_log(fas, CE_WARN, "lost state in phasemanage"); 3622 action = ACTION_ABORT_ALLCMDS; 3623 } 3624 3625 } while (action == ACTION_PHASEMANAGE); 3626 3627 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_PHASEMANAGE_END, 3628 "fas_phasemanage_end"); 3629 return (action); 3630 } 3631 3632 /* 3633 * remove a cmd from active list and if timeout flag is set, then 3634 * adjust timeouts; if a the same cmd will be resubmitted soon, don't 3635 * bother to adjust timeouts (ie. don't set this flag) 3636 */ 3637 static void 3638 fas_remove_cmd(struct fas *fas, struct fas_cmd *sp, int new_timeout_flag) 3639 { 3640 int tag = sp->cmd_tag[1]; 3641 int slot = sp->cmd_slot; 3642 struct f_slots *tag_slots = fas->f_active[slot]; 3643 3644 ASSERT(sp != NULL); 3645 EPRINTF4("remove tag %d slot %d for target %d.%d\n", 3646 tag, slot, Tgt(sp), Lun(sp)); 3647 3648 if (sp == tag_slots->f_slot[tag]) { 3649 tag_slots->f_slot[tag] = NULL; 3650 fas->f_tcmds[slot]--; 3651 } 3652 if (fas->f_current_sp == sp) { 3653 fas->f_current_sp = NULL; 3654 } 3655 3656 ASSERT(sp != fas->f_active[sp->cmd_slot]->f_slot[sp->cmd_tag[1]]); 3657 3658 if (new_timeout_flag != NEW_TIMEOUT) { 3659 return; 3660 } 3661 3662 /* 3663 * Figure out what to set tag Q timeout for... 3664 * 3665 * Optimize: If we have duplicate's of same timeout 3666 * we're using, then we'll use it again until we run 3667 * out of duplicates. This should be the normal case 3668 * for block and raw I/O. 3669 * If no duplicates, we have to scan through tag que and 3670 * find the longest timeout value and use it. This is 3671 * going to take a while... 3672 */ 3673 if (sp->cmd_pkt->pkt_time == tag_slots->f_timebase) { 3674 if (--(tag_slots->f_dups) <= 0) { 3675 if (fas->f_tcmds[slot]) { 3676 struct fas_cmd *ssp; 3677 uint_t n = 0; 3678 ushort_t t = tag_slots->f_n_slots; 3679 ushort_t i; 3680 /* 3681 * This crude check assumes we don't do 3682 * this too often which seems reasonable 3683 * for block and raw I/O. 3684 */ 3685 for (i = 0; i < t; i++) { 3686 ssp = tag_slots->f_slot[i]; 3687 if (ssp && 3688 (ssp->cmd_pkt->pkt_time > n)) { 3689 n = ssp->cmd_pkt->pkt_time; 3690 tag_slots->f_dups = 1; 3691 } else if (ssp && 3692 (ssp->cmd_pkt->pkt_time == n)) { 3693 tag_slots->f_dups++; 3694 } 3695 } 3696 tag_slots->f_timebase = n; 3697 EPRINTF1("searching, new_timeout= %d\n", n); 3698 } else { 3699 tag_slots->f_dups = 0; 3700 tag_slots->f_timebase = 0; 3701 } 3702 } 3703 } 3704 tag_slots->f_timeout = tag_slots->f_timebase; 3705 3706 ASSERT(fas->f_ncmds >= fas->f_ndisc); 3707 } 3708 3709 /* 3710 * decrement f_ncmds and f_ndisc for this cmd before completing 3711 */ 3712 static void 3713 fas_decrement_ncmds(struct fas *fas, struct fas_cmd *sp) 3714 { 3715 ASSERT((sp->cmd_flags & CFLAG_FREE) == 0); 3716 if ((sp->cmd_flags & CFLAG_FINISHED) == 0) { 3717 fas->f_ncmds--; 3718 if (sp->cmd_flags & CFLAG_CMDDISC) { 3719 fas->f_ndisc--; 3720 } 3721 sp->cmd_flags |= CFLAG_FINISHED; 3722 sp->cmd_flags &= ~CFLAG_CMDDISC; 3723 } 3724 ASSERT((fas->f_ncmds >= 0) && (fas->f_ndisc >= 0)); 3725 ASSERT(fas->f_ncmds >= fas->f_ndisc); 3726 } 3727 3728 /* 3729 * Most commonly called phase handlers: 3730 * 3731 * Finish routines 3732 */ 3733 static int 3734 fas_finish(struct fas *fas) 3735 { 3736 struct fas_cmd *sp = fas->f_current_sp; 3737 struct scsi_pkt *pkt = CMD2PKT(sp); 3738 int action = ACTION_SEARCH; 3739 struct scsi_status *status = 3740 (struct scsi_status *)sp->cmd_pkt->pkt_scbp; 3741 3742 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_FINISH_START, 3743 "fas_finish_start"); 3744 EPRINTF("fas_finish\n"); 3745 3746 #ifdef FAS_TEST 3747 if (fas_test_stop && (sp->cmd_pkt_flags & 0x80000000)) { 3748 debug_enter("untagged cmd completed"); 3749 } 3750 #endif 3751 3752 /* 3753 * immediately enable reselects 3754 */ 3755 fas_reg_cmd_write(fas, CMD_EN_RESEL); 3756 if (status->sts_chk) { 3757 /* 3758 * In the case that we are getting a check condition 3759 * clear our knowledge of synchronous capabilities. 3760 * This will unambiguously force a renegotiation 3761 * prior to any possible data transfer (we hope), 3762 * including the data transfer for a UNIT ATTENTION 3763 * condition generated by somebody powering on and 3764 * off a target. 3765 */ 3766 fas_force_renegotiation(fas, Tgt(sp)); 3767 } 3768 3769 /* 3770 * backoff sync/wide if there were parity errors 3771 */ 3772 if (sp->cmd_pkt->pkt_statistics & STAT_PERR) { 3773 fas_sync_wide_backoff(fas, sp, sp->cmd_slot); 3774 #ifdef FAS_TEST 3775 if (fas_test_stop) { 3776 debug_enter("parity error"); 3777 } 3778 #endif 3779 } 3780 3781 /* 3782 * Free from active list and update counts 3783 * We need to clean up this cmd now, just in case fas_ustart() 3784 * hits a reset or other fatal transport error 3785 */ 3786 fas_check_ncmds(fas); 3787 fas_remove_cmd(fas, sp, NEW_TIMEOUT); 3788 fas_decrement_ncmds(fas, sp); 3789 fas_check_ncmds(fas); 3790 3791 /* 3792 * go to state free and try to start a new cmd now 3793 */ 3794 New_state(fas, STATE_FREE); 3795 3796 if ((fas->f_ncmds > fas->f_ndisc) && (*((char *)status) == 0) && 3797 (INTPENDING(fas) == 0)) { 3798 if (fas_ustart(fas)) { 3799 action = ACTION_RETURN; 3800 } 3801 } 3802 3803 /* 3804 * if there was a data xfer then calculate residue and 3805 * sync data for consistent memory xfers 3806 */ 3807 if (pkt->pkt_state & STATE_XFERRED_DATA) { 3808 pkt->pkt_resid = sp->cmd_dmacount - sp->cmd_data_count; 3809 if (sp->cmd_flags & CFLAG_CMDIOPB) { 3810 (void) ddi_dma_sync(sp->cmd_dmahandle, 0, (uint_t)0, 3811 DDI_DMA_SYNC_FORCPU); 3812 } 3813 if (pkt->pkt_resid) { 3814 IPRINTF3("%d.%d finishes with %ld resid\n", 3815 Tgt(sp), Lun(sp), pkt->pkt_resid); 3816 } 3817 } 3818 3819 if (sp->cmd_pkt_flags & FLAG_NOINTR) { 3820 fas_call_pkt_comp(fas, sp); 3821 action = ACTION_RETURN; 3822 } else { 3823 /* 3824 * start an autorequest sense if there was a check condition. 3825 * if arq has not been enabled, fas_handle_sts_chk will do 3826 * do the callback 3827 */ 3828 if (status->sts_chk) { 3829 if (fas_handle_sts_chk(fas, sp)) { 3830 /* 3831 * we can't start an arq because one is 3832 * already in progress. the target is 3833 * probably confused 3834 */ 3835 action = ACTION_ABORT_CURCMD; 3836 } 3837 } else if ((*((char *)status) & STATUS_MASK) == 3838 STATUS_QFULL) { 3839 fas_handle_qfull(fas, sp); 3840 } else { 3841 #ifdef FAS_TEST 3842 if (fas_arqs_failure && (status->sts_chk == 0)) { 3843 struct scsi_arq_status *arqstat; 3844 status->sts_chk = 1; 3845 arqstat = (struct scsi_arq_status *) 3846 (sp->cmd_pkt->pkt_scbp); 3847 arqstat->sts_rqpkt_reason = CMD_TRAN_ERR; 3848 sp->cmd_pkt->pkt_state |= STATE_ARQ_DONE; 3849 fas_arqs_failure = 0; 3850 } 3851 if (fas_tran_err) { 3852 sp->cmd_pkt->pkt_reason = CMD_TRAN_ERR; 3853 fas_tran_err = 0; 3854 } 3855 #endif 3856 fas_call_pkt_comp(fas, sp); 3857 } 3858 } 3859 3860 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_FINISH_END, "fas_finish_end"); 3861 return (action); 3862 } 3863 3864 /* 3865 * Complete the process of selecting a target 3866 */ 3867 static int 3868 fas_finish_select(struct fas *fas) 3869 { 3870 volatile struct dma *dmar = fas->f_dma; 3871 struct fas_cmd *sp = fas->f_current_sp; 3872 uchar_t intr = fas->f_intr; 3873 uchar_t step; 3874 3875 step = fas_reg_read(fas, &fas->f_reg->fas_step) & FAS_STEP_MASK; 3876 3877 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_FINISH_SELECT_START, 3878 "fas_finish_select_start"); 3879 EPRINTF("fas_finish_select:\n"); 3880 ASSERT(sp != 0); 3881 3882 /* 3883 * Check for DMA gate array errors 3884 */ 3885 if ((fas->f_dma_csr = fas_dma_reg_read(fas, &dmar->dma_csr)) 3886 & DMA_ERRPEND) { 3887 /* 3888 * It would be desirable to set the ATN* line and attempt to 3889 * do the whole schmear of INITIATOR DETECTED ERROR here, 3890 * but that is too hard to do at present. 3891 */ 3892 fas_log(fas, CE_WARN, 3893 "Unrecoverable DMA error during selection"); 3894 fas_set_pkt_reason(fas, sp, CMD_TRAN_ERR, 0); 3895 3896 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_FINISH_SELECT_RESET1_END, 3897 "fas_finish_select_end (ACTION_RESET1)"); 3898 return (ACTION_RESET); 3899 } 3900 3901 /* 3902 * Shut off DMA gate array 3903 */ 3904 FAS_FLUSH_DMA(fas); 3905 3906 /* 3907 * Did something respond to selection? 3908 */ 3909 if (intr == (FAS_INT_BUS|FAS_INT_FCMP)) { 3910 /* 3911 * We succesfully selected a target (we think). 3912 * Now we figure out how botched things are 3913 * based upon the kind of selection we were 3914 * doing and the state of the step register. 3915 */ 3916 switch (step) { 3917 case FAS_STEP_ARBSEL: 3918 /* 3919 * In this case, we selected the target, but went 3920 * neither into MESSAGE OUT nor COMMAND phase. 3921 * However, this isn't a fatal error, so we just 3922 * drive on. 3923 * 3924 * This might be a good point to note that we have 3925 * a target that appears to not accomodate 3926 * disconnecting, 3927 * but it really isn't worth the effort to distinguish 3928 * such targets fasecially from others. 3929 */ 3930 /* FALLTHROUGH */ 3931 3932 case FAS_STEP_SENTID: 3933 /* 3934 * In this case, we selected the target and sent 3935 * message byte and have stopped with ATN* still on. 3936 * This case should only occur if we use the SELECT 3937 * AND STOP command. 3938 */ 3939 /* FALLTHROUGH */ 3940 3941 case FAS_STEP_NOTCMD: 3942 /* 3943 * In this case, we either didn't transition to command 3944 * phase, or, 3945 * if we were using the SELECT WITH ATN3 command, 3946 * we possibly didn't send all message bytes. 3947 */ 3948 break; 3949 3950 case FAS_STEP_PCMD: 3951 /* 3952 * In this case, not all command bytes transferred. 3953 */ 3954 /* FALLTHROUGH */ 3955 3956 case FAS_STEP_DONE: 3957 /* 3958 * This is the usual 'good' completion point. 3959 * If we we sent message byte(s), we subtract 3960 * off the number of message bytes that were 3961 * ahead of the command. 3962 */ 3963 sp->cmd_pkt->pkt_state |= STATE_SENT_CMD; 3964 break; 3965 3966 default: 3967 fas_log(fas, CE_WARN, 3968 "bad sequence step (0x%x) in selection", step); 3969 TRACE_0(TR_FAC_SCSI_FAS, 3970 TR_FAS_FINISH_SELECT_RESET3_END, 3971 "fas_finish_select_end (ACTION_RESET3)"); 3972 return (ACTION_RESET); 3973 } 3974 3975 /* 3976 * OR in common state... 3977 */ 3978 sp->cmd_pkt->pkt_state |= (STATE_GOT_BUS|STATE_GOT_TARGET); 3979 3980 /* 3981 * data pointer initialization has already been done 3982 */ 3983 New_state(fas, ACTS_UNKNOWN); 3984 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_FINISH_SELECT_ACTION3_END, 3985 "fas_finish_select_end (action3)"); 3986 return (fas_handle_unknown(fas)); 3987 3988 } else if (intr == FAS_INT_DISCON) { 3989 /* 3990 * make sure we negotiate when this target comes 3991 * on line later on 3992 */ 3993 fas_force_renegotiation(fas, Tgt(sp)); 3994 3995 fas->f_sdtr_sent = fas->f_wdtr_sent = 0; 3996 sp->cmd_pkt->pkt_state |= STATE_GOT_BUS; 3997 3998 /* 3999 * Set the throttle to DRAIN_THROTTLE to make 4000 * sure any disconnected commands will get timed out 4001 * incase the drive dies 4002 */ 4003 4004 if (fas->f_reset_delay[Tgt(sp)] == 0) { 4005 fas->f_throttle[sp->cmd_slot] = DRAIN_THROTTLE; 4006 } 4007 4008 fas_set_pkt_reason(fas, sp, CMD_INCOMPLETE, 0); 4009 4010 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_FINISH_SELECT_FINISH_END, 4011 "fas_finish_select_end (ACTION_FINISH)"); 4012 return (ACTION_FINISH); 4013 } else { 4014 fas_printstate(fas, "undetermined selection failure"); 4015 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_FINISH_SELECT_RESET2_END, 4016 "fas_finish_select_end (ACTION_RESET2)"); 4017 return (ACTION_RESET); 4018 } 4019 _NOTE(NOT_REACHED) 4020 /* NOTREACHED */ 4021 } 4022 4023 /* 4024 * a selection got preempted by a reselection; shut down dma 4025 * and put back cmd in the ready queue unless NOINTR 4026 */ 4027 static int 4028 fas_reselect_preempt(struct fas *fas) 4029 { 4030 int rval; 4031 4032 /* 4033 * A reselection attempt glotzed our selection attempt. 4034 * we put request back in the ready queue 4035 */ 4036 struct fas_cmd *sp = fas->f_current_sp; 4037 4038 /* 4039 * Shut off DMA gate array 4040 */ 4041 FAS_FLUSH_DMA(fas); 4042 4043 /* 4044 * service the reconnect now and clean up later 4045 */ 4046 New_state(fas, STATE_FREE); 4047 rval = fas_reconnect(fas); 4048 4049 /* 4050 * If selection for a non-tagged command is preempted, the 4051 * command could be stuck because throttle was set to DRAIN, 4052 * and a disconnected command timeout follows. 4053 */ 4054 if ((sp->cmd_pkt_flags & FLAG_TAGMASK) == 0) 4055 fas->f_throttle[sp->cmd_slot] = 1; 4056 4057 if ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) { 4058 fas_remove_cmd(fas, sp, NEW_TIMEOUT); 4059 } 4060 4061 /* 4062 * if we attempted to renegotiate on this cmd, undo this now 4063 */ 4064 if (fas->f_wdtr_sent) { 4065 fas->f_wide_known &= ~(1<<Tgt(sp)); 4066 fas->f_wdtr_sent = 0; 4067 } 4068 if (fas->f_sdtr_sent) { 4069 fas->f_sync_known &= ~(1<<Tgt(sp)); 4070 fas->f_sdtr_sent = 0; 4071 } 4072 4073 fas_head_of_readyQ(fas, sp); 4074 4075 return (rval); 4076 } 4077 4078 /* 4079 * Handle the reconnection of a target 4080 */ 4081 static int 4082 fas_reconnect(struct fas *fas) 4083 { 4084 volatile struct fasreg *fasreg = fas->f_reg; 4085 struct fas_cmd *sp = NULL; 4086 uchar_t target, lun; 4087 uchar_t tmp; 4088 uchar_t slot; 4089 char *bad_reselect = NULL; 4090 4091 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_RECONNECT_START, 4092 "fas_reconnect_start"); 4093 EPRINTF("fas_reconnect:\n"); 4094 4095 fas_check_ncmds(fas); 4096 4097 switch (fas->f_state) { 4098 default: 4099 /* 4100 * Pick up target id from fifo 4101 * 4102 * There should only be the reselecting target's id 4103 * and an identify message in the fifo. 4104 */ 4105 target = fas->f_fifo[0]; 4106 4107 /* 4108 * we know the target so update period, conf3, 4109 * offset reg, if necessary, and accept the msg 4110 */ 4111 FAS_SET_PERIOD_OFFSET_CONF3_REGS(fas, target); 4112 4113 /* 4114 * now we can accept the message. an untagged 4115 * target will go immediately into data phase so 4116 * the period/offset/conf3 registers need to be 4117 * updated before accepting the message 4118 */ 4119 fas_reg_cmd_write(fas, CMD_MSG_ACPT); 4120 4121 if (fas->f_fifolen != 2) { 4122 bad_reselect = "bad reselect bytes"; 4123 break; 4124 } 4125 4126 /* 4127 * normal initial reconnect; we get another interrupt later 4128 * for the tag 4129 */ 4130 New_state(fas, ACTS_RESEL); 4131 4132 if (fas->f_stat & FAS_STAT_PERR) { 4133 break; 4134 } 4135 4136 /* 4137 * Check sanity of message. 4138 */ 4139 tmp = fas->f_fifo[1]; 4140 fas->f_last_msgin = tmp; 4141 4142 if (!(IS_IDENTIFY_MSG(tmp)) || (tmp & INI_CAN_DISCON)) { 4143 bad_reselect = "bad identify msg"; 4144 break; 4145 } 4146 4147 lun = tmp & (NLUNS_PER_TARGET-1); 4148 4149 EPRINTF2("fas_reconnect: target=%x, idmsg=%x\n", 4150 target, tmp); 4151 4152 fas->f_resel_slot = slot = (target * NLUNS_PER_TARGET) | lun; 4153 4154 fas_reg_write(fas, (uchar_t *)&fasreg->fas_busid, 4155 (target & 0xf) | FAS_BUSID_ENCODID | 4156 FAS_BUSID_32BIT_COUNTER); 4157 4158 /* 4159 * If tag queueing in use, DMA in tag. 4160 * Otherwise, we're ready to go. 4161 * if tag 0 slot is non-empty, a non-tagged cmd is 4162 * reconnecting 4163 */ 4164 if (TAGGED(target) && fas->f_tcmds[slot] && 4165 (fas->f_active[slot]->f_slot[0] == NULL)) { 4166 volatile uchar_t *c = 4167 (uchar_t *)fas->f_cmdarea; 4168 4169 /* 4170 * If we've been doing tagged queueing and this 4171 * request doesn't do it, 4172 * maybe it was disabled for this one. This is rather 4173 * dangerous as it blows all pending tagged cmds away. 4174 * But if target is confused, then we'll blow up 4175 * shortly. 4176 */ 4177 *c++ = INVALID_MSG; 4178 *c = INVALID_MSG; 4179 4180 FAS_DMA_WRITE_SETUP(fas, 2, 4181 fas->f_dmacookie.dmac_address); 4182 4183 /* 4184 * For tagged queuing, we should still be in msgin 4185 * phase. 4186 * If not, then either we aren't running tagged 4187 * queueing like we thought or the target died. 4188 */ 4189 if (INTPENDING(fas) == 0) { 4190 EPRINTF1("slow reconnect, slot=%x\n", slot); 4191 TRACE_0(TR_FAC_SCSI_FAS, 4192 TR_FAS_RECONNECT_RETURN1_END, 4193 "fas_reconnect_end (_RETURN1)"); 4194 return (ACTION_RETURN); 4195 } 4196 4197 fas->f_stat = fas_reg_read(fas, &fasreg->fas_stat); 4198 fas->f_intr = fas_reg_read(fas, &fasreg->fas_intr); 4199 if (fas->f_intr & (FAS_INT_ILLEGAL | FAS_INT_RESET)) { 4200 return (fas_illegal_cmd_or_bus_reset(fas)); 4201 } 4202 4203 if ((fas->f_stat & FAS_PHASE_MASK) != 4204 FAS_PHASE_MSG_IN) { 4205 bad_reselect = "not in msgin phase"; 4206 break; 4207 } 4208 4209 if (fas->f_intr & FAS_INT_DISCON) { 4210 bad_reselect = "unexpected bus free"; 4211 break; 4212 } 4213 } else { 4214 fas->f_current_sp = sp = fas->f_active[slot]->f_slot[0]; 4215 break; 4216 } 4217 /*FALLTHROUGH*/ 4218 4219 case ACTS_RESEL: 4220 { 4221 volatile uchar_t *c = 4222 (uchar_t *)fas->f_cmdarea; 4223 struct f_slots *tag_slots; 4224 int id, tag; 4225 uint_t i; 4226 4227 slot = fas->f_resel_slot; 4228 target = slot/NLUNS_PER_TARGET; 4229 4230 if ((fas->f_stat & FAS_PHASE_MASK) != 4231 FAS_PHASE_MSG_IN) { 4232 IPRINTF1("no tag for slot %x\n", slot); 4233 if (fas->f_intr & ~(FAS_INT_BUS | 4234 FAS_INT_FCMP)) { 4235 New_state(fas, ACTS_UNKNOWN); 4236 TRACE_0(TR_FAC_SCSI_FAS, 4237 TR_FAS_RECONNECT_PHASEMANAGE_END, 4238 "fas_reconnect_end (_PHASEMANAGE)"); 4239 return (ACTION_PHASEMANAGE); 4240 } else { 4241 bad_reselect = "not in msgin phase"; 4242 break; 4243 } 4244 } 4245 fas_reg_cmd_write(fas, CMD_TRAN_INFO|CMD_DMA); 4246 fas_dma_reg_write(fas, &fas->f_dma->dma_csr, 4247 fas->f_dma_csr); 4248 4249 fas_reg_cmd_write(fas, CMD_MSG_ACPT); 4250 4251 for (i = 0; i < (uint_t)RECONNECT_TAG_RCV_TIMEOUT; 4252 i++) { 4253 /* 4254 * timeout is not very accurate but this 4255 * should take no time at all 4256 */ 4257 if (INTPENDING(fas)) { 4258 fas->f_stat = fas_reg_read(fas, 4259 (uchar_t *)&fas->f_reg->fas_stat); 4260 fas->f_intr = fas_reg_read(fas, 4261 (uchar_t *)&fas->f_reg->fas_intr); 4262 if (fas->f_intr & (FAS_INT_RESET | 4263 FAS_INT_ILLEGAL)) { 4264 return ( 4265 fas_illegal_cmd_or_bus_reset 4266 (fas)); 4267 } 4268 if (fas->f_intr & FAS_INT_FCMP) { 4269 break; 4270 } 4271 } 4272 } 4273 4274 if (i == (uint_t)RECONNECT_TAG_RCV_TIMEOUT) { 4275 bad_reselect = "timeout on receiving tag msg"; 4276 break; 4277 } 4278 4279 FAS_FLUSH_DMA(fas); 4280 4281 /* 4282 * we should really do a sync here but that 4283 * hurts performance too much; we'll just hang 4284 * around till the tag byte flips 4285 * This is necessary on any system with an 4286 * XBox 4287 */ 4288 if (*c == INVALID_MSG) { 4289 EPRINTF( 4290 "fas_reconnect: invalid msg, polling\n"); 4291 for (i = 0; i < 1000000; i++) { 4292 if (*c != INVALID_MSG) 4293 break; 4294 } 4295 } 4296 4297 if (fas->f_stat & FAS_STAT_PERR) { 4298 break; 4299 } 4300 4301 if ((fas->f_stat & FAS_STAT_XZERO) == 0 || 4302 (id = *c++) < MSG_SIMPLE_QTAG || 4303 id > MSG_ORDERED_QTAG) { 4304 /* 4305 * Target agreed to do tagged queueing 4306 * and lied! 4307 * This problem implies the drive firmware is 4308 * broken. 4309 */ 4310 bad_reselect = "botched tag"; 4311 break; 4312 } 4313 tag = *c; 4314 4315 /* Set ptr to reconnecting scsi pkt */ 4316 tag_slots = fas->f_active[slot]; 4317 if (tag_slots != NULL) { 4318 sp = tag_slots->f_slot[tag]; 4319 } else { 4320 bad_reselect = "Invalid tag"; 4321 break; 4322 } 4323 4324 fas->f_current_sp = sp; 4325 } 4326 } 4327 4328 if (fas->f_stat & FAS_STAT_PERR) { 4329 sp = NULL; 4330 bad_reselect = "Parity error in reconnect msg's"; 4331 } 4332 4333 if ((sp == NULL || 4334 #ifdef FAS_TEST 4335 (fas_atest_reconn & (1<<Tgt(sp))) || 4336 #endif 4337 (sp->cmd_flags & (CFLAG_CMDDISC|CFLAG_CMDPROXY)) == 0)) { 4338 /* 4339 * this shouldn't really happen, so it is better 4340 * to reset the bus; some disks accept the abort 4341 * and then still reconnect 4342 */ 4343 if (bad_reselect == NULL) { 4344 bad_reselect = "no command"; 4345 } 4346 #ifdef FAS_TEST 4347 if (sp && !(fas_atest_reconn & (1<<Tgt(sp))) && 4348 fas_test_stop) { 4349 debug_enter("bad reconnect"); 4350 } else { 4351 fas_atest_reconn = 0; 4352 } 4353 #endif 4354 goto bad; 4355 4356 /* 4357 * XXX remove this case or make it an ASSERT 4358 */ 4359 } else if (sp->cmd_flags & CFLAG_CMDPROXY) { 4360 /* 4361 * If we got here, we were already attempting to 4362 * run a polled proxy command for this target. 4363 * Set ATN and, copy in the message, and drive 4364 * on (ignoring any parity error on the identify). 4365 */ 4366 IPRINTF1("fas_reconnect: fielding proxy cmd for %d\n", 4367 target); 4368 fas_assert_atn(fas); 4369 fas->f_omsglen = sp->cmd_cdb[FAS_PROXY_DATA]; 4370 tmp = 0; 4371 while (tmp < fas->f_omsglen) { 4372 fas->f_cur_msgout[tmp] = 4373 sp->cmd_cdb[FAS_PROXY_DATA+1+tmp]; 4374 tmp++; 4375 } 4376 sp->cmd_cdb[FAS_PROXY_RESULT] = FALSE; 4377 4378 /* 4379 * pretend that the disconnected cmd is still disconnected 4380 * (this prevents ndisc from going negative) 4381 */ 4382 fas->f_ndisc++; 4383 ASSERT((fas->f_ncmds >= 0) && (fas->f_ndisc >= 0)); 4384 ASSERT(fas->f_ncmds >= fas->f_ndisc); 4385 } 4386 4387 ASSERT(fas->f_resel_slot == slot); 4388 ASSERT(fas->f_ndisc > 0); 4389 fas->f_ndisc--; 4390 sp->cmd_flags &= ~CFLAG_CMDDISC; 4391 New_state(fas, ACTS_UNKNOWN); 4392 4393 /* 4394 * A reconnect may imply a restore pointers operation 4395 * Note that some older disks (Micropolis in Pbox) do not 4396 * send a save data ptr on disconnect if all data has been 4397 * xferred. So, we cannot restore ptrs yet here. 4398 */ 4399 if ((sp->cmd_flags & CFLAG_DMAVALID) && 4400 (sp->cmd_data_count != sp->cmd_saved_data_count)) { 4401 sp->cmd_flags |= CFLAG_RESTORE_PTRS; 4402 } 4403 4404 /* 4405 * Return to await the FUNCTION COMPLETE interrupt we 4406 * should get out of accepting the IDENTIFY message. 4407 */ 4408 EPRINTF2("Reconnecting %d.%d\n", target, slot % NLUNS_PER_TARGET); 4409 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_RECONNECT_RETURN2_END, 4410 "fas_reconnect_end (_RETURN2)"); 4411 return (ACTION_RETURN); 4412 4413 bad: 4414 if (sp && (fas->f_stat & FAS_STAT_PERR)) { 4415 sp->cmd_pkt->pkt_statistics |= STAT_PERR; 4416 } 4417 fas_log(fas, CE_WARN, "target %x: failed reselection (%s)", 4418 target, bad_reselect); 4419 4420 #ifdef FASDEBUG 4421 fas_printstate(fas, "failed reselection"); 4422 #endif 4423 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_RECONNECT_RESET5_END, 4424 "fas_reconnect_end (_RESET5)"); 4425 return (ACTION_RESET); 4426 } 4427 4428 /* 4429 * handle unknown bus phase 4430 * we don't know what to expect so check status register for current 4431 * phase 4432 */ 4433 int 4434 fas_handle_unknown(struct fas *fas) 4435 { 4436 TRACE_1(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_UNKNOWN_START, 4437 "fas_handle_unknown_start: fas 0x%p", fas); 4438 EPRINTF("fas_handle_unknown:\n"); 4439 4440 if ((fas->f_intr & FAS_INT_DISCON) == 0) { 4441 /* 4442 * we call actions here rather than returning to phasemanage 4443 * (this is the most frequently called action) 4444 */ 4445 switch (fas->f_stat & FAS_PHASE_MASK) { 4446 case FAS_PHASE_DATA_IN: 4447 case FAS_PHASE_DATA_OUT: 4448 New_state(fas, ACTS_DATA); 4449 TRACE_0(TR_FAC_SCSI_FAS, 4450 TR_FAS_HANDLE_UNKNOWN_PHASE_DATA_END, 4451 "fas_handle_unknown_end (phase_data)"); 4452 return (fas_handle_data_start(fas)); 4453 4454 case FAS_PHASE_MSG_OUT: 4455 New_state(fas, ACTS_MSG_OUT); 4456 TRACE_0(TR_FAC_SCSI_FAS, 4457 TR_FAS_HANDLE_UNKNOWN_PHASE_MSG_OUT_END, 4458 "fas_handle_unknown_end (phase_msg_out)"); 4459 return (fas_handle_msg_out_start(fas)); 4460 4461 case FAS_PHASE_MSG_IN: 4462 New_state(fas, ACTS_MSG_IN); 4463 TRACE_0(TR_FAC_SCSI_FAS, 4464 TR_FAS_HANDLE_UNKNOWN_PHASE_MSG_IN_END, 4465 "fas_handle_unknown_end (phase_msg_in)"); 4466 return (fas_handle_msg_in_start(fas)); 4467 4468 case FAS_PHASE_STATUS: 4469 fas_reg_cmd_write(fas, CMD_FLUSH); 4470 #ifdef FAS_TEST 4471 if (fas_ptest_status & (1<<Tgt(fas->f_current_sp))) { 4472 fas_assert_atn(fas); 4473 } 4474 #endif /* FAS_TEST */ 4475 4476 fas_reg_cmd_write(fas, CMD_COMP_SEQ); 4477 New_state(fas, ACTS_C_CMPLT); 4478 4479 TRACE_0(TR_FAC_SCSI_FAS, 4480 TR_FAS_HANDLE_UNKNOWN_PHASE_STATUS_END, 4481 "fas_handle_unknown_end (phase_status)"); 4482 return (fas_handle_c_cmplt(fas)); 4483 4484 case FAS_PHASE_COMMAND: 4485 New_state(fas, ACTS_CMD_START); 4486 TRACE_0(TR_FAC_SCSI_FAS, 4487 TR_FAS_HANDLE_UNKNOWN_PHASE_CMD_END, 4488 "fas_handle_unknown_end (phase_cmd)"); 4489 return (fas_handle_cmd_start(fas)); 4490 } 4491 4492 fas_printstate(fas, "Unknown bus phase"); 4493 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_UNKNOWN_RESET_END, 4494 "fas_handle_unknown_end (reset)"); 4495 return (ACTION_RESET); 4496 4497 } else { 4498 /* 4499 * Okay. What to do now? Let's try (for the time being) 4500 * assuming that the target went south and dropped busy, 4501 * as a disconnect implies that either we received 4502 * a completion or a disconnect message, or that we 4503 * had sent an ABORT OPERATION or BUS DEVICE RESET 4504 * message. In either case, we expected the disconnect 4505 * and should have fielded it elsewhere. 4506 * 4507 * If we see a chip disconnect here, this is an unexpected 4508 * loss of BSY*. Clean up the state of the chip and return. 4509 * 4510 */ 4511 int msgout = fas->f_cur_msgout[0]; 4512 struct fas_cmd *sp = fas->f_current_sp; 4513 int target = Tgt(sp); 4514 4515 if (msgout == MSG_HEAD_QTAG || msgout == MSG_SIMPLE_QTAG) { 4516 msgout = fas->f_cur_msgout[2]; 4517 } 4518 EPRINTF4("msgout: %x %x %x, last_msgout=%x\n", 4519 fas->f_cur_msgout[0], fas->f_cur_msgout[1], 4520 fas->f_cur_msgout[2], fas->f_last_msgout); 4521 4522 if (msgout == MSG_ABORT || msgout == MSG_ABORT_TAG || 4523 msgout == MSG_DEVICE_RESET) { 4524 IPRINTF2("Successful %s message to target %d\n", 4525 scsi_mname(msgout), Tgt(sp)); 4526 if (sp->cmd_flags & CFLAG_CMDPROXY) { 4527 sp->cmd_cdb[FAS_PROXY_RESULT] = TRUE; 4528 } 4529 if (msgout == MSG_ABORT || msgout == MSG_ABORT_TAG) { 4530 fas->f_abort_msg_sent++; 4531 if ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) { 4532 fas_set_pkt_reason(fas, sp, 4533 CMD_ABORTED, STAT_ABORTED); 4534 } 4535 } else if (msgout == MSG_DEVICE_RESET) { 4536 fas->f_reset_msg_sent++; 4537 if ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) { 4538 fas_set_pkt_reason(fas, sp, 4539 CMD_RESET, STAT_DEV_RESET); 4540 } 4541 fas_force_renegotiation(fas, target); 4542 } 4543 } else { 4544 if ((fas->f_last_msgout == MSG_EXTENDED) && 4545 (fas->f_last_msgin == MSG_REJECT)) { 4546 /* 4547 * the target rejected the negotiations, 4548 * so resubmit again (no_sync/no_wide 4549 * is now set) 4550 */ 4551 New_state(fas, STATE_FREE); 4552 fas_reg_cmd_write(fas, CMD_EN_RESEL); 4553 fas_remove_cmd(fas, sp, NEW_TIMEOUT); 4554 fas_decrement_ncmds(fas, sp); 4555 fas_check_ncmds(fas); 4556 sp->cmd_flags &= ~CFLAG_TRANFLAG; 4557 (void) fas_accept_pkt(fas, sp, NO_TRAN_BUSY); 4558 fas_check_ncmds(fas); 4559 TRACE_0(TR_FAC_SCSI_FAS, 4560 TR_FAS_HANDLE_UNKNOWN_INT_DISCON_END, 4561 "fas_handle_unknown_end (int_discon)"); 4562 return (ACTION_SEARCH); 4563 4564 } else if (fas->f_last_msgout == MSG_EXTENDED) { 4565 /* 4566 * target dropped off the bus during 4567 * negotiations 4568 */ 4569 fas_reset_sync_wide(fas); 4570 fas->f_sdtr_sent = fas->f_wdtr_sent = 0; 4571 } 4572 4573 fas_set_pkt_reason(fas, sp, CMD_UNX_BUS_FREE, 0); 4574 #ifdef FASDEBUG 4575 fas_printstate(fas, "unexpected bus free"); 4576 #endif 4577 } 4578 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_UNKNOWN_INT_DISCON_END, 4579 "fas_handle_unknown_end (int_discon)"); 4580 return (ACTION_FINISH); 4581 } 4582 _NOTE(NOT_REACHED) 4583 /* NOTREACHED */ 4584 } 4585 4586 /* 4587 * handle target disconnecting 4588 */ 4589 static int 4590 fas_handle_clearing(struct fas *fas) 4591 { 4592 struct fas_cmd *sp = fas->f_current_sp; 4593 4594 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_CLEARING_START, 4595 "fas_handle_clearing_start"); 4596 EPRINTF("fas_handle_clearing:\n"); 4597 4598 if (fas->f_laststate == ACTS_C_CMPLT || 4599 fas->f_laststate == ACTS_MSG_IN_DONE) { 4600 if (INTPENDING(fas)) { 4601 volatile struct fasreg *fasreg = fas->f_reg; 4602 4603 fas->f_stat = fas_reg_read(fas, 4604 (uchar_t *)&fasreg->fas_stat); 4605 fas->f_intr = fas_reg_read(fas, 4606 (uchar_t *)&fasreg->fas_intr); 4607 if (fas->f_intr & (FAS_INT_RESET | FAS_INT_ILLEGAL)) { 4608 return (fas_illegal_cmd_or_bus_reset(fas)); 4609 } 4610 } else { 4611 /* 4612 * change e_laststate for the next time around 4613 */ 4614 fas->f_laststate = ACTS_CLEARING; 4615 TRACE_0(TR_FAC_SCSI_FAS, 4616 TR_FAS_HANDLE_CLEARING_RETURN1_END, 4617 "fas_handle_clearing_end (ACTION_RETURN1)"); 4618 return (ACTION_RETURN); 4619 } 4620 } 4621 4622 if (fas->f_intr == FAS_INT_DISCON) { 4623 /* 4624 * At this point the FAS chip has disconnected. The bus should 4625 * be either quiet or someone may be attempting a reselection 4626 * of us (or somebody else). Call the routine that sets the 4627 * chip back to a correct and known state. 4628 * If the last message in was a disconnect, search 4629 * for new work to do, else return to call fas_finish() 4630 */ 4631 fas->f_last_msgout = 0xff; 4632 fas->f_omsglen = 0; 4633 if (fas->f_last_msgin == MSG_DISCONNECT) { 4634 4635 fas_reg_cmd_write(fas, CMD_EN_RESEL); 4636 4637 New_state(fas, STATE_FREE); 4638 4639 ASSERT(fas->f_current_sp != NULL); 4640 EPRINTF2("disconnecting %d.%d\n", Tgt(sp), Lun(sp)); 4641 4642 sp->cmd_pkt->pkt_statistics |= STAT_DISCON; 4643 sp->cmd_flags |= CFLAG_CMDDISC; 4644 if ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) { 4645 fas->f_ndisc++; 4646 } 4647 ASSERT((fas->f_ncmds >= 0) && (fas->f_ndisc >= 0)); 4648 ASSERT(fas->f_ncmds >= fas->f_ndisc); 4649 4650 fas->f_current_sp = NULL; 4651 4652 /* 4653 * start a cmd here to save time 4654 */ 4655 if ((fas->f_ncmds > fas->f_ndisc) && fas_ustart(fas)) { 4656 TRACE_0(TR_FAC_SCSI_FAS, 4657 TR_FAS_HANDLE_CLEARING_RETURN2_END, 4658 "fas_handle_clearing_end (ACTION_RETURN2)"); 4659 return (ACTION_RETURN); 4660 } 4661 4662 4663 TRACE_0(TR_FAC_SCSI_FAS, 4664 TR_FAS_HANDLE_CLEARING_RETURN3_END, 4665 "fas_handle_clearing_end (ACTION_RETURN3)"); 4666 return (ACTION_RETURN); 4667 } else { 4668 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_CLEARING_END, 4669 "fas_handle_clearing_end"); 4670 return (fas_finish(fas)); 4671 } 4672 } else { 4673 /* 4674 * If the target didn't disconnect from the 4675 * bus, that is a gross fatal error. 4676 * XXX this can be caused by asserting ATN 4677 * XXX check bus phase and if msgout, send a message 4678 */ 4679 fas_log(fas, CE_WARN, 4680 "Target %d didn't disconnect after sending %s", 4681 Tgt(sp), scsi_mname(fas->f_last_msgin)); 4682 4683 fas_set_pkt_reason(fas, sp, CMD_TRAN_ERR, 0); 4684 4685 #ifdef FASDEBUG 4686 IPRINTF4("msgout: %x %x %x, last_msgout=%x\n", 4687 fas->f_cur_msgout[0], fas->f_cur_msgout[1], 4688 fas->f_cur_msgout[2], fas->f_last_msgout); 4689 IPRINTF1("last msgin=%x\n", fas->f_last_msgin); 4690 #endif 4691 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_CLEARING_ABORT_END, 4692 "fas_handle_clearing_end (ACTION_ABORT_CURCMD)"); 4693 return (ACTION_ABORT_ALLCMDS); 4694 } 4695 } 4696 4697 /* 4698 * handle data phase start 4699 */ 4700 static int 4701 fas_handle_data_start(struct fas *fas) 4702 { 4703 uint64_t end; 4704 uint32_t amt; 4705 struct fas_cmd *sp = fas->f_current_sp; 4706 int sending, phase; 4707 4708 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_DATA_START, 4709 "fas_handle_data_start"); 4710 EPRINTF("fas_handle_data_start:\n"); 4711 4712 if ((sp->cmd_flags & CFLAG_DMAVALID) == 0) { 4713 fas_printstate(fas, "unexpected data phase"); 4714 bad: 4715 fas_set_pkt_reason(fas, sp, CMD_TRAN_ERR, 0); 4716 4717 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_DATA_ABORT1_END, 4718 "fas_handle_data_end (ACTION_ABORT_CURCMD1)"); 4719 return (ACTION_ABORT_CURCMD); 4720 } else { 4721 sending = (sp->cmd_flags & CFLAG_DMASEND)? 1 : 0; 4722 } 4723 4724 if (sp->cmd_flags & CFLAG_RESTORE_PTRS) { 4725 if (fas_restore_pointers(fas, sp)) { 4726 return (ACTION_ABORT_CURCMD); 4727 } 4728 sp->cmd_flags &= ~CFLAG_RESTORE_PTRS; 4729 } 4730 4731 /* 4732 * And make sure our DMA pointers are in good shape. 4733 * 4734 * Because SCSI is SCSI, the current DMA pointer has got to be 4735 * greater than or equal to our DMA base address. All other cases 4736 * that might have affected this always set curaddr to be >= 4737 * to the DMA base address. 4738 */ 4739 ASSERT(sp->cmd_cur_addr >= sp->cmd_dmacookie.dmac_address); 4740 end = (uint64_t)sp->cmd_dmacookie.dmac_address + 4741 (uint64_t)sp->cmd_dmacookie.dmac_size; 4742 4743 DPRINTF5( 4744 "cmd_data_count=%x, dmacount=%x, curaddr=%x, end=%" 4745 PRIx64 ", nwin=%x\n", 4746 sp->cmd_data_count, sp->cmd_dmacount, sp->cmd_cur_addr, end, 4747 sp->cmd_nwin); 4748 DPRINTF2("dmac_address = %x, dmac_size=%lx\n", 4749 sp->cmd_dmacookie.dmac_address, sp->cmd_dmacookie.dmac_size); 4750 4751 if (sp->cmd_cur_addr >= end) { 4752 if (fas_next_window(fas, sp, end)) { 4753 goto bad; 4754 } 4755 end = (uint64_t)sp->cmd_dmacookie.dmac_address + 4756 (uint64_t)sp->cmd_dmacookie.dmac_size; 4757 DPRINTF2("dmac_address=%x, dmac_size=%lx\n", 4758 sp->cmd_dmacookie.dmac_address, 4759 sp->cmd_dmacookie.dmac_size); 4760 } 4761 4762 amt = end - sp->cmd_cur_addr; 4763 if (fas->f_dma_attr->dma_attr_count_max < amt) { 4764 amt = fas->f_dma_attr->dma_attr_count_max; 4765 } 4766 DPRINTF3("amt=%x, end=%lx, cur_addr=%x\n", amt, end, sp->cmd_cur_addr); 4767 4768 #ifdef FASDEBUG 4769 /* 4770 * Make sure that we don't cross a boundary we can't handle 4771 */ 4772 end = (uint64_t)sp->cmd_cur_addr + (uint64_t)amt - 1; 4773 if ((end & ~fas->f_dma_attr->dma_attr_seg) != 4774 (sp->cmd_cur_addr & ~fas->f_dma_attr->dma_attr_seg)) { 4775 EPRINTF3("curaddr %x curaddr+amt %" PRIx64 4776 " cntr_max %" PRIx64 "\n", 4777 sp->cmd_cur_addr, end, fas->f_dma_attr->dma_attr_seg); 4778 amt = (end & ~fas->f_dma_attr->dma_attr_seg) - sp->cmd_cur_addr; 4779 if (amt == 0 || amt > fas->f_dma_attr->dma_attr_count_max) { 4780 fas_log(fas, CE_WARN, "illegal dma boundary? %x", amt); 4781 goto bad; 4782 } 4783 } 4784 #endif 4785 4786 end = (uint64_t)sp->cmd_dmacookie.dmac_address + 4787 (uint64_t)sp->cmd_dmacookie.dmac_size - 4788 (uint64_t)sp->cmd_cur_addr; 4789 if (amt > end) { 4790 EPRINTF4("ovflow amt %x s.b. %" PRIx64 " curaddr %x count %x\n", 4791 amt, end, sp->cmd_cur_addr, sp->cmd_dmacount); 4792 amt = (uint32_t)end; 4793 } 4794 4795 fas->f_lastcount = amt; 4796 4797 EPRINTF4("%d.%d cmd 0x%x to xfer %x\n", Tgt(sp), Lun(sp), 4798 sp->cmd_pkt->pkt_cdbp[0], amt); 4799 4800 phase = fas->f_stat & FAS_PHASE_MASK; 4801 4802 if ((phase == FAS_PHASE_DATA_IN) && !sending) { 4803 FAS_DMA_WRITE(fas, amt, sp->cmd_cur_addr, 4804 CMD_TRAN_INFO|CMD_DMA); 4805 } else if ((phase == FAS_PHASE_DATA_OUT) && sending) { 4806 FAS_DMA_READ(fas, amt, sp->cmd_cur_addr, amt, 4807 CMD_TRAN_INFO|CMD_DMA); 4808 } else { 4809 fas_log(fas, CE_WARN, 4810 "unwanted data xfer direction for Target %d", Tgt(sp)); 4811 fas_set_pkt_reason(fas, sp, CMD_DMA_DERR, 0); 4812 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_DATA_ABORT2_END, 4813 "fas_handle_data_end (ACTION_ABORT_CURCMD2)"); 4814 return (ACTION_ABORT_CURCMD); 4815 } 4816 4817 #ifdef FAS_TEST 4818 if (!sending && (fas_ptest_data_in & (1<<Tgt(sp)))) { 4819 fas_assert_atn(fas); 4820 } 4821 #endif /* FAS_TEST */ 4822 4823 New_state(fas, ACTS_DATA_DONE); 4824 4825 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_DATA_END, 4826 "fas_handle_data_end (ACTION_RETURN)"); 4827 return (ACTION_RETURN); 4828 } 4829 4830 static int 4831 fas_handle_data_done(struct fas *fas) 4832 { 4833 volatile struct fasreg *fasreg = fas->f_reg; 4834 volatile struct dma *dmar = fas->f_dma; 4835 struct fas_cmd *sp = fas->f_current_sp; 4836 uint32_t xfer_amt; 4837 char was_sending; 4838 uchar_t stat, fifoamt, tgt; 4839 4840 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_DATA_DONE_START, 4841 "fas_handle_data_done_start"); 4842 EPRINTF("fas_handle_data_done\n"); 4843 4844 tgt = Tgt(sp); 4845 stat = fas->f_stat; 4846 was_sending = (sp->cmd_flags & CFLAG_DMASEND) ? 1 : 0; 4847 4848 /* 4849 * Check for DMA errors (parity or memory fault) 4850 */ 4851 if ((fas->f_dma_csr = fas_dma_reg_read(fas, &dmar->dma_csr)) & 4852 DMA_ERRPEND) { 4853 /* 4854 * It would be desirable to set the ATN* line and attempt to 4855 * do the whole schmear of INITIATOR DETECTED ERROR here, 4856 * but that is too hard to do at present. 4857 */ 4858 fas_log(fas, CE_WARN, "Unrecoverable DMA error on dma %s", 4859 (was_sending) ? "send" : "receive"); 4860 fas_set_pkt_reason(fas, sp, CMD_TRAN_ERR, 0); 4861 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_DATA_DONE_RESET_END, 4862 "fas_handle_data_done_end (ACTION_RESET)"); 4863 return (ACTION_RESET); 4864 } 4865 4866 /* 4867 * Data Receive conditions: 4868 * 4869 * Check for parity errors. If we have a parity error upon 4870 * receive, the FAS chip has asserted ATN* for us already. 4871 */ 4872 if (!was_sending) { 4873 #ifdef FAS_TEST 4874 if (fas_ptest_data_in & (1<<tgt)) { 4875 fas_ptest_data_in = 0; 4876 stat |= FAS_STAT_PERR; 4877 if (fas_test_stop > 1) { 4878 debug_enter("ptest_data_in"); 4879 } 4880 } 4881 #endif /* FAS_TEST */ 4882 if (stat & FAS_STAT_PERR) { 4883 fas_log(fas, CE_WARN, 4884 "SCSI bus DATA IN phase parity error"); 4885 fas->f_cur_msgout[0] = MSG_INITIATOR_ERROR; 4886 fas->f_omsglen = 1; 4887 sp->cmd_pkt->pkt_statistics |= STAT_PERR; 4888 sp->cmd_pkt->pkt_reason = CMD_TRAN_ERR; 4889 } 4890 } 4891 4892 FAS_FLUSH_DMA(fas); 4893 4894 /* 4895 * Check to make sure we're still connected to the target. 4896 * If the target dropped the bus, that is a fatal error. 4897 * We don't even attempt to count what we were transferring 4898 * here. Let fas_handle_unknown clean up for us. 4899 */ 4900 if (fas->f_intr != FAS_INT_BUS) { 4901 New_state(fas, ACTS_UNKNOWN); 4902 TRACE_0(TR_FAC_SCSI_FAS, 4903 TR_FAS_HANDLE_DATA_DONE_PHASEMANAGE_END, 4904 "fas_handle_data_done_end (ACTION_PHASEMANAGE)"); 4905 return (ACTION_PHASEMANAGE); 4906 } 4907 4908 /* 4909 * Figure out how far we got. 4910 * Latch up fifo amount first and double if wide has been enabled 4911 */ 4912 fifoamt = FIFO_CNT(fas); 4913 if (fas->f_wide_enabled & (1<<tgt)) { 4914 fifoamt = fifoamt << 1; 4915 } 4916 4917 if (stat & FAS_STAT_XZERO) { 4918 xfer_amt = fas->f_lastcount; 4919 } else { 4920 GET_FAS_COUNT(fasreg, xfer_amt); 4921 xfer_amt = fas->f_lastcount - xfer_amt; 4922 } 4923 DPRINTF4("fifoamt=%x, xfer_amt=%x, lastcount=%x, stat=%x\n", 4924 fifoamt, xfer_amt, fas->f_lastcount, stat); 4925 4926 4927 /* 4928 * Unconditionally knock off by the amount left 4929 * in the fifo if we were sending out the SCSI bus. 4930 * 4931 * If we were receiving from the SCSI bus, believe 4932 * what the chip told us (either XZERO or by the 4933 * value calculated from the counter register). 4934 * The reason we don't look at the fifo for 4935 * incoming data is that in synchronous mode 4936 * the fifo may have further data bytes, and 4937 * for async mode we assume that all data in 4938 * the fifo will have been transferred before 4939 * the fas asserts an interrupt. 4940 */ 4941 if (was_sending) { 4942 xfer_amt -= fifoamt; 4943 } 4944 4945 #ifdef FASDEBUG 4946 { 4947 int phase = stat & FAS_PHASE_MASK; 4948 fas->f_stat2 = fas_reg_read(fas, 4949 (uchar_t *)&fasreg->fas_stat2); 4950 4951 if (((fas->f_stat & FAS_STAT_XZERO) == 0) && 4952 (phase != FAS_PHASE_DATA_IN) && 4953 (phase != FAS_PHASE_DATA_OUT) && 4954 (fas->f_stat2 & FAS_STAT2_ISHUTTLE)) { 4955 fas_log(fas, CE_WARN, 4956 "input shuttle not empty at end of data phase"); 4957 fas_set_pkt_reason(fas, sp, CMD_TRAN_ERR, 0); 4958 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_DATA_DONE_RESET_END, 4959 "fas_handle_data_done_end (ACTION_RESET)"); 4960 return (ACTION_RESET); 4961 } 4962 } 4963 #endif /* FASDEBUG */ 4964 4965 /* 4966 * If this was a synchronous transfer, flag it. 4967 * Also check for the errata condition of long 4968 * last REQ/ pulse for some synchronous targets 4969 */ 4970 if (fas->f_offset[tgt]) { 4971 /* 4972 * flag that a synchronous data xfer took place 4973 */ 4974 sp->cmd_pkt->pkt_statistics |= STAT_SYNC; 4975 4976 if (was_sending) 4977 fas_reg_cmd_write(fas, CMD_FLUSH); 4978 } else { 4979 /* 4980 * If we aren't doing Synchronous Data Transfers, 4981 * definitely offload the fifo. 4982 */ 4983 fas_reg_cmd_write(fas, CMD_FLUSH); 4984 } 4985 4986 /* 4987 * adjust pointers... 4988 */ 4989 DPRINTF3("before:cmd_data_count=%x, cmd_cur_addr=%x, xfer_amt=%x\n", 4990 sp->cmd_data_count, sp->cmd_cur_addr, xfer_amt); 4991 sp->cmd_data_count += xfer_amt; 4992 sp->cmd_cur_addr += xfer_amt; 4993 sp->cmd_pkt->pkt_state |= STATE_XFERRED_DATA; 4994 New_state(fas, ACTS_UNKNOWN); 4995 DPRINTF3("after:cmd_data_count=%x, cmd_cur_addr=%x, xfer_amt=%x\n", 4996 sp->cmd_data_count, sp->cmd_cur_addr, xfer_amt); 4997 4998 stat &= FAS_PHASE_MASK; 4999 if (stat == FAS_PHASE_DATA_IN || stat == FAS_PHASE_DATA_OUT) { 5000 fas->f_state = ACTS_DATA; 5001 TRACE_0(TR_FAC_SCSI_FAS, 5002 TR_FAS_HANDLE_DATA_DONE_ACTION1_END, 5003 "fas_handle_data_done_end (action1)"); 5004 return (fas_handle_data_start(fas)); 5005 } 5006 5007 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_DATA_DONE_ACTION2_END, 5008 "fas_handle_data_done_end (action2)"); 5009 return (fas_handle_unknown(fas)); 5010 } 5011 5012 static char msginperr[] = "SCSI bus MESSAGE IN phase parity error"; 5013 5014 static int 5015 fas_handle_c_cmplt(struct fas *fas) 5016 { 5017 struct fas_cmd *sp = fas->f_current_sp; 5018 volatile struct fasreg *fasreg = fas->f_reg; 5019 uchar_t sts, msg, intr, perr; 5020 5021 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_C_CMPLT_START, 5022 "fas_handle_c_cmplt_start"); 5023 EPRINTF("fas_handle_c_cmplt:\n"); 5024 5025 5026 /* 5027 * if target is fast, we can get cmd. completion by the time we get 5028 * here. Otherwise, we'll have to taken an interrupt. 5029 */ 5030 if (fas->f_laststate == ACTS_UNKNOWN) { 5031 if (INTPENDING(fas)) { 5032 fas->f_stat = fas_reg_read(fas, 5033 (uchar_t *)&fasreg->fas_stat); 5034 intr = fas_reg_read(fas, (uchar_t *)&fasreg->fas_intr); 5035 fas->f_intr = intr; 5036 if (fas->f_intr & (FAS_INT_RESET | FAS_INT_ILLEGAL)) { 5037 return (fas_illegal_cmd_or_bus_reset(fas)); 5038 } 5039 } else { 5040 /* 5041 * change f_laststate for the next time around 5042 */ 5043 fas->f_laststate = ACTS_C_CMPLT; 5044 TRACE_0(TR_FAC_SCSI_FAS, 5045 TR_FAS_HANDLE_C_CMPLT_RETURN1_END, 5046 "fas_handle_c_cmplt_end (ACTION_RETURN1)"); 5047 return (ACTION_RETURN); 5048 } 5049 } else { 5050 intr = fas->f_intr; 5051 } 5052 5053 #ifdef FAS_TEST 5054 if (fas_ptest_status & (1<<Tgt(sp))) { 5055 fas_ptest_status = 0; 5056 fas->f_stat |= FAS_STAT_PERR; 5057 if (fas_test_stop > 1) { 5058 debug_enter("ptest_status"); 5059 } 5060 } else if ((fas_ptest_msgin & (1<<Tgt(sp))) && fas_ptest_msg == 0) { 5061 fas_ptest_msgin = 0; 5062 fas_ptest_msg = -1; 5063 fas->f_stat |= FAS_STAT_PERR; 5064 if (fas_test_stop > 1) { 5065 debug_enter("ptest_completion"); 5066 } 5067 } 5068 #endif /* FAS_TEST */ 5069 5070 if (intr == FAS_INT_DISCON) { 5071 New_state(fas, ACTS_UNKNOWN); 5072 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_C_CMPLT_ACTION1_END, 5073 "fas_handle_c_cmplt_end (action1)"); 5074 return (fas_handle_unknown(fas)); 5075 } 5076 5077 if ((perr = (fas->f_stat & FAS_STAT_PERR)) != 0) { 5078 fas_assert_atn(fas); 5079 sp->cmd_pkt->pkt_statistics |= STAT_PERR; 5080 } 5081 5082 /* 5083 * do a msg accept now and read the fifo data 5084 */ 5085 if (intr & FAS_INT_FCMP) { 5086 /* 5087 * The FAS manuals state that this sequence completes 5088 * with a BUS SERVICE interrupt if just the status 5089 * byte was received, else a FUNCTION COMPLETE interrupt 5090 * if both status and a message was received. 5091 * 5092 * if we give the MSG_ACT before reading the msg byte 5093 * we get the status byte again and if the status is zero 5094 * then we won't detect a failure 5095 */ 5096 *(sp->cmd_pkt->pkt_scbp) = 5097 sts = fas_reg_read(fas, (uchar_t *)&fasreg->fas_fifo_data); 5098 fas->f_last_msgin = fas->f_imsgarea[0] = 5099 msg = fas_reg_read(fas, (uchar_t *)&fasreg->fas_fifo_data); 5100 5101 fas_reg_cmd_write(fas, CMD_MSG_ACPT); 5102 sp->cmd_pkt->pkt_state |= STATE_GOT_STATUS; 5103 5104 /* 5105 * The manuals also state that ATN* is asserted if 5106 * bad parity is detected. 5107 * 5108 * The one case that we cannot handle is where we detect 5109 * bad parity for the status byte, but the target refuses 5110 * to go to MESSAGE OUT phase right away. This means that 5111 * if that happens, we will misconstrue the parity error 5112 * to be for the completion message, not the status byte. 5113 */ 5114 if (perr) { 5115 fas_log(fas, CE_WARN, msginperr); 5116 sp->cmd_pkt->pkt_statistics |= STAT_PERR; 5117 5118 fas->f_cur_msgout[0] = MSG_MSG_PARITY; 5119 fas->f_omsglen = 1; 5120 New_state(fas, ACTS_UNKNOWN); 5121 TRACE_0(TR_FAC_SCSI_FAS, 5122 TR_FAS_HANDLE_C_CMPLT_ACTION5_END, 5123 "fas_handle_c_cmplt_end (action5)"); 5124 return (ACTION_RETURN); 5125 } 5126 5127 } else if (intr == FAS_INT_BUS) { 5128 /* 5129 * We only got the status byte. 5130 */ 5131 sts = fas_reg_read(fas, (uchar_t *)&fasreg->fas_fifo_data); 5132 sp->cmd_pkt->pkt_state |= STATE_GOT_STATUS; 5133 *(sp->cmd_pkt->pkt_scbp) = sts; 5134 msg = INVALID_MSG; 5135 5136 IPRINTF1("fas_handle_cmd_cmplt: sts=%x, no msg byte\n", sts); 5137 5138 if (perr) { 5139 /* 5140 * If we get a parity error on a status byte 5141 * assume that it was a CHECK CONDITION 5142 */ 5143 sts = STATUS_CHECK; 5144 fas_log(fas, CE_WARN, 5145 "SCSI bus STATUS phase parity error"); 5146 fas->f_cur_msgout[0] = MSG_INITIATOR_ERROR; 5147 fas->f_omsglen = 1; 5148 New_state(fas, ACTS_UNKNOWN); 5149 TRACE_0(TR_FAC_SCSI_FAS, 5150 TR_FAS_HANDLE_C_CMPLT_ACTION5_END, 5151 "fas_handle_c_cmplt_end (action5)"); 5152 return (fas_handle_unknown(fas)); 5153 } 5154 5155 } else { 5156 msg = sts = INVALID_MSG; 5157 IPRINTF("fas_handle_cmd_cmplt: unexpected intr\n"); 5158 New_state(fas, ACTS_UNKNOWN); 5159 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_C_CMPLT_ACTION2_END, 5160 "fas_handle_c_cmplt_end (action2)"); 5161 return (fas_handle_unknown(fas)); 5162 } 5163 5164 EPRINTF2("fas_handle_c_cmplt: status=%x, msg=%x\n", sts, msg); 5165 5166 EPRINTF1("Completion Message=%s\n", scsi_mname(msg)); 5167 if (msg == MSG_COMMAND_COMPLETE) { 5168 /* 5169 * Actually, if the message was a 'linked command 5170 * complete' message, the target isn't going to be 5171 * clearing the bus. 5172 */ 5173 New_state(fas, ACTS_CLEARING); 5174 TRACE_0(TR_FAC_SCSI_FAS, 5175 TR_FAS_HANDLE_C_CMPLT_ACTION4_END, 5176 "fas_handle_c_cmplt_end (action4)"); 5177 return (fas_handle_clearing(fas)); 5178 } else { 5179 fas->f_imsglen = 1; 5180 fas->f_imsgindex = 1; 5181 New_state(fas, ACTS_MSG_IN_DONE); 5182 TRACE_0(TR_FAC_SCSI_FAS, 5183 TR_FAS_HANDLE_C_CMPLT_ACTION3_END, 5184 "fas_handle_c_cmplt_end (action3)"); 5185 return (fas_handle_msg_in_done(fas)); 5186 } 5187 } 5188 5189 /* 5190 * prepare for accepting a message byte from the fifo 5191 */ 5192 static int 5193 fas_handle_msg_in_start(struct fas *fas) 5194 { 5195 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_IN_START, 5196 "fas_handle_msg_in_start"); 5197 EPRINTF("fas_handle_msg_in_start\n"); 5198 5199 /* 5200 * Pick up a message byte. 5201 * Clear the FIFO so we 5202 * don't get confused. 5203 */ 5204 if (!FIFO_EMPTY(fas)) { 5205 fas_reg_cmd_write(fas, CMD_FLUSH); 5206 } 5207 fas_reg_cmd_write(fas, CMD_TRAN_INFO); 5208 fas->f_imsglen = 1; 5209 fas->f_imsgindex = 0; 5210 New_state(fas, ACTS_MSG_IN_DONE); 5211 5212 /* 5213 * give a little extra time by returning to phasemanage 5214 */ 5215 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_IN_END, 5216 "fas_handle_msg_in_end (ACTION_PHASEMANAGE)"); 5217 return (ACTION_PHASEMANAGE); 5218 } 5219 5220 /* 5221 * We come here after issuing a MSG_ACCEPT 5222 * command and are expecting more message bytes. 5223 * The FAS should be asserting a BUS SERVICE 5224 * interrupt status, but may have asserted 5225 * a different interrupt in the case that 5226 * the target disconnected and dropped BSY*. 5227 * 5228 * In the case that we are eating up message 5229 * bytes (and throwing them away unread) because 5230 * we have ATN* asserted (we are trying to send 5231 * a message), we do not consider it an error 5232 * if the phase has changed out of MESSAGE IN. 5233 */ 5234 static int 5235 fas_handle_more_msgin(struct fas *fas) 5236 { 5237 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MORE_MSGIN_START, 5238 "fas_handle_more_msgin_start"); 5239 EPRINTF("fas_handle_more_msgin\n"); 5240 5241 if (fas->f_intr & FAS_INT_BUS) { 5242 if ((fas->f_stat & FAS_PHASE_MASK) == FAS_PHASE_MSG_IN) { 5243 /* 5244 * Fetch another byte of a message in. 5245 */ 5246 fas_reg_cmd_write(fas, CMD_TRAN_INFO); 5247 New_state(fas, ACTS_MSG_IN_DONE); 5248 TRACE_0(TR_FAC_SCSI_FAS, 5249 TR_FAS_HANDLE_MORE_MSGIN_RETURN1_END, 5250 "fas_handle_more_msgin_end (ACTION_RETURN)"); 5251 return (ACTION_RETURN); 5252 } 5253 5254 /* 5255 * If we were gobbling up a message and we have 5256 * changed phases, handle this silently, else 5257 * complain. In either case, we return to let 5258 * fas_phasemanage() handle things. 5259 * 5260 * If it wasn't a BUS SERVICE interrupt, 5261 * let fas_phasemanage() find out if the 5262 * chip disconnected. 5263 */ 5264 if (fas->f_imsglen != 0) { 5265 fas_log(fas, CE_WARN, 5266 "Premature end of extended message"); 5267 } 5268 } 5269 New_state(fas, ACTS_UNKNOWN); 5270 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MORE_MSGIN_RETURN2_END, 5271 "fas_handle_more_msgin_end (action)"); 5272 return (fas_handle_unknown(fas)); 5273 } 5274 5275 static int 5276 fas_handle_msg_in_done(struct fas *fas) 5277 { 5278 struct fas_cmd *sp = fas->f_current_sp; 5279 volatile struct fasreg *fasreg = fas->f_reg; 5280 int sndmsg = 0; 5281 uchar_t msgin; 5282 5283 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_IN_DONE_START, 5284 "fas_handle_msg_in_done_start"); 5285 EPRINTF("fas_handle_msg_in_done:\n"); 5286 if (fas->f_laststate == ACTS_MSG_IN) { 5287 if (INTPENDING(fas)) { 5288 fas->f_stat = fas_reg_read(fas, 5289 (uchar_t *)&fasreg->fas_stat); 5290 fas->f_stat2 = fas_reg_read(fas, 5291 (uchar_t *)&fasreg->fas_stat2); 5292 5293 fas_read_fifo(fas); 5294 5295 fas->f_intr = fas_reg_read(fas, 5296 (uchar_t *)&fasreg->fas_intr); 5297 if (fas->f_intr & (FAS_INT_RESET | FAS_INT_ILLEGAL)) { 5298 return (fas_illegal_cmd_or_bus_reset(fas)); 5299 } 5300 } else { 5301 /* 5302 * change f_laststate for the next time around 5303 */ 5304 fas->f_laststate = ACTS_MSG_IN_DONE; 5305 TRACE_0(TR_FAC_SCSI_FAS, 5306 TR_FAS_HANDLE_MSG_IN_DONE_RETURN1_END, 5307 "fas_handle_msg_in_done_end (ACTION_RETURN1)"); 5308 return (ACTION_RETURN); 5309 } 5310 } 5311 5312 /* 5313 * the most common case is a disconnect message. we do 5314 * a fast path for this condition and if it fails then 5315 * we go for the detailed error handling 5316 */ 5317 #ifndef FAS_TEST 5318 if (((fas->f_laststate == ACTS_MSG_IN) || 5319 (fas->f_laststate == ACTS_MSG_IN_DONE)) && 5320 ((fas->f_intr & FAS_INT_DISCON) == 0) && 5321 ((fas->f_stat & FAS_STAT_PERR) == 0) && 5322 ((sp->cmd_pkt_flags & FLAG_NODISCON) == 0)) { 5323 5324 if ((fas->f_fifolen == 1) && 5325 (fas->f_imsglen == 1) && 5326 (fas->f_fifo[0] == MSG_DISCONNECT)) { 5327 5328 fas_reg_cmd_write(fas, CMD_MSG_ACPT); 5329 fas->f_imsgarea[fas->f_imsgindex++] = fas->f_fifo[0]; 5330 fas->f_last_msgin = MSG_DISCONNECT; 5331 New_state(fas, ACTS_CLEARING); 5332 5333 TRACE_0(TR_FAC_SCSI_FAS, 5334 TR_FAS_HANDLE_MSG_IN_DONE_ACTION_END, 5335 "fas_handle_msg_in_done_end (action)"); 5336 5337 return (fas_handle_clearing(fas)); 5338 } 5339 } 5340 #endif /* not FAS_TEST */ 5341 5342 /* 5343 * We can be called here for both the case where 5344 * we had requested the FAS chip to fetch a message 5345 * byte from the target (at the target's request). 5346 * We can also be called in the case where we had 5347 * been using the CMD_COMP_SEQ command to pick up 5348 * both a status byte and a completion message from 5349 * a target, but where the message wasn't one of 5350 * COMMAND COMPLETE, LINKED COMMAND COMPLETE, or 5351 * LINKED COMMAND COMPLETE (with flag). This is a 5352 * legal (albeit extremely unusual) SCSI bus trans- 5353 * -ition, so we have to handle it. 5354 */ 5355 if (fas->f_laststate != ACTS_C_CMPLT) { 5356 #ifdef FAS_TEST 5357 reloop: 5358 #endif /* FAS_TEST */ 5359 5360 if (fas->f_intr & FAS_INT_DISCON) { 5361 fas_log(fas, CE_WARN, 5362 "premature end of input message"); 5363 New_state(fas, ACTS_UNKNOWN); 5364 TRACE_0(TR_FAC_SCSI_FAS, 5365 TR_FAS_HANDLE_MSG_IN_DONE_PHASEMANAGE_END, 5366 "fas_handle_msg_in_done_end (ACTION_PHASEMANAGE)"); 5367 return (ACTION_PHASEMANAGE); 5368 } 5369 5370 /* 5371 * Note that if f_imsglen is zero, then we are skipping 5372 * input message bytes, so there is no reason to look for 5373 * parity errors. 5374 */ 5375 if (fas->f_imsglen != 0 && (fas->f_stat & FAS_STAT_PERR)) { 5376 fas_log(fas, CE_WARN, msginperr); 5377 sndmsg = MSG_MSG_PARITY; 5378 sp->cmd_pkt->pkt_statistics |= STAT_PERR; 5379 fas_reg_cmd_write(fas, CMD_FLUSH); 5380 5381 } else if ((msgin = fas->f_fifolen) != 1) { 5382 5383 /* 5384 * If we have got more than one or 0 bytes in the fifo, 5385 * that is a gross screwup, and we should let the 5386 * target know that we have completely fouled up. 5387 */ 5388 fas_printf(fas, "fifocount=%x", msgin); 5389 fas_printstate(fas, "input message botch"); 5390 sndmsg = MSG_INITIATOR_ERROR; 5391 fas_reg_cmd_write(fas, CMD_FLUSH); 5392 fas_log(fas, CE_WARN, "input message botch"); 5393 5394 } else if (fas->f_imsglen == 0) { 5395 /* 5396 * If we are in the middle of gobbling up and throwing 5397 * away a message (due to a previous message input 5398 * error), drive on. 5399 */ 5400 msgin = fas_reg_read(fas, 5401 (uchar_t *)&fasreg->fas_fifo_data); 5402 New_state(fas, ACTS_MSG_IN_MORE); 5403 5404 } else { 5405 msgin = fas->f_fifo[0]; 5406 fas->f_imsgarea[fas->f_imsgindex++] = msgin; 5407 } 5408 5409 } else { 5410 /* 5411 * In this case, we have been called (from 5412 * fas_handle_c_cmplt()) with the message 5413 * already stored in the message array. 5414 */ 5415 msgin = fas->f_imsgarea[0]; 5416 } 5417 5418 /* 5419 * Process this message byte (but not if we are 5420 * going to be trying to send back some error 5421 * anyway) 5422 */ 5423 if (sndmsg == 0 && fas->f_imsglen != 0) { 5424 5425 if (fas->f_imsgindex < fas->f_imsglen) { 5426 5427 EPRINTF2("message byte %d: 0x%x\n", 5428 fas->f_imsgindex-1, 5429 fas->f_imsgarea[fas->f_imsgindex-1]); 5430 5431 New_state(fas, ACTS_MSG_IN_MORE); 5432 5433 } else if (fas->f_imsglen == 1) { 5434 5435 #ifdef FAS_TEST 5436 if ((fas_ptest_msgin & (1<<Tgt(sp))) && 5437 fas_ptest_msg == msgin) { 5438 fas_ptest_msgin = 0; 5439 fas_ptest_msg = -1; 5440 fas_assert_atn(fas); 5441 fas->f_stat |= FAS_STAT_PERR; 5442 fas->f_imsgindex -= 1; 5443 if (fas_test_stop > 1) { 5444 debug_enter("ptest msgin"); 5445 } 5446 goto reloop; 5447 } 5448 #endif /* FAS_TEST */ 5449 5450 sndmsg = fas_onebyte_msg(fas); 5451 5452 } else if (fas->f_imsglen == 2) { 5453 #ifdef FAS_TEST 5454 if (fas_ptest_emsgin & (1<<Tgt(sp))) { 5455 fas_ptest_emsgin = 0; 5456 fas_assert_atn(fas); 5457 fas->f_stat |= FAS_STAT_PERR; 5458 fas->f_imsgindex -= 1; 5459 if (fas_test_stop > 1) { 5460 debug_enter("ptest emsgin"); 5461 } 5462 goto reloop; 5463 } 5464 #endif /* FAS_TEST */ 5465 5466 if (fas->f_imsgarea[0] == MSG_EXTENDED) { 5467 static char *tool = 5468 "Extended message 0x%x is too long"; 5469 5470 /* 5471 * Is the incoming message too long 5472 * to be stored in our local array? 5473 */ 5474 if ((int)(msgin+2) > IMSGSIZE) { 5475 fas_log(fas, CE_WARN, 5476 tool, fas->f_imsgarea[0]); 5477 sndmsg = MSG_REJECT; 5478 } else { 5479 fas->f_imsglen = msgin + 2; 5480 New_state(fas, ACTS_MSG_IN_MORE); 5481 } 5482 } else { 5483 sndmsg = fas_twobyte_msg(fas); 5484 } 5485 5486 } else { 5487 sndmsg = fas_multibyte_msg(fas); 5488 } 5489 } 5490 5491 if (sndmsg < 0) { 5492 /* 5493 * If sndmsg is less than zero, one of the subsidiary 5494 * routines needs to return some other state than 5495 * ACTION_RETURN. 5496 */ 5497 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_IN_DONE_SNDMSG_END, 5498 "fas_handle_msg_in_done_end (-sndmsg)"); 5499 return (-sndmsg); 5500 5501 } else if (sndmsg > 0) { 5502 if (IS_1BYTE_MSG(sndmsg)) { 5503 fas->f_omsglen = 1; 5504 } 5505 fas->f_cur_msgout[0] = (uchar_t)sndmsg; 5506 5507 /* 5508 * The target is not guaranteed to go to message out 5509 * phase, period. Moreover, until the entire incoming 5510 * message is transferred, the target may (and likely 5511 * will) continue to transfer message bytes (which 5512 * we will have to ignore). 5513 * 5514 * In order to do this, we'll go to 'infinite' 5515 * message in handling by setting the current input 5516 * message length to a sentinel of zero. 5517 * 5518 * This works regardless of the message we are trying 5519 * to send out. At the point in time which we want 5520 * to send a message in response to an incoming message 5521 * we do not care any more about the incoming message. 5522 * 5523 * If we are sending a message in response to detecting 5524 * a parity error on input, the FAS chip has already 5525 * set ATN* for us, but it doesn't hurt to set it here 5526 * again anyhow. 5527 */ 5528 fas_assert_atn(fas); 5529 New_state(fas, ACTS_MSG_IN_MORE); 5530 fas->f_imsglen = 0; 5531 } 5532 5533 fas_reg_cmd_write(fas, CMD_FLUSH); 5534 5535 fas_reg_cmd_write(fas, CMD_MSG_ACPT); 5536 5537 if ((fas->f_laststate == ACTS_MSG_IN_DONE) && 5538 (fas->f_state == ACTS_CLEARING)) { 5539 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_IN_DONE_ACTION_END, 5540 "fas_handle_msg_in_done_end (action)"); 5541 return (fas_handle_clearing(fas)); 5542 } 5543 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_IN_DONE_RETURN2_END, 5544 "fas_handle_msg_in_done_end (ACTION_RETURN2)"); 5545 return (ACTION_RETURN); 5546 } 5547 5548 static int 5549 fas_onebyte_msg(struct fas *fas) 5550 { 5551 struct fas_cmd *sp = fas->f_current_sp; 5552 int msgout = 0; 5553 uchar_t msgin = fas->f_last_msgin = fas->f_imsgarea[0]; 5554 int tgt = Tgt(sp); 5555 5556 EPRINTF("fas_onebyte_msg\n"); 5557 5558 if (msgin & MSG_IDENTIFY) { 5559 /* 5560 * How did we get here? We should only see identify 5561 * messages on a reconnection, but we'll handle this 5562 * fine here (just in case we get this) as long as 5563 * we believe that this is a valid identify message. 5564 * 5565 * For this to be a valid incoming message, 5566 * bits 6-4 must must be zero. Also, the 5567 * bit that says that I'm an initiator and 5568 * can support disconnection cannot possibly 5569 * be set here. 5570 */ 5571 5572 char garbled = ((msgin & (BAD_IDENTIFY|INI_CAN_DISCON)) != 0); 5573 5574 fas_log(fas, CE_WARN, "%s message 0x%x from Target %d", 5575 garbled ? "Garbled" : "Identify", msgin, tgt); 5576 5577 if (garbled) { 5578 /* 5579 * If it's a garbled message, 5580 * try and tell the target... 5581 */ 5582 msgout = MSG_INITIATOR_ERROR; 5583 } else { 5584 New_state(fas, ACTS_UNKNOWN); 5585 } 5586 return (msgout); 5587 5588 } else if (IS_2BYTE_MSG(msgin) || IS_EXTENDED_MSG(msgin)) { 5589 fas->f_imsglen = 2; 5590 New_state(fas, ACTS_MSG_IN_MORE); 5591 return (0); 5592 } 5593 5594 New_state(fas, ACTS_UNKNOWN); 5595 5596 switch (msgin) { 5597 case MSG_DISCONNECT: 5598 /* 5599 * If we 'cannot' disconnect- reject this message. 5600 * Note that we only key off of the pkt_flags here- 5601 * the FLAG_NODISCON was set in fas_accept_pkt() if 5602 * no disconnect was enabled in scsi_options 5603 */ 5604 if (sp->cmd_pkt_flags & FLAG_NODISCON) { 5605 msgout = MSG_REJECT; 5606 break; 5607 } 5608 /* FALLTHROUGH */ 5609 case MSG_COMMAND_COMPLETE: 5610 fas->f_state = ACTS_CLEARING; 5611 break; 5612 5613 case MSG_NOP: 5614 break; 5615 5616 /* XXX Make it a MSG_REJECT handler */ 5617 case MSG_REJECT: 5618 { 5619 uchar_t reason = 0; 5620 uchar_t lastmsg = fas->f_last_msgout; 5621 /* 5622 * The target is rejecting the last message we sent. 5623 * 5624 * If the last message we attempted to send out was an 5625 * extended message, we were trying to negotiate sync 5626 * xfers- and we're okay. 5627 * 5628 * Otherwise, a target has rejected a message that 5629 * it should have handled. We will abort the operation 5630 * in progress and set the pkt_reason value here to 5631 * show why we have completed. The process of aborting 5632 * may be via a message or may be via a bus reset (as 5633 * a last resort). 5634 */ 5635 msgout = (TAGGED(tgt)? MSG_ABORT_TAG : MSG_ABORT); 5636 5637 switch (lastmsg) { 5638 case MSG_EXTENDED: 5639 if (fas->f_wdtr_sent) { 5640 /* 5641 * Disable wide, Target rejected 5642 * out WDTR message 5643 */ 5644 fas_set_wide_conf3(fas, tgt, 0); 5645 fas->f_nowide |= (1<<tgt); 5646 fas->f_wdtr_sent = 0; 5647 /* 5648 * we still want to negotiate sync 5649 */ 5650 if ((fas->f_nosync & (1<<tgt)) == 0) { 5651 fas_assert_atn(fas); 5652 fas_make_sdtr(fas, 0, tgt); 5653 } 5654 } else if (fas->f_sdtr_sent) { 5655 fas_reg_cmd_write(fas, CMD_CLR_ATN); 5656 fas_revert_to_async(fas, tgt); 5657 fas->f_nosync |= (1<<tgt); 5658 fas->f_sdtr_sent = 0; 5659 } 5660 msgout = 0; 5661 break; 5662 case MSG_NOP: 5663 reason = CMD_NOP_FAIL; 5664 break; 5665 case MSG_INITIATOR_ERROR: 5666 reason = CMD_IDE_FAIL; 5667 break; 5668 case MSG_MSG_PARITY: 5669 reason = CMD_PER_FAIL; 5670 break; 5671 case MSG_REJECT: 5672 reason = CMD_REJECT_FAIL; 5673 break; 5674 /* XXX - abort not good, queue full handling or drain (?) */ 5675 case MSG_SIMPLE_QTAG: 5676 case MSG_ORDERED_QTAG: 5677 case MSG_HEAD_QTAG: 5678 msgout = MSG_ABORT; 5679 reason = CMD_TAG_REJECT; 5680 break; 5681 case MSG_DEVICE_RESET: 5682 reason = CMD_BDR_FAIL; 5683 msgout = -ACTION_ABORT_CURCMD; 5684 break; 5685 case MSG_ABORT: 5686 case MSG_ABORT_TAG: 5687 /* 5688 * If an RESET/ABORT OPERATION message is rejected 5689 * it is time to yank the chain on the bus... 5690 */ 5691 reason = CMD_ABORT_FAIL; 5692 msgout = -ACTION_ABORT_CURCMD; 5693 break; 5694 default: 5695 if (IS_IDENTIFY_MSG(lastmsg)) { 5696 if (TAGGED(tgt)) { 5697 /* 5698 * this often happens when the 5699 * target rejected our tag 5700 */ 5701 reason = CMD_TAG_REJECT; 5702 } else { 5703 reason = CMD_ID_FAIL; 5704 } 5705 } else { 5706 reason = CMD_TRAN_ERR; 5707 msgout = -ACTION_ABORT_CURCMD; 5708 } 5709 5710 break; 5711 } 5712 5713 if (msgout) { 5714 fas_log(fas, CE_WARN, 5715 "Target %d rejects our message '%s'", 5716 tgt, scsi_mname(lastmsg)); 5717 fas_set_pkt_reason(fas, sp, reason, 0); 5718 } 5719 5720 break; 5721 } 5722 case MSG_RESTORE_PTRS: 5723 sp->cmd_cdbp = sp->cmd_pkt->pkt_cdbp; 5724 if (sp->cmd_data_count != sp->cmd_saved_data_count) { 5725 if (fas_restore_pointers(fas, sp)) { 5726 msgout = -ACTION_ABORT_CURCMD; 5727 } else if ((sp->cmd_pkt->pkt_reason & CMD_TRAN_ERR) && 5728 (sp->cmd_pkt->pkt_statistics & STAT_PERR) && 5729 (sp->cmd_cur_win == 0) && 5730 (sp->cmd_data_count == 0)) { 5731 sp->cmd_pkt->pkt_reason &= ~CMD_TRAN_ERR; 5732 } 5733 } 5734 break; 5735 5736 case MSG_SAVE_DATA_PTR: 5737 sp->cmd_saved_data_count = sp->cmd_data_count; 5738 sp->cmd_saved_win = sp->cmd_cur_win; 5739 sp->cmd_saved_cur_addr = sp->cmd_cur_addr; 5740 break; 5741 5742 /* These don't make sense for us, and */ 5743 /* will be rejected */ 5744 /* case MSG_INITIATOR_ERROR */ 5745 /* case MSG_ABORT */ 5746 /* case MSG_MSG_PARITY */ 5747 /* case MSG_DEVICE_RESET */ 5748 default: 5749 msgout = MSG_REJECT; 5750 fas_log(fas, CE_WARN, 5751 "Rejecting message '%s' from Target %d", 5752 scsi_mname(msgin), tgt); 5753 break; 5754 } 5755 5756 EPRINTF1("Message in: %s\n", scsi_mname(msgin)); 5757 5758 return (msgout); 5759 } 5760 5761 /* 5762 * phase handlers that are rarely used 5763 */ 5764 static int 5765 fas_handle_cmd_start(struct fas *fas) 5766 { 5767 struct fas_cmd *sp = fas->f_current_sp; 5768 volatile uchar_t *tp = fas->f_cmdarea; 5769 int i; 5770 int amt = sp->cmd_cdblen; 5771 5772 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_CMD_START_START, 5773 "fas_handle_cmd_start_start"); 5774 EPRINTF("fas_handle_cmd: send cmd\n"); 5775 5776 for (i = 0; i < amt; i++) { 5777 *tp++ = sp->cmd_cdbp[i]; 5778 } 5779 fas_reg_cmd_write(fas, CMD_FLUSH); 5780 5781 FAS_DMA_READ(fas, amt, fas->f_dmacookie.dmac_address, amt, 5782 CMD_TRAN_INFO|CMD_DMA); 5783 fas->f_lastcount = amt; 5784 5785 New_state(fas, ACTS_CMD_DONE); 5786 5787 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_CMD_START_END, 5788 "fas_handle_cmd_start_end"); 5789 return (ACTION_RETURN); 5790 } 5791 5792 static int 5793 fas_handle_cmd_done(struct fas *fas) 5794 { 5795 struct fas_cmd *sp = fas->f_current_sp; 5796 uchar_t intr = fas->f_intr; 5797 volatile struct dma *dmar = fas->f_dma; 5798 5799 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_CMD_DONE_START, 5800 "fas_handle_cmd_done_start"); 5801 EPRINTF("fas_handle_cmd_done\n"); 5802 5803 /* 5804 * We should have gotten a BUS SERVICE interrupt. 5805 * If it isn't that, and it isn't a DISCONNECT 5806 * interrupt, we have a "cannot happen" situation. 5807 */ 5808 if ((intr & FAS_INT_BUS) == 0) { 5809 if ((intr & FAS_INT_DISCON) == 0) { 5810 fas_printstate(fas, "cmd transmission error"); 5811 TRACE_0(TR_FAC_SCSI_FAS, 5812 TR_FAS_HANDLE_CMD_DONE_ABORT1_END, 5813 "fas_handle_cmd_done_end (abort1)"); 5814 return (ACTION_ABORT_CURCMD); 5815 } 5816 } else { 5817 sp->cmd_pkt->pkt_state |= STATE_SENT_CMD; 5818 } 5819 5820 fas->f_dma_csr = fas_dma_reg_read(fas, &dmar->dma_csr); 5821 FAS_FLUSH_DMA(fas); 5822 5823 New_state(fas, ACTS_UNKNOWN); 5824 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_CMD_DONE_END, 5825 "fas_handle_cmd_done_end"); 5826 return (fas_handle_unknown(fas)); 5827 } 5828 5829 /* 5830 * Begin to send a message out 5831 */ 5832 static int 5833 fas_handle_msg_out_start(struct fas *fas) 5834 { 5835 struct fas_cmd *sp = fas->f_current_sp; 5836 uchar_t *msgout = fas->f_cur_msgout; 5837 uchar_t amt = fas->f_omsglen; 5838 5839 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_OUT_START, 5840 "fas_handle_msg_out_start"); 5841 EPRINTF("fas_handle_msg_out_start\n"); 5842 5843 /* 5844 * Check to make *sure* that we are really 5845 * in MESSAGE OUT phase. If the last state 5846 * was ACTS_MSG_OUT_DONE, then we are trying 5847 * to resend a message that the target stated 5848 * had a parity error in it. 5849 * 5850 * If this is the case, and mark completion reason as CMD_NOMSGOUT. 5851 * XXX: Right now, we just *drive* on. Should we abort the command? 5852 */ 5853 if ((fas->f_stat & FAS_PHASE_MASK) != FAS_PHASE_MSG_OUT && 5854 fas->f_laststate == ACTS_MSG_OUT_DONE) { 5855 fas_log(fas, CE_WARN, 5856 "Target %d refused message resend", Tgt(sp)); 5857 fas_set_pkt_reason(fas, sp, CMD_NOMSGOUT, 0); 5858 New_state(fas, ACTS_UNKNOWN); 5859 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_OUT_PHASEMANAGE_END, 5860 "fas_handle_msg_out_end (ACTION_PHASEMANAGE)"); 5861 return (ACTION_PHASEMANAGE); 5862 } 5863 5864 /* 5865 * Clean the fifo. 5866 */ 5867 fas_reg_cmd_write(fas, CMD_FLUSH); 5868 5869 if (amt == 0) { 5870 /* 5871 * no msg to send 5872 */ 5873 *msgout = MSG_NOP; 5874 amt = fas->f_omsglen = 1; 5875 } 5876 5877 /* 5878 * If msg only 1 byte, just dump it in the fifo and go. For 5879 * multi-byte msgs, dma them to save time. If we have no 5880 * msg to send and we're in msg out phase, send a NOP. 5881 */ 5882 fas->f_last_msgout = *msgout; 5883 5884 /* 5885 * There is a bug in the fas366 that occasionaly 5886 * deasserts the ATN signal prematurely when we send 5887 * the sync/wide negotiation bytes out using DMA. The 5888 * workaround here is to send the negotiation bytes out 5889 * using PIO 5890 */ 5891 fas_write_fifo(fas, msgout, fas->f_omsglen, 1); 5892 fas_reg_cmd_write(fas, CMD_TRAN_INFO); 5893 5894 EPRINTF2("amt=%x, last_msgout=%x\n", amt, fas->f_last_msgout); 5895 5896 New_state(fas, ACTS_MSG_OUT_DONE); 5897 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_OUT_END, 5898 "fas_handle_msg_out_end"); 5899 return (ACTION_RETURN); 5900 } 5901 5902 static int 5903 fas_handle_msg_out_done(struct fas *fas) 5904 { 5905 struct fas_cmd *sp = fas->f_current_sp; 5906 uchar_t msgout, phase; 5907 int target = Tgt(sp); 5908 int amt = fas->f_omsglen; 5909 int action; 5910 5911 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_OUT_DONE_START, 5912 "fas_handle_msg_out_done_start"); 5913 msgout = fas->f_cur_msgout[0]; 5914 if ((msgout == MSG_HEAD_QTAG) || (msgout == MSG_SIMPLE_QTAG)) { 5915 msgout = fas->f_cur_msgout[2]; 5916 } 5917 EPRINTF4("msgout: %x %x %x, last_msgout=%x\n", 5918 fas->f_cur_msgout[0], fas->f_cur_msgout[1], 5919 fas->f_cur_msgout[2], fas->f_last_msgout); 5920 5921 EPRINTF1("fas_handle_msgout_done: msgout=%x\n", msgout); 5922 5923 /* 5924 * flush fifo, just in case some bytes were not sent 5925 */ 5926 fas_reg_cmd_write(fas, CMD_FLUSH); 5927 5928 /* 5929 * If the FAS disconnected, then the message we sent caused 5930 * the target to decide to drop BSY* and clear the bus. 5931 */ 5932 if (fas->f_intr == FAS_INT_DISCON) { 5933 if (msgout == MSG_DEVICE_RESET || msgout == MSG_ABORT || 5934 msgout == MSG_ABORT_TAG) { 5935 /* 5936 * If we sent a device reset msg, then we need to do 5937 * a synch negotiate again unless we have already 5938 * inhibited synch. 5939 */ 5940 if (msgout == MSG_ABORT || msgout == MSG_ABORT_TAG) { 5941 fas->f_abort_msg_sent++; 5942 if ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) { 5943 fas_set_pkt_reason(fas, sp, 5944 CMD_ABORTED, STAT_ABORTED); 5945 } 5946 } else if (msgout == MSG_DEVICE_RESET) { 5947 fas->f_reset_msg_sent++; 5948 if ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) { 5949 fas_set_pkt_reason(fas, sp, 5950 CMD_RESET, STAT_DEV_RESET); 5951 } 5952 fas_force_renegotiation(fas, Tgt(sp)); 5953 } 5954 EPRINTF2("Successful %s message to target %d\n", 5955 scsi_mname(msgout), target); 5956 5957 if (sp->cmd_flags & CFLAG_CMDPROXY) { 5958 sp->cmd_cdb[FAS_PROXY_RESULT] = TRUE; 5959 } 5960 TRACE_0(TR_FAC_SCSI_FAS, 5961 TR_FAS_HANDLE_MSG_OUT_DONE_FINISH_END, 5962 "fas_handle_msg_out_done_end (ACTION_FINISH)"); 5963 return (ACTION_FINISH); 5964 } 5965 /* 5966 * If the target dropped busy on any other message, it 5967 * wasn't expected. We will let the code in fas_phasemanage() 5968 * handle this unexpected bus free event. 5969 */ 5970 goto out; 5971 } 5972 5973 /* 5974 * What phase have we transitioned to? 5975 */ 5976 phase = fas->f_stat & FAS_PHASE_MASK; 5977 5978 /* 5979 * If we finish sending a message out, and we are 5980 * still in message out phase, then the target has 5981 * detected one or more parity errors in the message 5982 * we just sent and it is asking us to resend the 5983 * previous message. 5984 */ 5985 if ((fas->f_intr & FAS_INT_BUS) && phase == FAS_PHASE_MSG_OUT) { 5986 /* 5987 * As per SCSI-2 specification, if the message to 5988 * be re-sent is greater than one byte, then we 5989 * have to set ATN*. 5990 */ 5991 if (amt > 1) { 5992 fas_assert_atn(fas); 5993 } 5994 fas_log(fas, CE_WARN, 5995 "SCSI bus MESSAGE OUT phase parity error"); 5996 sp->cmd_pkt->pkt_statistics |= STAT_PERR; 5997 New_state(fas, ACTS_MSG_OUT); 5998 TRACE_0(TR_FAC_SCSI_FAS, 5999 TR_FAS_HANDLE_MSG_OUT_DONE_PHASEMANAGE_END, 6000 "fas_handle_msg_out_done_end (ACTION_PHASEMANAGE)"); 6001 return (ACTION_PHASEMANAGE); 6002 } 6003 6004 6005 out: 6006 fas->f_last_msgout = msgout; 6007 fas->f_omsglen = 0; 6008 New_state(fas, ACTS_UNKNOWN); 6009 action = fas_handle_unknown(fas); 6010 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_HANDLE_MSG_OUT_DONE_END, 6011 "fas_handle_msg_out_done_end"); 6012 return (action); 6013 } 6014 6015 static int 6016 fas_twobyte_msg(struct fas *fas) 6017 { 6018 struct fas_cmd *sp = fas->f_current_sp; 6019 6020 if ((fas->f_imsgarea[0] == MSG_IGNORE_WIDE_RESID) && 6021 (fas->f_imsgarea[1] == 1)) { 6022 int xfer_amt; 6023 6024 /* 6025 * Knock off one byte if there 6026 * is a last transfer and is even number of bytes 6027 */ 6028 xfer_amt = sp->cmd_data_count - sp->cmd_saved_data_count; 6029 if (xfer_amt && (!(xfer_amt & 1))) { 6030 ASSERT(sp->cmd_data_count > 0); 6031 sp->cmd_data_count--; 6032 sp->cmd_cur_addr--; 6033 } 6034 IPRINTF1("ignore wide resid %d\n", fas->f_imsgarea[1]); 6035 New_state(fas, ACTS_UNKNOWN); 6036 return (0); 6037 } 6038 6039 fas_log(fas, CE_WARN, 6040 "Two byte message '%s' 0x%x rejected", 6041 scsi_mname(fas->f_imsgarea[0]), fas->f_imsgarea[1]); 6042 return (MSG_REJECT); 6043 } 6044 6045 /* 6046 * handle receiving extended messages 6047 */ 6048 static int 6049 fas_multibyte_msg(struct fas *fas) 6050 { 6051 #ifdef FASDEBUG 6052 static char *mbs = 6053 "Target %d now Synchronous at %d.%d MB/s max transmit rate\n"; 6054 static char *mbs1 = 6055 "Target %d now Synchronous at %d.0%d MB/s max transmit rate\n"; 6056 static char *mbs2 = 6057 "Target %d now Synchronous at %d.00%d MB/s max transmit rate\n"; 6058 #endif 6059 struct fas_cmd *sp = fas->f_current_sp; 6060 volatile struct fasreg *fasreg = fas->f_reg; 6061 uchar_t emsg = fas->f_imsgarea[2]; 6062 int tgt = Tgt(sp); 6063 int msgout = 0; 6064 6065 EPRINTF("fas_multibyte_msg:\n"); 6066 6067 if (emsg == MSG_SYNCHRONOUS) { 6068 uint_t period, offset, regval; 6069 uint_t minsync, maxsync, clockval; 6070 uint_t xfer_freq, xfer_div, xfer_mod, xfer_rate; 6071 6072 period = fas->f_imsgarea[3] & 0xff; 6073 offset = fas->f_imsgarea[4] & 0xff; 6074 minsync = MIN_SYNC_PERIOD(fas); 6075 maxsync = MAX_SYNC_PERIOD(fas); 6076 DPRINTF5("sync msg received: %x %x %x %x %x\n", 6077 fas->f_imsgarea[0], fas->f_imsgarea[1], 6078 fas->f_imsgarea[2], fas->f_imsgarea[3], 6079 fas->f_imsgarea[4]); 6080 DPRINTF3("received period %d offset %d from tgt %d\n", 6081 period, offset, tgt); 6082 DPRINTF3("calculated minsync %d, maxsync %d for tgt %d\n", 6083 minsync, maxsync, tgt); 6084 DPRINTF2("sync period %d, neg period %d\n", 6085 fas->f_sync_period[tgt], fas->f_neg_period[tgt]); 6086 6087 if ((++(fas->f_sdtr_sent)) & 1) { 6088 /* 6089 * In cases where the target negotiates synchronous 6090 * mode before we do, and we either have sync mode 6091 * disabled, or this target is known to be a weak 6092 * signal target, we send back a message indicating 6093 * a desire to stay in asynchronous mode (the SCSI-2 6094 * spec states that if we have synchronous capability 6095 * then we cannot reject a SYNCHRONOUS DATA TRANSFER 6096 * REQUEST message). 6097 */ 6098 IPRINTF1("SYNC negotiation initiated by target %d\n", 6099 tgt); 6100 6101 msgout = MSG_EXTENDED; 6102 6103 period = 6104 period ? max(period, MIN_SYNC_PERIOD(fas)) : 0; 6105 6106 if (fas->f_backoff & (1<<tgt)) { 6107 period = period ? 6108 max(period, fas->f_neg_period[tgt]) : 0; 6109 } 6110 offset = min(offset, fas_default_offset); 6111 } 6112 xfer_freq = regval = 0; 6113 6114 /* 6115 * If the target's offset is bigger than ours, 6116 * the target has violated the scsi protocol. 6117 */ 6118 if (offset > fas_default_offset) { 6119 period = offset = 0; 6120 msgout = MSG_REJECT; 6121 } 6122 6123 if (offset && (period > maxsync)) { 6124 /* 6125 * We cannot transmit data in synchronous 6126 * mode this slow, so convert to asynchronous 6127 * mode. 6128 */ 6129 msgout = MSG_EXTENDED; 6130 period = offset = 0; 6131 6132 } else if (offset && (period < minsync)) { 6133 /* 6134 * If the target's period is less than ours, 6135 * the target has violated the scsi protocol. 6136 */ 6137 period = offset = 0; 6138 msgout = MSG_REJECT; 6139 6140 } else if (offset) { 6141 /* 6142 * Conversion method for received PERIOD value 6143 * to the number of input clock ticks to the FAS. 6144 * 6145 * We adjust the input period value such that 6146 * we always will transmit data *not* faster 6147 * than the period value received. 6148 */ 6149 6150 clockval = fas->f_clock_cycle / 1000; 6151 regval = (((period << 2) + clockval - 1) / clockval); 6152 6153 /* 6154 * correction if xfer rate <= 5MB/sec 6155 * XXX do we need this? 6156 */ 6157 if (regval && (period >= FASTSCSI_THRESHOLD)) { 6158 regval--; 6159 } 6160 } 6161 6162 fas->f_offset[tgt] = offset; 6163 fas->f_neg_period[tgt] = period; 6164 6165 /* 6166 * Is is now safe to produce a responce to a target 6167 * initiated sdtr. period and offset have been checked. 6168 */ 6169 if (msgout == MSG_EXTENDED) { 6170 fas_make_sdtr(fas, 0, tgt); 6171 period = fas->f_neg_period[tgt]; 6172 offset = (fas->f_offset[tgt] & 0xf); 6173 } 6174 6175 if (offset) { 6176 fas->f_sync_period[tgt] = regval & SYNC_PERIOD_MASK; 6177 fas_reg_write(fas, (uchar_t *)&fasreg->fas_sync_period, 6178 fas->f_sync_period[tgt]); 6179 6180 fas->f_offset[tgt] = offset | fas->f_req_ack_delay; 6181 fas_reg_write(fas, (uchar_t *)&fasreg->fas_sync_offset, 6182 fas->f_offset[tgt]); 6183 6184 /* 6185 * if transferring > 5 MB/sec then enable 6186 * fastscsi in conf3 6187 */ 6188 if (period < FASTSCSI_THRESHOLD) { 6189 fas->f_fasconf3[tgt] |= FAS_CONF3_FASTSCSI; 6190 } else { 6191 fas->f_fasconf3[tgt] &= ~FAS_CONF3_FASTSCSI; 6192 } 6193 6194 fas_reg_write(fas, (uchar_t *)&fasreg->fas_conf3, 6195 fas->f_fasconf3[tgt]); 6196 6197 DPRINTF4("period %d (%d), offset %d to tgt %d\n", 6198 period, 6199 fas->f_sync_period[tgt] & SYNC_PERIOD_MASK, 6200 fas->f_offset[tgt] & 0xf, tgt); 6201 DPRINTF1("req/ack delay = %x\n", fas->f_req_ack_delay); 6202 DPRINTF1("conf3 = %x\n", fas->f_fasconf3[tgt]); 6203 #ifdef FASDEBUG 6204 /* 6205 * Convert input clock cycle per 6206 * byte to nanoseconds per byte. 6207 * (ns/b), and convert that to 6208 * k-bytes/second. 6209 */ 6210 xfer_freq = FAS_SYNC_KBPS((regval * 6211 fas->f_clock_cycle) / 1000); 6212 xfer_rate = ((fas->f_nowide & (1<<tgt))? 1 : 2) * 6213 xfer_freq; 6214 xfer_div = xfer_rate / 1000; 6215 xfer_mod = xfer_rate % 1000; 6216 6217 6218 if (xfer_mod > 99) { 6219 IPRINTF3(mbs, tgt, xfer_div, xfer_mod); 6220 } else if (xfer_mod > 9) { 6221 IPRINTF3(mbs1, tgt, xfer_div, xfer_mod); 6222 } else { 6223 IPRINTF3(mbs2, tgt, xfer_div, xfer_mod); 6224 } 6225 #endif 6226 fas->f_sync_enabled |= (1<<tgt); 6227 6228 } else { 6229 /* 6230 * We are converting back to async mode. 6231 */ 6232 fas_revert_to_async(fas, tgt); 6233 } 6234 6235 /* 6236 * If this target violated the scsi spec, reject the 6237 * sdtr msg and don't negotiate sdtr again. 6238 */ 6239 if (msgout == MSG_REJECT) { 6240 fas->f_nosync |= (1<<tgt); 6241 } 6242 6243 fas->f_props_update |= (1<<tgt); 6244 6245 } else if (emsg == MSG_WIDE_DATA_XFER) { 6246 uchar_t width = fas->f_imsgarea[3] & 0xff; 6247 6248 DPRINTF4("wide msg received: %x %x %x %x\n", 6249 fas->f_imsgarea[0], fas->f_imsgarea[1], 6250 fas->f_imsgarea[2], fas->f_imsgarea[3]); 6251 6252 /* always renegotiate sync after wide */ 6253 msgout = MSG_EXTENDED; 6254 6255 if ((++(fas->f_wdtr_sent)) & 1) { 6256 IPRINTF1("Wide negotiation initiated by target %d\n", 6257 tgt); 6258 /* 6259 * allow wide neg even if the target driver hasn't 6260 * enabled wide yet. 6261 */ 6262 fas->f_nowide &= ~(1<<tgt); 6263 fas_make_wdtr(fas, 0, tgt, width); 6264 IPRINTF1("sending wide sync %d back\n", width); 6265 /* 6266 * Let us go back to async mode(SCSI spec) 6267 * and depend on target to do sync 6268 * after wide negotiations. 6269 * If target does not do a sync neg and enters 6270 * async mode we will negotiate sync on next command 6271 */ 6272 fas_revert_to_async(fas, tgt); 6273 fas->f_sync_known &= ~(1<<tgt); 6274 } else { 6275 /* 6276 * renegotiate sync after wide 6277 */ 6278 fas_set_wide_conf3(fas, tgt, width); 6279 ASSERT(width <= 1); 6280 fas->f_wdtr_sent = 0; 6281 if ((fas->f_nosync & (1<<tgt)) == 0) { 6282 fas_make_sdtr(fas, 0, tgt); 6283 } else { 6284 msgout = 0; 6285 } 6286 } 6287 6288 fas->f_props_update |= (1<<tgt); 6289 6290 } else if (emsg == MSG_MODIFY_DATA_PTR) { 6291 msgout = MSG_REJECT; 6292 } else { 6293 fas_log(fas, CE_WARN, 6294 "Rejecting message %s 0x%x from Target %d", 6295 scsi_mname(MSG_EXTENDED), emsg, tgt); 6296 msgout = MSG_REJECT; 6297 } 6298 out: 6299 New_state(fas, ACTS_UNKNOWN); 6300 return (msgout); 6301 } 6302 6303 /* 6304 * Back off sync negotiation 6305 * and got to async mode 6306 */ 6307 static void 6308 fas_revert_to_async(struct fas *fas, int tgt) 6309 { 6310 volatile struct fasreg *fasreg = fas->f_reg; 6311 6312 fas->f_sync_period[tgt] = 0; 6313 fas_reg_write(fas, (uchar_t *)&fasreg->fas_sync_period, 0); 6314 fas->f_offset[tgt] = 0; 6315 fas_reg_write(fas, (uchar_t *)&fasreg->fas_sync_offset, 0); 6316 fas->f_fasconf3[tgt] &= ~FAS_CONF3_FASTSCSI; 6317 fas_reg_write(fas, &fasreg->fas_conf3, fas->f_fasconf3[tgt]); 6318 fas->f_sync_enabled &= ~(1<<tgt); 6319 } 6320 6321 /* 6322 * handle an unexpected selection attempt 6323 * XXX look for better way: msg reject, drop off the bus 6324 */ 6325 static int 6326 fas_handle_selection(struct fas *fas) 6327 { 6328 fas_reg_cmd_write(fas, CMD_DISCONNECT); 6329 fas_reg_cmd_write(fas, CMD_FLUSH); 6330 fas_reg_cmd_write(fas, CMD_EN_RESEL); 6331 return (ACTION_RETURN); 6332 } 6333 6334 /* 6335 * dma window handling 6336 */ 6337 static int 6338 fas_restore_pointers(struct fas *fas, struct fas_cmd *sp) 6339 { 6340 if (sp->cmd_data_count != sp->cmd_saved_data_count) { 6341 sp->cmd_data_count = sp->cmd_saved_data_count; 6342 sp->cmd_cur_addr = sp->cmd_saved_cur_addr; 6343 6344 if (sp->cmd_cur_win != sp->cmd_saved_win) { 6345 sp->cmd_cur_win = sp->cmd_saved_win; 6346 if (fas_set_new_window(fas, sp)) { 6347 return (-1); 6348 } 6349 } 6350 DPRINTF1("curaddr=%x\n", sp->cmd_cur_addr); 6351 } 6352 return (0); 6353 } 6354 6355 static int 6356 fas_set_new_window(struct fas *fas, struct fas_cmd *sp) 6357 { 6358 off_t offset; 6359 size_t len; 6360 uint_t count; 6361 6362 if (ddi_dma_getwin(sp->cmd_dmahandle, sp->cmd_cur_win, 6363 &offset, &len, &sp->cmd_dmacookie, &count) != DDI_SUCCESS) { 6364 return (-1); 6365 } 6366 6367 DPRINTF4("new window %x: off=%lx, len=%lx, count=%x\n", 6368 sp->cmd_cur_win, offset, len, count); 6369 6370 ASSERT(count == 1); 6371 return (0); 6372 } 6373 6374 static int 6375 fas_next_window(struct fas *fas, struct fas_cmd *sp, uint64_t end) 6376 { 6377 6378 /* are there more windows? */ 6379 if (sp->cmd_nwin == 0) { 6380 uint_t nwin = 0; 6381 (void) ddi_dma_numwin(sp->cmd_dmahandle, &nwin); 6382 sp->cmd_nwin = (uchar_t)nwin; 6383 } 6384 6385 DPRINTF5( 6386 "cmd_data_count=%x, dmacount=%x, curaddr=%x, end=%lx, nwin=%x\n", 6387 sp->cmd_data_count, sp->cmd_dmacount, sp->cmd_cur_addr, end, 6388 sp->cmd_nwin); 6389 6390 if (sp->cmd_cur_win < sp->cmd_nwin) { 6391 sp->cmd_cur_win++; 6392 if (fas_set_new_window(fas, sp)) { 6393 fas_printstate(fas, "cannot set new window"); 6394 sp->cmd_cur_win--; 6395 return (-1); 6396 } 6397 /* 6398 * if there are no more windows, we have a data overrun condition 6399 */ 6400 } else { 6401 int slot = sp->cmd_slot; 6402 6403 fas_printstate(fas, "data transfer overrun"); 6404 fas_set_pkt_reason(fas, sp, CMD_DATA_OVR, 0); 6405 6406 /* 6407 * if we get data transfer overruns, assume we have 6408 * a weak scsi bus. Note that this won't catch consistent 6409 * underruns or other noise related syndromes. 6410 */ 6411 fas_sync_wide_backoff(fas, sp, slot); 6412 return (-1); 6413 } 6414 sp->cmd_cur_addr = sp->cmd_dmacookie.dmac_address; 6415 DPRINTF1("cur_addr=%x\n", sp->cmd_cur_addr); 6416 return (0); 6417 } 6418 6419 /* 6420 * dma error handler 6421 */ 6422 static int 6423 fas_check_dma_error(struct fas *fas) 6424 { 6425 /* 6426 * was there a dma error that caused fas_intr_svc() to be called? 6427 */ 6428 if (fas->f_dma->dma_csr & DMA_ERRPEND) { 6429 /* 6430 * It would be desirable to set the ATN* line and attempt to 6431 * do the whole schmear of INITIATOR DETECTED ERROR here, 6432 * but that is too hard to do at present. 6433 */ 6434 fas_log(fas, CE_WARN, "Unrecoverable DMA error"); 6435 fas_printstate(fas, "dma error"); 6436 fas_set_pkt_reason(fas, fas->f_current_sp, CMD_TRAN_ERR, 0); 6437 return (-1); 6438 } 6439 return (0); 6440 } 6441 6442 /* 6443 * check for gross error or spurious interrupt 6444 */ 6445 static int 6446 fas_handle_gross_err(struct fas *fas) 6447 { 6448 volatile struct fasreg *fasreg = fas->f_reg; 6449 6450 fas_log(fas, CE_WARN, 6451 "gross error in fas status (%x)", fas->f_stat); 6452 6453 IPRINTF5("fas_cmd=%x, stat=%x, intr=%x, step=%x, fifoflag=%x\n", 6454 fasreg->fas_cmd, fas->f_stat, fas->f_intr, fasreg->fas_step, 6455 fasreg->fas_fifo_flag); 6456 6457 fas_set_pkt_reason(fas, fas->f_current_sp, CMD_TRAN_ERR, 0); 6458 6459 fas_internal_reset(fas, FAS_RESET_FAS); 6460 return (ACTION_RESET); 6461 } 6462 6463 6464 /* 6465 * handle illegal cmd interrupt or (external) bus reset cleanup 6466 */ 6467 static int 6468 fas_illegal_cmd_or_bus_reset(struct fas *fas) 6469 { 6470 /* 6471 * If we detect a SCSI reset, we blow away the current 6472 * command (if there is one) and all disconnected commands 6473 * because we now don't know the state of them at all. 6474 */ 6475 ASSERT(fas->f_intr & (FAS_INT_ILLEGAL | FAS_INT_RESET)); 6476 6477 if (fas->f_intr & FAS_INT_RESET) { 6478 return (ACTION_FINRST); 6479 } 6480 6481 /* 6482 * Illegal cmd to fas: 6483 * This should not happen. The one situation where 6484 * we can get an ILLEGAL COMMAND interrupt is due to 6485 * a bug in the FAS366 during reselection which we 6486 * should be handling in fas_reconnect(). 6487 */ 6488 if (fas->f_intr & FAS_INT_ILLEGAL) { 6489 IPRINTF1("lastcmd=%x\n", fas->f_reg->fas_cmd); 6490 fas_printstate(fas, "ILLEGAL bit set"); 6491 return (ACTION_RESET); 6492 } 6493 /*NOTREACHED*/ 6494 return (ACTION_RETURN); 6495 } 6496 6497 /* 6498 * set throttles for all luns of this target 6499 */ 6500 static void 6501 fas_set_throttles(struct fas *fas, int slot, int n, int what) 6502 { 6503 int i; 6504 6505 /* 6506 * if the bus is draining/quiesced, no changes to the throttles 6507 * are allowed. Not allowing change of throttles during draining 6508 * limits error recovery but will reduce draining time 6509 * 6510 * all throttles should have been set to HOLD_THROTTLE 6511 */ 6512 if (fas->f_softstate & (FAS_SS_QUIESCED | FAS_SS_DRAINING)) { 6513 return; 6514 } 6515 6516 ASSERT((n == 1) || (n == N_SLOTS) || (n == NLUNS_PER_TARGET)); 6517 ASSERT((slot + n) <= N_SLOTS); 6518 if (n == NLUNS_PER_TARGET) { 6519 slot &= ~(NLUNS_PER_TARGET - 1); 6520 } 6521 6522 for (i = slot; i < (slot + n); i++) { 6523 if (what == HOLD_THROTTLE) { 6524 fas->f_throttle[i] = HOLD_THROTTLE; 6525 } else if ((fas->f_reset_delay[i/NLUNS_PER_TARGET]) == 0) { 6526 if (what == MAX_THROTTLE) { 6527 int tshift = 1 << (i/NLUNS_PER_TARGET); 6528 fas->f_throttle[i] = (short) 6529 ((fas->f_notag & tshift)? 1 : what); 6530 } else { 6531 fas->f_throttle[i] = what; 6532 } 6533 } 6534 } 6535 } 6536 6537 static void 6538 fas_set_all_lun_throttles(struct fas *fas, int slot, int what) 6539 { 6540 /* 6541 * fas_set_throttle will adjust slot to starting at LUN 0 6542 */ 6543 fas_set_throttles(fas, slot, NLUNS_PER_TARGET, what); 6544 } 6545 6546 static void 6547 fas_full_throttle(struct fas *fas, int slot) 6548 { 6549 fas_set_throttles(fas, slot, 1, MAX_THROTTLE); 6550 } 6551 6552 /* 6553 * run a polled cmd 6554 */ 6555 static void 6556 fas_runpoll(struct fas *fas, short slot, struct fas_cmd *sp) 6557 { 6558 int limit, i, n; 6559 int timeout = 0; 6560 6561 DPRINTF4("runpoll: slot=%x, cmd=%x, current_sp=0x%p, tcmds=%x\n", 6562 slot, *((uchar_t *)sp->cmd_pkt->pkt_cdbp), 6563 (void *)fas->f_current_sp, fas->f_tcmds[slot]); 6564 6565 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_RUNPOLL_START, "fas_runpoll_start"); 6566 6567 /* 6568 * wait for cmd to complete 6569 * don't start new cmds so set throttles to HOLD_THROTTLE 6570 */ 6571 while ((sp->cmd_flags & CFLAG_COMPLETED) == 0) { 6572 if (!(sp->cmd_flags & CFLAG_CMDPROXY)) { 6573 fas_set_all_lun_throttles(fas, slot, HOLD_THROTTLE); 6574 } 6575 if ((fas->f_state != STATE_FREE) || INTPENDING(fas)) { 6576 if (fas_dopoll(fas, POLL_TIMEOUT) <= 0) { 6577 IPRINTF("runpoll: timeout on draining\n"); 6578 goto bad; 6579 } 6580 } 6581 6582 ASSERT(fas->f_state == STATE_FREE); 6583 ASSERT(fas->f_current_sp == NULL); 6584 6585 /* 6586 * if this is not a proxy cmd, don't start the cmd 6587 * without draining the active cmd(s) 6588 * for proxy cmds, we zap the active cmd and assume 6589 * that the caller will take care of this 6590 * For tagged cmds, wait with submitting a non-tagged 6591 * cmd until the queue has been drained 6592 * If the cmd is a request sense, then draining won't 6593 * help since we are in contingence allegiance condition 6594 */ 6595 if (!(sp->cmd_flags & CFLAG_CMDPROXY)) { 6596 uchar_t *cmdp = (uchar_t *)sp->cmd_pkt->pkt_cdbp; 6597 6598 if ((fas->f_tcmds[slot]) && 6599 (NOTAG(Tgt(sp)) || 6600 (((sp->cmd_pkt_flags & FLAG_TAGMASK) == 0) && 6601 (*cmdp != SCMD_REQUEST_SENSE)))) { 6602 if (timeout < POLL_TIMEOUT) { 6603 timeout += 100; 6604 drv_usecwait(100); 6605 continue; 6606 } else { 6607 fas_log(fas, CE_WARN, 6608 "polled cmd failed (target busy)"); 6609 goto cleanup; 6610 } 6611 } 6612 } 6613 6614 /* 6615 * If the draining of active commands killed the 6616 * the current polled command, we're done.. 6617 */ 6618 if (sp->cmd_flags & CFLAG_COMPLETED) { 6619 break; 6620 } 6621 6622 /* 6623 * ensure we are not accessing a target too quickly 6624 * after a reset. the throttles get set back later 6625 * by the reset delay watch; hopefully, we don't go 6626 * thru this loop more than once 6627 */ 6628 if (fas->f_reset_delay[slot/NLUNS_PER_TARGET]) { 6629 IPRINTF1("reset delay set for slot %x\n", slot); 6630 drv_usecwait(fas->f_scsi_reset_delay * 1000); 6631 for (i = 0; i < NTARGETS_WIDE; i++) { 6632 if (fas->f_reset_delay[i]) { 6633 int s = i * NLUNS_PER_TARGET; 6634 int e = s + NLUNS_PER_TARGET; 6635 fas->f_reset_delay[i] = 0; 6636 for (; s < e; s++) { 6637 fas_full_throttle(fas, s); 6638 } 6639 } 6640 } 6641 } 6642 6643 /* 6644 * fas_startcmd() will return false if preempted 6645 * or draining 6646 */ 6647 if (fas_startcmd(fas, sp) != TRUE) { 6648 IPRINTF("runpoll: cannot start new cmds\n"); 6649 ASSERT(fas->f_current_sp != sp); 6650 continue; 6651 } 6652 6653 /* 6654 * We're now 'running' this command. 6655 * 6656 * fas_dopoll will always return when 6657 * fas->f_state is STATE_FREE, and 6658 */ 6659 limit = sp->cmd_pkt->pkt_time * 1000000; 6660 if (limit == 0) { 6661 limit = POLL_TIMEOUT; 6662 } 6663 6664 /* 6665 * if the cmd disconnected, the first call to fas_dopoll 6666 * will return with bus free; we go thru the loop one more 6667 * time and wait limit usec for the target to reconnect 6668 */ 6669 for (i = 0; i <= POLL_TIMEOUT; i += 100) { 6670 6671 if ((n = fas_dopoll(fas, limit)) <= 0) { 6672 IPRINTF("runpoll: timeout on polling\n"); 6673 goto bad; 6674 } 6675 6676 /* 6677 * If a preemption occurred that caused this 6678 * command to actually not start, go around 6679 * the loop again. If CFLAG_COMPLETED is set, the 6680 * command completed 6681 */ 6682 if ((sp->cmd_flags & CFLAG_COMPLETED) || 6683 (sp->cmd_pkt->pkt_state == 0)) { 6684 break; 6685 } 6686 6687 /* 6688 * the bus may have gone free because the target 6689 * disconnected; go thru the loop again 6690 */ 6691 ASSERT(fas->f_state == STATE_FREE); 6692 if (n == 0) { 6693 /* 6694 * bump i, we have waited limit usecs in 6695 * fas_dopoll 6696 */ 6697 i += limit - 100; 6698 } 6699 } 6700 6701 if ((sp->cmd_flags & CFLAG_COMPLETED) == 0) { 6702 6703 if (i > POLL_TIMEOUT) { 6704 IPRINTF("polled timeout on disc. cmd\n"); 6705 goto bad; 6706 } 6707 6708 if (sp->cmd_pkt->pkt_state) { 6709 /* 6710 * don't go thru the loop again; the cmd 6711 * was already started 6712 */ 6713 IPRINTF("fas_runpoll: cmd started??\n"); 6714 goto bad; 6715 } 6716 } 6717 } 6718 6719 /* 6720 * blindly restore throttles which is preferable over 6721 * leaving throttle hanging at 0 and noone to clear it 6722 */ 6723 if (!(sp->cmd_flags & CFLAG_CMDPROXY)) { 6724 fas_set_all_lun_throttles(fas, slot, MAX_THROTTLE); 6725 } 6726 6727 /* 6728 * ensure that the cmd is completely removed 6729 */ 6730 fas_remove_cmd(fas, sp, 0); 6731 6732 /* 6733 * If we stored up commands to do, start them off now. 6734 */ 6735 if ((fas->f_state == STATE_FREE) && 6736 (!(sp->cmd_flags & CFLAG_CMDPROXY))) { 6737 (void) fas_ustart(fas); 6738 } 6739 exit: 6740 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_RUNPOLL_END, "fas_runpoll_end"); 6741 return; 6742 6743 bad: 6744 fas_log(fas, CE_WARN, "Polled cmd failed"); 6745 #ifdef FASDEBUG 6746 fas_printstate(fas, "fas_runpoll: polled cmd failed"); 6747 #endif /* FASDEBUG */ 6748 6749 cleanup: 6750 fas_set_all_lun_throttles(fas, slot, MAX_THROTTLE); 6751 6752 /* 6753 * clean up all traces of this sp because fas_runpoll will return 6754 * before fas_reset_recovery() cleans up 6755 */ 6756 fas_remove_cmd(fas, sp, NEW_TIMEOUT); 6757 fas_decrement_ncmds(fas, sp); 6758 fas_set_pkt_reason(fas, sp, CMD_TRAN_ERR, 0); 6759 6760 if ((sp->cmd_flags & CFLAG_CMDPROXY) == 0) { 6761 (void) fas_reset_bus(fas); 6762 } 6763 goto exit; 6764 } 6765 6766 /* 6767 * Poll for command completion (i.e., no interrupts) 6768 * limit is in usec (and will not be very accurate) 6769 * 6770 * the assumption is that we only run polled cmds in interrupt context 6771 * as scsi_transport will filter out FLAG_NOINTR 6772 */ 6773 static int 6774 fas_dopoll(struct fas *fas, int limit) 6775 { 6776 int i, n; 6777 6778 /* 6779 * timeout is not very accurate since we don't know how 6780 * long the poll takes 6781 * also if the packet gets started fairly late, we may 6782 * timeout prematurely 6783 * fas_dopoll always returns if e_state transitions to STATE_FREE 6784 */ 6785 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_DOPOLL_START, "fas_dopoll_start"); 6786 6787 if (limit == 0) { 6788 limit = POLL_TIMEOUT; 6789 } 6790 6791 for (n = i = 0; i < limit; i += 100) { 6792 if (INTPENDING(fas)) { 6793 fas->f_polled_intr = 1; 6794 n++; 6795 (void) fas_intr_svc(fas); 6796 if (fas->f_state == STATE_FREE) 6797 break; 6798 } 6799 drv_usecwait(100); 6800 } 6801 6802 if (i >= limit && fas->f_state != STATE_FREE) { 6803 fas_printstate(fas, "polled command timeout"); 6804 n = -1; 6805 } 6806 TRACE_1(TR_FAC_SCSI_FAS, TR_FAS_DOPOLL_END, 6807 "fas_dopoll_end: rval %x", n); 6808 return (n); 6809 } 6810 6811 /* 6812 * prepare a sync negotiation message 6813 */ 6814 static void 6815 fas_make_sdtr(struct fas *fas, int msgout_offset, int target) 6816 { 6817 uchar_t *p = fas->f_cur_msgout + msgout_offset; 6818 ushort_t tshift = 1<<target; 6819 uchar_t period = MIN_SYNC_PERIOD(fas); 6820 uchar_t offset = fas_default_offset; 6821 6822 /* 6823 * If this target experienced a sync backoff use the 6824 * target's sync speed that was adjusted in 6825 * fas_sync_wide_backoff. For second sync backoff, 6826 * offset will be ajusted below in sanity checks. 6827 */ 6828 if (fas->f_backoff & tshift) { 6829 period = fas->f_neg_period[target]; 6830 } 6831 6832 /* 6833 * If this is a responce to a target initiated sdtr, 6834 * use the agreed upon values. 6835 */ 6836 if (fas->f_sdtr_sent & 1) { 6837 period = fas->f_neg_period[target]; 6838 offset = fas->f_offset[target]; 6839 } 6840 6841 /* 6842 * If the target driver disabled 6843 * sync then make offset = 0 6844 */ 6845 if (fas->f_force_async & tshift) { 6846 offset = 0; 6847 } 6848 6849 /* 6850 * sanity check of period and offset 6851 */ 6852 if (fas->f_target_scsi_options[target] & SCSI_OPTIONS_FAST) { 6853 if (period < (uchar_t)(DEFAULT_FASTSYNC_PERIOD/4)) { 6854 period = (uchar_t)(DEFAULT_FASTSYNC_PERIOD/4); 6855 } 6856 } else if (fas->f_target_scsi_options[target] & SCSI_OPTIONS_SYNC) { 6857 if (period < (uchar_t)(DEFAULT_SYNC_PERIOD/4)) { 6858 period = (uchar_t)(DEFAULT_SYNC_PERIOD/4); 6859 } 6860 } else { 6861 fas->f_nosync |= tshift; 6862 } 6863 6864 if (fas->f_nosync & tshift) { 6865 offset = 0; 6866 } 6867 6868 if ((uchar_t)(offset & 0xf) > fas_default_offset) { 6869 offset = fas_default_offset | fas->f_req_ack_delay; 6870 } 6871 6872 fas->f_neg_period[target] = (uchar_t)period; 6873 fas->f_offset[target] = (uchar_t)offset; 6874 6875 *p++ = (uchar_t)MSG_EXTENDED; 6876 *p++ = (uchar_t)3; 6877 *p++ = (uchar_t)MSG_SYNCHRONOUS; 6878 *p++ = period; 6879 *p++ = offset & 0xf; 6880 fas->f_omsglen = 5 + msgout_offset; 6881 6882 IPRINTF2("fas_make_sdtr: period = %x, offset = %x\n", 6883 period, offset); 6884 /* 6885 * increment sdtr flag, odd value indicates that we initiated 6886 * the negotiation 6887 */ 6888 fas->f_sdtr_sent++; 6889 6890 /* 6891 * the target may reject the optional sync message so 6892 * to avoid negotiating on every cmd, set sync known here 6893 * we should not negotiate wide after sync again 6894 */ 6895 fas->f_sync_known |= 1<<target; 6896 fas->f_wide_known |= 1<<target; 6897 } 6898 6899 /* 6900 * prepare a wide negotiation message 6901 */ 6902 static void 6903 fas_make_wdtr(struct fas *fas, int msgout_offset, int target, int width) 6904 { 6905 uchar_t *p = fas->f_cur_msgout + msgout_offset; 6906 6907 if (((fas->f_target_scsi_options[target] & SCSI_OPTIONS_WIDE) == 0) || 6908 (fas->f_nowide & (1<<target))) { 6909 fas->f_nowide |= 1<<target; 6910 width = 0; 6911 } 6912 if (fas->f_force_narrow & (1<<target)) { 6913 width = 0; 6914 } 6915 width = min(FAS_XFER_WIDTH, width); 6916 6917 *p++ = (uchar_t)MSG_EXTENDED; 6918 *p++ = (uchar_t)2; 6919 *p++ = (uchar_t)MSG_WIDE_DATA_XFER; 6920 *p++ = (uchar_t)width; 6921 fas->f_omsglen = 4 + msgout_offset; 6922 IPRINTF1("fas_make_wdtr: width=%x\n", width); 6923 6924 /* 6925 * increment wdtr flag, odd value indicates that we initiated 6926 * the negotiation 6927 */ 6928 fas->f_wdtr_sent++; 6929 6930 /* 6931 * the target may reject the optional wide message so 6932 * to avoid negotiating on every cmd, set wide known here 6933 */ 6934 fas->f_wide_known |= 1<<target; 6935 6936 fas_set_wide_conf3(fas, target, width); 6937 } 6938 6939 /* 6940 * auto request sense support 6941 * create or destroy an auto request sense packet 6942 */ 6943 static int 6944 fas_create_arq_pkt(struct fas *fas, struct scsi_address *ap) 6945 { 6946 /* 6947 * Allocate a request sense packet using get_pktiopb 6948 */ 6949 struct fas_cmd *rqpktp; 6950 uchar_t slot = ap->a_target * NLUNS_PER_TARGET | ap->a_lun; 6951 struct buf *bp; 6952 struct arq_private_data *arq_data; 6953 6954 /* 6955 * if one exists, don't create another 6956 */ 6957 if (fas->f_arq_pkt[slot] != 0) { 6958 return (0); 6959 } 6960 6961 /* 6962 * it would be nicer if we could allow the target driver 6963 * to specify the size but this is easier and OK for most 6964 * drivers to use SENSE_LENGTH 6965 * Allocate a request sense packet. 6966 */ 6967 bp = scsi_alloc_consistent_buf(ap, (struct buf *)NULL, 6968 SENSE_LENGTH, B_READ, SLEEP_FUNC, NULL); 6969 rqpktp = PKT2CMD(scsi_init_pkt(ap, 6970 NULL, bp, CDB_GROUP0, 1, PKT_PRIV_LEN, 6971 PKT_CONSISTENT, SLEEP_FUNC, NULL)); 6972 arq_data = 6973 (struct arq_private_data *)(rqpktp->cmd_pkt->pkt_private); 6974 arq_data->arq_save_bp = bp; 6975 6976 RQ_MAKECOM_G0((CMD2PKT(rqpktp)), 6977 FLAG_SENSING | FLAG_HEAD | FLAG_NODISCON, 6978 (char)SCMD_REQUEST_SENSE, 0, (char)SENSE_LENGTH); 6979 rqpktp->cmd_flags |= CFLAG_CMDARQ; 6980 rqpktp->cmd_slot = slot; 6981 rqpktp->cmd_pkt->pkt_ha_private = rqpktp; 6982 fas->f_arq_pkt[slot] = rqpktp; 6983 6984 /* 6985 * we need a function ptr here so abort/reset can 6986 * defer callbacks; fas_call_pkt_comp() calls 6987 * fas_complete_arq_pkt() directly without releasing the lock 6988 * However, since we are not calling back directly thru 6989 * pkt_comp, don't check this with warlock 6990 */ 6991 #ifndef __lock_lint 6992 rqpktp->cmd_pkt->pkt_comp = 6993 (void (*)(struct scsi_pkt *))fas_complete_arq_pkt; 6994 #endif 6995 return (0); 6996 } 6997 6998 static int 6999 fas_delete_arq_pkt(struct fas *fas, struct scsi_address *ap) 7000 { 7001 struct fas_cmd *rqpktp; 7002 int slot = ap->a_target * NLUNS_PER_TARGET | ap->a_lun; 7003 7004 /* 7005 * if there is still a pkt saved or no rqpkt 7006 * then we cannot deallocate or there is nothing to do 7007 */ 7008 if ((rqpktp = fas->f_arq_pkt[slot]) != NULL) { 7009 struct arq_private_data *arq_data = 7010 (struct arq_private_data *)(rqpktp->cmd_pkt->pkt_private); 7011 struct buf *bp = arq_data->arq_save_bp; 7012 /* 7013 * is arq pkt in use? 7014 */ 7015 if (arq_data->arq_save_sp) { 7016 return (-1); 7017 } 7018 7019 scsi_destroy_pkt(CMD2PKT(rqpktp)); 7020 scsi_free_consistent_buf(bp); 7021 fas->f_arq_pkt[slot] = 0; 7022 } 7023 return (0); 7024 } 7025 7026 /* 7027 * complete an arq packet by copying over transport info and the actual 7028 * request sense data; called with mutex held from fas_call_pkt_comp() 7029 */ 7030 void 7031 fas_complete_arq_pkt(struct scsi_pkt *pkt) 7032 { 7033 struct fas *fas = ADDR2FAS(&pkt->pkt_address); 7034 struct fas_cmd *sp = pkt->pkt_ha_private; 7035 struct scsi_arq_status *arqstat; 7036 struct arq_private_data *arq_data = 7037 (struct arq_private_data *)sp->cmd_pkt->pkt_private; 7038 struct fas_cmd *ssp = arq_data->arq_save_sp; 7039 struct buf *bp = arq_data->arq_save_bp; 7040 int slot = sp->cmd_slot; 7041 7042 DPRINTF1("completing arq pkt sp=0x%p\n", (void *)sp); 7043 ASSERT(sp == fas->f_arq_pkt[slot]); 7044 ASSERT(arq_data->arq_save_sp != NULL); 7045 ASSERT(ssp != fas->f_active[sp->cmd_slot]->f_slot[sp->cmd_tag[1]]); 7046 7047 arqstat = (struct scsi_arq_status *)(ssp->cmd_pkt->pkt_scbp); 7048 arqstat->sts_rqpkt_status = *((struct scsi_status *) 7049 (sp->cmd_pkt->pkt_scbp)); 7050 arqstat->sts_rqpkt_reason = sp->cmd_pkt->pkt_reason; 7051 arqstat->sts_rqpkt_state = sp->cmd_pkt->pkt_state; 7052 arqstat->sts_rqpkt_statistics = sp->cmd_pkt->pkt_statistics; 7053 arqstat->sts_rqpkt_resid = sp->cmd_pkt->pkt_resid; 7054 arqstat->sts_sensedata = 7055 *((struct scsi_extended_sense *)bp->b_un.b_addr); 7056 ssp->cmd_pkt->pkt_state |= STATE_ARQ_DONE; 7057 arq_data->arq_save_sp = NULL; 7058 7059 /* 7060 * ASC=0x47 is parity error 7061 */ 7062 if (arqstat->sts_sensedata.es_key == KEY_ABORTED_COMMAND && 7063 arqstat->sts_sensedata.es_add_code == 0x47) { 7064 fas_sync_wide_backoff(fas, sp, slot); 7065 } 7066 7067 fas_call_pkt_comp(fas, ssp); 7068 } 7069 7070 /* 7071 * handle check condition and start an arq packet 7072 */ 7073 static int 7074 fas_handle_sts_chk(struct fas *fas, struct fas_cmd *sp) 7075 { 7076 struct fas_cmd *arqsp = fas->f_arq_pkt[sp->cmd_slot]; 7077 struct arq_private_data *arq_data; 7078 struct buf *bp; 7079 7080 if ((arqsp == NULL) || (arqsp == sp) || 7081 (sp->cmd_scblen < sizeof (struct scsi_arq_status))) { 7082 IPRINTF("no arq packet or cannot arq on arq pkt\n"); 7083 fas_call_pkt_comp(fas, sp); 7084 return (0); 7085 } 7086 7087 arq_data = (struct arq_private_data *)arqsp->cmd_pkt->pkt_private; 7088 bp = arq_data->arq_save_bp; 7089 7090 ASSERT(sp->cmd_flags & CFLAG_FINISHED); 7091 ASSERT(sp != fas->f_active[sp->cmd_slot]->f_slot[sp->cmd_tag[1]]); 7092 DPRINTF3("start arq for slot=%x, arqsp=0x%p, rqpkt=0x%p\n", 7093 sp->cmd_slot, (void *)arqsp, (void *)fas->f_arq_pkt[sp->cmd_slot]); 7094 if (arq_data->arq_save_sp != NULL) { 7095 IPRINTF("auto request sense already in progress\n"); 7096 goto fail; 7097 } 7098 7099 arq_data->arq_save_sp = sp; 7100 7101 bzero(bp->b_un.b_addr, sizeof (struct scsi_extended_sense)); 7102 7103 /* 7104 * copy the timeout from the original packet by lack of a better 7105 * value 7106 * we could take the residue of the timeout but that could cause 7107 * premature timeouts perhaps 7108 */ 7109 arqsp->cmd_pkt->pkt_time = sp->cmd_pkt->pkt_time; 7110 arqsp->cmd_flags &= ~CFLAG_TRANFLAG; 7111 ASSERT(arqsp->cmd_pkt->pkt_comp != NULL); 7112 7113 /* 7114 * make sure that auto request sense always goes out 7115 * after queue full and after throttle was set to draining 7116 */ 7117 fas_full_throttle(fas, sp->cmd_slot); 7118 (void) fas_accept_pkt(fas, arqsp, NO_TRAN_BUSY); 7119 return (0); 7120 7121 fail: 7122 fas_set_pkt_reason(fas, sp, CMD_TRAN_ERR, 0); 7123 fas_log(fas, CE_WARN, "auto request sense failed\n"); 7124 fas_dump_cmd(fas, sp); 7125 fas_call_pkt_comp(fas, sp); 7126 return (-1); 7127 } 7128 7129 7130 /* 7131 * handle qfull condition 7132 */ 7133 static void 7134 fas_handle_qfull(struct fas *fas, struct fas_cmd *sp) 7135 { 7136 int slot = sp->cmd_slot; 7137 7138 if ((++sp->cmd_qfull_retries > fas->f_qfull_retries[Tgt(sp)]) || 7139 (fas->f_qfull_retries[Tgt(sp)] == 0)) { 7140 /* 7141 * We have exhausted the retries on QFULL, or, 7142 * the target driver has indicated that it 7143 * wants to handle QFULL itself by setting 7144 * qfull-retries capability to 0. In either case 7145 * we want the target driver's QFULL handling 7146 * to kick in. We do this by having pkt_reason 7147 * as CMD_CMPLT and pkt_scbp as STATUS_QFULL. 7148 */ 7149 IPRINTF2("%d.%d: status queue full, retries over\n", 7150 Tgt(sp), Lun(sp)); 7151 fas_set_all_lun_throttles(fas, slot, DRAIN_THROTTLE); 7152 fas_call_pkt_comp(fas, sp); 7153 } else { 7154 if (fas->f_reset_delay[Tgt(sp)] == 0) { 7155 fas->f_throttle[slot] = 7156 max((fas->f_tcmds[slot] - 2), 0); 7157 } 7158 IPRINTF3("%d.%d: status queue full, new throttle = %d, " 7159 "retrying\n", Tgt(sp), Lun(sp), fas->f_throttle[slot]); 7160 sp->cmd_pkt->pkt_flags |= FLAG_HEAD; 7161 sp->cmd_flags &= ~CFLAG_TRANFLAG; 7162 (void) fas_accept_pkt(fas, sp, NO_TRAN_BUSY); 7163 7164 /* 7165 * when target gives queue full status with no commands 7166 * outstanding (f_tcmds[] == 0), throttle is set to 0 7167 * (HOLD_THROTTLE), and the queue full handling starts 7168 * (see psarc/1994/313); if there are commands outstanding, 7169 * the throttle is set to (f_tcmds[] - 2) 7170 */ 7171 if (fas->f_throttle[slot] == HOLD_THROTTLE) { 7172 /* 7173 * By setting throttle to QFULL_THROTTLE, we 7174 * avoid submitting new commands and in 7175 * fas_restart_cmd find out slots which need 7176 * their throttles to be cleared. 7177 */ 7178 fas_set_all_lun_throttles(fas, slot, QFULL_THROTTLE); 7179 if (fas->f_restart_cmd_timeid == 0) { 7180 fas->f_restart_cmd_timeid = 7181 timeout(fas_restart_cmd, fas, 7182 fas->f_qfull_retry_interval[Tgt(sp)]); 7183 } 7184 } 7185 } 7186 } 7187 7188 /* 7189 * invoked from timeout() to restart qfull cmds with throttle == 0 7190 */ 7191 static void 7192 fas_restart_cmd(void *fas_arg) 7193 { 7194 struct fas *fas = fas_arg; 7195 int i; 7196 7197 IPRINTF("fas_restart_cmd:\n"); 7198 7199 mutex_enter(FAS_MUTEX(fas)); 7200 fas->f_restart_cmd_timeid = 0; 7201 7202 for (i = 0; i < N_SLOTS; i += NLUNS_PER_TARGET) { 7203 if (fas->f_reset_delay[i/NLUNS_PER_TARGET] == 0) { 7204 if (fas->f_throttle[i] == QFULL_THROTTLE) { 7205 fas_set_all_lun_throttles(fas, 7206 i, MAX_THROTTLE); 7207 } 7208 } 7209 } 7210 7211 (void) fas_ustart(fas); 7212 mutex_exit(FAS_MUTEX(fas)); 7213 } 7214 7215 /* 7216 * Timeout handling: 7217 * Command watchdog routines 7218 */ 7219 7220 /*ARGSUSED*/ 7221 static void 7222 fas_watch(void *arg) 7223 { 7224 struct fas *fas; 7225 ushort_t props_update = 0; 7226 7227 rw_enter(&fas_global_rwlock, RW_READER); 7228 7229 for (fas = fas_head; fas != (struct fas *)NULL; fas = fas->f_next) { 7230 7231 mutex_enter(FAS_MUTEX(fas)); 7232 IPRINTF2("ncmds=%x, ndisc=%x\n", fas->f_ncmds, fas->f_ndisc); 7233 7234 #ifdef FAS_PIO_COUNTS 7235 if (fas->f_total_cmds) { 7236 int n = fas->f_total_cmds; 7237 7238 fas_log(fas, CE_NOTE, 7239 "total=%d, cmds=%d fas-rd=%d, fas-wrt=%d, dma-rd=%d, dma-wrt=%d\n", 7240 fas->f_total_cmds, 7241 fas->f_reg_cmds/n, 7242 fas->f_reg_reads/n, fas->f_reg_writes/n, 7243 fas->f_reg_dma_reads/n, fas->f_reg_dma_writes/n); 7244 7245 fas->f_reg_reads = fas->f_reg_writes = 7246 fas->f_reg_dma_reads = fas->f_reg_dma_writes = 7247 fas->f_reg_cmds = fas->f_total_cmds = 0; 7248 } 7249 #endif 7250 if (fas->f_ncmds) { 7251 int i; 7252 fas_watchsubr(fas); 7253 7254 /* 7255 * reset throttle. the throttle may have been 7256 * too low if queue full was caused by 7257 * another initiator 7258 * Only reset throttle if no cmd active in slot 0 7259 * (untagged cmd) 7260 */ 7261 #ifdef FAS_TEST 7262 if (fas_enable_untagged) { 7263 fas_test_untagged++; 7264 } 7265 #endif 7266 for (i = 0; i < N_SLOTS; i++) { 7267 if ((fas->f_throttle[i] > HOLD_THROTTLE) && 7268 (fas->f_active[i] && 7269 (fas->f_active[i]->f_slot[0] == NULL))) { 7270 fas_full_throttle(fas, i); 7271 } 7272 } 7273 } 7274 7275 if (fas->f_props_update) { 7276 int i; 7277 /* 7278 * f_mutex will be released and reentered in 7279 * fas_props_update(). 7280 * Hence we save the fas->f_props_update now and 7281 * set to 0 indicating that property has been 7282 * updated. This will avoid a race condition with 7283 * any thread that runs in interrupt context that 7284 * attempts to set the f_props_update to non-zero value 7285 */ 7286 props_update = fas->f_props_update; 7287 fas->f_props_update = 0; 7288 for (i = 0; i < NTARGETS_WIDE; i++) { 7289 if (props_update & (1<<i)) { 7290 fas_update_props(fas, i); 7291 } 7292 } 7293 } 7294 fas_check_waitQ_and_mutex_exit(fas); 7295 7296 } 7297 rw_exit(&fas_global_rwlock); 7298 7299 again: 7300 mutex_enter(&fas_global_mutex); 7301 if (fas_timeout_initted && fas_timeout_id) { 7302 fas_timeout_id = timeout(fas_watch, NULL, fas_tick); 7303 } 7304 mutex_exit(&fas_global_mutex); 7305 TRACE_0(TR_FAC_SCSI_FAS, TR_FAS_WATCH_END, "fas_watch_end"); 7306 } 7307 7308 static void 7309 fas_watchsubr(struct fas *fas) 7310 { 7311 short slot; 7312 int d = ((fas->f_dslot == 0)? 1 : fas->f_dslot); 7313 struct f_slots *tag_slots; 7314 7315 for (slot = 0; slot < N_SLOTS; slot += d) { 7316 7317 #ifdef FAS_TEST 7318 if (fas_btest) { 7319 fas_btest = 0; 7320 (void) fas_reset_bus(fas); 7321 return; 7322 } 7323 if (fas_force_timeout && fas->f_tcmds[slot]) { 7324 fas_cmd_timeout(fas, slot); 7325 fas_force_timeout = 0; 7326 return; 7327 } 7328 fas_test_reset(fas, slot); 7329 fas_test_abort(fas, slot); 7330 #endif /* FAS_TEST */ 7331 7332 /* 7333 * check tagged cmds first 7334 */ 7335 tag_slots = fas->f_active[slot]; 7336 DPRINTF3( 7337 "fas_watchsubr: slot %x: tcmds=%x, timeout=%x\n", 7338 slot, fas->f_tcmds[slot], tag_slots->f_timeout); 7339 7340 if ((fas->f_tcmds[slot] > 0) && (tag_slots->f_timebase)) { 7341 7342 if (tag_slots->f_timebase <= 7343 fas_scsi_watchdog_tick) { 7344 tag_slots->f_timebase += 7345 fas_scsi_watchdog_tick; 7346 continue; 7347 } 7348 7349 tag_slots->f_timeout -= fas_scsi_watchdog_tick; 7350 7351 if (tag_slots->f_timeout < 0) { 7352 fas_cmd_timeout(fas, slot); 7353 return; 7354 } 7355 if ((tag_slots->f_timeout) <= 7356 fas_scsi_watchdog_tick) { 7357 IPRINTF1("pending timeout on slot=%x\n", 7358 slot); 7359 IPRINTF("draining all queues\n"); 7360 fas_set_throttles(fas, 0, N_SLOTS, 7361 DRAIN_THROTTLE); 7362 } 7363 } 7364 } 7365 } 7366 7367 /* 7368 * timeout recovery 7369 */ 7370 static void 7371 fas_cmd_timeout(struct fas *fas, int slot) 7372 { 7373 int d = ((fas->f_dslot == 0)? 1 : fas->f_dslot); 7374 int target, lun, i, n, tag, ncmds; 7375 struct fas_cmd *sp = NULL; 7376 struct fas_cmd *ssp; 7377 7378 ASSERT(fas->f_tcmds[slot]); 7379 7380 #ifdef FAS_TEST 7381 if (fas_test_stop) { 7382 debug_enter("timeout"); 7383 } 7384 #endif 7385 7386 /* 7387 * set throttle back; no more draining necessary 7388 */ 7389 for (i = 0; i < N_SLOTS; i += d) { 7390 if (fas->f_throttle[i] == DRAIN_THROTTLE) { 7391 fas_full_throttle(fas, i); 7392 } 7393 } 7394 7395 if (NOTAG(slot/NLUNS_PER_TARGET)) { 7396 sp = fas->f_active[slot]->f_slot[0]; 7397 } 7398 7399 /* 7400 * if no interrupt pending for next second then the current 7401 * cmd must be stuck; switch slot and sp to current slot and cmd 7402 */ 7403 if (fas->f_current_sp && fas->f_state != STATE_FREE) { 7404 for (i = 0; (i < 10000) && (INTPENDING(fas) == 0); i++) { 7405 drv_usecwait(100); 7406 } 7407 if (INTPENDING(fas) == 0) { 7408 slot = fas->f_current_sp->cmd_slot; 7409 sp = fas->f_current_sp; 7410 } 7411 } 7412 7413 target = slot / NLUNS_PER_TARGET; 7414 lun = slot % NLUNS_PER_TARGET; 7415 7416 /* 7417 * update all outstanding pkts for this slot 7418 */ 7419 n = fas->f_active[slot]->f_n_slots; 7420 for (ncmds = tag = 0; tag < n; tag++) { 7421 ssp = fas->f_active[slot]->f_slot[tag]; 7422 if (ssp && ssp->cmd_pkt->pkt_time) { 7423 fas_set_pkt_reason(fas, ssp, CMD_TIMEOUT, 7424 STAT_TIMEOUT | STAT_ABORTED); 7425 fas_short_dump_cmd(fas, ssp); 7426 ncmds++; 7427 } 7428 } 7429 7430 /* 7431 * no timed-out cmds here? 7432 */ 7433 if (ncmds == 0) { 7434 return; 7435 } 7436 7437 /* 7438 * dump all we know about this timeout 7439 */ 7440 if (sp) { 7441 if (sp->cmd_flags & CFLAG_CMDDISC) { 7442 fas_log(fas, CE_WARN, 7443 "Disconnected command timeout for Target %d.%d", 7444 target, lun); 7445 } else { 7446 ASSERT(sp == fas->f_current_sp); 7447 fas_log(fas, CE_WARN, 7448 "Connected command timeout for Target %d.%d", 7449 target, lun); 7450 /* 7451 * Current command timeout appears to relate often 7452 * to noisy SCSI in synchronous mode. 7453 */ 7454 if (fas->f_state == ACTS_DATA_DONE) { 7455 fas_sync_wide_backoff(fas, sp, slot); 7456 } 7457 } 7458 #ifdef FASDEBUG 7459 fas_printstate(fas, "timeout"); 7460 #endif 7461 } else { 7462 fas_log(fas, CE_WARN, 7463 "Disconnected tagged cmd(s) (%d) timeout for Target %d.%d", 7464 fas->f_tcmds[slot], target, lun); 7465 } 7466 7467 if (fas_abort_cmd(fas, sp, slot) == ACTION_SEARCH) { 7468 (void) fas_istart(fas); 7469 } 7470 } 7471 7472 /* 7473 * fas_sync_wide_backoff() increases sync period and enables slow 7474 * cable mode. 7475 * the second time, we revert back to narrow/async 7476 * we count on a bus reset to disable wide in the target and will 7477 * never renegotiate wide again 7478 */ 7479 static void 7480 fas_sync_wide_backoff(struct fas *fas, struct fas_cmd *sp, 7481 int slot) 7482 { 7483 char phase; 7484 ushort_t state = fas->f_state; 7485 uchar_t tgt = slot / NLUNS_PER_TARGET; 7486 uint_t tshift = 1 << tgt; 7487 7488 phase = fas_reg_read(fas, &fas->f_reg->fas_stat); 7489 phase &= FAS_PHASE_MASK; 7490 7491 IPRINTF4( 7492 "fas_sync_wide_backoff: target %d: state=%x, phase=%x, sp=0x%p\n", 7493 tgt, state, phase, (void *)sp); 7494 7495 #ifdef FASDEBUG 7496 if (fas_no_sync_wide_backoff) { 7497 return; 7498 } 7499 #endif 7500 7501 /* 7502 * if this not the first time or sync is disabled 7503 * thru scsi_options then disable wide 7504 */ 7505 if ((fas->f_backoff & tshift) || 7506 (fas->f_nosync & tshift)) { 7507 /* 7508 * disable wide for just this target 7509 */ 7510 if ((fas->f_nowide & tshift) == 0) { 7511 fas_log(fas, CE_WARN, 7512 "Target %d disabled wide SCSI mode", tgt); 7513 } 7514 /* 7515 * do not reset the bit in f_nowide because that 7516 * would not force a renegotiation of wide 7517 * and do not change any register value yet because 7518 * we may have reconnects before the renegotiations 7519 */ 7520 fas->f_target_scsi_options[tgt] &= ~SCSI_OPTIONS_WIDE; 7521 } 7522 7523 /* 7524 * reduce xfer rate. if this is the first time, reduce by 7525 * 100%. second time, disable sync and wide. 7526 */ 7527 if (fas->f_offset[tgt] != 0) { 7528 /* 7529 * do not reset the bit in f_nosync because that 7530 * would not force a renegotiation of sync 7531 */ 7532 if (fas->f_backoff & tshift) { 7533 if ((fas->f_nosync & tshift) == 0) { 7534 fas_log(fas, CE_WARN, 7535 "Target %d reverting to async. mode", 7536 tgt); 7537 } 7538 fas->f_target_scsi_options[tgt] &= 7539 ~(SCSI_OPTIONS_SYNC | SCSI_OPTIONS_FAST); 7540 } else { 7541 /* increase period by 100% */ 7542 fas->f_neg_period[tgt] *= 2; 7543 7544 fas_log(fas, CE_WARN, 7545 "Target %d reducing sync. transfer rate", tgt); 7546 } 7547 } 7548 fas->f_backoff |= tshift; 7549 7550 /* 7551 * always enable slow cable mode, if not already enabled 7552 */ 7553 if ((fas->f_fasconf & FAS_CONF_SLOWMODE) == 0) { 7554 fas->f_fasconf |= FAS_CONF_SLOWMODE; 7555 fas_reg_write(fas, &fas->f_reg->fas_conf, fas->f_fasconf); 7556 IPRINTF("Reverting to slow SCSI cable mode\n"); 7557 } 7558 7559 /* 7560 * Force sync renegotiation and update properties 7561 */ 7562 fas_force_renegotiation(fas, tgt); 7563 fas->f_props_update |= (1<<tgt); 7564 } 7565 7566 /* 7567 * handle failed negotiations (either reject or bus free condition) 7568 */ 7569 static void 7570 fas_reset_sync_wide(struct fas *fas) 7571 { 7572 struct fas_cmd *sp = fas->f_current_sp; 7573 int tgt = Tgt(sp); 7574 7575 if (fas->f_wdtr_sent) { 7576 IPRINTF("wide neg message rejected or bus free\n"); 7577 fas->f_nowide |= (1<<tgt); 7578 fas->f_fasconf3[tgt] &= ~FAS_CONF3_WIDE; 7579 fas_reg_write(fas, &fas->f_reg->fas_conf3, 7580 fas->f_fasconf3[tgt]); 7581 /* 7582 * clear offset just in case it goes to 7583 * data phase 7584 */ 7585 fas_reg_write(fas, 7586 (uchar_t *)&fas->f_reg->fas_sync_offset, 0); 7587 } else if (fas->f_sdtr_sent) { 7588 volatile struct fasreg *fasreg = 7589 fas->f_reg; 7590 IPRINTF("sync neg message rejected or bus free\n"); 7591 fas->f_nosync |= (1<<tgt); 7592 fas->f_offset[tgt] = 0; 7593 fas->f_sync_period[tgt] = 0; 7594 fas_reg_write(fas, 7595 (uchar_t *)&fasreg->fas_sync_period, 0); 7596 fas_reg_write(fas, 7597 (uchar_t *)&fasreg->fas_sync_offset, 0); 7598 fas->f_offset[tgt] = 0; 7599 fas->f_fasconf3[tgt] &= ~FAS_CONF3_FASTSCSI; 7600 fas_reg_write(fas, &fasreg->fas_conf3, 7601 fas->f_fasconf3[tgt]); 7602 } 7603 7604 fas_force_renegotiation(fas, tgt); 7605 } 7606 7607 /* 7608 * force wide and sync renegotiation 7609 */ 7610 static void 7611 fas_force_renegotiation(struct fas *fas, int target) 7612 { 7613 ushort_t tshift = 1<<target; 7614 fas->f_sync_known &= ~tshift; 7615 fas->f_sync_enabled &= ~tshift; 7616 fas->f_wide_known &= ~tshift; 7617 fas->f_wide_enabled &= ~tshift; 7618 } 7619 7620 /* 7621 * update conf3 register for wide negotiation 7622 */ 7623 static void 7624 fas_set_wide_conf3(struct fas *fas, int target, int width) 7625 { 7626 ASSERT(width <= 1); 7627 switch (width) { 7628 case 0: 7629 fas->f_fasconf3[target] &= ~FAS_CONF3_WIDE; 7630 break; 7631 case 1: 7632 fas->f_fasconf3[target] |= FAS_CONF3_WIDE; 7633 fas->f_wide_enabled |= (1<<target); 7634 break; 7635 } 7636 7637 fas_reg_write(fas, &fas->f_reg->fas_conf3, fas->f_fasconf3[target]); 7638 fas->f_fasconf3_reg_last = fas->f_fasconf3[target]; 7639 } 7640 7641 /* 7642 * Abort command handling 7643 * 7644 * abort current cmd, either by device reset or immediately with bus reset 7645 * (usually an abort msg doesn't completely solve the problem, therefore 7646 * a device or bus reset is recommended) 7647 */ 7648 static int 7649 fas_abort_curcmd(struct fas *fas) 7650 { 7651 if (fas->f_current_sp) { 7652 return (fas_abort_cmd(fas, fas->f_current_sp, 7653 fas->f_current_sp->cmd_slot)); 7654 } else { 7655 return (fas_reset_bus(fas)); 7656 } 7657 } 7658 7659 static int 7660 fas_abort_cmd(struct fas *fas, struct fas_cmd *sp, int slot) 7661 { 7662 struct scsi_address ap; 7663 7664 ap.a_hba_tran = fas->f_tran; 7665 ap.a_target = slot / NLUNS_PER_TARGET; 7666 ap.a_lun = slot % NLUNS_PER_TARGET; 7667 7668 IPRINTF1("abort cmd 0x%p\n", (void *)sp); 7669 7670 /* 7671 * attempting to abort a connected cmd is usually fruitless, so 7672 * only try disconnected cmds 7673 * a reset is preferable over an abort (see 1161701) 7674 */ 7675 if ((fas->f_current_sp && (fas->f_current_sp->cmd_slot != slot)) || 7676 (fas->f_state == STATE_FREE)) { 7677 IPRINTF2("attempting to reset target %d.%d\n", 7678 ap.a_target, ap.a_lun); 7679 if (fas_do_scsi_reset(&ap, RESET_TARGET)) { 7680 return (ACTION_SEARCH); 7681 } 7682 } 7683 7684 /* 7685 * if the target won't listen, then a retry is useless 7686 * there is also the possibility that the cmd still completed while 7687 * we were trying to reset and the target driver may have done a 7688 * device reset which has blown away this sp. 7689 * well, we've tried, now pull the chain 7690 */ 7691 IPRINTF("aborting all cmds by bus reset\n"); 7692 return (fas_reset_bus(fas)); 7693 } 7694 7695 /* 7696 * fas_do_scsi_abort() assumes that we already have the mutex. 7697 * during the abort, we hold the mutex and prevent callbacks by setting 7698 * completion pointer to NULL. this will also avoid that a target driver 7699 * attempts to do a scsi_abort/reset while we are aborting. 7700 * because the completion pointer is NULL we can still update the 7701 * packet after completion 7702 * the throttle for this slot is cleared either by fas_abort_connected_cmd 7703 * or fas_runpoll which prevents new cmds from starting while aborting 7704 */ 7705 static int 7706 fas_do_scsi_abort(struct scsi_address *ap, struct scsi_pkt *pkt) 7707 { 7708 struct fas *fas = ADDR2FAS(ap); 7709 struct fas_cmd *sp; 7710 int rval = FALSE; 7711 short slot; 7712 struct fas_cmd *cur_sp = fas->f_current_sp; 7713 void (*cur_savec)(), (*sp_savec)(); 7714 int sp_tagged_flag, abort_msg; 7715 7716 if (pkt) { 7717 sp = PKT2CMD(pkt); 7718 slot = sp->cmd_slot; 7719 ASSERT(slot == ((ap->a_target * NLUNS_PER_TARGET) | ap->a_lun)); 7720 } else { 7721 sp = NULL; 7722 slot = (ap->a_target * NLUNS_PER_TARGET) | ap->a_lun; 7723 } 7724 7725 fas_move_waitQ_to_readyQ(fas); 7726 7727 /* 7728 * If no specific command was passed, all cmds here will be aborted 7729 * If a specific command was passed as an argument (to be aborted) 7730 * only the specified command will be aborted 7731 */ 7732 ASSERT(mutex_owned(FAS_MUTEX(fas))); 7733 IPRINTF4("fas_scsi_abort for slot %x, " 7734 "sp=0x%p, pkt_flags=%x, cur_sp=0x%p\n", 7735 slot, (void *)sp, (sp? sp->cmd_pkt_flags : 0), (void *)cur_sp); 7736 7737 /* 7738 * first check if the cmd is in the ready queue or 7739 * in the active queue 7740 */ 7741 if (sp) { 7742 IPRINTF3("aborting one command 0x%p for %d.%d\n", 7743 (void *)sp, ap->a_target, ap->a_lun); 7744 rval = fas_remove_from_readyQ(fas, sp, slot); 7745 if (rval) { 7746 IPRINTF("aborted one ready cmd\n"); 7747 fas_set_pkt_reason(fas, sp, CMD_ABORTED, STAT_ABORTED); 7748 fas_decrement_ncmds(fas, sp); 7749 fas_call_pkt_comp(fas, sp); 7750 goto exit; 7751 7752 } else if ((sp != 7753 fas->f_active[slot]->f_slot[sp->cmd_tag[1]])) { 7754 IPRINTF("cmd doesn't exist here\n"); 7755 rval = TRUE; 7756 goto exit; 7757 } 7758 } 7759 7760 /* 7761 * hold off any new commands while attempting to abort 7762 * an active cmd 7763 */ 7764 fas_set_throttles(fas, slot, 1, HOLD_THROTTLE); 7765 7766 if (cur_sp) { 7767 /* 7768 * prevent completion on current cmd 7769 */ 7770 cur_savec = cur_sp->cmd_pkt->pkt_comp; 7771 cur_sp->cmd_pkt->pkt_comp = NULL; 7772 } 7773 7774 if (sp) { 7775 /* 7776 * the cmd exists here. is it connected or disconnected? 7777 * if connected but still selecting then can't abort now. 7778 * prevent completion on this cmd 7779 */ 7780 sp_tagged_flag = (sp->cmd_pkt_flags & FLAG_TAGMASK); 7781 abort_msg = (sp_tagged_flag? MSG_ABORT_TAG : MSG_ABORT); 7782 sp_savec = sp->cmd_pkt->pkt_comp; 7783 sp->cmd_pkt->pkt_comp = NULL; 7784 7785 /* connected but not selecting? */ 7786 if ((sp == cur_sp) && (fas->f_state != STATE_FREE) && 7787 (sp->cmd_pkt->pkt_state)) { 7788 rval = fas_abort_connected_cmd(fas, sp, abort_msg); 7789 } 7790 7791 /* if abort connected cmd failed, try abort disconnected */ 7792 if ((rval == 0) && 7793 (sp->cmd_flags & CFLAG_CMDDISC) && 7794 ((sp->cmd_flags & CFLAG_COMPLETED) == 0)) { 7795 rval = fas_abort_disconnected_cmd(fas, ap, sp, 7796 abort_msg, slot); 7797 } 7798 7799 if (rval) { 7800 sp->cmd_flags |= CFLAG_COMPLETED; 7801 fas_set_pkt_reason(fas, sp, CMD_ABORTED, STAT_ABORTED); 7802 } 7803 7804 sp->cmd_pkt->pkt_comp = sp_savec; 7805 7806 } else { 7807 IPRINTF2("aborting all commands for %d.%d\n", 7808 ap->a_target, ap->a_lun); 7809 abort_msg = MSG_ABORT; 7810 7811 /* active and not selecting ? */ 7812 if (cur_sp && (fas->f_state != STATE_FREE) && 7813 (cur_sp->cmd_slot == slot) && 7814 cur_sp->cmd_pkt->pkt_state) { 7815 rval = fas_abort_connected_cmd(fas, cur_sp, 7816 abort_msg); 7817 } 7818 if (rval == 0) { 7819 rval = fas_abort_disconnected_cmd(fas, ap, 7820 NULL, abort_msg, slot); 7821 } 7822 } 7823 7824 done: 7825 /* complete the current sp */ 7826 if (cur_sp) { 7827 cur_sp->cmd_pkt->pkt_comp = cur_savec; 7828 if (cur_sp->cmd_flags & CFLAG_COMPLETED) { 7829 fas_remove_cmd(fas, cur_sp, NEW_TIMEOUT); 7830 cur_sp->cmd_flags &= ~CFLAG_COMPLETED; 7831 fas_decrement_ncmds(fas, cur_sp); 7832 fas_call_pkt_comp(fas, cur_sp); 7833 } 7834 } 7835 7836 /* complete the sp passed as 2nd arg */ 7837 if (sp && (sp != cur_sp) && (sp->cmd_flags & CFLAG_COMPLETED)) { 7838 sp->cmd_flags &= ~CFLAG_COMPLETED; 7839 fas_remove_cmd(fas, sp, NEW_TIMEOUT); 7840 fas_decrement_ncmds(fas, sp); 7841 fas_call_pkt_comp(fas, sp); 7842 } 7843 7844 /* clean up all cmds for this slot */ 7845 if (rval && (abort_msg == MSG_ABORT)) { 7846 /* 7847 * mark all commands here as aborted 7848 * abort msg has been accepted, now cleanup queues; 7849 */ 7850 fas_mark_packets(fas, slot, CMD_ABORTED, STAT_ABORTED); 7851 fas_flush_tagQ(fas, slot); 7852 fas_flush_readyQ(fas, slot); 7853 } 7854 fas_set_throttles(fas, slot, 1, MAX_THROTTLE); 7855 7856 exit: 7857 if (fas->f_state == STATE_FREE) { 7858 (void) fas_ustart(fas); 7859 } 7860 7861 ASSERT(mutex_owned(FAS_MUTEX(fas))); 7862 7863 #ifdef FASDEBUG 7864 if (rval && fas_test_stop) { 7865 debug_enter("abort succeeded"); 7866 } 7867 #endif 7868 return (rval); 7869 } 7870 7871 /* 7872 * mark all packets with new reason and update statistics 7873 */ 7874 static void 7875 fas_mark_packets(struct fas *fas, int slot, uchar_t reason, uint_t stat) 7876 { 7877 struct fas_cmd *sp = fas->f_readyf[slot]; 7878 7879 while (sp != 0) { 7880 fas_set_pkt_reason(fas, sp, reason, STAT_ABORTED); 7881 sp = sp->cmd_forw; 7882 } 7883 if (fas->f_tcmds[slot]) { 7884 int n = 0; 7885 ushort_t tag; 7886 7887 for (tag = 0; tag < fas->f_active[slot]->f_n_slots; tag++) { 7888 if ((sp = fas->f_active[slot]->f_slot[tag]) != 0) { 7889 fas_set_pkt_reason(fas, sp, reason, stat); 7890 n++; 7891 } 7892 } 7893 ASSERT(fas->f_tcmds[slot] == n); 7894 } 7895 } 7896 7897 /* 7898 * set pkt_reason and OR in pkt_statistics flag 7899 */ 7900 static void 7901 fas_set_pkt_reason(struct fas *fas, struct fas_cmd *sp, uchar_t reason, 7902 uint_t stat) 7903 { 7904 if (sp) { 7905 if (sp->cmd_pkt->pkt_reason == CMD_CMPLT) { 7906 sp->cmd_pkt->pkt_reason = reason; 7907 } 7908 sp->cmd_pkt->pkt_statistics |= stat; 7909 IPRINTF3("sp=0x%p, pkt_reason=%x, pkt_stat=%x\n", 7910 (void *)sp, reason, sp->cmd_pkt->pkt_statistics); 7911 } 7912 } 7913 7914 /* 7915 * delete specified cmd from the ready queue 7916 */ 7917 static int 7918 fas_remove_from_readyQ(struct fas *fas, struct fas_cmd *sp, int slot) 7919 { 7920 struct fas_cmd *ssp, *psp; 7921 7922 /* 7923 * command has not been started yet and is still in the ready queue 7924 */ 7925 if (sp) { 7926 ASSERT(fas->f_ncmds > 0); 7927 /* 7928 * find packet on the ready queue and remove it 7929 */ 7930 for (psp = NULL, ssp = fas->f_readyf[slot]; ssp != NULL; 7931 psp = ssp, ssp = ssp->cmd_forw) { 7932 if (ssp == sp) { 7933 if (fas->f_readyf[slot] == sp) { 7934 fas->f_readyf[slot] = sp->cmd_forw; 7935 } else { 7936 psp->cmd_forw = sp->cmd_forw; 7937 } 7938 if (fas->f_readyb[slot] == sp) { 7939 fas->f_readyb[slot] = psp; 7940 } 7941 return (TRUE); 7942 } 7943 } 7944 } 7945 return (FALSE); 7946 } 7947 7948 /* 7949 * add cmd to to head of the readyQ 7950 * due to tag allocation failure or preemption we have to return 7951 * this cmd to the readyQ 7952 */ 7953 static void 7954 fas_head_of_readyQ(struct fas *fas, struct fas_cmd *sp) 7955 { 7956 /* 7957 * never return a NOINTR pkt to the readyQ 7958 * (fas_runpoll will resubmit) 7959 */ 7960 if ((sp->cmd_pkt_flags & FLAG_NOINTR) == 0) { 7961 struct fas_cmd *dp; 7962 int slot = sp->cmd_slot; 7963 7964 dp = fas->f_readyf[slot]; 7965 fas->f_readyf[slot] = sp; 7966 sp->cmd_forw = dp; 7967 if (fas->f_readyb[slot] == NULL) { 7968 fas->f_readyb[slot] = sp; 7969 } 7970 } 7971 } 7972 7973 /* 7974 * flush cmds in ready queue 7975 */ 7976 static void 7977 fas_flush_readyQ(struct fas *fas, int slot) 7978 { 7979 if (fas->f_readyf[slot]) { 7980 struct fas_cmd *sp, *nsp; 7981 7982 IPRINTF1("flushing ready queue, slot=%x\n", slot); 7983 ASSERT(fas->f_ncmds > 0); 7984 7985 sp = fas->f_readyf[slot]; 7986 fas->f_readyf[slot] = fas->f_readyb[slot] = NULL; 7987 7988 while (sp != 0) { 7989 /* 7990 * save the forward pointer before calling 7991 * the completion routine 7992 */ 7993 nsp = sp->cmd_forw; 7994 ASSERT((sp->cmd_flags & CFLAG_FREE) == 0); 7995 ASSERT(Tgt(sp) == slot/NLUNS_PER_TARGET); 7996 fas_decrement_ncmds(fas, sp); 7997 fas_call_pkt_comp(fas, sp); 7998 sp = nsp; 7999 } 8000 fas_check_ncmds(fas); 8001 } 8002 } 8003 8004 /* 8005 * cleanup the tag queue 8006 * preserve some order by starting with the oldest tag 8007 */ 8008 static void 8009 fas_flush_tagQ(struct fas *fas, int slot) 8010 { 8011 ushort_t tag, starttag; 8012 struct fas_cmd *sp; 8013 struct f_slots *tagque = fas->f_active[slot]; 8014 8015 if (tagque == NULL) { 8016 return; 8017 } 8018 8019 DPRINTF2("flushing entire tag queue, slot=%x, tcmds=%x\n", 8020 slot, fas->f_tcmds[slot]); 8021 8022 #ifdef FASDEBUG 8023 { 8024 int n = 0; 8025 for (tag = 0; tag < fas->f_active[slot]->f_n_slots; tag++) { 8026 if ((sp = tagque->f_slot[tag]) != 0) { 8027 n++; 8028 ASSERT((sp->cmd_flags & CFLAG_FREE) == 0); 8029 if (sp->cmd_pkt->pkt_reason == CMD_CMPLT) { 8030 if ((sp->cmd_flags & CFLAG_FINISHED) == 8031 0) { 8032 debug_enter("fas_flush_tagQ"); 8033 } 8034 } 8035 } 8036 } 8037 ASSERT(fas->f_tcmds[slot] == n); 8038 } 8039 #endif 8040 tag = starttag = fas->f_active[slot]->f_tags; 8041 8042 do { 8043 if ((sp = tagque->f_slot[tag]) != 0) { 8044 fas_flush_cmd(fas, sp, 0, 0); 8045 } 8046 tag = ((ushort_t)(tag + 1)) % 8047 (ushort_t)fas->f_active[slot]->f_n_slots; 8048 } while (tag != starttag); 8049 8050 ASSERT(fas->f_tcmds[slot] == 0); 8051 EPRINTF2("ncmds = %x, ndisc=%x\n", fas->f_ncmds, fas->f_ndisc); 8052 fas_check_ncmds(fas); 8053 } 8054 8055 /* 8056 * cleanup one active command 8057 */ 8058 static void 8059 fas_flush_cmd(struct fas *fas, struct fas_cmd *sp, uchar_t reason, 8060 uint_t stat) 8061 { 8062 short slot = sp->cmd_slot; 8063 8064 ASSERT(fas->f_ncmds > 0); 8065 ASSERT((sp->cmd_flags & CFLAG_FREE) == 0); 8066 ASSERT(sp == fas->f_active[slot]->f_slot[sp->cmd_tag[1]]); 8067 8068 fas_remove_cmd(fas, sp, NEW_TIMEOUT); 8069 fas_decrement_ncmds(fas, sp); 8070 fas_set_pkt_reason(fas, sp, reason, stat); 8071 fas_call_pkt_comp(fas, sp); 8072 8073 EPRINTF2("ncmds = %x, ndisc=%x\n", fas->f_ncmds, fas->f_ndisc); 8074 fas_check_ncmds(fas); 8075 } 8076 8077 /* 8078 * prepare a proxy cmd (a cmd sent on behalf of the target driver, 8079 * usually for error recovery or abort/reset) 8080 */ 8081 static void 8082 fas_makeproxy_cmd(struct fas_cmd *sp, struct scsi_address *ap, 8083 struct scsi_pkt *pkt, int nmsgs, ...) 8084 { 8085 va_list vap; 8086 int i; 8087 8088 ASSERT(nmsgs <= (CDB_GROUP5 - CDB_GROUP0 - 3)); 8089 8090 bzero(sp, sizeof (*sp)); 8091 bzero(pkt, scsi_pkt_size()); 8092 8093 pkt->pkt_address = *ap; 8094 pkt->pkt_cdbp = (opaque_t)&sp->cmd_cdb[0]; 8095 pkt->pkt_scbp = (opaque_t)&sp->cmd_scb; 8096 pkt->pkt_ha_private = (opaque_t)sp; 8097 sp->cmd_pkt = pkt; 8098 sp->cmd_scblen = 1; 8099 sp->cmd_pkt_flags = pkt->pkt_flags = FLAG_NOINTR; 8100 sp->cmd_flags = CFLAG_CMDPROXY; 8101 sp->cmd_cdb[FAS_PROXY_TYPE] = FAS_PROXY_SNDMSG; 8102 sp->cmd_cdb[FAS_PROXY_RESULT] = FALSE; 8103 sp->cmd_cdb[FAS_PROXY_DATA] = (char)nmsgs; 8104 8105 va_start(vap, nmsgs); 8106 for (i = 0; i < nmsgs; i++) { 8107 sp->cmd_cdb[FAS_PROXY_DATA + 1 + i] = (uchar_t)va_arg(vap, int); 8108 } 8109 va_end(vap); 8110 } 8111 8112 /* 8113 * send a proxy cmd and check the result 8114 */ 8115 static int 8116 fas_do_proxy_cmd(struct fas *fas, struct fas_cmd *sp, 8117 struct scsi_address *ap, char *what) 8118 { 8119 int rval; 8120 8121 IPRINTF3("Sending proxy %s message to %d.%d\n", what, 8122 ap->a_target, ap->a_lun); 8123 if (fas_accept_pkt(fas, sp, TRAN_BUSY_OK) == TRAN_ACCEPT && 8124 sp->cmd_pkt->pkt_reason == CMD_CMPLT && 8125 sp->cmd_cdb[FAS_PROXY_RESULT] == TRUE) { 8126 IPRINTF3("Proxy %s succeeded for %d.%d\n", what, 8127 ap->a_target, ap->a_lun); 8128 ASSERT(fas->f_current_sp != sp); 8129 rval = TRUE; 8130 } else { 8131 IPRINTF5( 8132 "Proxy %s failed for %d.%d, result=%x, reason=%x\n", what, 8133 ap->a_target, ap->a_lun, sp->cmd_cdb[FAS_PROXY_RESULT], 8134 sp->cmd_pkt->pkt_reason); 8135 ASSERT(fas->f_current_sp != sp); 8136 rval = FALSE; 8137 } 8138 return (rval); 8139 } 8140 8141 /* 8142 * abort a connected command by sending an abort msg; hold off on 8143 * starting new cmds by setting throttles to HOLD_THROTTLE 8144 */ 8145 static int 8146 fas_abort_connected_cmd(struct fas *fas, struct fas_cmd *sp, uchar_t msg) 8147 { 8148 int rval = FALSE; 8149 int flags = sp->cmd_pkt_flags; 8150 8151 /* 8152 * if reset delay active we cannot access the target. 8153 */ 8154 if (fas->f_reset_delay[Tgt(sp)]) { 8155 return (rval); 8156 } 8157 8158 /* 8159 * only abort while in data phase; otherwise we mess up msg phase 8160 */ 8161 if (!((fas->f_state == ACTS_DATA) || 8162 (fas->f_state == ACTS_DATA_DONE))) { 8163 return (rval); 8164 } 8165 8166 8167 IPRINTF3("Sending abort message %s to connected %d.%d\n", 8168 scsi_mname(msg), Tgt(sp), Lun(sp)); 8169 8170 8171 fas->f_abort_msg_sent = 0; 8172 fas->f_omsglen = 1; 8173 fas->f_cur_msgout[0] = msg; 8174 sp->cmd_pkt_flags |= FLAG_NOINTR; 8175 fas_assert_atn(fas); 8176 8177 (void) fas_dopoll(fas, SHORT_POLL_TIMEOUT); 8178 8179 /* 8180 * now check if the msg was taken 8181 * e_abort is set in fas_handle_msg_out_done when the abort 8182 * msg has actually gone out (ie. msg out phase occurred 8183 */ 8184 if (fas->f_abort_msg_sent && (sp->cmd_flags & CFLAG_COMPLETED)) { 8185 IPRINTF2("target %d.%d aborted\n", 8186 Tgt(sp), Lun(sp)); 8187 rval = TRUE; 8188 } else { 8189 IPRINTF2("target %d.%d did not abort\n", 8190 Tgt(sp), Lun(sp)); 8191 } 8192 sp->cmd_pkt_flags = flags; 8193 fas->f_omsglen = 0; 8194 return (rval); 8195 } 8196 8197 /* 8198 * abort a disconnected command; if it is a tagged command, we need 8199 * to include the tag 8200 */ 8201 static int 8202 fas_abort_disconnected_cmd(struct fas *fas, struct scsi_address *ap, 8203 struct fas_cmd *sp, uchar_t msg, int slot) 8204 { 8205 auto struct fas_cmd local; 8206 struct fas_cmd *proxy_cmdp = &local; 8207 struct scsi_pkt *pkt; 8208 int rval; 8209 int target = ap->a_target; 8210 8211 /* 8212 * if reset delay is active, we cannot start a selection 8213 * and there shouldn't be a cmd outstanding 8214 */ 8215 if (fas->f_reset_delay[target] != 0) { 8216 return (FALSE); 8217 } 8218 8219 if (sp) 8220 ASSERT(sp->cmd_slot == slot); 8221 8222 IPRINTF1("aborting disconnected tagged cmd(s) with %s\n", 8223 scsi_mname(msg)); 8224 pkt = kmem_alloc(scsi_pkt_size(), KM_SLEEP); 8225 if (sp && (TAGGED(target) && (msg == MSG_ABORT_TAG))) { 8226 int tag = sp->cmd_tag[1]; 8227 ASSERT(sp == fas->f_active[slot]->f_slot[tag]); 8228 fas_makeproxy_cmd(proxy_cmdp, ap, pkt, 3, 8229 MSG_SIMPLE_QTAG, tag, msg); 8230 } else { 8231 fas_makeproxy_cmd(proxy_cmdp, ap, pkt, 1, msg); 8232 } 8233 8234 rval = fas_do_proxy_cmd(fas, proxy_cmdp, ap, scsi_mname(msg)); 8235 kmem_free(pkt, scsi_pkt_size()); 8236 return (rval); 8237 } 8238 8239 /* 8240 * reset handling: 8241 * fas_do_scsi_reset assumes that we have already entered the mutex 8242 */ 8243 static int 8244 fas_do_scsi_reset(struct scsi_address *ap, int level) 8245 { 8246 int rval = FALSE; 8247 struct fas *fas = ADDR2FAS(ap); 8248 short slot = (ap->a_target * NLUNS_PER_TARGET) | ap->a_lun; 8249 8250 ASSERT(mutex_owned(FAS_MUTEX(fas))); 8251 IPRINTF3("fas_scsi_reset for slot %x, level=%x, tcmds=%x\n", 8252 slot, level, fas->f_tcmds[slot]); 8253 8254 fas_move_waitQ_to_readyQ(fas); 8255 8256 if (level == RESET_ALL) { 8257 /* 8258 * We know that fas_reset_bus() returns ACTION_RETURN. 8259 */ 8260 (void) fas_reset_bus(fas); 8261 8262 /* 8263 * Now call fas_dopoll() to field the reset interrupt 8264 * which will then call fas_reset_recovery which will 8265 * call the completion function for all commands. 8266 */ 8267 if (fas_dopoll(fas, SHORT_POLL_TIMEOUT) <= 0) { 8268 /* 8269 * reset fas 8270 */ 8271 fas_internal_reset(fas, FAS_RESET_FAS); 8272 (void) fas_reset_bus(fas); 8273 if (fas_dopoll(fas, SHORT_POLL_TIMEOUT) <= 0) { 8274 fas_log(fas, 8275 CE_WARN, "reset scsi bus failed"); 8276 New_state(fas, STATE_FREE); 8277 } else { 8278 rval = TRUE; 8279 } 8280 } else { 8281 rval = TRUE; 8282 } 8283 8284 } else { 8285 struct fas_cmd *cur_sp = fas->f_current_sp; 8286 void (*savec)() = NULL; 8287 8288 /* 8289 * prevent new commands from starting 8290 */ 8291 fas_set_all_lun_throttles(fas, slot, HOLD_THROTTLE); 8292 8293 /* 8294 * zero pkt_comp so it won't complete during the reset and 8295 * we can still update the packet after the reset. 8296 */ 8297 if (cur_sp) { 8298 savec = cur_sp->cmd_pkt->pkt_comp; 8299 cur_sp->cmd_pkt->pkt_comp = NULL; 8300 } 8301 8302 /* 8303 * is this a connected cmd but not selecting? 8304 */ 8305 if (cur_sp && (fas->f_state != STATE_FREE) && 8306 (cur_sp->cmd_pkt->pkt_state != 0) && 8307 (ap->a_target == (Tgt(cur_sp)))) { 8308 rval = fas_reset_connected_cmd(fas, ap); 8309 } 8310 8311 /* 8312 * if not connected or fas_reset_connected_cmd() failed, 8313 * attempt a reset_disconnected_cmd 8314 */ 8315 if (rval == FALSE) { 8316 rval = fas_reset_disconnected_cmd(fas, ap); 8317 } 8318 8319 /* 8320 * cleanup if reset was successful 8321 * complete the current sp first. 8322 */ 8323 if (cur_sp) { 8324 cur_sp->cmd_pkt->pkt_comp = savec; 8325 if (cur_sp->cmd_flags & CFLAG_COMPLETED) { 8326 if (ap->a_target == (Tgt(cur_sp))) { 8327 fas_set_pkt_reason(fas, cur_sp, 8328 CMD_RESET, STAT_DEV_RESET); 8329 } 8330 fas_remove_cmd(fas, cur_sp, NEW_TIMEOUT); 8331 cur_sp->cmd_flags &= ~CFLAG_COMPLETED; 8332 fas_decrement_ncmds(fas, cur_sp); 8333 fas_call_pkt_comp(fas, cur_sp); 8334 } 8335 } 8336 8337 if (rval == TRUE) { 8338 fas_reset_cleanup(fas, slot); 8339 } else { 8340 IPRINTF1("fas_scsi_reset failed for slot %x\n", slot); 8341 8342 /* 8343 * restore throttles to max throttle, regardless 8344 * of what it was (fas_set_throttles() will deal 8345 * with reset delay active) 8346 * restoring to the old throttle is not 8347 * a such a good idea 8348 */ 8349 fas_set_all_lun_throttles(fas, slot, MAX_THROTTLE); 8350 8351 } 8352 8353 if (fas->f_state == STATE_FREE) { 8354 (void) fas_ustart(fas); 8355 } 8356 } 8357 exit: 8358 ASSERT(mutex_owned(FAS_MUTEX(fas))); 8359 ASSERT(fas->f_ncmds >= fas->f_ndisc); 8360 8361 #ifdef FASDEBUG 8362 if (rval && fas_test_stop) { 8363 debug_enter("reset succeeded"); 8364 } 8365 #endif 8366 return (rval); 8367 } 8368 8369 /* 8370 * reset delay is handled by a separate watchdog; this ensures that 8371 * regardless of fas_scsi_watchdog_tick, the reset delay will not change 8372 */ 8373 static void 8374 fas_start_watch_reset_delay(struct fas *fas) 8375 { 8376 mutex_enter(&fas_global_mutex); 8377 if ((fas_reset_watch == 0) && FAS_CAN_SCHED) { 8378 fas_reset_watch = timeout(fas_watch_reset_delay, NULL, 8379 drv_usectohz((clock_t)FAS_WATCH_RESET_DELAY_TICK * 1000)); 8380 } 8381 ASSERT((fas_reset_watch != 0) || (fas->f_flags & FAS_FLG_NOTIMEOUTS)); 8382 mutex_exit(&fas_global_mutex); 8383 } 8384 8385 /* 8386 * set throttles to HOLD and set reset_delay for all target/luns 8387 */ 8388 static void 8389 fas_setup_reset_delay(struct fas *fas) 8390 { 8391 if (!ddi_in_panic()) { 8392 int i; 8393 8394 fas_set_throttles(fas, 0, N_SLOTS, HOLD_THROTTLE); 8395 for (i = 0; i < NTARGETS_WIDE; i++) { 8396 fas->f_reset_delay[i] = fas->f_scsi_reset_delay; 8397 } 8398 fas_start_watch_reset_delay(fas); 8399 } else { 8400 drv_usecwait(fas->f_scsi_reset_delay * 1000); 8401 } 8402 } 8403 8404 /* 8405 * fas_watch_reset_delay(_subr) is invoked by timeout() and checks every 8406 * fas instance for active reset delays 8407 */ 8408 /*ARGSUSED*/ 8409 static void 8410 fas_watch_reset_delay(void *arg) 8411 { 8412 struct fas *fas; 8413 struct fas *lfas; /* last not_done fas */ 8414 int not_done = 0; 8415 8416 mutex_enter(&fas_global_mutex); 8417 fas_reset_watch = 0; 8418 mutex_exit(&fas_global_mutex); 8419 8420 rw_enter(&fas_global_rwlock, RW_READER); 8421 for (fas = fas_head; fas != (struct fas *)NULL; fas = fas->f_next) { 8422 if (fas->f_tran == 0) { 8423 continue; 8424 } 8425 mutex_enter(FAS_MUTEX(fas)); 8426 not_done += fas_watch_reset_delay_subr(fas); 8427 lfas = fas; 8428 fas_check_waitQ_and_mutex_exit(fas); 8429 } 8430 rw_exit(&fas_global_rwlock); 8431 if (not_done) { 8432 ASSERT(lfas != NULL); 8433 fas_start_watch_reset_delay(lfas); 8434 } 8435 } 8436 8437 static int 8438 fas_watch_reset_delay_subr(struct fas *fas) 8439 { 8440 short slot, s; 8441 int start_slot = -1; 8442 int done = 0; 8443 8444 for (slot = 0; slot < N_SLOTS; slot += NLUNS_PER_TARGET) { 8445 8446 /* 8447 * check if a reset delay is active; if so back to full throttle 8448 * which will unleash the cmds in the ready Q 8449 */ 8450 s = slot/NLUNS_PER_TARGET; 8451 if (fas->f_reset_delay[s] != 0) { 8452 EPRINTF2("target%d: reset delay=%d\n", s, 8453 fas->f_reset_delay[s]); 8454 fas->f_reset_delay[s] -= FAS_WATCH_RESET_DELAY_TICK; 8455 if (fas->f_reset_delay[s] <= 0) { 8456 /* 8457 * clear throttle for all luns on this target 8458 */ 8459 fas->f_reset_delay[s] = 0; 8460 fas_set_all_lun_throttles(fas, 8461 slot, MAX_THROTTLE); 8462 IPRINTF1("reset delay completed, slot=%x\n", 8463 slot); 8464 if (start_slot == -1) { 8465 start_slot = slot; 8466 } 8467 } else { 8468 done = -1; 8469 } 8470 } 8471 } 8472 8473 /* 8474 * start a cmd if a reset delay expired 8475 */ 8476 if (start_slot != -1 && fas->f_state == STATE_FREE) { 8477 (void) fas_ustart(fas); 8478 } 8479 return (done); 8480 } 8481 8482 /* 8483 * cleanup after a device reset. this affects all target's luns 8484 */ 8485 static void 8486 fas_reset_cleanup(struct fas *fas, int slot) 8487 { 8488 /* 8489 * reset msg has been accepted, now cleanup queues; 8490 * for all luns of this target 8491 */ 8492 int i, start, end; 8493 int target = slot/NLUNS_PER_TARGET; 8494 8495 start = slot & ~(NLUNS_PER_TARGET-1); 8496 end = start + NLUNS_PER_TARGET; 8497 IPRINTF4("fas_reset_cleanup: slot %x, start=%x, end=%x, tcmds=%x\n", 8498 slot, start, end, fas->f_tcmds[slot]); 8499 8500 ASSERT(!(fas->f_current_sp && 8501 (fas->f_current_sp->cmd_slot == slot) && 8502 (fas->f_state & STATE_SELECTING))); 8503 8504 /* 8505 * if we are not in panic set up a reset delay for this target, 8506 * a zero throttle forces all new requests into the ready Q 8507 */ 8508 if (!ddi_in_panic()) { 8509 fas_set_all_lun_throttles(fas, start, HOLD_THROTTLE); 8510 fas->f_reset_delay[target] = fas->f_scsi_reset_delay; 8511 fas_start_watch_reset_delay(fas); 8512 } else { 8513 drv_usecwait(fas->f_scsi_reset_delay * 1000); 8514 } 8515 8516 for (i = start; i < end; i++) { 8517 fas_mark_packets(fas, i, CMD_RESET, STAT_DEV_RESET); 8518 fas_flush_tagQ(fas, i); 8519 fas_flush_readyQ(fas, i); 8520 if (fas->f_arq_pkt[i]) { 8521 struct fas_cmd *sp = fas->f_arq_pkt[i]; 8522 struct arq_private_data *arq_data = 8523 (struct arq_private_data *) 8524 (sp->cmd_pkt->pkt_private); 8525 if (sp->cmd_pkt->pkt_comp) { 8526 ASSERT(arq_data->arq_save_sp == NULL); 8527 } 8528 } 8529 ASSERT(fas->f_tcmds[i] == 0); 8530 } 8531 ASSERT(fas->f_ncmds >= fas->f_ndisc); 8532 8533 fas_force_renegotiation(fas, target); 8534 } 8535 8536 /* 8537 * reset a currently disconnected target 8538 */ 8539 static int 8540 fas_reset_disconnected_cmd(struct fas *fas, struct scsi_address *ap) 8541 { 8542 auto struct fas_cmd local; 8543 struct fas_cmd *sp = &local; 8544 struct scsi_pkt *pkt; 8545 int rval; 8546 8547 pkt = kmem_alloc(scsi_pkt_size(), KM_SLEEP); 8548 fas_makeproxy_cmd(sp, ap, pkt, 1, MSG_DEVICE_RESET); 8549 rval = fas_do_proxy_cmd(fas, sp, ap, scsi_mname(MSG_DEVICE_RESET)); 8550 kmem_free(pkt, scsi_pkt_size()); 8551 return (rval); 8552 } 8553 8554 /* 8555 * reset a target with a currently connected command 8556 * Assert ATN and send MSG_DEVICE_RESET, zero throttles temporarily 8557 * to prevent new cmds from starting regardless of the outcome 8558 */ 8559 static int 8560 fas_reset_connected_cmd(struct fas *fas, struct scsi_address *ap) 8561 { 8562 int rval = FALSE; 8563 struct fas_cmd *sp = fas->f_current_sp; 8564 int flags = sp->cmd_pkt_flags; 8565 8566 /* 8567 * only attempt to reset in data phase; during other phases 8568 * asserting ATN may just cause confusion 8569 */ 8570 if (!((fas->f_state == ACTS_DATA) || 8571 (fas->f_state == ACTS_DATA_DONE))) { 8572 return (rval); 8573 } 8574 8575 IPRINTF2("Sending reset message to connected %d.%d\n", 8576 ap->a_target, ap->a_lun); 8577 fas->f_reset_msg_sent = 0; 8578 fas->f_omsglen = 1; 8579 fas->f_cur_msgout[0] = MSG_DEVICE_RESET; 8580 sp->cmd_pkt_flags |= FLAG_NOINTR; 8581 8582 fas_assert_atn(fas); 8583 8584 /* 8585 * poll for interrupts until bus free 8586 */ 8587 (void) fas_dopoll(fas, SHORT_POLL_TIMEOUT); 8588 8589 /* 8590 * now check if the msg was taken 8591 * f_reset is set in fas_handle_msg_out_done when 8592 * msg has actually gone out (ie. msg out phase occurred) 8593 */ 8594 if (fas->f_reset_msg_sent && (sp->cmd_flags & CFLAG_COMPLETED)) { 8595 IPRINTF2("target %d.%d reset\n", ap->a_target, ap->a_lun); 8596 rval = TRUE; 8597 } else { 8598 IPRINTF2("target %d.%d did not reset\n", 8599 ap->a_target, ap->a_lun); 8600 } 8601 sp->cmd_pkt_flags = flags; 8602 fas->f_omsglen = 0; 8603 8604 return (rval); 8605 } 8606 8607 /* 8608 * reset the scsi bus to blow all commands away 8609 */ 8610 static int 8611 fas_reset_bus(struct fas *fas) 8612 { 8613 IPRINTF("fas_reset_bus:\n"); 8614 New_state(fas, ACTS_RESET); 8615 8616 fas_internal_reset(fas, FAS_RESET_SCSIBUS); 8617 8618 /* 8619 * Now that we've reset the SCSI bus, we'll take a SCSI RESET 8620 * interrupt and use that to clean up the state of things. 8621 */ 8622 return (ACTION_RETURN); 8623 } 8624 8625 /* 8626 * fas_reset_recovery is called on the reset interrupt and cleans 8627 * up all cmds (active or waiting) 8628 */ 8629 static int 8630 fas_reset_recovery(struct fas *fas) 8631 { 8632 short slot, start_slot; 8633 int i; 8634 int rval = ACTION_SEARCH; 8635 int max_loop = 0; 8636 8637 IPRINTF("fas_reset_recovery:\n"); 8638 fas_check_ncmds(fas); 8639 8640 /* 8641 * renegotiate wide and sync for all targets 8642 */ 8643 fas->f_sync_known = fas->f_wide_known = 0; 8644 8645 /* 8646 * reset dma engine 8647 */ 8648 FAS_FLUSH_DMA_HARD(fas); 8649 8650 /* 8651 * set throttles and reset delay 8652 */ 8653 fas_setup_reset_delay(fas); 8654 8655 /* 8656 * clear interrupts until they go away 8657 */ 8658 while (INTPENDING(fas) && (max_loop < FAS_RESET_SPIN_MAX_LOOP)) { 8659 volatile struct fasreg *fasreg = fas->f_reg; 8660 fas->f_stat = fas_reg_read(fas, &fasreg->fas_stat); 8661 fas->f_stat2 = fas_reg_read(fas, &fasreg->fas_stat2); 8662 fas->f_step = fas_reg_read(fas, &fasreg->fas_step); 8663 fas->f_intr = fas_reg_read(fas, &fasreg->fas_intr); 8664 drv_usecwait(FAS_RESET_SPIN_DELAY_USEC); 8665 max_loop++; 8666 } 8667 8668 if (max_loop >= FAS_RESET_SPIN_MAX_LOOP) { 8669 fas_log(fas, CE_WARN, "Resetting SCSI bus failed"); 8670 } 8671 8672 fas_reg_cmd_write(fas, CMD_FLUSH); 8673 8674 /* 8675 * reset the chip, this shouldn't be necessary but sometimes 8676 * we get a hang in the next data in phase 8677 */ 8678 fas_internal_reset(fas, FAS_RESET_FAS); 8679 8680 /* 8681 * reset was expected? if not, it must be external bus reset 8682 */ 8683 if (fas->f_state != ACTS_RESET) { 8684 if (fas->f_ncmds) { 8685 fas_log(fas, CE_WARN, "external SCSI bus reset"); 8686 } 8687 } 8688 8689 if (fas->f_ncmds == 0) { 8690 rval = ACTION_RETURN; 8691 goto done; 8692 } 8693 8694 /* 8695 * completely reset the state of the softc data. 8696 */ 8697 fas_internal_reset(fas, FAS_RESET_SOFTC); 8698 8699 /* 8700 * Hold the state of the host adapter open 8701 */ 8702 New_state(fas, ACTS_FROZEN); 8703 8704 /* 8705 * for right now just claim that all 8706 * commands have been destroyed by a SCSI reset 8707 * and let already set reason fields or callers 8708 * decide otherwise for specific commands. 8709 */ 8710 start_slot = fas->f_next_slot; 8711 slot = start_slot; 8712 do { 8713 fas_check_ncmds(fas); 8714 fas_mark_packets(fas, slot, CMD_RESET, STAT_BUS_RESET); 8715 fas_flush_tagQ(fas, slot); 8716 fas_flush_readyQ(fas, slot); 8717 if (fas->f_arq_pkt[slot]) { 8718 struct fas_cmd *sp = fas->f_arq_pkt[slot]; 8719 struct arq_private_data *arq_data = 8720 (struct arq_private_data *) 8721 (sp->cmd_pkt->pkt_private); 8722 if (sp->cmd_pkt->pkt_comp) { 8723 ASSERT(arq_data->arq_save_sp == NULL); 8724 } 8725 } 8726 slot = NEXTSLOT(slot, fas->f_dslot); 8727 } while (slot != start_slot); 8728 8729 fas_check_ncmds(fas); 8730 8731 /* 8732 * reset timeouts 8733 */ 8734 for (i = 0; i < N_SLOTS; i++) { 8735 if (fas->f_active[i]) { 8736 fas->f_active[i]->f_timebase = 0; 8737 fas->f_active[i]->f_timeout = 0; 8738 fas->f_active[i]->f_dups = 0; 8739 } 8740 } 8741 8742 done: 8743 /* 8744 * Move the state back to free... 8745 */ 8746 New_state(fas, STATE_FREE); 8747 ASSERT(fas->f_ncmds >= fas->f_ndisc); 8748 8749 /* 8750 * perform the reset notification callbacks that are registered. 8751 */ 8752 (void) scsi_hba_reset_notify_callback(&fas->f_mutex, 8753 &fas->f_reset_notify_listf); 8754 8755 /* 8756 * if reset delay is still active a search is meaningless 8757 * but do it anyway 8758 */ 8759 return (rval); 8760 } 8761 8762 /* 8763 * hba_tran ops for quiesce and unquiesce 8764 */ 8765 static int 8766 fas_scsi_quiesce(dev_info_t *dip) 8767 { 8768 struct fas *fas; 8769 scsi_hba_tran_t *tran; 8770 8771 tran = ddi_get_driver_private(dip); 8772 if ((tran == NULL) || ((fas = TRAN2FAS(tran)) == NULL)) { 8773 return (-1); 8774 } 8775 8776 return (fas_quiesce_bus(fas)); 8777 } 8778 8779 static int 8780 fas_scsi_unquiesce(dev_info_t *dip) 8781 { 8782 struct fas *fas; 8783 scsi_hba_tran_t *tran; 8784 8785 tran = ddi_get_driver_private(dip); 8786 if ((tran == NULL) || ((fas = TRAN2FAS(tran)) == NULL)) { 8787 return (-1); 8788 } 8789 8790 return (fas_unquiesce_bus(fas)); 8791 } 8792 8793 #ifdef FAS_TEST 8794 /* 8795 * torture test functions 8796 */ 8797 static void 8798 fas_test_reset(struct fas *fas, int slot) 8799 { 8800 struct scsi_address ap; 8801 char target = slot/NLUNS_PER_TARGET; 8802 8803 if (fas_rtest & (1 << target)) { 8804 ap.a_hba_tran = fas->f_tran; 8805 ap.a_target = target; 8806 ap.a_lun = 0; 8807 if ((fas_rtest_type == 1) && 8808 (fas->f_state == ACTS_DATA_DONE)) { 8809 if (fas_do_scsi_reset(&ap, RESET_TARGET)) { 8810 fas_rtest = 0; 8811 } 8812 } else if ((fas_rtest_type == 2) && 8813 (fas->f_state == ACTS_DATA_DONE)) { 8814 if (fas_do_scsi_reset(&ap, RESET_ALL)) { 8815 fas_rtest = 0; 8816 } 8817 } else { 8818 if (fas_do_scsi_reset(&ap, RESET_TARGET)) { 8819 fas_rtest = 0; 8820 } 8821 } 8822 } 8823 } 8824 8825 static void 8826 fas_test_abort(struct fas *fas, int slot) 8827 { 8828 struct fas_cmd *sp = fas->f_current_sp; 8829 struct scsi_address ap; 8830 char target = slot/NLUNS_PER_TARGET; 8831 struct scsi_pkt *pkt = NULL; 8832 8833 if (fas_atest & (1 << target)) { 8834 ap.a_hba_tran = fas->f_tran; 8835 ap.a_target = target; 8836 ap.a_lun = 0; 8837 8838 if ((fas_atest_disc == 0) && sp && 8839 (sp->cmd_slot == slot) && 8840 ((sp->cmd_flags & CFLAG_CMDDISC) == 0)) { 8841 pkt = sp->cmd_pkt; 8842 } else if ((fas_atest_disc == 1) && NOTAG(target)) { 8843 sp = fas->f_active[slot]->f_slot[0]; 8844 if (sp && (sp->cmd_flags & CFLAG_CMDDISC)) { 8845 pkt = sp->cmd_pkt; 8846 } 8847 } else if ((fas_atest_disc == 1) && (sp == 0) && 8848 TAGGED(target) && 8849 (fas->f_tcmds[slot] != 0)) { 8850 int tag; 8851 /* 8852 * find the oldest tag 8853 */ 8854 for (tag = NTAGS-1; tag >= 0; tag--) { 8855 if ((sp = fas->f_active[slot]->f_slot[tag]) 8856 != 0) 8857 break; 8858 } 8859 if (sp) { 8860 pkt = sp->cmd_pkt; 8861 ASSERT(sp->cmd_slot == slot); 8862 } else { 8863 return; 8864 } 8865 } else if (fas_atest_disc == 2 && (sp == 0) && 8866 (fas->f_tcmds[slot] != 0)) { 8867 pkt = NULL; 8868 } else if (fas_atest_disc == 2 && NOTAG(target)) { 8869 pkt = NULL; 8870 } else if (fas_atest_disc == 3 && fas->f_readyf[slot]) { 8871 pkt = fas->f_readyf[slot]->cmd_pkt; 8872 } else if (fas_atest_disc == 4 && 8873 fas->f_readyf[slot] && fas->f_readyf[slot]->cmd_forw) { 8874 pkt = fas->f_readyf[slot]->cmd_forw->cmd_pkt; 8875 } else if (fas_atest_disc == 5 && fas->f_readyb[slot]) { 8876 pkt = fas->f_readyb[slot]->cmd_pkt; 8877 } else if ((fas_atest_disc == 6) && sp && 8878 (sp->cmd_slot == slot) && 8879 (fas->f_state == ACTS_DATA_DONE)) { 8880 pkt = sp->cmd_pkt; 8881 } else if (fas_atest_disc == 7) { 8882 if (fas_do_scsi_abort(&ap, NULL)) { 8883 if (fas_do_scsi_abort(&ap, NULL)) { 8884 if (fas_do_scsi_reset(&ap, 8885 RESET_TARGET)) { 8886 fas_atest = 0; 8887 } 8888 } 8889 } 8890 return; 8891 } else { 8892 return; 8893 } 8894 8895 fas_log(fas, CE_NOTE, "aborting pkt=0x%p state=%x\n", 8896 (void *)pkt, (pkt != NULL? pkt->pkt_state : 0)); 8897 if (fas_do_scsi_abort(&ap, pkt)) { 8898 fas_atest = 0; 8899 } 8900 } 8901 } 8902 #endif /* FAS_TEST */ 8903 8904 /* 8905 * capability interface 8906 */ 8907 static int 8908 fas_commoncap(struct scsi_address *ap, char *cap, int val, 8909 int tgtonly, int doset) 8910 { 8911 struct fas *fas = ADDR2FAS(ap); 8912 int cidx; 8913 int target = ap->a_target; 8914 ushort_t tshift = (1<<target); 8915 ushort_t ntshift = ~tshift; 8916 int rval = FALSE; 8917 8918 mutex_enter(FAS_MUTEX(fas)); 8919 8920 if (cap == (char *)0) { 8921 goto exit; 8922 } 8923 8924 cidx = scsi_hba_lookup_capstr(cap); 8925 if (cidx == -1) { 8926 rval = UNDEFINED; 8927 } else if (doset) { 8928 /* 8929 * we usually don't allow setting capabilities for 8930 * other targets! 8931 */ 8932 if (!tgtonly) { 8933 goto exit; 8934 } 8935 switch (cidx) { 8936 case SCSI_CAP_DMA_MAX: 8937 case SCSI_CAP_MSG_OUT: 8938 case SCSI_CAP_PARITY: 8939 case SCSI_CAP_INITIATOR_ID: 8940 case SCSI_CAP_LINKED_CMDS: 8941 case SCSI_CAP_UNTAGGED_QING: 8942 case SCSI_CAP_RESET_NOTIFICATION: 8943 /* 8944 * None of these are settable via 8945 * the capability interface. 8946 */ 8947 break; 8948 8949 case SCSI_CAP_DISCONNECT: 8950 if (val) 8951 fas->f_target_scsi_options[ap->a_target] |= 8952 SCSI_OPTIONS_DR; 8953 else 8954 fas->f_target_scsi_options[ap->a_target] &= 8955 ~SCSI_OPTIONS_DR; 8956 8957 break; 8958 8959 case SCSI_CAP_SYNCHRONOUS: 8960 if (val) { 8961 fas->f_force_async &= ~tshift; 8962 } else { 8963 fas->f_force_async |= tshift; 8964 } 8965 fas_force_renegotiation(fas, target); 8966 rval = TRUE; 8967 break; 8968 8969 case SCSI_CAP_TAGGED_QING: 8970 { 8971 int slot = target * NLUNS_PER_TARGET | ap->a_lun; 8972 ushort_t old_notag = fas->f_notag; 8973 8974 /* do not allow with active tgt */ 8975 if (fas->f_tcmds[slot]) { 8976 break; 8977 } 8978 8979 slot = target * NLUNS_PER_TARGET | ap->a_lun; 8980 8981 if (val) { 8982 if (fas->f_target_scsi_options[target] & 8983 SCSI_OPTIONS_TAG) { 8984 IPRINTF1("target %d: TQ enabled\n", 8985 target); 8986 fas->f_notag &= ntshift; 8987 } else { 8988 break; 8989 } 8990 } else { 8991 IPRINTF1("target %d: TQ disabled\n", 8992 target); 8993 fas->f_notag |= tshift; 8994 } 8995 8996 if (val && fas_alloc_active_slots(fas, slot, 8997 KM_NOSLEEP)) { 8998 fas->f_notag = old_notag; 8999 break; 9000 } 9001 9002 fas_set_all_lun_throttles(fas, slot, MAX_THROTTLE); 9003 9004 fas_update_props(fas, target); 9005 rval = TRUE; 9006 break; 9007 } 9008 9009 case SCSI_CAP_WIDE_XFER: 9010 if (val) { 9011 if (fas->f_target_scsi_options[target] & 9012 SCSI_OPTIONS_WIDE) { 9013 fas->f_nowide &= ntshift; 9014 fas->f_force_narrow &= ~tshift; 9015 } else { 9016 break; 9017 } 9018 } else { 9019 fas->f_force_narrow |= tshift; 9020 } 9021 fas_force_renegotiation(fas, target); 9022 rval = TRUE; 9023 break; 9024 9025 case SCSI_CAP_ARQ: 9026 if (val) { 9027 if (fas_create_arq_pkt(fas, ap)) { 9028 break; 9029 } 9030 } else { 9031 if (fas_delete_arq_pkt(fas, ap)) { 9032 break; 9033 } 9034 } 9035 rval = TRUE; 9036 break; 9037 9038 case SCSI_CAP_QFULL_RETRIES: 9039 fas->f_qfull_retries[target] = (uchar_t)val; 9040 rval = TRUE; 9041 break; 9042 9043 case SCSI_CAP_QFULL_RETRY_INTERVAL: 9044 fas->f_qfull_retry_interval[target] = 9045 drv_usectohz(val * 1000); 9046 rval = TRUE; 9047 break; 9048 9049 default: 9050 rval = UNDEFINED; 9051 break; 9052 } 9053 9054 } else if (doset == 0) { 9055 int slot = target * NLUNS_PER_TARGET | ap->a_lun; 9056 9057 switch (cidx) { 9058 case SCSI_CAP_DMA_MAX: 9059 /* very high limit because of multiple dma windows */ 9060 rval = 1<<30; 9061 break; 9062 case SCSI_CAP_MSG_OUT: 9063 rval = TRUE; 9064 break; 9065 case SCSI_CAP_DISCONNECT: 9066 if (tgtonly && 9067 (fas->f_target_scsi_options[target] & 9068 SCSI_OPTIONS_DR)) { 9069 rval = TRUE; 9070 } 9071 break; 9072 case SCSI_CAP_SYNCHRONOUS: 9073 if (tgtonly && fas->f_offset[target]) { 9074 rval = TRUE; 9075 } 9076 break; 9077 case SCSI_CAP_PARITY: 9078 rval = TRUE; 9079 break; 9080 case SCSI_CAP_INITIATOR_ID: 9081 rval = MY_ID(fas); 9082 break; 9083 case SCSI_CAP_TAGGED_QING: 9084 if (tgtonly && ((fas->f_notag & tshift) == 0)) { 9085 rval = TRUE; 9086 } 9087 break; 9088 case SCSI_CAP_WIDE_XFER: 9089 if ((tgtonly && (fas->f_nowide & tshift) == 0)) { 9090 rval = TRUE; 9091 } 9092 break; 9093 case SCSI_CAP_UNTAGGED_QING: 9094 rval = TRUE; 9095 break; 9096 case SCSI_CAP_ARQ: 9097 if (tgtonly && fas->f_arq_pkt[slot]) { 9098 rval = TRUE; 9099 } 9100 break; 9101 case SCSI_CAP_LINKED_CMDS: 9102 break; 9103 case SCSI_CAP_RESET_NOTIFICATION: 9104 rval = TRUE; 9105 break; 9106 case SCSI_CAP_QFULL_RETRIES: 9107 rval = fas->f_qfull_retries[target]; 9108 break; 9109 case SCSI_CAP_QFULL_RETRY_INTERVAL: 9110 rval = drv_hztousec( 9111 fas->f_qfull_retry_interval[target]) / 9112 1000; 9113 break; 9114 9115 default: 9116 rval = UNDEFINED; 9117 break; 9118 } 9119 } 9120 exit: 9121 if (val && tgtonly) { 9122 fas_update_props(fas, target); 9123 } 9124 fas_check_waitQ_and_mutex_exit(fas); 9125 9126 if (doset) { 9127 IPRINTF6( 9128 "fas_commoncap:tgt=%x,cap=%s,tgtonly=%x,doset=%x,val=%x,rval=%x\n", 9129 target, cap, tgtonly, doset, val, rval); 9130 } 9131 return (rval); 9132 } 9133 9134 /* 9135 * property management 9136 * fas_update_props: 9137 * create/update sync/wide/TQ/scsi-options properties for this target 9138 */ 9139 static void 9140 fas_update_props(struct fas *fas, int tgt) 9141 { 9142 char property[32]; 9143 uint_t xfer_speed = 0; 9144 uint_t xfer_rate = 0; 9145 int wide_enabled, tq_enabled; 9146 uint_t regval = fas->f_sync_period[tgt]; 9147 int offset = fas->f_offset[tgt]; 9148 9149 wide_enabled = ((fas->f_nowide & (1<<tgt)) == 0); 9150 if (offset && regval) { 9151 xfer_speed = 9152 FAS_SYNC_KBPS((regval * fas->f_clock_cycle) / 1000); 9153 xfer_rate = ((wide_enabled)? 2 : 1) * xfer_speed; 9154 } 9155 (void) sprintf(property, "target%x-sync-speed", tgt); 9156 fas_update_this_prop(fas, property, xfer_rate); 9157 9158 (void) sprintf(property, "target%x-wide", tgt); 9159 fas_update_this_prop(fas, property, wide_enabled); 9160 9161 (void) sprintf(property, "target%x-TQ", tgt); 9162 tq_enabled = ((fas->f_notag & (1<<tgt))? 0 : 1); 9163 fas_update_this_prop(fas, property, tq_enabled); 9164 9165 } 9166 9167 static void 9168 fas_update_this_prop(struct fas *fas, char *property, int value) 9169 { 9170 dev_info_t *dip = fas->f_dev; 9171 9172 IPRINTF2("update prop: %s value=%x\n", property, value); 9173 ASSERT(mutex_owned(FAS_MUTEX(fas))); 9174 /* 9175 * We cannot hold any mutex at this point because the call to 9176 * ddi_prop_update_int() may block. 9177 */ 9178 mutex_exit(FAS_MUTEX(fas)); 9179 if (ddi_prop_update_int(DDI_DEV_T_NONE, dip, 9180 property, value) != DDI_PROP_SUCCESS) { 9181 IPRINTF1("cannot modify/create %s property\n", property); 9182 } 9183 mutex_enter(FAS_MUTEX(fas)); 9184 } 9185 9186 /* 9187 * allocate active slots array, size is dependent on whether tagQ enabled 9188 */ 9189 static int 9190 fas_alloc_active_slots(struct fas *fas, int slot, int flag) 9191 { 9192 int target = slot / NLUNS_PER_TARGET; 9193 struct f_slots *old_active = fas->f_active[slot]; 9194 struct f_slots *new_active; 9195 ushort_t size; 9196 int rval = -1; 9197 9198 if (fas->f_tcmds[slot]) { 9199 IPRINTF("cannot change size of active slots array\n"); 9200 return (rval); 9201 } 9202 9203 size = ((NOTAG(target)) ? FAS_F_SLOT_SIZE : FAS_F_SLOTS_SIZE_TQ); 9204 EPRINTF4( 9205 "fas_alloc_active_slots: target=%x size=%x, old=0x%p, oldsize=%x\n", 9206 target, size, (void *)old_active, 9207 ((old_active == NULL) ? -1 : old_active->f_size)); 9208 9209 new_active = kmem_zalloc(size, flag); 9210 if (new_active == NULL) { 9211 IPRINTF("new active alloc failed\n"); 9212 } else { 9213 fas->f_active[slot] = new_active; 9214 fas->f_active[slot]->f_n_slots = (NOTAG(target) ? 1 : NTAGS); 9215 fas->f_active[slot]->f_size = size; 9216 /* 9217 * reserve tag 0 for non-tagged cmds to tagged targets 9218 */ 9219 if (TAGGED(target)) { 9220 fas->f_active[slot]->f_tags = 1; 9221 } 9222 if (old_active) { 9223 kmem_free((caddr_t)old_active, old_active->f_size); 9224 } 9225 rval = 0; 9226 } 9227 return (rval); 9228 } 9229 9230 /* 9231 * Error logging, printing, and debug print routines 9232 */ 9233 static char *fas_label = "fas"; 9234 9235 /*PRINTFLIKE3*/ 9236 static void 9237 fas_log(struct fas *fas, int level, const char *fmt, ...) 9238 { 9239 dev_info_t *dev; 9240 va_list ap; 9241 9242 if (fas) { 9243 dev = fas->f_dev; 9244 } else { 9245 dev = 0; 9246 } 9247 9248 mutex_enter(&fas_log_mutex); 9249 9250 va_start(ap, fmt); 9251 (void) vsprintf(fas_log_buf, fmt, ap); 9252 va_end(ap); 9253 9254 if (level == CE_CONT) { 9255 scsi_log(dev, fas_label, level, "%s\n", fas_log_buf); 9256 } else { 9257 scsi_log(dev, fas_label, level, "%s", fas_log_buf); 9258 } 9259 9260 mutex_exit(&fas_log_mutex); 9261 } 9262 9263 /*PRINTFLIKE2*/ 9264 static void 9265 fas_printf(struct fas *fas, const char *fmt, ...) 9266 { 9267 dev_info_t *dev = 0; 9268 va_list ap; 9269 int level = CE_CONT; 9270 9271 mutex_enter(&fas_log_mutex); 9272 9273 va_start(ap, fmt); 9274 (void) vsprintf(fas_log_buf, fmt, ap); 9275 va_end(ap); 9276 9277 if (fas) { 9278 dev = fas->f_dev; 9279 level = CE_NOTE; 9280 scsi_log(dev, fas_label, level, "%s", fas_log_buf); 9281 } else { 9282 scsi_log(dev, fas_label, level, "%s\n", fas_log_buf); 9283 } 9284 9285 mutex_exit(&fas_log_mutex); 9286 } 9287 9288 #ifdef FASDEBUG 9289 /*PRINTFLIKE2*/ 9290 void 9291 fas_dprintf(struct fas *fas, const char *fmt, ...) 9292 { 9293 dev_info_t *dev = 0; 9294 va_list ap; 9295 9296 if (fas) { 9297 dev = fas->f_dev; 9298 } 9299 9300 mutex_enter(&fas_log_mutex); 9301 9302 va_start(ap, fmt); 9303 (void) vsprintf(fas_log_buf, fmt, ap); 9304 va_end(ap); 9305 9306 scsi_log(dev, fas_label, SCSI_DEBUG, "%s", fas_log_buf); 9307 9308 mutex_exit(&fas_log_mutex); 9309 } 9310 #endif 9311 9312 9313 static void 9314 fas_printstate(struct fas *fas, char *msg) 9315 { 9316 volatile struct fasreg *fasreg = fas->f_reg; 9317 volatile struct dma *dmar = fas->f_dma; 9318 uint_t csr = fas_dma_reg_read(fas, &dmar->dma_csr); 9319 uint_t count = fas_dma_reg_read(fas, &dmar->dma_count); 9320 uint_t addr = fas_dma_reg_read(fas, &dmar->dma_addr); 9321 uint_t test = fas_dma_reg_read(fas, &dmar->dma_test); 9322 uint_t fas_cnt; 9323 9324 fas_log(fas, CE_WARN, "%s: current fas state:", msg); 9325 fas_printf(NULL, "Latched stat=0x%b intr=0x%b", 9326 fas->f_stat, FAS_STAT_BITS, fas->f_intr, FAS_INT_BITS); 9327 fas_printf(NULL, "last msgout: %s, last msgin: %s", 9328 scsi_mname(fas->f_last_msgout), scsi_mname(fas->f_last_msgin)); 9329 fas_printf(NULL, "DMA csr=0x%b", csr, dma_bits); 9330 fas_printf(NULL, 9331 "addr=%x dmacnt=%x test=%x last=%x last_cnt=%x", 9332 addr, count, test, fas->f_lastdma, fas->f_lastcount); 9333 9334 GET_FAS_COUNT(fasreg, fas_cnt); 9335 fas_printf(NULL, "fas state:"); 9336 fas_printf(NULL, "\tcount(32)=%x cmd=%x stat=%x stat2=%x intr=%x", 9337 fas_cnt, fasreg->fas_cmd, fasreg->fas_stat, fasreg->fas_stat2, 9338 fasreg->fas_intr); 9339 fas_printf(NULL, 9340 "\tstep=%x fifoflag=%x conf=%x test=%x conf2=%x conf3=%x", 9341 fasreg->fas_step, fasreg->fas_fifo_flag, fasreg->fas_conf, 9342 fasreg->fas_test, fasreg->fas_conf2, fasreg->fas_conf3); 9343 9344 if (fas->f_current_sp) { 9345 fas_dump_cmd(fas, fas->f_current_sp); 9346 } 9347 } 9348 9349 /* 9350 * dump all we know about a cmd 9351 */ 9352 static void 9353 fas_dump_cmd(struct fas *fas, struct fas_cmd *sp) 9354 { 9355 int i; 9356 uchar_t *cp = (uchar_t *)sp->cmd_pkt->pkt_cdbp; 9357 auto char buf[128]; 9358 9359 buf[0] = '\0'; 9360 fas_printf(NULL, "Cmd dump for Target %d Lun %d:", 9361 Tgt(sp), Lun(sp)); 9362 (void) sprintf(&buf[0], " cdb=["); 9363 for (i = 0; i < (int)sp->cmd_actual_cdblen; i++) { 9364 (void) sprintf(&buf[strlen(buf)], " 0x%x", *cp++); 9365 } 9366 (void) sprintf(&buf[strlen(buf)], " ]"); 9367 fas_printf(NULL, buf); 9368 fas_printf(NULL, "State=%s Last State=%s", 9369 fas_state_name(fas->f_state), fas_state_name(fas->f_laststate)); 9370 fas_printf(NULL, 9371 "pkt_state=0x%b pkt_flags=0x%x pkt_statistics=0x%x", 9372 sp->cmd_pkt->pkt_state, scsi_state_bits, sp->cmd_pkt_flags, 9373 sp->cmd_pkt->pkt_statistics); 9374 if (sp->cmd_pkt->pkt_state & STATE_GOT_STATUS) { 9375 fas_printf(NULL, "Status=0x%x\n", sp->cmd_pkt->pkt_scbp[0]); 9376 } 9377 } 9378 9379 /*ARGSUSED*/ 9380 static void 9381 fas_short_dump_cmd(struct fas *fas, struct fas_cmd *sp) 9382 { 9383 int i; 9384 uchar_t *cp = (uchar_t *)sp->cmd_pkt->pkt_cdbp; 9385 auto char buf[128]; 9386 9387 buf[0] = '\0'; 9388 (void) sprintf(&buf[0], "?%d.%d: cdb=[", Tgt(sp), Lun(sp)); 9389 for (i = 0; i < (int)sp->cmd_actual_cdblen; i++) { 9390 (void) sprintf(&buf[strlen(buf)], " 0x%x", *cp++); 9391 } 9392 (void) sprintf(&buf[strlen(buf)], " ]"); 9393 fas_printf(NULL, buf); 9394 } 9395 9396 /* 9397 * state decoding for error messages 9398 */ 9399 static char * 9400 fas_state_name(ushort_t state) 9401 { 9402 if (state == STATE_FREE) { 9403 return ("FREE"); 9404 } else if (state & STATE_SELECTING) { 9405 if (state == STATE_SELECT_NORMAL) 9406 return ("SELECT"); 9407 else if (state == STATE_SELECT_N_STOP) 9408 return ("SEL&STOP"); 9409 else if (state == STATE_SELECT_N_SENDMSG) 9410 return ("SELECT_SNDMSG"); 9411 else 9412 return ("SEL_NO_ATN"); 9413 } else { 9414 static struct { 9415 char *sname; 9416 char state; 9417 } names[] = { 9418 "CMD_START", ACTS_CMD_START, 9419 "CMD_DONE", ACTS_CMD_DONE, 9420 "MSG_OUT", ACTS_MSG_OUT, 9421 "MSG_OUT_DONE", ACTS_MSG_OUT_DONE, 9422 "MSG_IN", ACTS_MSG_IN, 9423 "MSG_IN_MORE", ACTS_MSG_IN_MORE, 9424 "MSG_IN_DONE", ACTS_MSG_IN_DONE, 9425 "CLEARING", ACTS_CLEARING, 9426 "DATA", ACTS_DATA, 9427 "DATA_DONE", ACTS_DATA_DONE, 9428 "CMD_CMPLT", ACTS_C_CMPLT, 9429 "UNKNOWN", ACTS_UNKNOWN, 9430 "RESEL", ACTS_RESEL, 9431 "ENDVEC", ACTS_ENDVEC, 9432 "RESET", ACTS_RESET, 9433 "ABORTING", ACTS_ABORTING, 9434 "FROZEN", ACTS_FROZEN, 9435 0 9436 }; 9437 int i; 9438 for (i = 0; names[i].sname; i++) { 9439 if (names[i].state == state) 9440 return (names[i].sname); 9441 } 9442 } 9443 return ("<BAD>"); 9444 } 9445