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