Lines Matching +full:sg +full:- +full:micro
2 * SPDX-License-Identifier: BSD-2-Clause
44 static int tws_cam_depth=(TWS_MAX_REQS - TWS_RESERVED_REQS);
137 if ( tws_cam_depth > (tws_queue_depth - TWS_RESERVED_REQS) ) in tws_cam_attach()
138 tws_cam_depth = tws_queue_depth - TWS_RESERVED_REQS; in tws_cam_attach()
153 sc->sim = cam_sim_alloc(tws_action, tws_poll, "tws", sc, in tws_cam_attach()
154 device_get_unit(sc->tws_dev), in tws_cam_attach()
155 &sc->sim_lock, in tws_cam_attach()
158 if (sc->sim == NULL) { in tws_cam_attach()
163 mtx_lock(&sc->sim_lock); in tws_cam_attach()
164 if (xpt_bus_register(sc->sim, in tws_cam_attach()
165 sc->tws_dev, in tws_cam_attach()
167 cam_sim_free(sc->sim, TRUE); /* passing true will free the devq */ in tws_cam_attach()
168 sc->sim = NULL; /* so cam_detach will not try to free it */ in tws_cam_attach()
169 mtx_unlock(&sc->sim_lock); in tws_cam_attach()
173 if (xpt_create_path(&sc->path, NULL, cam_sim_path(sc->sim), in tws_cam_attach()
176 xpt_bus_deregister(cam_sim_path(sc->sim)); in tws_cam_attach()
178 cam_sim_free(sc->sim, TRUE); in tws_cam_attach()
180 mtx_unlock(&sc->sim_lock); in tws_cam_attach()
183 mtx_unlock(&sc->sim_lock); in tws_cam_attach()
192 mtx_lock(&sc->sim_lock); in tws_cam_detach()
193 if (sc->path) in tws_cam_detach()
194 xpt_free_path(sc->path); in tws_cam_detach()
195 if (sc->sim) { in tws_cam_detach()
196 xpt_bus_deregister(cam_sim_path(sc->sim)); in tws_cam_detach()
197 cam_sim_free(sc->sim, TRUE); in tws_cam_detach()
199 mtx_unlock(&sc->sim_lock); in tws_cam_detach()
208 if (!(sc->sim)) in tws_bus_scan()
211 mtx_lock(&sc->sim_lock); in tws_bus_scan()
212 if (xpt_create_path(&ccb->ccb_h.path, NULL, cam_sim_path(sc->sim), in tws_bus_scan()
214 mtx_unlock(&sc->sim_lock); in tws_bus_scan()
219 mtx_unlock(&sc->sim_lock); in tws_bus_scan()
228 switch( ccb->ccb_h.func_code ) { in tws_action()
238 ccb->ccb_h.status = CAM_UA_ABORT; in tws_action()
250 ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; in tws_action()
259 ccb->cts.protocol = PROTO_SCSI; in tws_action()
260 ccb->cts.protocol_version = SCSI_REV_2; in tws_action()
261 ccb->cts.transport = XPORT_SPI; in tws_action()
262 ccb->cts.transport_version = 2; in tws_action()
264 ccb->cts.xport_specific.spi.valid = CTS_SPI_VALID_DISC; in tws_action()
265 ccb->cts.xport_specific.spi.flags = CTS_SPI_FLAGS_DISC_ENB; in tws_action()
266 ccb->cts.proto_specific.scsi.valid = CTS_SCSI_VALID_TQ; in tws_action()
267 ccb->cts.proto_specific.scsi.flags = CTS_SCSI_FLAGS_TAG_ENB; in tws_action()
268 ccb->ccb_h.status = CAM_REQ_CMP; in tws_action()
275 TWS_TRACE_DEBUG(sc, "calc geometry(ccb,block-size)", ccb, in tws_action()
276 ccb->ccg.block_size); in tws_action()
277 cam_calc_geometry(&ccb->ccg, 1/* extended */); in tws_action()
285 ccb->cpi.version_num = 1; in tws_action()
286 ccb->cpi.hba_inquiry = 0; in tws_action()
287 ccb->cpi.target_sprt = 0; in tws_action()
288 ccb->cpi.hba_misc = 0; in tws_action()
289 ccb->cpi.hba_eng_cnt = 0; in tws_action()
290 ccb->cpi.max_target = TWS_MAX_NUM_UNITS; in tws_action()
291 ccb->cpi.max_lun = TWS_MAX_NUM_LUNS - 1; in tws_action()
292 ccb->cpi.unit_number = cam_sim_unit(sim); in tws_action()
293 ccb->cpi.bus_id = cam_sim_bus(sim); in tws_action()
294 ccb->cpi.initiator_id = TWS_SCSI_INITIATOR_ID; in tws_action()
295 ccb->cpi.base_transfer_speed = 6000000; in tws_action()
296 strlcpy(ccb->cpi.sim_vid, "FreeBSD", SIM_IDLEN); in tws_action()
297 strlcpy(ccb->cpi.hba_vid, "3ware", HBA_IDLEN); in tws_action()
298 strlcpy(ccb->cpi.dev_name, cam_sim_name(sim), DEV_IDLEN); in tws_action()
299 ccb->cpi.transport = XPORT_SPI; in tws_action()
300 ccb->cpi.transport_version = 2; in tws_action()
301 ccb->cpi.protocol = PROTO_SCSI; in tws_action()
302 ccb->cpi.protocol_version = SCSI_REV_2; in tws_action()
303 ccb->cpi.maxio = TWS_MAX_IO_SIZE; in tws_action()
304 ccb->ccb_h.status = CAM_REQ_CMP; in tws_action()
311 ccb->ccb_h.status = CAM_REQ_INVALID; in tws_action()
320 struct tws_softc *sc = req->sc; in tws_scsi_complete()
322 mtx_lock(&sc->q_lock); in tws_scsi_complete()
324 mtx_unlock(&sc->q_lock); in tws_scsi_complete()
326 callout_stop(&req->timeout); in tws_scsi_complete()
327 tws_unmap_request(req->sc, req); in tws_scsi_complete()
329 req->ccb_ptr->ccb_h.status = CAM_REQ_CMP; in tws_scsi_complete()
330 mtx_lock(&sc->sim_lock); in tws_scsi_complete()
331 xpt_done(req->ccb_ptr); in tws_scsi_complete()
332 mtx_unlock(&sc->sim_lock); in tws_scsi_complete()
334 mtx_lock(&sc->q_lock); in tws_scsi_complete()
336 mtx_unlock(&sc->q_lock); in tws_scsi_complete()
342 struct tws_softc *sc = req->sc; in tws_getset_param_complete()
344 TWS_TRACE_DEBUG(sc, "getset complete", req, req->request_id); in tws_getset_param_complete()
346 callout_stop(&req->timeout); in tws_getset_param_complete()
349 free(req->data, M_TWS); in tws_getset_param_complete()
351 req->state = TWS_REQ_STATE_FREE; in tws_getset_param_complete()
357 struct tws_softc *sc = req->sc; in tws_aen_complete()
362 TWS_TRACE_DEBUG(sc, "aen complete", 0, req->request_id); in tws_aen_complete()
364 callout_stop(&req->timeout); in tws_aen_complete()
367 sense = (struct tws_command_header *)req->data; in tws_aen_complete()
369 TWS_TRACE_DEBUG(sc,"sense code, key",sense->sense_data[0], in tws_aen_complete()
370 sense->sense_data[2]); in tws_aen_complete()
371 TWS_TRACE_DEBUG(sc,"sense rid, seve",sense->header_desc.request_id, in tws_aen_complete()
372 sense->status_block.res__severity); in tws_aen_complete()
373 TWS_TRACE_DEBUG(sc,"sense srcnum, error",sense->status_block.srcnum, in tws_aen_complete()
374 sense->status_block.error); in tws_aen_complete()
375 TWS_TRACE_DEBUG(sc,"sense shdr, ssense",sense->header_desc.size_header, in tws_aen_complete()
376 sense->header_desc.size_sense); in tws_aen_complete()
378 aen_code = sense->status_block.error; in tws_aen_complete()
388 event.sequence_id = sc->seq_id; in tws_aen_complete()
390 event.aen_code = sense->status_block.error; in tws_aen_complete()
391 event.severity = sense->status_block.res__severity & 0x7; in tws_aen_complete()
396 bcopy(sense->err_specific_desc, event.parameter_data, in tws_aen_complete()
398 event.parameter_data[TWS_ERROR_SPECIFIC_DESC_LEN - 1] = '\0'; in tws_aen_complete()
406 device_printf(sc->tws_dev, "%s: (0x%02X: 0x%04X): %s: %s\n", in tws_aen_complete()
414 mtx_lock(&sc->gen_lock); in tws_aen_complete()
415 tws_circular_aenq_insert(sc, &sc->aen_q, &event); in tws_aen_complete()
416 sc->seq_id++; in tws_aen_complete()
417 mtx_unlock(&sc->gen_lock); in tws_aen_complete()
421 free(req->data, M_TWS); in tws_aen_complete()
423 req->state = TWS_REQ_STATE_FREE; in tws_aen_complete()
427 sc->stats.num_aens++; in tws_aen_complete()
435 struct tws_softc *sc = req->sc; in tws_cmd_complete()
437 callout_stop(&req->timeout); in tws_cmd_complete()
460 hdr = sen->hdr; in tws_err_complete()
462 req_id = hdr->header_desc.request_id; in tws_err_complete()
463 req = &sc->reqs[req_id]; in tws_err_complete()
465 if ( req->error_code != TWS_REQ_RET_SUBMIT_SUCCESS ) in tws_err_complete()
466 TWS_TRACE_DEBUG(sc, "submit failure?", 0, req->error_code); in tws_err_complete()
469 switch (req->type) { in tws_err_complete()
482 mtx_lock(&sc->io_lock); in tws_err_complete()
483 hdr->header_desc.size_header = 128; in tws_err_complete()
491 device_printf(sc->tws_dev, "OBFL Overrun\n"); in tws_err_complete()
492 sc->obfl_q_overrun = true; in tws_err_complete()
494 mtx_unlock(&sc->io_lock); in tws_err_complete()
501 struct tws_softc *sc = req->sc; in tws_scsi_err_complete()
502 union ccb *ccb = req->ccb_ptr; in tws_scsi_err_complete()
504 TWS_TRACE_DEBUG(sc, "sbe, cmd_status", hdr->status_block.error, in tws_scsi_err_complete()
505 req->cmd_pkt->cmd.pkt_a.status); in tws_scsi_err_complete()
506 if ( hdr->status_block.error == TWS_ERROR_LOGICAL_UNIT_NOT_SUPPORTED || in tws_scsi_err_complete()
507 hdr->status_block.error == TWS_ERROR_UNIT_OFFLINE ) { in tws_scsi_err_complete()
508 if ( ccb->ccb_h.target_lun ) { in tws_scsi_err_complete()
510 ccb->ccb_h.status |= CAM_DEV_NOT_THERE; in tws_scsi_err_complete()
513 ccb->ccb_h.status |= CAM_SEL_TIMEOUT; in tws_scsi_err_complete()
518 ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR; in tws_scsi_err_complete()
519 if (((ccb->csio.cdb_io.cdb_bytes[0] == 0x1A) && in tws_scsi_err_complete()
520 (hdr->status_block.error == TWS_ERROR_NOT_SUPPORTED))) { in tws_scsi_err_complete()
521 ccb->ccb_h.status |= CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID; in tws_scsi_err_complete()
527 if (ccb->ccb_h.status == 0) in tws_scsi_err_complete()
528 ccb->ccb_h.status = CAM_REQ_CMP_ERR; in tws_scsi_err_complete()
530 sense_data = (u_int8_t *)&ccb->csio.sense_data; in tws_scsi_err_complete()
532 memcpy(sense_data, hdr->sense_data, TWS_SENSE_DATA_LENGTH ); in tws_scsi_err_complete()
533 ccb->csio.sense_len = TWS_SENSE_DATA_LENGTH; in tws_scsi_err_complete()
534 ccb->ccb_h.status |= CAM_AUTOSNS_VALID; in tws_scsi_err_complete()
536 ccb->csio.scsi_status = req->cmd_pkt->cmd.pkt_a.status; in tws_scsi_err_complete()
538 ccb->ccb_h.status &= ~CAM_SIM_QUEUED; in tws_scsi_err_complete()
539 mtx_lock(&sc->sim_lock); in tws_scsi_err_complete()
541 mtx_unlock(&sc->sim_lock); in tws_scsi_err_complete()
543 callout_stop(&req->timeout); in tws_scsi_err_complete()
544 tws_unmap_request(req->sc, req); in tws_scsi_err_complete()
545 mtx_lock(&sc->q_lock); in tws_scsi_err_complete()
548 mtx_unlock(&sc->q_lock); in tws_scsi_err_complete()
555 TWS_TRACE_DEBUG(req->sc, "entry", hdr, req->request_id); in tws_passthru_err_complete()
556 req->error_code = hdr->status_block.error; in tws_passthru_err_complete()
557 memcpy(&(req->cmd_pkt->hdr), hdr, sizeof(struct tws_command_header)); in tws_passthru_err_complete()
568 mtx_lock(&sc->q_lock); in tws_drain_busy_queue()
570 mtx_unlock(&sc->q_lock); in tws_drain_busy_queue()
572 TWS_TRACE_DEBUG(sc, "moved to TWS_COMPLETE_Q", 0, req->request_id); in tws_drain_busy_queue()
573 callout_stop(&req->timeout); in tws_drain_busy_queue()
575 req->error_code = TWS_REQ_RET_RESET; in tws_drain_busy_queue()
576 ccb = (union ccb *)(req->ccb_ptr); in tws_drain_busy_queue()
578 ccb->ccb_h.status &= ~CAM_SIM_QUEUED; in tws_drain_busy_queue()
579 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in tws_drain_busy_queue()
580 ccb->ccb_h.status |= CAM_SCSI_BUS_RESET; in tws_drain_busy_queue()
582 tws_unmap_request(req->sc, req); in tws_drain_busy_queue()
584 mtx_lock(&sc->sim_lock); in tws_drain_busy_queue()
585 xpt_done(req->ccb_ptr); in tws_drain_busy_queue()
586 mtx_unlock(&sc->sim_lock); in tws_drain_busy_queue()
588 mtx_lock(&sc->q_lock); in tws_drain_busy_queue()
591 mtx_unlock(&sc->q_lock); in tws_drain_busy_queue()
600 r = &sc->reqs[TWS_REQ_TYPE_AEN_FETCH]; in tws_drain_reserved_reqs()
601 if ( r->state != TWS_REQ_STATE_FREE ) { in tws_drain_reserved_reqs()
603 callout_stop(&r->timeout); in tws_drain_reserved_reqs()
605 free(r->data, M_TWS); in tws_drain_reserved_reqs()
606 r->state = TWS_REQ_STATE_FREE; in tws_drain_reserved_reqs()
607 r->error_code = TWS_REQ_RET_RESET; in tws_drain_reserved_reqs()
610 r = &sc->reqs[TWS_REQ_TYPE_PASSTHRU]; in tws_drain_reserved_reqs()
611 if ( r->state == TWS_REQ_STATE_BUSY ) { in tws_drain_reserved_reqs()
613 r->error_code = TWS_REQ_RET_RESET; in tws_drain_reserved_reqs()
616 r = &sc->reqs[TWS_REQ_TYPE_GETSET_PARAM]; in tws_drain_reserved_reqs()
617 if ( r->state != TWS_REQ_STATE_FREE ) { in tws_drain_reserved_reqs()
619 callout_stop(&r->timeout); in tws_drain_reserved_reqs()
621 free(r->data, M_TWS); in tws_drain_reserved_reqs()
622 r->state = TWS_REQ_STATE_FREE; in tws_drain_reserved_reqs()
623 r->error_code = TWS_REQ_RET_RESET; in tws_drain_reserved_reqs()
640 struct ccb_hdr *ccb_h = &(ccb->ccb_h); in tws_execute_scsi()
641 struct ccb_scsiio *csio = &(ccb->csio); in tws_execute_scsi()
645 mtx_assert(&sc->sim_lock, MA_OWNED); in tws_execute_scsi()
646 if (ccb_h->target_id >= TWS_MAX_NUM_UNITS) { in tws_execute_scsi()
647 TWS_TRACE_DEBUG(sc, "traget id too big", ccb_h->target_id, ccb_h->target_lun); in tws_execute_scsi()
648 ccb_h->status |= CAM_TID_INVALID; in tws_execute_scsi()
652 if (ccb_h->target_lun >= TWS_MAX_NUM_LUNS) { in tws_execute_scsi()
653 TWS_TRACE_DEBUG(sc, "target lun 2 big", ccb_h->target_id, ccb_h->target_lun); in tws_execute_scsi()
654 ccb_h->status |= CAM_LUN_INVALID; in tws_execute_scsi()
659 if(ccb_h->flags & CAM_CDB_PHYS) { in tws_execute_scsi()
660 TWS_TRACE_DEBUG(sc, "cdb phy", ccb_h->target_id, ccb_h->target_lun); in tws_execute_scsi()
661 ccb_h->status = CAM_REQ_INVALID; in tws_execute_scsi()
670 ccb_h->status |= CAM_SIM_QUEUED; in tws_execute_scsi()
674 TWS_TRACE_DEBUG(sc, "no reqs", ccb_h->target_id, ccb_h->target_lun); in tws_execute_scsi()
675 ccb_h->status |= CAM_REQUEUE_REQ; in tws_execute_scsi()
680 if((ccb_h->flags & CAM_DIR_MASK) != CAM_DIR_NONE) { in tws_execute_scsi()
681 if(ccb_h->flags & CAM_DIR_IN) in tws_execute_scsi()
682 req->flags |= TWS_DIR_IN; in tws_execute_scsi()
683 if(ccb_h->flags & CAM_DIR_OUT) in tws_execute_scsi()
684 req->flags |= TWS_DIR_OUT; in tws_execute_scsi()
686 req->flags = TWS_DIR_NONE; /* no data */ in tws_execute_scsi()
689 req->type = TWS_REQ_TYPE_SCSI_IO; in tws_execute_scsi()
690 req->cb = tws_scsi_complete; in tws_execute_scsi()
692 cmd_pkt = req->cmd_pkt; in tws_execute_scsi()
693 /* cmd_pkt->hdr.header_desc.size_header = 128; */ in tws_execute_scsi()
694 cmd_pkt->cmd.pkt_a.res__opcode = TWS_FW_CMD_EXECUTE_SCSI; in tws_execute_scsi()
695 cmd_pkt->cmd.pkt_a.unit = ccb_h->target_id; in tws_execute_scsi()
696 cmd_pkt->cmd.pkt_a.status = 0; in tws_execute_scsi()
697 cmd_pkt->cmd.pkt_a.sgl_offset = 16; in tws_execute_scsi()
700 lun = ccb_h->target_lun & 0XF; in tws_execute_scsi()
702 cmd_pkt->cmd.pkt_a.lun_l4__req_id = lun | req->request_id; in tws_execute_scsi()
704 lun = ccb_h->target_lun & 0XF0; in tws_execute_scsi()
706 cmd_pkt->cmd.pkt_a.lun_h4__sgl_entries = lun; in tws_execute_scsi()
709 if ( csio->cdb_len > 16 ) in tws_execute_scsi()
710 TWS_TRACE(sc, "cdb len too big", ccb_h->target_id, csio->cdb_len); in tws_execute_scsi()
713 if(ccb_h->flags & CAM_CDB_POINTER) in tws_execute_scsi()
714 bcopy(csio->cdb_io.cdb_ptr, cmd_pkt->cmd.pkt_a.cdb, csio->cdb_len); in tws_execute_scsi()
716 bcopy(csio->cdb_io.cdb_bytes, cmd_pkt->cmd.pkt_a.cdb, csio->cdb_len); in tws_execute_scsi()
718 req->data = ccb; in tws_execute_scsi()
719 req->flags |= TWS_DATA_CCB; in tws_execute_scsi()
721 req->ccb_ptr = ccb; in tws_execute_scsi()
726 sc->stats.scsi_ios++; in tws_execute_scsi()
727 callout_reset_sbt(&req->timeout, SBT_1MS * ccb->ccb_h.timeout, 0, in tws_execute_scsi()
746 req->cb = tws_aen_complete; in tws_send_scsi_cmd()
748 cmd_pkt = req->cmd_pkt; in tws_send_scsi_cmd()
749 cmd_pkt->cmd.pkt_a.res__opcode = TWS_FW_CMD_EXECUTE_SCSI; in tws_send_scsi_cmd()
750 cmd_pkt->cmd.pkt_a.status = 0; in tws_send_scsi_cmd()
751 cmd_pkt->cmd.pkt_a.unit = 0; in tws_send_scsi_cmd()
752 cmd_pkt->cmd.pkt_a.sgl_offset = 16; in tws_send_scsi_cmd()
753 cmd_pkt->cmd.pkt_a.lun_l4__req_id = req->request_id; in tws_send_scsi_cmd()
755 cmd_pkt->cmd.pkt_a.cdb[0] = (u_int8_t)cmd; in tws_send_scsi_cmd()
756 cmd_pkt->cmd.pkt_a.cdb[4] = 128; in tws_send_scsi_cmd()
758 req->length = TWS_SECTOR_SIZE; in tws_send_scsi_cmd()
759 req->data = malloc(TWS_SECTOR_SIZE, M_TWS, M_NOWAIT); in tws_send_scsi_cmd()
760 if ( req->data == NULL ) in tws_send_scsi_cmd()
762 bzero(req->data, TWS_SECTOR_SIZE); in tws_send_scsi_cmd()
763 req->flags = TWS_DIR_IN; in tws_send_scsi_cmd()
765 callout_reset(&req->timeout, (TWS_IO_TIMEOUT * hz), tws_timeout, req); in tws_send_scsi_cmd()
787 req->length = TWS_SECTOR_SIZE; in tws_set_param()
788 req->data = malloc(TWS_SECTOR_SIZE, M_TWS, M_NOWAIT); in tws_set_param()
789 if ( req->data == NULL ) in tws_set_param()
791 bzero(req->data, TWS_SECTOR_SIZE); in tws_set_param()
792 param = (struct tws_getset_param *)req->data; in tws_set_param()
794 req->cb = tws_getset_param_complete; in tws_set_param()
795 req->flags = TWS_DIR_OUT; in tws_set_param()
796 cmd_pkt = req->cmd_pkt; in tws_set_param()
798 cmd = &cmd_pkt->cmd.pkt_g; in tws_set_param()
799 cmd->param.sgl_off__opcode = in tws_set_param()
801 cmd->param.request_id = (u_int8_t)req->request_id; in tws_set_param()
802 cmd->param.host_id__unit = 0; in tws_set_param()
803 cmd->param.param_count = 1; in tws_set_param()
804 cmd->param.size = 2; /* map routine will add sgls */ in tws_set_param()
807 param->table_id = (table_id | TWS_9K_PARAM_DESCRIPTOR); in tws_set_param()
808 param->parameter_id = (u_int8_t)(param_id); in tws_set_param()
809 param->parameter_size_bytes = (u_int16_t)param_size; in tws_set_param()
810 memcpy(param->data, data, param_size); in tws_set_param()
812 callout_reset(&req->timeout, (TWS_IOCTL_TIMEOUT * hz), tws_timeout, req); in tws_set_param()
836 req->length = TWS_SECTOR_SIZE; in tws_get_param()
837 req->data = malloc(TWS_SECTOR_SIZE, M_TWS, M_NOWAIT); in tws_get_param()
838 if ( req->data == NULL ) in tws_get_param()
840 bzero(req->data, TWS_SECTOR_SIZE); in tws_get_param()
841 param = (struct tws_getset_param *)req->data; in tws_get_param()
843 req->cb = NULL; in tws_get_param()
844 req->flags = TWS_DIR_IN; in tws_get_param()
845 cmd_pkt = req->cmd_pkt; in tws_get_param()
847 cmd = &cmd_pkt->cmd.pkt_g; in tws_get_param()
848 cmd->param.sgl_off__opcode = in tws_get_param()
850 cmd->param.request_id = (u_int8_t)req->request_id; in tws_get_param()
851 cmd->param.host_id__unit = 0; in tws_get_param()
852 cmd->param.param_count = 1; in tws_get_param()
853 cmd->param.size = 2; /* map routine will add sgls */ in tws_get_param()
856 param->table_id = (table_id | TWS_9K_PARAM_DESCRIPTOR); in tws_get_param()
857 param->parameter_id = (u_int8_t)(param_id); in tws_get_param()
858 param->parameter_size_bytes = (u_int16_t)param_size; in tws_get_param()
866 memcpy(data, param->data, param_size); in tws_get_param()
872 free(req->data, M_TWS); in tws_get_param()
873 req->state = TWS_REQ_STATE_FREE; in tws_get_param()
881 if (req->data != NULL) { in tws_unmap_request()
882 if ( req->flags & TWS_DIR_IN ) in tws_unmap_request()
883 bus_dmamap_sync(sc->data_tag, req->dma_map, in tws_unmap_request()
885 if ( req->flags & TWS_DIR_OUT ) in tws_unmap_request()
886 bus_dmamap_sync(sc->data_tag, req->dma_map, in tws_unmap_request()
888 mtx_lock(&sc->io_lock); in tws_unmap_request()
889 bus_dmamap_unload(sc->data_tag, req->dma_map); in tws_unmap_request()
890 mtx_unlock(&sc->io_lock); in tws_unmap_request()
900 if (req->data != NULL) { in tws_map_request()
901 int my_flags = ((req->type == TWS_REQ_TYPE_SCSI_IO) ? BUS_DMA_WAITOK : BUS_DMA_NOWAIT); in tws_map_request()
904 * Map the data buffer into bus space and build the SG list. in tws_map_request()
906 mtx_lock(&sc->io_lock); in tws_map_request()
907 if (req->flags & TWS_DATA_CCB) in tws_map_request()
908 error = bus_dmamap_load_ccb(sc->data_tag, req->dma_map, in tws_map_request()
909 req->data, in tws_map_request()
913 error = bus_dmamap_load(sc->data_tag, req->dma_map, in tws_map_request()
914 req->data, req->length, in tws_map_request()
917 mtx_unlock(&sc->io_lock); in tws_map_request()
935 struct tws_softc *sc = req->sc; in tws_dmamap_data_load_cbfn()
946 req->error_code = error; in tws_dmamap_data_load_cbfn()
947 req->ccb_ptr->ccb_h.status = CAM_REQ_TOO_BIG; in tws_dmamap_data_load_cbfn()
951 if ( req->flags & TWS_DIR_IN ) in tws_dmamap_data_load_cbfn()
952 bus_dmamap_sync(req->sc->data_tag, req->dma_map, in tws_dmamap_data_load_cbfn()
954 if ( req->flags & TWS_DIR_OUT ) in tws_dmamap_data_load_cbfn()
955 bus_dmamap_sync(req->sc->data_tag, req->dma_map, in tws_dmamap_data_load_cbfn()
958 if ( (req->type == TWS_REQ_TYPE_PASSTHRU && in tws_dmamap_data_load_cbfn()
959 GET_OPCODE(req->cmd_pkt->cmd.pkt_a.res__opcode) != in tws_dmamap_data_load_cbfn()
961 req->type == TWS_REQ_TYPE_GETSET_PARAM) { in tws_dmamap_data_load_cbfn()
962 gcmd = &req->cmd_pkt->cmd.pkt_g.generic; in tws_dmamap_data_load_cbfn()
963 sgl_ptr = (u_int32_t *)(gcmd) + gcmd->size; in tws_dmamap_data_load_cbfn()
964 gcmd->size += sgls * in tws_dmamap_data_load_cbfn()
965 ((req->sc->is64bit && !tws_use_32bit_sgls) ? 4 : 2 ); in tws_dmamap_data_load_cbfn()
966 tws_fill_sg_list(req->sc, (void *)segs, sgl_ptr, sgls); in tws_dmamap_data_load_cbfn()
969 tws_fill_sg_list(req->sc, (void *)segs, in tws_dmamap_data_load_cbfn()
970 (void *)&(req->cmd_pkt->cmd.pkt_a.sg_list), sgls); in tws_dmamap_data_load_cbfn()
971 req->cmd_pkt->cmd.pkt_a.lun_h4__sgl_entries |= sgls ; in tws_dmamap_data_load_cbfn()
975 req->error_code = tws_submit_command(req->sc, req); in tws_dmamap_data_load_cbfn()
985 if ( sc->is64bit ) { in tws_fill_sg_list()
991 TWS_TRACE(sc, "64bit sg overflow", num_sgl_entries, 0); in tws_fill_sg_list()
993 sgl_d[i].address = sgl_s->address; in tws_fill_sg_list()
994 sgl_d[i].length = sgl_s->length; in tws_fill_sg_list()
1003 TWS_TRACE(sc, "32bit sg overflow", num_sgl_entries, 0); in tws_fill_sg_list()
1005 sgl_d[i].address = sgl_s->address; in tws_fill_sg_list()
1006 sgl_d[i].length = sgl_s->length; in tws_fill_sg_list()
1017 TWS_TRACE(sc, "32bit sg overflow", num_sgl_entries, 0); in tws_fill_sg_list()
1034 device_printf(sc->tws_dev, "null softc!!!\n"); in tws_intr()
1046 sc->stats.num_intrs++; in tws_intr()
1084 device_printf(sc->tws_dev, "Micro controller error.\n"); in tws_intr_attn_error()
1095 sc->stats.reqs_out++; in tws_intr_resp()
1098 sc->stats.reqs_errored++; in tws_intr_resp()
1102 sc->reqs[req_id].cb(&sc->reqs[req_id]); in tws_intr_resp()
1119 struct tws_softc *sc = req->sc; in tws_timeout()
1121 if ( req->error_code == TWS_REQ_RET_RESET ) { in tws_timeout()
1125 mtx_lock(&sc->gen_lock); in tws_timeout()
1126 if ( req->error_code == TWS_REQ_RET_RESET ) { in tws_timeout()
1127 mtx_unlock(&sc->gen_lock); in tws_timeout()
1132 mtx_unlock(&sc->gen_lock); in tws_timeout()
1136 xpt_freeze_simq(sc->sim, 1); in tws_timeout()
1140 if (req->type == TWS_REQ_TYPE_SCSI_IO) { in tws_timeout()
1141 device_printf(sc->tws_dev, "I/O Request timed out... Resetting controller\n"); in tws_timeout()
1142 } else if (req->type == TWS_REQ_TYPE_PASSTHRU) { in tws_timeout()
1143 device_printf(sc->tws_dev, "IOCTL Request timed out... Resetting controller\n"); in tws_timeout()
1145 device_printf(sc->tws_dev, "Internal Request timed out... Resetting controller\n"); in tws_timeout()
1153 // device_printf(sc->tws_dev, "Controller Reset complete!\n"); in tws_timeout()
1155 mtx_unlock(&sc->gen_lock); in tws_timeout()
1157 xpt_release_simq(sc->sim, 1); in tws_timeout()
1165 mtx_lock(&sc->gen_lock); in tws_reset()
1167 mtx_unlock(&sc->gen_lock); in tws_reset()
1171 xpt_freeze_simq(sc->sim, 1); in tws_reset()
1175 device_printf(sc->tws_dev, "Resetting controller\n"); in tws_reset()
1182 // device_printf(sc->tws_dev, "Controller Reset complete!\n"); in tws_reset()
1184 mtx_unlock(&sc->gen_lock); in tws_reset()
1186 xpt_release_simq(sc->sim, 1); in tws_reset()
1201 // device_printf(sc->tws_dev, "Draining Busy Queue\n"); in tws_reset_cb()
1203 // device_printf(sc->tws_dev, "Draining Reserved Reqs\n"); in tws_reset_cb()
1205 // device_printf(sc->tws_dev, "Draining Response Queue\n"); in tws_reset_cb()
1208 // device_printf(sc->tws_dev, "Looking for controller ready flag...\n"); in tws_reset_cb()
1214 // device_printf(sc->tws_dev, " ... Got it!\n"); in tws_reset_cb()
1218 device_printf(sc->tws_dev, " ... Controller ready flag NOT found!\n"); in tws_reset_cb()
1229 // device_printf(sc->tws_dev, "Waiting for Controller Ready\n"); in tws_reinit()
1240 try--; in tws_reinit()
1242 mtx_sleep(sc, &sc->gen_lock, 0, "tws_reinit", 5*hz); in tws_reinit()
1247 device_printf(sc->tws_dev, "FAILED to get Controller Ready!\n"); in tws_reinit()
1251 sc->obfl_q_overrun = false; in tws_reinit()
1252 // device_printf(sc->tws_dev, "Sending initConnect\n"); in tws_reinit()
1254 TWS_TRACE_DEBUG(sc, "initConnect failed", 0, sc->is64bit); in tws_reinit()
1267 if (req->type == TWS_REQ_TYPE_SCSI_IO) { in tws_freeze_simq()
1268 union ccb *ccb = (union ccb *)(req->ccb_ptr); in tws_freeze_simq()
1270 xpt_freeze_simq(sc->sim, 1); in tws_freeze_simq()
1271 ccb->ccb_h.status |= CAM_RELEASE_SIMQ; in tws_freeze_simq()
1272 ccb->ccb_h.status |= CAM_REQUEUE_REQ; in tws_freeze_simq()