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