Print this page
4031 scsa1394 violates DDI scsi_pkt(9S) allocation rules


 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