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