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
ndmos_scsi_register_callbacks(struct ndm_session * sess,struct ndm_robot_simulator_callbacks * callbacks)53 void ndmos_scsi_register_callbacks(
54 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,
64 sizeof(struct ndm_robot_simulator_callbacks));
65 }
66 }
67 }
68
ndmos_scsi_unregister_callbacks(struct ndm_session * sess)69 void 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
ndmos_scsi_initialize(struct ndm_session * sess)77 int ndmos_scsi_initialize(struct ndm_session* sess)
78 {
79 struct ndm_robot_agent* ra = sess->robot_acb;
80
81 NDMOS_MACRO_ZEROFILL(&ra->scsi_state);
82 ra->scsi_state.error = NDMP9_DEV_NOT_OPEN_ERR;
83 ra->scsi_state.target_controller = ROBOT_CONTROLLER;
84 ra->scsi_state.target_id = ROBOT_ID;
85 ra->scsi_state.target_lun = ROBOT_LUN;
86
87 return 0;
88 }
89
ndmos_scsi_sync_state(struct ndm_session * sess)90 void ndmos_scsi_sync_state(struct ndm_session* sess) {}
91
ndmos_scsi_open(struct ndm_session * sess,char * name)92 ndmp9_error ndmos_scsi_open(struct ndm_session* sess, char* name)
93 {
94 ndmp9_error err;
95
96 if (!name || strlen(name) > NDMOS_CONST_PATH_MAX - 1)
97 return NDMP9_NO_DEVICE_ERR;
98
99 if (sess->nrsc && sess->nrsc->scsi_open) {
100 err = sess->nrsc->scsi_open(sess, name);
101 if (err != NDMP9_NO_ERR) return err;
102 }
103
104 return NDMP9_NO_ERR;
105 }
106
ndmos_scsi_close(struct ndm_session * sess)107 ndmp9_error ndmos_scsi_close(struct ndm_session* sess)
108 {
109 ndmp9_error err;
110
111 if (sess->nrsc && sess->nrsc->scsi_close) {
112 err = sess->nrsc->scsi_close(sess);
113 if (err != NDMP9_NO_ERR) return err;
114 }
115
116 ndmos_scsi_initialize(sess);
117 return NDMP9_NO_ERR;
118 }
119
120 /* deprecated */
ndmos_scsi_set_target(struct ndm_session * sess)121 ndmp9_error ndmos_scsi_set_target(struct ndm_session* sess)
122 {
123 return NDMP9_NOT_SUPPORTED_ERR;
124 }
125
126
ndmos_scsi_reset_device(struct ndm_session * sess)127 ndmp9_error ndmos_scsi_reset_device(struct ndm_session* sess)
128 {
129 ndmp9_error err;
130 struct ndm_robot_agent* ra = sess->robot_acb;
131
132 if (sess->nrsc && sess->nrsc->scsi_reset) {
133 err = sess->nrsc->scsi_reset(sess);
134 if (err != NDMP9_NO_ERR) return err;
135 }
136
137 return ra->scsi_state.error;
138 }
139
140 /* deprecated */
ndmos_scsi_reset_bus(struct ndm_session * sess)141 ndmp9_error ndmos_scsi_reset_bus(struct ndm_session* sess)
142 {
143 return NDMP9_NOT_SUPPORTED_ERR;
144 }
145
ndmos_scsi_execute_cdb(struct ndm_session * sess,ndmp9_execute_cdb_request * request,ndmp9_execute_cdb_reply * reply)146 ndmp9_error ndmos_scsi_execute_cdb(struct ndm_session* sess,
147 ndmp9_execute_cdb_request* request,
148 ndmp9_execute_cdb_reply* reply)
149 {
150 ndmp9_error err;
151 struct ndm_robot_agent* ra = sess->robot_acb;
152
153 if (ra->scsi_state.error != NDMP9_NO_ERR) return ra->scsi_state.error;
154
155 if (request->cdb.cdb_len < 1) return NDMP9_ILLEGAL_ARGS_ERR;
156
157 if (sess->nrsc && sess->nrsc->scsi_execute_cdb) {
158 err = sess->nrsc->scsi_execute_cdb(sess, request, reply);
159 if (err != NDMP9_NO_ERR) return err;
160 }
161
162 return NDMP9_NO_ERR;
163 }
164
165 #endif /* NDMOS_OPTION_ROBOT_SIMULATOR */
166
167 #endif /* !NDMOS_OPTION_NO_ROBOT_AGENT */
168