1 /*
2 ********************************************************************************************************************
3 * usb host driver
4 *
5 * (c) Copyright 2007-2010, javen.China
6 * All Rights Reserved
7 *
8 * File Name : LunMgr.c
9 *
10 * Author : javen
11 *
12 * Version : 2.0
13 *
14 * Date : 2010.03.02
15 *
16 * Description :
17 *
18 * History :
19 *
20 ********************************************************************************************************************
21 */
22 #include "usb_os_platform.h"
23 #include "error.h"
24 #include "usb_msc_i.h"
25 #include "Scsi2.h"
26 #include "LunMgr.h"
27 #include "LunMgr_i.h"
28
print_inquiry(__InquiryData_t * InquiryData)29 static void print_inquiry(__InquiryData_t *InquiryData)
30 {
31 //DMSG_INFO("");
32 //DMSG_INFO("------------------device infomation----------------------");
33 //DMSG_INFO("Device_Type = %d", InquiryData->Device_Type);
34 //DMSG_INFO("Removable_Media = %d", InquiryData->Removable_Media);
35 //DMSG_INFO("ANSI_Version = %d", InquiryData->ANSI_Version);
36 //DMSG_INFO("ECMA_Version = %d", InquiryData->ECMA_Version);
37 //DMSG_INFO("ISO_Version = %d", InquiryData->ISO_Version);
38 //DMSG_INFO("Data_Format = %d", InquiryData->Data_Format);
39 //DMSG_INFO("Additional_Length = %d", InquiryData->Additional_Length);
40 //DMSG_INFO("Vendor_Info = %s", InquiryData->Vendor_Info);
41 //DMSG_INFO("Product_Info = %s", InquiryData->Product_Info);
42 //DMSG_INFO("Product_Revision = %s", InquiryData->Product_Revision);
43 //DMSG_INFO("--------------------------------------------------------");
44 //DMSG_INFO("");
45 }
46
47 /*
48 *******************************************************************************
49 * mscLun_alloc
50 *
51 * Description:
52 *
53 *
54 * Parameters:
55 *
56 *
57 * Return value:
58 *
59 *
60 * note:
61 *
62 *
63 *******************************************************************************
64 */
mscLun_alloc(void)65 __mscLun_t *mscLun_alloc(void)
66 {
67 __mscLun_t *mscLun = NULL;
68 mscLun = hal_malloc(sizeof(__mscLun_t));
69
70 if (mscLun == NULL)
71 {
72 hal_log_err("ERR: USB_OS_MALLOC failed");
73 return NULL;
74 }
75
76 memset(mscLun, 0, sizeof(__mscLun_t));
77 //--<2>--create lock
78 mscLun->Lock = hal_sem_create(1);
79
80 if (mscLun->Lock == NULL)
81 {
82 hal_log_err("ERR: UsbBlkDevAllocInit: create lock failed");
83 hal_free(mscLun);
84 return NULL;
85 }
86
87 return mscLun;
88 }
89
90 /*
91 *******************************************************************************
92 * mscLun_free
93 *
94 * Description:
95 *
96 *
97 * Parameters:
98 *
99 *
100 * Return value:
101 *
102 *
103 * note:
104 *
105 *
106 *******************************************************************************
107 */
mscLun_free(__mscLun_t * mscLun)108 void mscLun_free(__mscLun_t *mscLun)
109 {
110 __u8 err = 0;
111
112 if (mscLun == NULL)
113 {
114 hal_log_err("ERR: input error");
115 return;
116 }
117
118 if (mscLun->Lock)
119 {
120 hal_sem_delete(mscLun->Lock);
121 mscLun->Lock = NULL;
122 }
123 else
124 {
125 hal_log_err("ERR: BlkDev Lock had already delete");
126 }
127
128 hal_free(mscLun);
129 }
130
131
132 /*
133 *******************************************************************************
134 * mscLunAdd
135 *
136 * Description:
137 *
138 *
139 * Parameters:
140 *
141 *
142 * Return value:
143 *
144 *
145 * note:
146 *
147 *
148 *******************************************************************************
149 */
mscLunAdd(__mscLun_t * mscLun)150 __s32 mscLunAdd(__mscLun_t *mscLun)
151 {
152 __mscDev_t *mscDev = NULL;
153 __InquiryData_t *InquiryData = NULL;
154 __s32 ret = 0;
155 __u32 i = 0;
156
157 if (mscLun == NULL)
158 {
159 hal_log_err("ERR: MscLunAdd: input error");
160 return USB_ERR_BAD_ARGUMENTS;
161 }
162
163 mscDev = mscLun->mscDev;
164
165 if (mscDev == NULL)
166 {
167 hal_log_err("ERR: MscLunAdd: mscDev == NULL");
168 return -1;
169 }
170
171 /* 获得LUN信息 */
172 for (i = 0; i < 3; i++)
173 {
174 hal_sem_wait(mscLun->Lock);
175 ret = ScsiInquery(mscLun, mscLun->Inquiry, SCSI_INQUERY_LEN);
176 hal_sem_post(mscLun->Lock);
177
178 if (ret == USB_STATUS_SUCCESS)
179 {
180 break;
181 }
182 }
183
184 if (i >= 3)
185 {
186 hal_log_err("ERR: MscLunAdd: ScsiInquery failed");
187 return USB_ERR_COMMAND_EXECUTE_FAILED;
188 }
189
190 /* 识别LUN */
191 InquiryData = (__InquiryData_t *)mscLun->Inquiry;
192 print_inquiry(InquiryData);
193 mscLun->DeviceType = InquiryData->Device_Type;
194 mscLun->ScsiLevel = InquiryData->ANSI_Version;
195 mscLun->Vendor = (__u8 *)InquiryData->Vendor_Info;
196 mscLun->Product = (__u8 *)InquiryData->Product_Info;
197 mscLun->Revision = (__u8 *)InquiryData->Product_Revision;
198 mscLun->RemoveAble = InquiryData->Removable_Media;
199
200 switch (mscLun->DeviceType)
201 {
202 case SCSI_DEVICE_DIRECT_ACCESS:
203 mscLun->Probe = DiskProbe;
204 mscLun->Remove = DiskRemove;
205 break;
206
207 case SCSI_DEVICE_CDROM:
208 mscLun->Probe = CDProbe;
209 mscLun->Remove = CDRemove;
210 break;
211
212 default:
213 hal_log_err("[Lun]: MscLunAdd: unknown device type %d", mscLun->DeviceType);
214 return USB_ERR_UNKOWN_DEVICE;
215 }
216
217 /* LUN探测 */
218 if (mscLun->Probe)
219 {
220 ret = mscLun->Probe(mscLun);
221
222 if (ret != 0)
223 {
224 hal_log_err("[Lun]: MscLunAdd: Lun(%d) Probe fialed", mscLun->LunNo);
225 return USB_ERR_DEVICE_PROBE_FAILED;
226 }
227 }
228
229 return USB_ERR_SUCCESS;
230 }
231
232 /*
233 *******************************************************************************
234 * mscLunDel
235 *
236 * Description:
237 *
238 *
239 * Parameters:
240 *
241 *
242 * Return value:
243 *
244 *
245 * note:
246 *
247 *
248 *******************************************************************************
249 */
mscLunDel(__mscLun_t * mscLun)250 __s32 mscLunDel(__mscLun_t *mscLun)
251 {
252 __s32 ret = 0;
253
254 if (mscLun == NULL)
255 {
256 hal_log_err("ERR: MscLunDel: input error");
257 return USB_ERR_BAD_ARGUMENTS;
258 }
259
260 if (mscLun->Remove)
261 {
262 ret = mscLun->Remove(mscLun);
263
264 if (ret != 0)
265 {
266 hal_log_err("[Lun]: MscLunAdd: Lun(%d) Remove fialed", mscLun->LunNo);
267 return USB_ERR_DEVICE_REMOVE_FAILED;
268 }
269 }
270
271 return USB_ERR_SUCCESS;
272 }
273
274
275
276
277