usr/src/uts/common/io/comstar/stmf/stmf.c
changeset 12340 4a5a5c4e987a
parent 12314 0ed71edeac88
child 12404 3f83c631bd29
equal deleted inserted replaced
12339:07dcda070d15 12340:4a5a5c4e987a
    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.