83 stmf_status_t stmf_lun_reset_poll(stmf_lu_t *lu, struct scsi_task *task, |
83 stmf_status_t stmf_lun_reset_poll(stmf_lu_t *lu, struct scsi_task *task, |
84 int target_reset); |
84 int target_reset); |
85 void stmf_target_reset_poll(struct scsi_task *task); |
85 void stmf_target_reset_poll(struct scsi_task *task); |
86 void stmf_handle_lun_reset(scsi_task_t *task); |
86 void stmf_handle_lun_reset(scsi_task_t *task); |
87 void stmf_handle_target_reset(scsi_task_t *task); |
87 void stmf_handle_target_reset(scsi_task_t *task); |
88 void stmf_xd_to_dbuf(stmf_data_buf_t *dbuf); |
88 void stmf_xd_to_dbuf(stmf_data_buf_t *dbuf, int set_rel_off); |
89 int stmf_load_ppd_ioctl(stmf_ppioctl_data_t *ppi, uint64_t *ppi_token, |
89 int stmf_load_ppd_ioctl(stmf_ppioctl_data_t *ppi, uint64_t *ppi_token, |
90 uint32_t *err_ret); |
90 uint32_t *err_ret); |
91 int stmf_delete_ppd_ioctl(stmf_ppioctl_data_t *ppi); |
91 int stmf_delete_ppd_ioctl(stmf_ppioctl_data_t *ppi); |
92 int stmf_get_ppd_ioctl(stmf_ppioctl_data_t *ppi, stmf_ppioctl_data_t *ppi_out, |
92 int stmf_get_ppd_ioctl(stmf_ppioctl_data_t *ppi, stmf_ppioctl_data_t *ppi_out, |
93 uint32_t *err_ret); |
93 uint32_t *err_ret); |
1782 } |
1782 } |
1783 |
1783 |
1784 itask = (stmf_i_scsi_task_t *)task->task_stmf_private; |
1784 itask = (stmf_i_scsi_task_t *)task->task_stmf_private; |
1785 dbuf = itask->itask_proxy_dbuf; |
1785 dbuf = itask->itask_proxy_dbuf; |
1786 |
1786 |
1787 task->task_cmd_xfer_length = msg->icsd_data_len; |
1787 task->task_cmd_xfer_length += msg->icsd_data_len; |
1788 |
1788 |
1789 if (task->task_additional_flags & |
1789 if (task->task_additional_flags & |
1790 TASK_AF_NO_EXPECTED_XFER_LENGTH) { |
1790 TASK_AF_NO_EXPECTED_XFER_LENGTH) { |
1791 task->task_expected_xfer_length = |
1791 task->task_expected_xfer_length = |
1792 task->task_cmd_xfer_length; |
1792 task->task_cmd_xfer_length; |
1820 stmf_abort(STMF_QUEUE_TASK_ABORT, task, |
1820 stmf_abort(STMF_QUEUE_TASK_ABORT, task, |
1821 STMF_ALLOC_FAILURE, NULL); |
1821 STMF_ALLOC_FAILURE, NULL); |
1822 return (STMF_FAILURE); |
1822 return (STMF_FAILURE); |
1823 } |
1823 } |
1824 dbuf->db_lu_private = xd; |
1824 dbuf->db_lu_private = xd; |
1825 stmf_xd_to_dbuf(dbuf); |
1825 dbuf->db_relative_offset = task->task_nbytes_transferred; |
|
1826 stmf_xd_to_dbuf(dbuf, 0); |
1826 |
1827 |
1827 dbuf->db_flags = DB_DIRECTION_TO_RPORT; |
1828 dbuf->db_flags = DB_DIRECTION_TO_RPORT; |
1828 (void) stmf_xfer_data(task, dbuf, 0); |
1829 (void) stmf_xfer_data(task, dbuf, 0); |
1829 return (STMF_SUCCESS); |
1830 return (STMF_SUCCESS); |
1830 } |
1831 } |
6161 stmf_abort(STMF_QUEUE_TASK_ABORT, task, |
6162 stmf_abort(STMF_QUEUE_TASK_ABORT, task, |
6162 STMF_ALLOC_FAILURE, NULL); |
6163 STMF_ALLOC_FAILURE, NULL); |
6163 return; |
6164 return; |
6164 } |
6165 } |
6165 dbuf->db_lu_private = xd; |
6166 dbuf->db_lu_private = xd; |
6166 stmf_xd_to_dbuf(dbuf); |
6167 stmf_xd_to_dbuf(dbuf, 1); |
6167 |
6168 |
6168 dbuf->db_flags = DB_DIRECTION_TO_RPORT; |
6169 dbuf->db_flags = DB_DIRECTION_TO_RPORT; |
6169 (void) stmf_xfer_data(task, dbuf, 0); |
6170 (void) stmf_xfer_data(task, dbuf, 0); |
6170 |
6171 |
6171 } |
6172 } |
6798 * Fills out a dbuf from stmf_xfer_data_t (contained in the db_lu_private). |
6799 * Fills out a dbuf from stmf_xfer_data_t (contained in the db_lu_private). |
6799 * If all the data has been filled out, frees the xd and makes |
6800 * If all the data has been filled out, frees the xd and makes |
6800 * db_lu_private NULL. |
6801 * db_lu_private NULL. |
6801 */ |
6802 */ |
6802 void |
6803 void |
6803 stmf_xd_to_dbuf(stmf_data_buf_t *dbuf) |
6804 stmf_xd_to_dbuf(stmf_data_buf_t *dbuf, int set_rel_off) |
6804 { |
6805 { |
6805 stmf_xfer_data_t *xd; |
6806 stmf_xfer_data_t *xd; |
6806 uint8_t *p; |
6807 uint8_t *p; |
6807 int i; |
6808 int i; |
6808 uint32_t s; |
6809 uint32_t s; |
6809 |
6810 |
6810 xd = (stmf_xfer_data_t *)dbuf->db_lu_private; |
6811 xd = (stmf_xfer_data_t *)dbuf->db_lu_private; |
6811 dbuf->db_data_size = 0; |
6812 dbuf->db_data_size = 0; |
6812 dbuf->db_relative_offset = xd->size_done; |
6813 if (set_rel_off) |
|
6814 dbuf->db_relative_offset = xd->size_done; |
6813 for (i = 0; i < dbuf->db_sglist_length; i++) { |
6815 for (i = 0; i < dbuf->db_sglist_length; i++) { |
6814 s = min(xd->size_left, dbuf->db_sglist[i].seg_length); |
6816 s = min(xd->size_left, dbuf->db_sglist[i].seg_length); |
6815 p = &xd->buf[xd->size_done]; |
6817 p = &xd->buf[xd->size_done]; |
6816 bcopy(p, dbuf->db_sglist[i].seg_addr, s); |
6818 bcopy(p, dbuf->db_sglist[i].seg_addr, s); |
6817 xd->size_left -= s; |
6819 xd->size_left -= s; |
6965 stmf_abort(STMF_QUEUE_TASK_ABORT, task, |
6967 stmf_abort(STMF_QUEUE_TASK_ABORT, task, |
6966 STMF_ALLOC_FAILURE, NULL); |
6968 STMF_ALLOC_FAILURE, NULL); |
6967 return; |
6969 return; |
6968 } |
6970 } |
6969 dbuf->db_lu_private = xd; |
6971 dbuf->db_lu_private = xd; |
6970 stmf_xd_to_dbuf(dbuf); |
6972 stmf_xd_to_dbuf(dbuf, 1); |
6971 |
6973 |
6972 atomic_and_32(&iss->iss_flags, |
6974 atomic_and_32(&iss->iss_flags, |
6973 ~(ISS_LUN_INVENTORY_CHANGED | ISS_GOT_INITIAL_LUNS)); |
6975 ~(ISS_LUN_INVENTORY_CHANGED | ISS_GOT_INITIAL_LUNS)); |
6974 dbuf->db_flags = DB_DIRECTION_TO_RPORT; |
6976 dbuf->db_flags = DB_DIRECTION_TO_RPORT; |
6975 (void) stmf_xfer_data(task, dbuf, 0); |
6977 (void) stmf_xfer_data(task, dbuf, 0); |
6988 if (dbuf->db_xfer_status != STMF_SUCCESS) { |
6990 if (dbuf->db_xfer_status != STMF_SUCCESS) { |
6989 stmf_abort(STMF_QUEUE_TASK_ABORT, task, |
6991 stmf_abort(STMF_QUEUE_TASK_ABORT, task, |
6990 dbuf->db_xfer_status, NULL); |
6992 dbuf->db_xfer_status, NULL); |
6991 return; |
6993 return; |
6992 } |
6994 } |
6993 task->task_nbytes_transferred = dbuf->db_data_size; |
6995 task->task_nbytes_transferred += dbuf->db_data_size; |
6994 if (dbuf->db_lu_private) { |
6996 if (dbuf->db_lu_private) { |
6995 /* There is more */ |
6997 /* There is more */ |
6996 stmf_xd_to_dbuf(dbuf); |
6998 stmf_xd_to_dbuf(dbuf, 1); |
6997 (void) stmf_xfer_data(task, dbuf, 0); |
6999 (void) stmf_xfer_data(task, dbuf, 0); |
6998 return; |
7000 return; |
6999 } |
7001 } |
|
7002 |
|
7003 stmf_free_dbuf(task, dbuf); |
7000 /* |
7004 /* |
7001 * If this is a proxy task, it will need to be completed from the |
7005 * If this is a proxy task, it will need to be completed from the |
7002 * proxy port provider. This message lets pppt know that the xfer |
7006 * proxy port provider. This message lets pppt know that the xfer |
7003 * is complete. When we receive the status from pppt, we will |
7007 * is complete. When we receive the status from pppt, we will |
7004 * then relay that status back to the lport. |
7008 * then relay that status back to the lport. |