540
541 cmd->sc_pt_cmd_size = nsegs;
542 }
543
544 /*
545 * convert command into DMA-mapped SBP-2 ORB
546 */
547 void
548 scsa1394_sbp2_cmd2orb(scsa1394_lun_t *lp, scsa1394_cmd_t *cmd)
549 {
550 scsa1394_state_t *sp = lp->l_sp;
551 scsa1394_cmd_orb_t *orb = sbp2_task_orb_kaddr(&cmd->sc_task);
552
553 mutex_enter(&lp->l_mutex);
554
555 lp->l_stat.stat_cmd_cnt++;
556
557 bzero(orb->co_cdb, sizeof (orb->co_cdb));
558
559 /* CDB */
560 bcopy(cmd->sc_cdb, orb->co_cdb, cmd->sc_cdb_actual_len);
561
562 /*
563 * ORB parameters
564 *
565 * use max speed and max payload for this speed.
566 * max async data transfer for a given speed is 512<<speed
567 * SBP-2 defines (see 5.1.2) max data transfer as 2^(max_payload+2),
568 * hence max_payload = 7 + speed
569 */
570 orb->co_params = SBP2_ORB_NOTIFY | SBP2_ORB_RQ_FMT_SBP2 |
571 (sp->s_targetinfo.current_max_speed << SBP2_ORB_CMD_SPD_SHIFT) |
572 ((7 + sp->s_targetinfo.current_max_speed -
573 scsa1394_sbp2_max_payload_sub) << SBP2_ORB_CMD_MAX_PAYLOAD_SHIFT);
574
575 /* direction: initiator's read is target's write (and vice versa) */
576 if (cmd->sc_flags & SCSA1394_CMD_READ) {
577 orb->co_params |= SBP2_ORB_CMD_DIR;
578 }
579
580 /*
808 } else {
809 pkt->pkt_state |= (STATE_GOT_BUS | STATE_GOT_TARGET |
810 STATE_SENT_CMD | STATE_XFERRED_DATA |
811 STATE_GOT_STATUS);
812 pkt->pkt_reason = CMD_TRAN_ERR;
813 lp->l_stat.stat_err_status_conv++;
814 }
815 } else {
816 /* transport or serial bus failure */
817 pkt->pkt_state |= (STATE_GOT_BUS | STATE_GOT_TARGET);
818 pkt->pkt_reason = CMD_TRAN_ERR;
819 lp->l_stat.stat_err_status_resp++;
820 }
821
822 if (pkt->pkt_reason == CMD_TRAN_ERR) {
823 lp->l_stat.stat_err_status_tran_err++;
824
825 /* save the command */
826 p = &lp->l_stat.stat_cmd_last_fail[
827 lp->l_stat.stat_cmd_last_fail_idx][0];
828 bcopy(&pkt->pkt_cdbp[0], p, min(cmd->sc_cdb_len, 16));
829 *(clock_t *)&p[2] = ddi_get_lbolt();
830 lp->l_stat.stat_cmd_last_fail_idx =
831 (lp->l_stat.stat_cmd_last_fail_idx + 1) %
832 SCSA1394_STAT_NCMD_LAST;
833 }
834
835 /* generic HBA status processing */
836 scsa1394_cmd_status_proc(lp, cmd);
837 }
838
839
840 /*
841 * Convert SBP-2 status block into SCSA status.
842 *
843 * Note: (ref: B.2) "SBP-2 permits the return of a status block between two
844 * and quadlets in length. When a truncated status block is stored, the
845 * omitted quadlets shall be interpreted as if zero values were stored."
846 * We expect the sbp2 layer to do the zeroing for us.
847 */
848 static int
|
540
541 cmd->sc_pt_cmd_size = nsegs;
542 }
543
544 /*
545 * convert command into DMA-mapped SBP-2 ORB
546 */
547 void
548 scsa1394_sbp2_cmd2orb(scsa1394_lun_t *lp, scsa1394_cmd_t *cmd)
549 {
550 scsa1394_state_t *sp = lp->l_sp;
551 scsa1394_cmd_orb_t *orb = sbp2_task_orb_kaddr(&cmd->sc_task);
552
553 mutex_enter(&lp->l_mutex);
554
555 lp->l_stat.stat_cmd_cnt++;
556
557 bzero(orb->co_cdb, sizeof (orb->co_cdb));
558
559 /* CDB */
560 bcopy(cmd->sc_pkt->pkt_cdbp, orb->co_cdb, cmd->sc_orig_cdblen);
561
562 /*
563 * ORB parameters
564 *
565 * use max speed and max payload for this speed.
566 * max async data transfer for a given speed is 512<<speed
567 * SBP-2 defines (see 5.1.2) max data transfer as 2^(max_payload+2),
568 * hence max_payload = 7 + speed
569 */
570 orb->co_params = SBP2_ORB_NOTIFY | SBP2_ORB_RQ_FMT_SBP2 |
571 (sp->s_targetinfo.current_max_speed << SBP2_ORB_CMD_SPD_SHIFT) |
572 ((7 + sp->s_targetinfo.current_max_speed -
573 scsa1394_sbp2_max_payload_sub) << SBP2_ORB_CMD_MAX_PAYLOAD_SHIFT);
574
575 /* direction: initiator's read is target's write (and vice versa) */
576 if (cmd->sc_flags & SCSA1394_CMD_READ) {
577 orb->co_params |= SBP2_ORB_CMD_DIR;
578 }
579
580 /*
808 } else {
809 pkt->pkt_state |= (STATE_GOT_BUS | STATE_GOT_TARGET |
810 STATE_SENT_CMD | STATE_XFERRED_DATA |
811 STATE_GOT_STATUS);
812 pkt->pkt_reason = CMD_TRAN_ERR;
813 lp->l_stat.stat_err_status_conv++;
814 }
815 } else {
816 /* transport or serial bus failure */
817 pkt->pkt_state |= (STATE_GOT_BUS | STATE_GOT_TARGET);
818 pkt->pkt_reason = CMD_TRAN_ERR;
819 lp->l_stat.stat_err_status_resp++;
820 }
821
822 if (pkt->pkt_reason == CMD_TRAN_ERR) {
823 lp->l_stat.stat_err_status_tran_err++;
824
825 /* save the command */
826 p = &lp->l_stat.stat_cmd_last_fail[
827 lp->l_stat.stat_cmd_last_fail_idx][0];
828 bcopy(&pkt->pkt_cdbp[0], p, min(cmd->sc_pkt->pkt_cdblen, 16));
829 *(clock_t *)&p[2] = ddi_get_lbolt();
830 lp->l_stat.stat_cmd_last_fail_idx =
831 (lp->l_stat.stat_cmd_last_fail_idx + 1) %
832 SCSA1394_STAT_NCMD_LAST;
833 }
834
835 /* generic HBA status processing */
836 scsa1394_cmd_status_proc(lp, cmd);
837 }
838
839
840 /*
841 * Convert SBP-2 status block into SCSA status.
842 *
843 * Note: (ref: B.2) "SBP-2 permits the return of a status block between two
844 * and quadlets in length. When a truncated status block is stored, the
845 * omitted quadlets shall be interpreted as if zero values were stored."
846 * We expect the sbp2 layer to do the zeroing for us.
847 */
848 static int
|