1 /*
2 ********************************************************************************************************************
3 *                                              usb host driver
4 *
5 *                              (c) Copyright 2007-2010, javen.China
6 *                                       All Rights Reserved
7 *
8 * File Name     : usb_msc.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 
25 #include  "usb_utils_find_zero_bit.h"
26 #include  "usb_list.h"
27 #include  "list_head_ext.h"
28 
29 #include  "usb_host_common.h"
30 #include  "usb_gen_dev_mod.h"
31 #include  "urb.h"
32 #include  "usb_core_interface.h"
33 
34 #include  "usbh_disk_info.h"
35 #include  "usbh_buff_manager.h"
36 #include  "usbh_disk_remove_time.h"
37 
38 #include  "usb_msc_i.h"
39 #include  "mscTransport.h"
40 #include  "mscProtocol.h"
41 #include  "LunMgr.h"
42 #include  "usb_msc.h"
43 
44 #define  MSC_DRV_NAME       "Mass Storage Class"
45 #define  MSC_DRV_AUTHOR     "Host Driver Author"
46 
47 static struct usb_host_func_drv mscDrv;     /* 存储USB Mass Storage设备驱动 */
48 static __u32 mscDev_id_array;               /* 记录已连接的mscDev的id值 */
49 
50 static struct usb_drv_dev_match_table msc_match_table [] =
51 {
52     //--1--CB
53     {
54         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
55         , 0, 0, 0, 0, 0, 0, 0
56         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
57         , USB_CLASS_MASS_STORAGE
58         , USBMSC_SUBCLASS_RBC
59         , USBMSC_INTERFACE_PROTOCOL_CBT
60         , 0 //driver_info;
61     },
62     {
63         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
64         , 0, 0, 0, 0, 0, 0, 0
65         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
66         , USB_CLASS_MASS_STORAGE
67         , USBMSC_SUBCLASS_8020
68         , USBMSC_INTERFACE_PROTOCOL_CBT
69         , 0 //driver_info;
70     },
71     {
72         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
73         , 0, 0, 0, 0, 0, 0, 0
74         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
75         , USB_CLASS_MASS_STORAGE
76         , USBMSC_SUBCLASS_QIC
77         , USBMSC_INTERFACE_PROTOCOL_CBT
78         , 0 //driver_info;
79     },
80 
81     {
82         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
83         , 0, 0, 0, 0, 0, 0, 0
84         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
85         , USB_CLASS_MASS_STORAGE
86         , USBMSC_SUBCLASS_UFI
87         , USBMSC_INTERFACE_PROTOCOL_CBT
88         , 0 //driver_info;
89     },
90     {
91         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
92         , 0, 0, 0, 0, 0, 0, 0
93         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
94         , USB_CLASS_MASS_STORAGE
95         , USBMSC_SUBCLASS_8070
96         , USBMSC_INTERFACE_PROTOCOL_CBT
97         , 0 //driver_info;
98     },
99     {
100         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
101         , 0, 0, 0, 0, 0, 0, 0
102         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
103         , USB_CLASS_MASS_STORAGE
104         , USBMSC_SUBCLASS_SCSI
105         , USBMSC_INTERFACE_PROTOCOL_CBT
106         , 0 //driver_info;
107     },
108     //--2--CBI
109     {
110         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
111         , 0, 0, 0, 0, 0, 0, 0
112         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
113         , USB_CLASS_MASS_STORAGE
114         , USBMSC_SUBCLASS_RBC
115         , USBMSC_INTERFACE_PROTOCOL_CBIT
116         , 0 //driver_info;
117     },
118     {
119         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
120         , 0, 0, 0, 0, 0, 0, 0
121         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
122         , USB_CLASS_MASS_STORAGE
123         , USBMSC_SUBCLASS_8020
124         , USBMSC_INTERFACE_PROTOCOL_CBIT
125         , 0 //driver_info;
126     },
127     {
128         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
129         , 0, 0, 0, 0, 0, 0, 0
130         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
131         , USB_CLASS_MASS_STORAGE
132         , USBMSC_SUBCLASS_QIC
133         , USBMSC_INTERFACE_PROTOCOL_CBIT
134         , 0 //driver_info;
135     },
136 
137     {
138         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
139         , 0, 0, 0, 0, 0, 0, 0
140         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
141         , USB_CLASS_MASS_STORAGE
142         , USBMSC_SUBCLASS_UFI
143         , USBMSC_INTERFACE_PROTOCOL_CBIT
144         , 0 //driver_info;
145     },
146     {
147         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
148         , 0, 0, 0, 0, 0, 0, 0
149         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
150         , USB_CLASS_MASS_STORAGE
151         , USBMSC_SUBCLASS_8070
152         , USBMSC_INTERFACE_PROTOCOL_CBIT
153         , 0 //driver_info;
154     },
155     {
156         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
157         , 0, 0, 0, 0, 0, 0, 0
158         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
159         , USB_CLASS_MASS_STORAGE
160         , USBMSC_SUBCLASS_SCSI
161         , USBMSC_INTERFACE_PROTOCOL_CBIT
162         , 0 //driver_info;
163     },
164     //--3--BO
165     {
166         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
167         , 0, 0, 0, 0, 0, 0, 0
168         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
169         , USB_CLASS_MASS_STORAGE
170         , USBMSC_SUBCLASS_RBC
171         , USBMSC_INTERFACE_PROTOCOL_BOT
172         , 0 //driver_info;
173     },
174     {
175         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
176         , 0, 0, 0, 0, 0, 0, 0
177         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
178         , USB_CLASS_MASS_STORAGE
179         , USBMSC_SUBCLASS_8020
180         , USBMSC_INTERFACE_PROTOCOL_BOT
181         , 0 //driver_info;
182     },
183     {
184         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
185         , 0, 0, 0, 0, 0, 0, 0
186         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
187         , USB_CLASS_MASS_STORAGE
188         , USBMSC_SUBCLASS_QIC
189         , USBMSC_INTERFACE_PROTOCOL_BOT
190         , 0 //driver_info;
191     },
192 
193     {
194         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
195         , 0, 0, 0, 0, 0, 0, 0
196         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
197         , USB_CLASS_MASS_STORAGE
198         , USBMSC_SUBCLASS_UFI
199         , USBMSC_INTERFACE_PROTOCOL_BOT
200         , 0 //driver_info;
201     },
202     {
203         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
204         , 0, 0, 0, 0, 0, 0, 0
205         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
206         , USB_CLASS_MASS_STORAGE
207         , USBMSC_SUBCLASS_8070
208         , USBMSC_INTERFACE_PROTOCOL_BOT
209         , 0 //driver_info;
210     },
211     {
212         USB_DEVICE_ID_MATCH_INT_INFO    //match_flags;
213         , 0, 0, 0, 0, 0, 0, 0
214         //bInterfaceClass;bInterfaceSubClass;bInterfaceProtocol
215         , USB_CLASS_MASS_STORAGE
216         , USBMSC_SUBCLASS_SCSI
217         , USBMSC_INTERFACE_PROTOCOL_BOT
218         , 0 //driver_info;
219     },
220     {
221         0
222         , 0, 0, 0, 0, 0, 0, 0
223         , 0
224         , 0
225         , 0
226 
227         , 0
228     },
229 
230     {
231         0  //match_flags;
232 
233         , 0 //idVendor;
234         , 0 //idProduct;
235         , 0 //bcdDevice_lo;
236         , 0 //bcdDevice_hi;
237 
238         //Used for device class matches
239         , 0 //bDeviceClass;
240         , 0 //bDeviceSubClass;
241         , 0 //bDeviceProtocol;
242 
243         //Used for interface class matches
244         , 0 //bInterfaceClass;
245         , 0 //bInterfaceSubClass;
246         , 0 //bInterfaceProtocol;
247 
248         //not matched against
249         , 0 //driver_info;
250     }/* Terminating entry */
251 };
252 
253 /*
254 *******************************************************************************
255 *                     get_mscDev_id
256 *
257 * Description:
258 *    获取USB Mass Storage设备的ID
259 *
260 * Parameters:
261 *    void
262 *
263 * Return value:
264 *    返回设备的ID
265 *
266 * note:
267 *    无
268 *
269 *******************************************************************************
270 */
get_mscDev_id(void)271 static unsigned int get_mscDev_id(void)
272 {
273     unsigned int bit = 0;
274     bit = find_next_zero_bit((const volatile u32 *)&mscDev_id_array, (1 * 32), 0);
275 
276     if (bit > 32)
277     {
278         hal_log_err("ERR: find_next_zero_bit failed");
279         return 31;
280     }
281 
282     usb_set_bit(bit, (volatile uint32_t *)&mscDev_id_array);
283     return bit;
284 }
285 
286 /*
287 *******************************************************************************
288 *                     free_mscDev_id
289 *
290 * Description:
291 *    释放USB Mass Storage设备的ID
292 *
293 * Parameters:
294 *    bit : input.  mscDev的ID号
295 *
296 * Return value:
297 *    0  成功
298 *   !0  失败
299 *
300 * note:
301 *    无
302 *
303 *******************************************************************************
304 */
free_mscDev_id(unsigned int bit)305 static int free_mscDev_id(unsigned int bit)
306 {
307     if (usb_test_bit(bit, (volatile uint32_t *)&mscDev_id_array) == 0)
308     {
309         hal_log_err("ERR: free_mscDev_id: invalid bit(%d)", bit);
310         return -1;
311     }
312 
313     /* 释放占用位 */
314     usb_clear_bit(bit, (volatile uint32_t *)&mscDev_id_array);
315     return 0;
316 }
317 
318 
319 /*
320 *******************************************************************************
321 *                     mscDevInit
322 *
323 * Description:
324 *
325 *
326 * Parameters:
327 *    mscDev  : input. msc设备信息
328 *    intf    : input. USB接口
329 *
330 * Return value:
331 *    0  成功
332 *   !0  失败
333 *
334 * note:
335 *    无
336 *
337 *******************************************************************************
338 */
339 
mscDevInit(__mscDev_t * mscDev,struct usb_interface * intf)340 static int mscDevInit(__mscDev_t *mscDev, struct usb_interface *intf)
341 {
342     int ret = 0;
343     __u8 err = 0;
344 
345     if (mscDev == NULL)
346     {
347         hal_log_err("ERR: invalid argment");
348         return -1;
349     }
350 
351     mscDev->pusb_dev    = usb_mod_interface_to_usbdev(intf);
352 
353     if (mscDev->pusb_dev == NULL)
354     {
355         hal_log_err("ERR: invalid argment");
356         return -1;
357     }
358 
359     mscDev->pusb_intf   = intf;
360     mscDev->InterfaceNo = intf->cur_altsetting->desc.bInterfaceNumber;
361     /* Store our private data in the interface */
362     usb_mod_usb_set_intf_priv_data(intf, (void *)mscDev);
363     mscDev->mscDevNo    = get_mscDev_id();
364     USB_INIT_LIST_HEAD(&(mscDev->cmd_list));
365     /* alloc urb */
366     mscDev->CurrentUrb = usb_alloc_urb(0);
367 
368     if (mscDev->CurrentUrb == NULL)
369     {
370         hal_log_err("ERR: hal_sem_create scan_lock failed");
371         return USB_ERR_ALLOC_URB_FAILED;
372     }
373 
374     /* 一次性锁 */
375     mscDev->scan_lock = hal_sem_create(1);
376 
377     if (mscDev->scan_lock == NULL)
378     {
379         hal_log_err("ERR: hal_sem_create scan_lock failed");
380         ret = USB_ERR_CREATE_SIME_FAILED;
381         goto error0;
382     }
383 
384     mscDev->DevLock = hal_sem_create(1);
385 
386     if (mscDev->DevLock == NULL)
387     {
388         hal_log_err("ERR: hal_sem_create DevLock failed");
389         ret = USB_ERR_CREATE_SIME_FAILED;
390         goto error1;
391     }
392 
393     /* 线程同步 */
394     mscDev->ThreadSemi = hal_sem_create(0);
395 
396     if (mscDev->ThreadSemi == NULL)
397     {
398         hal_log_err("ERR: hal_sem_create dev_lock failed");
399         ret = USB_ERR_CREATE_SIME_FAILED;
400         goto error2;
401     }
402 
403     mscDev->notify_complete = hal_sem_create(0);
404 
405     if (mscDev->notify_complete == NULL)
406     {
407         hal_log_err("ERR: hal_sem_create notify_complete failed");
408         ret = USB_ERR_CREATE_SIME_FAILED;
409         goto error3;
410     }
411 
412     mscDev->CtrlReq = (struct usb_ctrlrequest *)usb_buffer_alloc(mscDev->pusb_dev,
413                       sizeof(struct usb_ctrlrequest),
414                       0,
415                       NULL);
416 
417     if (mscDev->CtrlReq == NULL)
418     {
419         hal_log_err("ERR: usb_buffer_alloc CtrlReq failed");
420         ret = USB_ERR_MALLOC_FAILED;
421         goto error4;
422     }
423 
424     mscDev->iobuf = (__u8 *)usb_buffer_alloc(mscDev->pusb_dev, MSC_IOBUF_SIZE, 0, NULL);
425 
426     if (mscDev->iobuf == NULL)
427     {
428         hal_log_err("ERR: usb_buffer_alloc iobuf failed");
429         ret = USB_ERR_MALLOC_FAILED;
430         goto error5;
431     }
432 
433     mscDev->UrbWait = hal_sem_create(0);
434 
435     if (mscDev->UrbWait == NULL)
436     {
437         hal_log_err("ERR: hal_sem_create UrbWait failed");
438         ret = USB_ERR_CREATE_SIME_FAILED;
439         goto error6;
440     }
441 
442     return USB_ERR_SUCCESS;
443 error6:
444     usb_buffer_free(mscDev->pusb_dev, MSC_IOBUF_SIZE, (void *)(mscDev->iobuf), 0);
445 error5:
446     usb_buffer_free(mscDev->pusb_dev, sizeof(*mscDev->CtrlReq), (void *)(mscDev->CtrlReq), 0);
447 error4:
448     hal_sem_delete(mscDev->notify_complete);
449 error3:
450     hal_sem_delete(mscDev->ThreadSemi);
451 error2:
452     hal_sem_delete(mscDev->DevLock);
453 error1:
454     hal_sem_delete(mscDev->scan_lock);
455 error0:
456     usb_free_urb(mscDev->CurrentUrb);
457     return ret;
458 }
459 
460 /*
461 *******************************************************************************
462 *                     mscDevFree
463 *
464 * Description:
465 *
466 *
467 * Parameters:
468 *    mscDev  -- input. msc设备信息
469 *
470 * Return value:
471 *    none
472 *
473 * note:
474 *    none
475 *
476 *******************************************************************************
477 */
mscDevFree(__mscDev_t * mscDev)478 static void mscDevFree(__mscDev_t *mscDev)
479 {
480     __u8 err = 0;
481 
482     if (mscDev->ThreadSemi)
483     {
484         hal_sem_delete(mscDev->ThreadSemi);
485     }
486 
487     if (mscDev->scan_lock)
488     {
489         hal_sem_delete(mscDev->scan_lock);
490     }
491 
492     if (mscDev->DevLock)
493     {
494         hal_sem_delete(mscDev->DevLock);
495     }
496 
497     if (mscDev->notify_complete)
498     {
499         hal_sem_delete(mscDev->notify_complete);
500     }
501 
502     if (mscDev->UrbWait)
503     {
504         hal_sem_delete(mscDev->UrbWait);
505     }
506 
507     if (mscDev->CtrlReq)
508     {
509         usb_buffer_free(mscDev->pusb_dev, sizeof(*mscDev->CtrlReq), (void *)(mscDev->CtrlReq), 0);
510     }
511 
512     if (mscDev->iobuf)
513     {
514         usb_buffer_free(mscDev->pusb_dev, MSC_IOBUF_SIZE, (void *)(mscDev->iobuf), 0);
515     }
516 
517     usb_free_urb(mscDev->CurrentUrb);
518     /* Remove our private data from the interface */
519     usb_mod_usb_set_intf_priv_data(mscDev->pusb_intf, NULL);
520     free_mscDev_id(mscDev->mscDevNo);
521 }
522 
523 /*
524 *******************************************************************************
525 *                     SetMscDevState
526 *
527 * Description:
528 *
529 *
530 * Parameters:
531 *
532 *
533 * Return value:
534 *    none
535 *
536 * note:
537 *    none
538 *
539 *******************************************************************************
540 */
SetMscDevState(__mscDev_t * mscDev,mscDev_state_t state)541 static void SetMscDevState(__mscDev_t *mscDev, mscDev_state_t state)
542 {
543     unsigned int cup_sr    = 0;
544     ENTER_CRITICAL(cup_sr);
545     mscDev->state = state;
546     EXIT_CRITICAL(cup_sr);
547 }
548 
549 /*
550 *******************************************************************************
551 *                     mscDevOnline
552 *
553 * Description:
554 *
555 *
556 * Parameters:
557 *
558 *
559 * Return value:
560 *    none/error
561 *
562 * note:
563 *    none
564 *
565 *******************************************************************************
566 */
mscDevOnline(__mscDev_t * mscDev)567 unsigned int mscDevOnline(__mscDev_t *mscDev)
568 {
569     return (mscDev->state == MSC_DEV_ONLINE);
570 }
571 
572 /*
573 *******************************************************************************
574 *                     GetDeviceInfo
575 *
576 * Description:
577 *
578 *
579 * Parameters:
580 *
581 *
582 * Return value:
583 *    void
584 *
585 * note:
586 *    none
587 *
588 *******************************************************************************
589 */
GetDeviceInfo(__mscDev_t * mscDev,unsigned int index)590 static void GetDeviceInfo(__mscDev_t *mscDev, unsigned int index)
591 {
592     struct usb_interface_descriptor *idesc = &(mscDev->pusb_intf->cur_altsetting->desc);
593     mscDev->SubClass = idesc->bInterfaceSubClass ;
594     mscDev->Protocol = idesc->bInterfaceProtocol ;
595     return;
596 }
597 
598 /*
599 *******************************************************************************
600 *                     GetTransport
601 *
602 * Description:
603 *    获取msc设备的传输方式
604 *
605 * Parameters:
606 *    mscDev 获取 input.msc设备信息
607 *
608 * Return value:
609 *    0  成功
610 *   !0  失败
611 *
612 * note:
613 *    none
614 *
615 *******************************************************************************
616 */
GetTransport(__mscDev_t * mscDev)617 static int GetTransport(__mscDev_t *mscDev)
618 {
619 //  printf("%s %d %s Protocol:%x\n", __FILE__, __LINE__, __func__, mscDev->Protocol);
620     switch (mscDev->Protocol)
621     {
622         case USBMSC_INTERFACE_PROTOCOL_BOT:
623             mscDev->transport_name  = "BulkOnly";
624             mscDev->ResetRecovery   = mscResetRecovery;
625             mscDev->Transport       = mscBoTransport;
626             mscDev->StopTransport   = mscBoStopTransport;
627             break;
628 
629         default:
630             hal_log_info("ERR: not support transport Protocol(%x)", mscDev->Protocol);
631             mscDev->transport_name  = "unkown";
632             mscDev->ResetRecovery   = NULL;
633             mscDev->Transport       = NULL;
634             mscDev->StopTransport   = NULL;
635             return USB_ERR_UNKOWN_ERROR;
636     }
637 
638     return USB_ERR_SUCCESS;
639 }
640 
641 /*
642 *******************************************************************************
643 *                     GetProtocol
644 *
645 * Description:
646 *    获取msc设备的传输方式
647 *
648 * Parameters:
649 *    mscDev 获取 input.msc设备信息
650 *
651 * Return value:
652 *    0  成功
653 *   !0  失败
654 *
655 * note:
656 *    none
657 *
658 *******************************************************************************
659 */
GetProtocol(__mscDev_t * mscDev)660 static int GetProtocol(__mscDev_t *mscDev)
661 {
662     switch (mscDev->SubClass)
663     {
664         case USBMSC_SUBCLASS_RBC:
665             mscDev->Protocol_name   = "Reduced Block Commands (RBC)";
666             mscDev->ProtocolHandler = mscScsiCommand;
667             break;
668 
669         case USBMSC_SUBCLASS_8020:
670             mscDev->Protocol_name   = "8020i";
671             mscDev->ProtocolHandler = mscATAPICommand;
672             break;
673 
674         case USBMSC_SUBCLASS_QIC:
675             mscDev->Protocol_name   = "QIC-157";
676             mscDev->ProtocolHandler = mscQIC157Command;
677             break;
678 
679         case USBMSC_SUBCLASS_UFI:
680             mscDev->Protocol_name   = "Uniform Floppy Interface (UFI)";
681             mscDev->ProtocolHandler = mscUFICommand;
682             break;
683 
684         case USBMSC_SUBCLASS_8070:
685             mscDev->Protocol_name   = "8070i";
686             mscDev->ProtocolHandler = mscQIC157Command;
687             break;
688 
689         case USBMSC_SUBCLASS_SCSI:
690             mscDev->Protocol_name   = "Reduced Block Commands (RBC)";
691             mscDev->ProtocolHandler = mscScsiCommand;
692             break;
693 
694         default:
695             hal_log_info("ERR: not support transport SubClass(%x)", mscDev->SubClass);
696             return USB_ERR_UNKOWN_ERROR;
697     }
698 
699     return USB_ERR_SUCCESS;
700 }
701 
702 /*
703 *******************************************************************************
704 *                     CreatePipes
705 *
706 * Description:
707 *    创建管道函数
708 *
709 * Parameters:
710 *    mscDev 获取 input.msc设备信息
711 *
712 * Return value:
713 *    0  成功
714 *   !0  失败
715 *
716 * note:
717 *    none
718 *
719 *******************************************************************************
720 */
721 
CreatePipes(__mscDev_t * mscDev)722 static int CreatePipes(__mscDev_t *mscDev)
723 {
724     struct usb_host_virt_interface *altsetting = mscDev->pusb_intf->cur_altsetting;
725     struct usb_endpoint_descriptor *ep      = NULL;
726     struct usb_endpoint_descriptor *ep_in   = NULL;
727     struct usb_endpoint_descriptor *ep_out  = NULL;
728     struct usb_endpoint_descriptor *ep_int  = NULL;
729     int i = 0;
730 
731     /*
732      * Find the endpoints we need.
733      * We are expecting a minimum of 2 endpoints - in and out (bulk).
734      * An optional interrupt is OK (necessary for CBI protocol).
735      * We will ignore any others.
736      */
737     for (i = 0; i < altsetting->desc.bNumEndpoints; i++)
738     {
739         ep = &altsetting->endpoint[i].desc;
740 
741         /* Is it a BULK endpoint? */
742         if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
743             == USB_ENDPOINT_XFER_BULK)
744         {
745             /* BULK in or out? */
746             if (ep->bEndpointAddress & USB_DIR_IN)
747             {
748                 ep_in = ep;
749             }
750             else
751             {
752                 ep_out = ep;
753             }
754         }
755         /* Is it an interrupt endpoint? */
756         else if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
757                  == USB_ENDPOINT_XFER_INT)
758         {
759             ep_int = ep;
760         }
761     }
762 
763     if (!ep_in || !ep_out || (mscDev->Protocol == USBMSC_INTERFACE_PROTOCOL_CBIT && !ep_int))
764     {
765         hal_log_err("Endpoint sanity check failed! Rejecting dev.");
766         return USB_ERR_UNKOWN_ERROR;
767     }
768 
769     /* Calculate and store the pipe values */
770     mscDev->CtrlOut = usb_sndctrlpipe(mscDev->pusb_dev, 0);
771     mscDev->CtrlIn  = usb_rcvctrlpipe(mscDev->pusb_dev, 0);
772     mscDev->BulkOut = usb_sndbulkpipe(mscDev->pusb_dev,
773                                       ep_out->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
774     mscDev->BulkIn  = usb_rcvbulkpipe(mscDev->pusb_dev,
775                                       ep_in->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
776 
777     if (ep_int)
778     {
779         mscDev->IntIn = usb_rcvintpipe(mscDev->pusb_dev,
780                                        ep_int->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
781         mscDev->EpInterval = ep_int->bInterval;
782     }
783 
784     return USB_ERR_SUCCESS;
785 }
786 
787 /*
788 *******************************************************************************
789 *                     mscDevAdd
790 *
791 * Description:
792 *     添加msc设备
793 *
794 * Parameters:
795 *    mscDev  : input. msc设备信息
796 *
797 * Return value:
798 *    None
799 *
800 * note:
801 *    无
802 *
803 *******************************************************************************
804 */
mscDevAdd(__mscDev_t * mscDev)805 static void mscDevAdd(__mscDev_t *mscDev)
806 {
807     unsigned int i = 0;
808     int ret = 0;
809 
810     if (mscDev == NULL)
811     {
812         printf("ERR: mscDevAdd input error");
813         return;
814     }
815 
816 //    printf("mscDev->MaxLun=%d", mscDev->MaxLun);
817 
818     /* probe lun */
819     for (i = 0; i < mscDev->MaxLun; i++)
820     {
821         __mscLun_t *mscLun = NULL;
822         mscLun = mscLun_alloc();
823 
824         if (mscLun == NULL)
825         {
826             hal_log_err("ERR: MscLun_alloc failed");
827             return;
828         }
829 
830         mscLun->mscDev       = mscDev;
831         mscLun->LunNo        = i;
832         mscLun->DiskSubClass = mscDev->SubClass;
833         mscLun->RemoveAble   = 1;    /* 默认为可移动设备 */
834         mscDev->Lun[i]  = mscLun;
835         hal_log_info("begin mscLunAdd\n");
836         ret = mscLunAdd(mscLun);
837         hal_log_info("end mscLunAdd\n");
838 
839         if (ret != USB_ERR_SUCCESS)
840         {
841             hal_log_err("ERR: probe Lun(%d) failed", i);
842             continue;
843         }
844 
845         /* 判断设备是否可移动设备, 若不是则delay */
846         if (mscLun->RemoveAble == 0)
847         {
848             mscDev->SuspendTime = 10000; /* 10s */
849         }
850         else
851         {
852             mscDev->SuspendTime = 0;
853         }
854 
855         usbh_disk_save_time(mscDev->SuspendTime);
856     }
857 
858     return;
859 }
860 
861 /*
862 *******************************************************************************
863 *                     mscDevDel
864 *
865 * Description:
866 *
867 *
868 * Parameters:
869 *    mscDev  : input. msc设备信息
870 *
871 * Return value:
872 *    无
873 *
874 * note:
875 *    无
876 *
877 *******************************************************************************
878 */
mscDevDel(__mscDev_t * mscDev)879 static void mscDevDel(__mscDev_t *mscDev)
880 {
881     unsigned int i = 0;
882 
883     if (mscDev == NULL)
884     {
885         hal_log_err("ERR: mscDevDel input error");
886         return;
887     }
888 
889     /* remove lun */
890     for (i = 0; i < mscDev->MaxLun; i++)
891     {
892         __mscLun_t *mscLun = NULL;
893         mscLun = mscDev->Lun[i];
894 
895         if (mscLun == NULL)
896         {
897             hal_log_err("ERR: mscLun == NULL");
898             return;
899         }
900 
901         mscLunDel(mscLun);
902         mscLun_free(mscLun);
903         usbh_disk_del_time(mscDev->SuspendTime);
904     }
905 
906     return;
907 }
908 
909 /*
910 *******************************************************************************
911 *                     MediaChangeThread
912 *
913 * Description:
914 *    媒体变化线程
915 *
916 * Parameters:
917 *    p_arg  : input. 为mscDev, msc设备信息
918 *
919 * Return value:
920 *    无
921 *
922 * note:
923 *    无
924 *
925 *******************************************************************************
926 */
927 
MediaChangeThread(void * p_arg)928 static void MediaChangeThread(void *p_arg)
929 {
930     __mscDev_t *mscDev = (__mscDev_t *)p_arg;
931     hal_sem_post(mscDev->notify_complete);
932     while (1)
933     {
934         unsigned int i = 0;
935         //--<1>--销毁线程
936         //TryTo//KillThreadSelf("MediaChangeThread");
937 
938         for (i = 0; i < mscDev->MaxLun; i++)
939         {
940             __mscLun_t *mscLun = NULL;
941             mscLun = mscDev->Lun[i];
942 
943             if (mscLun == NULL)
944             {
945                 hal_log_err("ERR: MediaChangeThread: mscLun is NULL");
946                 continue;
947             }
948 
949             if (mscLun->MediaChange)
950             {
951                 mscLun->MediaChange(mscLun);
952             }
953         }
954 
955         /* delay 1.25s */
956         hal_msleep(1250);
957     }
958 }
959 
960 /*
961 *******************************************************************************
962 *                     mscDevScanThread
963 *
964 * Description:
965 *    mscDev扫描
966 *
967 * Parameters:
968 *    p_arg  : input. 指向mscDev, msc设备信息
969 *
970 * Return value:
971 *    无
972 *
973 * note:
974 *    无
975 *
976 *******************************************************************************
977 */
mscDevScanThread(void * p_arg)978 static void mscDevScanThread(void *p_arg)
979 {
980     __mscDev_t *mscDev = (__mscDev_t *)p_arg;
981     mscDevAdd(mscDev);
982     hal_sem_post(mscDev->notify_complete);
983     //KillThreadSelf();
984 }
985 
986 
987 /*
988 *******************************************************************************
989 *                     QueueCmnd
990 *
991 * Description:
992 *    将命令队列提交到Lun
993 *
994 * Parameters:
995 *    mscLun     : input. 对应的Lun
996 *    scsi_cmnd  :  input. 命令
997 *
998 * Return value:
999 *    0  成功
1000 *   !0  失败
1001 *
1002 * note:
1003 *    无
1004 *
1005 *******************************************************************************
1006 */
mscDevQueueCmnd(__mscLun_t * mscLun,__ScsiCmnd_t * ScsiCmnd)1007 int mscDevQueueCmnd(__mscLun_t *mscLun, __ScsiCmnd_t *ScsiCmnd)
1008 {
1009     __mscDev_t *mscDev = NULL;
1010     unsigned int sr = 0 ;
1011     int val = 0;
1012 
1013     if (ScsiCmnd == NULL)
1014     {
1015         hal_log_err("ERR: invalid argment");
1016         return USB_ERR_BAD_ARGUMENTS;
1017     }
1018 
1019     if (mscLun == NULL)
1020     {
1021         hal_log_err("ERR: MscTransport: input error, mscLun = 0x%x, ScsiCmnd = %x", mscLun, ScsiCmnd);
1022         ScsiCmnd->Result = USB_STOR_TRANSPORT_ERROR;
1023         return USB_ERR_BAD_ARGUMENTS;
1024     }
1025 
1026     //DMSG_MSC_TEST("mscDevQueueCmnd: cmnd = %x", ((__u8 *)(ScsiCmnd->cmnd.CommandBlock))[0]);
1027     mscDev = mscLun->mscDev;
1028 
1029     if (mscDev == NULL)
1030     {
1031         hal_log_err("ERR: MscTransport: input error, mscDev == NULL");
1032         ScsiCmnd->Result = USB_STOR_TRANSPORT_ERROR;
1033         return USB_ERR_BAD_ARGUMENTS;
1034     }
1035 
1036     /* if mscDev is Busy, then all cmd to cmd_list */
1037     if (!mscDevOnline(mscDev))
1038     {
1039         hal_log_err("ERR: mscDevice is %s",
1040                    (mscDev->state == MSC_DEV_OFFLINE) ? "offline" : "died");
1041         ScsiCmnd->Result = USB_STOR_TRANSPORT_ERROR;
1042         return USB_ERR_IO_DEVICE_OFFLINE;
1043     }
1044 
1045     /* add command to cmd_list */
1046     ENTER_CRITICAL(sr);
1047     list_head_malloc_and_add((void *)ScsiCmnd, &(mscDev->cmd_list));
1048     EXIT_CRITICAL(sr);
1049     /* wakeup mscDev main thread */
1050     //UsbThreadWakeUp(mscDev->ThreadSemi);
1051     if (!hal_sem_getvalue(mscDev->ThreadSemi, &val))
1052     {
1053         hal_sem_post(mscDev->ThreadSemi);
1054     }
1055     return USB_ERR_SUCCESS;
1056 }
1057 
1058 /*
1059 *******************************************************************************
1060 *                     mscCmndDone
1061 *
1062 * Description:
1063 *    处理命令完成后的回调函数
1064 *
1065 * Parameters:
1066 *    mscLun         : input. 对应的Lun
1067 *    scsi_cmnd      :  input. 命令
1068 *    TransStatus    :  input. 数据传输状态
1069 *
1070 * Return value:
1071 *    无
1072 *
1073 * note:
1074 *    无
1075 *
1076 *******************************************************************************
1077 */
mscCmndDone(__mscDev_t * mscDev,__ScsiCmnd_t * ScsiCmnd,int TransStatus)1078 static void mscCmndDone(__mscDev_t *mscDev, __ScsiCmnd_t *ScsiCmnd, int TransStatus)
1079 {
1080     unsigned int sr = 0 ;
1081 
1082     if (ScsiCmnd == NULL)
1083     {
1084         return;
1085     }
1086 
1087     if (mscDev->state != MSC_DEV_OFFLINE)
1088     {
1089         /* need retry? */
1090         if (TransStatus == USB_STOR_TRANSPORT_ERROR && (ScsiCmnd->retries < ScsiCmnd->allowed))
1091         {
1092             if (mscGetDataTransportReason(ScsiCmnd->sc_lun, ScsiCmnd) == USB_ERR_COMMAND_NEED_RETRY)
1093             {
1094                 ScsiCmnd->retries++;
1095                 hal_log_err("ERR: do command(%x) failed, need retry, retries = %d, ScsiCmnd->allowed = %d",
1096                            ((__u8 *)(ScsiCmnd->cmnd.CommandBlock))[0], ScsiCmnd->retries, ScsiCmnd->allowed);
1097                 return ;
1098             }
1099             else
1100             {
1101                 hal_log_err("ERR: mscCmndDone: media is not present");
1102             }
1103         }
1104 
1105         //DMSG_MSC_TEST("mscCmndDone: cmnd = %x", ((__u8 *)(ScsiCmnd->cmnd.CommandBlock))[0]);
1106 
1107         /* retries = allowed = 0 ? */
1108         if (ScsiCmnd->retries > ScsiCmnd->allowed)
1109         {
1110             hal_log_err("ERR: ScsiCmnd(%x) retry %d times, maybe device is died",
1111                        ((__u8 *)(ScsiCmnd->cmnd.CommandBlock))[0], ScsiCmnd->retries);
1112            /* 不要使用异步执行操作,因为设备可能不支持并且可能会导致失败 */
1113         }
1114     }
1115     else
1116     {
1117         hal_log_err("ERR: mscCmndDone: device is offline");
1118     }
1119 
1120     /* Done command */
1121     ENTER_CRITICAL(sr);
1122     list_head_unlink_and_del(mscDev->cmd_list.next);
1123     ScsiCmnd->Result = TransStatus;
1124     EXIT_CRITICAL(sr);
1125 
1126     if (ScsiCmnd->Done)
1127     {
1128         ScsiCmnd->Done(ScsiCmnd);
1129     }
1130 
1131     return ;
1132 }
1133 
1134 /*
1135 *******************************************************************************
1136 *                     mscMainThread
1137 *
1138 * Description:
1139 *    线程函数,控制整个系统运行。
1140 *
1141 * Parameters:
1142 *    p_arg  -- input. 对象指针,mscDev, msc设备信息。
1143 *
1144 * Return value:
1145 *    无
1146 *
1147 * note:
1148 *    无
1149 *
1150 *******************************************************************************
1151 */
mscMainThread(void * p_arg)1152 static void mscMainThread(void *p_arg)
1153 {
1154     __mscDev_t *mscDev = (__mscDev_t *)p_arg;
1155     __ScsiCmnd_t *ScsiCmnd = NULL;
1156     int TransStatus = 0;
1157     unsigned int sr = 0 ;
1158     hal_sem_post(mscDev->notify_complete);
1159 
1160     while (1)
1161     {
1162         //--<1>--线程退出
1163         //TryTo//KillThreadSelf("mscMainThread");
1164         /* sleep */
1165         //UsbThreadSleep(mscDev->ThreadSemi);
1166     //      kthread_stop(mscDev->MainThreadId);
1167         hal_sem_wait(mscDev->ThreadSemi);
1168         /* cmd_list is empty?
1169         * 如果mscDevQueueCmnd的cmd加入了cmd_list队列就会唤醒mscMainThread线程去执行,
1170         * for循环从cmd_list取出一个cmd执行完再继续取下一个。
1171         * 所以UsbThreadWakeUp函数用于将mscMainThread线程唤醒,去执行已经加入到cmd_list的cmd。
1172         */
1173         if (usb_list_empty(&(mscDev->cmd_list)))
1174         {
1175             hal_log_err("Wrn: mscDev cmd_list is empty");
1176             continue;
1177         }
1178 
1179         for (; !usb_list_empty(&(mscDev->cmd_list));)
1180         {
1181             /* Get command */
1182             ScsiCmnd = (__ScsiCmnd_t *)mscDev->cmd_list.next->data;
1183 
1184             if (ScsiCmnd == NULL)
1185             {
1186                 hal_log_err("Wrn: mscDev cmd_list is not empty, but ScsiCmnd is NULL");
1187                 ENTER_CRITICAL(sr);
1188                 list_head_unlink_and_del(mscDev->cmd_list.next);
1189                 EXIT_CRITICAL(sr);
1190                 continue;
1191             }
1192 
1193             /* transport */
1194             if (mscDev->ProtocolHandler)
1195             {
1196                 TransStatus = mscDev->ProtocolHandler(mscDev, ScsiCmnd);
1197             }
1198             else
1199             {
1200                 hal_log_err("ERR: mscDev ProtocolHandler is NULL");
1201                 ScsiCmnd->Result = USB_STOR_TRANSPORT_ERROR;
1202                 TransStatus = USB_STOR_TRANSPORT_GOOD;
1203             }
1204 
1205             /* done cmnd */
1206             mscCmndDone(mscDev, ScsiCmnd, TransStatus);
1207         }
1208     }
1209 }
1210 
1211 /*
1212 *******************************************************************************
1213 *                     mscDevProbe
1214 *
1215 * Description:
1216 *    设备探测函数
1217 *
1218 * Parameters:
1219 *    intf       : input. USB接口信息
1220 *    table_item :  input. 匹配项
1221 *
1222 * Return value:
1223 *    0  成功
1224 *   !0  失败
1225 *
1226 * note:
1227 *    备注
1228 *
1229 *******************************************************************************
1230 */
mscDevProbe(struct usb_interface * intf,const struct usb_drv_dev_match_table * table_item)1231 static int32_t mscDevProbe(struct usb_interface *intf, const struct usb_drv_dev_match_table *table_item)
1232 {
1233     const s32 match_table_index = table_item - msc_match_table;
1234     __mscDev_t *mscDev = NULL;
1235     int ret = 0;
1236     unsigned char err  = 0;
1237     struct rt_thread *mscDev_Scan_Id = 0;
1238 
1239     hal_log_info("mscDevProbe begin");
1240     if (intf == NULL || table_item == NULL)
1241     {
1242         hal_log_err("ERR: mscDevProbe: input error");
1243         return -1;
1244     }
1245 
1246     //----------------------------------------------------------------
1247     //   初始化mscDev
1248     //----------------------------------------------------------------
1249     /* 初始化一个mscDev */
1250     mscDev = (__mscDev_t *)hal_malloc(sizeof(__mscDev_t));
1251 
1252     if (mscDev == NULL)
1253     {
1254         hal_log_err("ERR: hal_malloc failed");
1255         ret = -1;
1256         goto error0;
1257     }
1258 
1259     memset(mscDev, 0, sizeof(__mscDev_t));
1260     ret = mscDevInit(mscDev, intf);
1261 
1262     if (ret != USB_ERR_SUCCESS)
1263     {
1264         hal_log_err("ERR: mscDevInit failed");
1265         ret = -1;
1266         goto error1;
1267     }
1268 
1269     GetDeviceInfo(mscDev, match_table_index);
1270     /* 获取 SubClass */
1271     ret = GetProtocol(mscDev);
1272 
1273     if (ret != USB_ERR_SUCCESS)
1274     {
1275         hal_log_err("ERR: GetProtocol failed");
1276         ret = -1;
1277         goto error2;
1278     }
1279 
1280     /* 获取 Transport */
1281     ret = GetTransport(mscDev);
1282 
1283     if (ret != USB_ERR_SUCCESS)
1284     {
1285         hal_log_err("ERR: GetTransport failed");
1286         ret = -1;
1287         goto error3;
1288     }
1289 
1290     /* 创建管道 */
1291     ret = CreatePipes(mscDev);
1292     if (ret != USB_ERR_SUCCESS)
1293     {
1294         hal_log_err("ERR: CreatePipes failed");
1295         ret = -1;
1296         goto error4;
1297     }
1298 
1299 
1300     //----------------------------------------------------------------
1301     //识别mscDev
1302     //----------------------------------------------------------------
1303     SetMscDevState(mscDev, MSC_DEV_ONLINE);
1304     /* 获取MaxLun */
1305     mscDev->MaxLun = mscGetMaxLun(mscDev) + 1;
1306 
1307     if (mscDev->MaxLun > MSC_MAX_LUN)
1308     {
1309         hal_log_err("ERR: MaxLun = %d, mscDrv only support %d Lun", mscDev->MaxLun, MSC_MAX_LUN);
1310         mscDev->MaxLun = MSC_MAX_LUN;
1311     }
1312 
1313     /* msc main thread */
1314     mscDev->MainThreadId = kthread_run((void *)mscMainThread,
1315                                            (void *)mscDev,
1316                                            "MscMainThread");
1317 
1318     if (IS_ERR((unsigned long)mscDev->MainThreadId))
1319     {
1320         hal_log_err("ERR: create MainThreadId failed");
1321         ret = -1;
1322         goto error5;
1323     }
1324 
1325     hal_sem_wait(mscDev->notify_complete);
1326     /* mscDev scan thread */
1327     mscDev_Scan_Id = kthread_run((void *)mscDevScanThread,
1328                                      (void *)mscDev,
1329                                      "mscDevScanThread");
1330 
1331     if (IS_ERR((unsigned long)mscDev_Scan_Id))
1332     {
1333         hal_log_err("ERR: create mscDevScanThread failed");
1334         ret = -1;
1335         goto error6;
1336     }
1337 
1338     hal_sem_wait(mscDev->notify_complete);
1339     hal_log_info("mscDevScanThread end...");
1340     /* media change thread */
1341     mscDev->MediaChangeId = kthread_run((void *)MediaChangeThread,
1342                                             (void *)mscDev,
1343                                             "MediaChangeThread");
1344 
1345     if (IS_ERR((unsigned long)mscDev->MediaChangeId))
1346     {
1347         hal_log_err("ERR: create MediaChangeId failed");
1348         ret = -1;
1349         goto error7;
1350     }
1351 
1352     hal_sem_wait(mscDev->notify_complete);
1353     return 0;
1354 error7:
1355     kthread_stop(mscDev_Scan_Id);
1356 error6:
1357     kthread_stop(mscDev->MainThreadId);
1358 error5:
1359 error4:
1360 error3:
1361 error2:
1362     mscDevFree(mscDev);
1363 error1:
1364     hal_free(mscDev);
1365 error0:
1366     hal_log_err("ERR: USB Mass Storage Driver probe failed");
1367     return ret;
1368 }
1369 
1370 
1371 /*
1372 *******************************************************************************
1373 *                     mscDevSuspend
1374 *
1375 * Description:
1376 *    挂起设备
1377 *
1378 * Parameters:
1379 *    intf  : input. USB接口信息
1380 *
1381 * Return value:
1382 *    0  成功
1383 *   !0  失败
1384 *
1385 * note:
1386 *    无
1387 *
1388 *******************************************************************************
1389 */
mscDevSuspend(struct usb_interface * intf)1390 static int32_t mscDevSuspend(struct usb_interface *intf)
1391 {
1392     __mscDev_t *mscDev = NULL;
1393 
1394     if (intf == NULL)
1395     {
1396         hal_log_err("ERR: mscDevRemove: input error");
1397         return -1;
1398     }
1399 
1400     mscDev = (__mscDev_t *)usb_mod_usb_get_intf_priv_data(intf);
1401 
1402     if (mscDev == NULL)
1403     {
1404         hal_log_err("ERR: mscDev = NULL");
1405         return -1;
1406     }
1407 
1408     /* suspend interface */
1409     /* delay for suspend successful */
1410     hal_log_info("mscDevSuspend: SuspendTime = %dms", mscDev->SuspendTime);
1411     //  hal_msleep(mscDev->SuspendTime);
1412     return 0;
1413 }
1414 
1415 
1416 /*
1417 *******************************************************************************
1418 *                     mscDevRemove
1419 *
1420 * Description:
1421 *    msc设备移除
1422 *
1423 * Parameters:
1424 *    intf  : input. USB接口信息
1425 *
1426 * Return value:
1427 *    0  成功
1428 *   !0  失败
1429 *
1430 * note:
1431 *    无
1432 *
1433 *******************************************************************************
1434 */
mscDevRemove(struct usb_interface * intf)1435 static void mscDevRemove(struct usb_interface *intf)
1436 {
1437     __mscDev_t *mscDev = NULL;
1438 
1439     if (intf == NULL)
1440     {
1441         hal_log_err("ERR: mscDevRemove: input error");
1442         return ;
1443     }
1444 
1445     mscDev = (__mscDev_t *)usb_mod_usb_get_intf_priv_data(intf);
1446 
1447     if (mscDev == NULL)
1448     {
1449         hal_log_err("ERR: mscDev = NULL");
1450         return ;
1451     }
1452 
1453     SetMscDevState(mscDev, MSC_DEV_OFFLINE);
1454     hal_log_info("mscDevRemove: SetMscDevState MSC_DEV_OFFLINE");
1455     /* 停止当前传输 */
1456     mscDev->StopTransport(mscDev);
1457     /* 断开mscDev与所有Lun的关联 */
1458     mscDevDel(mscDev);
1459     /* kill media change thrad */
1460     kthread_stop(mscDev->MediaChangeId);
1461     /* kill main thrad */
1462     //kthread_stop(mscDev->MainThreadId, mscDev->ThreadSemi);
1463     kthread_stop(mscDev->MainThreadId);
1464     if (mscDev->ThreadSemi)
1465     {
1466         hal_sem_delete(mscDev->ThreadSemi);
1467         mscDev->ThreadSemi = NULL;
1468     }
1469     /* 释放mscDev资源 */
1470     mscDevFree(mscDev);
1471     hal_free(mscDev);
1472     hal_log_info("mscDevRemove complete");
1473     return ;
1474 }
1475 
1476 /*
1477 *******************************************************************************
1478 *                     mscDrv_init
1479 *
1480 * Description:
1481 *    msc驱动初始化
1482 *
1483 * Parameters:
1484 *    drv  为input.msc驱动
1485 *
1486 * Return value:
1487 *    0  成功
1488 *   !0  失败
1489 *
1490 * note:
1491 *
1492 *
1493 *******************************************************************************
1494 */
mscDrvInit(struct usb_host_func_drv * drv)1495 static int mscDrvInit(struct usb_host_func_drv *drv)
1496 {
1497     if (drv == NULL)
1498     {
1499         hal_log_err("ERR: mscDrv_init: input error");
1500         return -1;
1501     }
1502 
1503     USB_INIT_LIST_HEAD(&(drv->virt_dev_list));
1504     drv->func_drv_name      = MSC_DRV_NAME;
1505     drv->func_drv_auther    = MSC_DRV_AUTHOR;
1506     drv->probe              = mscDevProbe;
1507     drv->disconnect         = mscDevRemove;
1508     drv->suspend            = mscDevSuspend;
1509     drv->resume             = NULL;
1510     drv->match_table        = msc_match_table;
1511     return 0;
1512 }
1513 
1514 /*
1515 *******************************************************************************
1516 *                     scsi_bus_drv_reg
1517 *
1518 * Description:
1519 *    SCSI总线驱动注册函数
1520 *
1521 * Parameters:
1522 *    drv : input.  驱动
1523 *
1524 * Return value:
1525 *    EPDK_OK / EPDK_FAIL
1526 *
1527 * note:
1528 *    无
1529 *
1530 *******************************************************************************
1531 */
mscInit(void)1532 int mscInit(void)
1533 {
1534     int ret = 0;
1535 
1536     memset(&mscDrv, 0, sizeof(struct usb_host_func_drv));
1537     mscDev_id_array  = 0;
1538     init_usbh_buff_manager();
1539     usbh_disk_time_init();
1540     /* 数据库客户端需要映射disk状态, 这就是针对disk状态 */
1541     usbh_disk_info_reg();
1542 
1543     if (mscDrvInit(&mscDrv) != 0)
1544     {
1545         hal_log_err("ERR: mscDrv_init failed");
1546         return -1;
1547     }
1548 
1549     ret = usb_host_func_drv_reg(&mscDrv);
1550     if (ret != 0)
1551     {
1552         hal_log_err("ERR: mscInit: Reg driver %s failed", mscDrv.func_drv_name);
1553         return -1;
1554     }
1555     return 0;
1556 }
1557 
1558 /*
1559 *******************************************************************************
1560 *                     scsi_bus_drv_reg
1561 *
1562 * Description:
1563 *    SCSI总线驱动注册
1564 *
1565 * Parameters:
1566 *    drv : input.  驱动
1567 *
1568 * Return value:
1569 *    EPDK_OK / EPDK_FAIL
1570 *
1571 * note:
1572 *    无
1573 *
1574 *******************************************************************************
1575 */
mscExit(void)1576 int mscExit(void)
1577 {
1578     int ret = 0;
1579     ret = usb_host_func_drv_unreg(&mscDrv);
1580 
1581     if (ret != 0)
1582     {
1583         hal_log_err("ERR: mscExit: UnReg driver %s failed", mscDrv.func_drv_name);
1584         return -1;
1585     }
1586 
1587     usbh_disk_info_unreg();
1588     exit_usbh_buff_manager();
1589     usbh_disk_time_exit();
1590     return 0;
1591 }
1592 
1593 
1594 
1595 
1596