1 /*
2  * Copyright (c) 1998,1999,2000
3  *	Traakan, Inc., Los Altos, CA
4  *	All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice unmodified, this list of conditions, and the following
11  *    disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 /*
30  * Project:  NDMJOB
31  * Ident:    $Id: $
32  *
33  * Description:
34  *
35  */
36 
37 
38 #include "ndmagents.h"
39 
40 #ifndef NDMOS_OPTION_NO_ROBOT_AGENT
41 #ifdef NDMOS_OPTION_ROBOT_SIMULATOR
42 
43 #include "scsiconst.h"
44 
45 #define ROBOT_CONTROLLER 0
46 #define ROBOT_ID 7
47 #define ROBOT_LUN 1
48 
49 /*
50  * interface
51  */
52 
53 void
ndmos_scsi_register_callbacks(struct ndm_session * sess,struct ndm_robot_simulator_callbacks * callbacks)54 ndmos_scsi_register_callbacks (struct ndm_session *sess,
55   struct ndm_robot_simulator_callbacks *callbacks)
56 {
57 	/*
58 	 * Only allow one register.
59 	 */
60         if (!sess->nrsc) {
61 		sess->nrsc = NDMOS_API_MALLOC (sizeof(struct ndm_robot_simulator_callbacks));
62 		if (sess->nrsc) {
63 			memcpy (sess->nrsc, callbacks, sizeof(struct ndm_robot_simulator_callbacks));
64 		}
65         }
66 }
67 
68 void
ndmos_scsi_unregister_callbacks(struct ndm_session * sess)69 ndmos_scsi_unregister_callbacks (struct ndm_session *sess)
70 {
71         if (sess->nrsc) {
72 		NDMOS_API_FREE (sess->nrsc);
73 		sess->nrsc = NULL;
74 	}
75 }
76 
77 int
ndmos_scsi_initialize(struct ndm_session * sess)78 ndmos_scsi_initialize (struct ndm_session *sess)
79 {
80 	struct ndm_robot_agent *	ra = sess->robot_acb;
81 
82 	NDMOS_MACRO_ZEROFILL (&ra->scsi_state);
83 	ra->scsi_state.error = NDMP9_DEV_NOT_OPEN_ERR;
84 	ra->scsi_state.target_controller = ROBOT_CONTROLLER;
85 	ra->scsi_state.target_id = ROBOT_ID;
86 	ra->scsi_state.target_lun = ROBOT_LUN;
87 
88 	return 0;
89 }
90 
91 void
ndmos_scsi_sync_state(struct ndm_session * sess)92 ndmos_scsi_sync_state (struct ndm_session *sess)
93 {
94 }
95 
96 ndmp9_error
ndmos_scsi_open(struct ndm_session * sess,char * name)97 ndmos_scsi_open (struct ndm_session *sess, char *name)
98 {
99 	ndmp9_error		err;
100 
101 	if (!name || strlen(name) > NDMOS_CONST_PATH_MAX - 1)
102 		return NDMP9_NO_DEVICE_ERR;
103 
104 	if (sess->nrsc && sess->nrsc->scsi_open) {
105 		err = sess->nrsc->scsi_open(sess, name);
106 		if (err != NDMP9_NO_ERR)
107 			return err;
108 	}
109 
110 	return NDMP9_NO_ERR;
111 }
112 
113 ndmp9_error
ndmos_scsi_close(struct ndm_session * sess)114 ndmos_scsi_close (struct ndm_session *sess)
115 {
116 	ndmp9_error		err;
117 
118 	if (sess->nrsc && sess->nrsc->scsi_close) {
119 		err = sess->nrsc->scsi_close(sess);
120 		if (err != NDMP9_NO_ERR)
121 			return err;
122 	}
123 
124 	ndmos_scsi_initialize(sess);
125 	return NDMP9_NO_ERR;
126 }
127 
128 /* deprecated */
129 ndmp9_error
ndmos_scsi_set_target(struct ndm_session * sess)130 ndmos_scsi_set_target (struct ndm_session *sess)
131 {
132 	return NDMP9_NOT_SUPPORTED_ERR;
133 }
134 
135 
136 ndmp9_error
ndmos_scsi_reset_device(struct ndm_session * sess)137 ndmos_scsi_reset_device (struct ndm_session *sess)
138 {
139 	ndmp9_error		err;
140 	struct ndm_robot_agent *	ra = sess->robot_acb;
141 
142 	if (sess->nrsc && sess->nrsc->scsi_reset) {
143 		err = sess->nrsc->scsi_reset(sess);
144 		if (err != NDMP9_NO_ERR)
145 			return err;
146 	}
147 
148 	return ra->scsi_state.error;
149 }
150 
151 /* deprecated */
152 ndmp9_error
ndmos_scsi_reset_bus(struct ndm_session * sess)153 ndmos_scsi_reset_bus (struct ndm_session *sess)
154 {
155 	return NDMP9_NOT_SUPPORTED_ERR;
156 }
157 
158 ndmp9_error
ndmos_scsi_execute_cdb(struct ndm_session * sess,ndmp9_execute_cdb_request * request,ndmp9_execute_cdb_reply * reply)159 ndmos_scsi_execute_cdb (struct ndm_session *sess,
160   ndmp9_execute_cdb_request *request,
161   ndmp9_execute_cdb_reply *reply)
162 {
163 	ndmp9_error		err;
164 	struct ndm_robot_agent *	ra = sess->robot_acb;
165 
166 	if (ra->scsi_state.error != NDMP9_NO_ERR)
167 		return ra->scsi_state.error;
168 
169 	if (request->cdb.cdb_len < 1)
170 		return NDMP9_ILLEGAL_ARGS_ERR;
171 
172 	if (sess->nrsc && sess->nrsc->scsi_execute_cdb) {
173 		err = sess->nrsc->scsi_execute_cdb(sess, request, reply);
174 		if (err != NDMP9_NO_ERR)
175 			return err;
176 	}
177 
178 	return NDMP9_NO_ERR;
179 }
180 
181 #endif /* NDMOS_OPTION_ROBOT_SIMULATOR */
182 
183 #endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */
184