1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200#include <linux/blkdev.h>
201#include <linux/completion.h>
202#include <linux/dcache.h>
203#include <linux/delay.h>
204#include <linux/device.h>
205#include <linux/fcntl.h>
206#include <linux/file.h>
207#include <linux/fs.h>
208#include <linux/kref.h>
209#include <linux/kthread.h>
210#include <linux/limits.h>
211#include <linux/rwsem.h>
212#include <linux/slab.h>
213#include <linux/spinlock.h>
214#include <linux/string.h>
215#include <linux/freezer.h>
216#include <linux/module.h>
217#include <linux/uaccess.h>
218
219#include <linux/usb/ch9.h>
220#include <linux/usb/gadget.h>
221#include <linux/usb/composite.h>
222
223#include "configfs.h"
224
225
226
227
228#define FSG_DRIVER_DESC "Mass Storage Function"
229#define FSG_DRIVER_VERSION "2009/09/11"
230
231static const char fsg_string_interface[] = "Mass Storage";
232
233#include "storage_common.h"
234#include "f_mass_storage.h"
235
236
237static struct usb_string fsg_strings[] = {
238 {FSG_STRING_INTERFACE, fsg_string_interface},
239 {}
240};
241
242static struct usb_gadget_strings fsg_stringtab = {
243 .language = 0x0409,
244 .strings = fsg_strings,
245};
246
247static struct usb_gadget_strings *fsg_strings_array[] = {
248 &fsg_stringtab,
249 NULL,
250};
251
252
253
254struct fsg_dev;
255struct fsg_common;
256
257
258struct fsg_common {
259 struct usb_gadget *gadget;
260 struct usb_composite_dev *cdev;
261 struct fsg_dev *fsg, *new_fsg;
262 wait_queue_head_t fsg_wait;
263
264
265 struct rw_semaphore filesem;
266
267
268 spinlock_t lock;
269
270 struct usb_ep *ep0;
271 struct usb_request *ep0req;
272 unsigned int ep0_req_tag;
273
274 struct fsg_buffhd *next_buffhd_to_fill;
275 struct fsg_buffhd *next_buffhd_to_drain;
276 struct fsg_buffhd *buffhds;
277 unsigned int fsg_num_buffers;
278
279 int cmnd_size;
280 u8 cmnd[MAX_COMMAND_SIZE];
281
282 unsigned int lun;
283 struct fsg_lun *luns[FSG_MAX_LUNS];
284 struct fsg_lun *curlun;
285
286 unsigned int bulk_out_maxpacket;
287 enum fsg_state state;
288 unsigned int exception_req_tag;
289
290 enum data_direction data_dir;
291 u32 data_size;
292 u32 data_size_from_cmnd;
293 u32 tag;
294 u32 residue;
295 u32 usb_amount_left;
296
297 unsigned int can_stall:1;
298 unsigned int free_storage_on_release:1;
299 unsigned int phase_error:1;
300 unsigned int short_packet_received:1;
301 unsigned int bad_lun_okay:1;
302 unsigned int running:1;
303 unsigned int sysfs:1;
304
305 int thread_wakeup_needed;
306 struct completion thread_notifier;
307 struct task_struct *thread_task;
308
309
310 const struct fsg_operations *ops;
311
312 void *private_data;
313
314
315
316
317
318 char inquiry_string[8 + 16 + 4 + 1];
319
320 struct kref ref;
321};
322
323struct fsg_dev {
324 struct usb_function function;
325 struct usb_gadget *gadget;
326 struct fsg_common *common;
327
328 u16 interface_number;
329
330 unsigned int bulk_in_enabled:1;
331 unsigned int bulk_out_enabled:1;
332
333 unsigned long atomic_bitflags;
334#define IGNORE_BULK_OUT 0
335
336 struct usb_ep *bulk_in;
337 struct usb_ep *bulk_out;
338};
339
340static inline int __fsg_is_set(struct fsg_common *common,
341 const char *func, unsigned line)
342{
343 if (common->fsg)
344 return 1;
345 ERROR(common, "common->fsg is NULL in %s at %u\n", func, line);
346 WARN_ON(1);
347 return 0;
348}
349
350#define fsg_is_set(common) likely(__fsg_is_set(common, __func__, __LINE__))
351
352static inline struct fsg_dev *fsg_from_func(struct usb_function *f)
353{
354 return container_of(f, struct fsg_dev, function);
355}
356
357typedef void (*fsg_routine_t)(struct fsg_dev *);
358
359static int exception_in_progress(struct fsg_common *common)
360{
361 return common->state > FSG_STATE_IDLE;
362}
363
364
365static void set_bulk_out_req_length(struct fsg_common *common,
366 struct fsg_buffhd *bh, unsigned int length)
367{
368 unsigned int rem;
369
370 bh->bulk_out_intended_length = length;
371 rem = length % common->bulk_out_maxpacket;
372 if (rem > 0)
373 length += common->bulk_out_maxpacket - rem;
374 bh->outreq->length = length;
375}
376
377
378
379
380static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep)
381{
382 const char *name;
383
384 if (ep == fsg->bulk_in)
385 name = "bulk-in";
386 else if (ep == fsg->bulk_out)
387 name = "bulk-out";
388 else
389 name = ep->name;
390 DBG(fsg, "%s set halt\n", name);
391 return usb_ep_set_halt(ep);
392}
393
394
395
396
397
398
399
400static void wakeup_thread(struct fsg_common *common)
401{
402 smp_wmb();
403
404 common->thread_wakeup_needed = 1;
405 if (common->thread_task)
406 wake_up_process(common->thread_task);
407}
408
409static void raise_exception(struct fsg_common *common, enum fsg_state new_state)
410{
411 unsigned long flags;
412
413
414
415
416
417
418 spin_lock_irqsave(&common->lock, flags);
419 if (common->state <= new_state) {
420 common->exception_req_tag = common->ep0_req_tag;
421 common->state = new_state;
422 if (common->thread_task)
423 send_sig_info(SIGUSR1, SEND_SIG_FORCED,
424 common->thread_task);
425 }
426 spin_unlock_irqrestore(&common->lock, flags);
427}
428
429
430
431
432static int ep0_queue(struct fsg_common *common)
433{
434 int rc;
435
436 rc = usb_ep_queue(common->ep0, common->ep0req, GFP_ATOMIC);
437 common->ep0->driver_data = common;
438 if (rc != 0 && rc != -ESHUTDOWN) {
439
440 WARNING(common, "error in submission: %s --> %d\n",
441 common->ep0->name, rc);
442 }
443 return rc;
444}
445
446
447
448
449
450
451static void bulk_in_complete(struct usb_ep *ep, struct usb_request *req)
452{
453 struct fsg_common *common = ep->driver_data;
454 struct fsg_buffhd *bh = req->context;
455
456 if (req->status || req->actual != req->length)
457 DBG(common, "%s --> %d, %u/%u\n", __func__,
458 req->status, req->actual, req->length);
459 if (req->status == -ECONNRESET)
460 usb_ep_fifo_flush(ep);
461
462
463 smp_wmb();
464 spin_lock(&common->lock);
465 bh->inreq_busy = 0;
466 bh->state = BUF_STATE_EMPTY;
467 wakeup_thread(common);
468 spin_unlock(&common->lock);
469}
470
471static void bulk_out_complete(struct usb_ep *ep, struct usb_request *req)
472{
473 struct fsg_common *common = ep->driver_data;
474 struct fsg_buffhd *bh = req->context;
475
476 dump_msg(common, "bulk-out", req->buf, req->actual);
477 if (req->status || req->actual != bh->bulk_out_intended_length)
478 DBG(common, "%s --> %d, %u/%u\n", __func__,
479 req->status, req->actual, bh->bulk_out_intended_length);
480 if (req->status == -ECONNRESET)
481 usb_ep_fifo_flush(ep);
482
483
484 smp_wmb();
485 spin_lock(&common->lock);
486 bh->outreq_busy = 0;
487 bh->state = BUF_STATE_FULL;
488 wakeup_thread(common);
489 spin_unlock(&common->lock);
490}
491
492static int _fsg_common_get_max_lun(struct fsg_common *common)
493{
494 int i = ARRAY_SIZE(common->luns) - 1;
495
496 while (i >= 0 && !common->luns[i])
497 --i;
498
499 return i;
500}
501
502static int fsg_setup(struct usb_function *f,
503 const struct usb_ctrlrequest *ctrl)
504{
505 struct fsg_dev *fsg = fsg_from_func(f);
506 struct usb_request *req = fsg->common->ep0req;
507 u16 w_index = le16_to_cpu(ctrl->wIndex);
508 u16 w_value = le16_to_cpu(ctrl->wValue);
509 u16 w_length = le16_to_cpu(ctrl->wLength);
510
511 if (!fsg_is_set(fsg->common))
512 return -EOPNOTSUPP;
513
514 ++fsg->common->ep0_req_tag;
515 req->context = NULL;
516 req->length = 0;
517 dump_msg(fsg, "ep0-setup", (u8 *) ctrl, sizeof(*ctrl));
518
519 switch (ctrl->bRequest) {
520
521 case US_BULK_RESET_REQUEST:
522 if (ctrl->bRequestType !=
523 (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE))
524 break;
525 if (w_index != fsg->interface_number || w_value != 0 ||
526 w_length != 0)
527 return -EDOM;
528
529
530
531
532
533 DBG(fsg, "bulk reset request\n");
534 raise_exception(fsg->common, FSG_STATE_RESET);
535 return USB_GADGET_DELAYED_STATUS;
536
537 case US_BULK_GET_MAX_LUN:
538 if (ctrl->bRequestType !=
539 (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE))
540 break;
541 if (w_index != fsg->interface_number || w_value != 0 ||
542 w_length != 1)
543 return -EDOM;
544 VDBG(fsg, "get max LUN\n");
545 *(u8 *)req->buf = _fsg_common_get_max_lun(fsg->common);
546
547
548 req->length = min((u16)1, w_length);
549 return ep0_queue(fsg->common);
550 }
551
552 VDBG(fsg,
553 "unknown class-specific control req %02x.%02x v%04x i%04x l%u\n",
554 ctrl->bRequestType, ctrl->bRequest,
555 le16_to_cpu(ctrl->wValue), w_index, w_length);
556 return -EOPNOTSUPP;
557}
558
559
560
561
562
563
564
565static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
566 struct usb_request *req, int *pbusy,
567 enum fsg_buffer_state *state)
568{
569 int rc;
570
571 if (ep == fsg->bulk_in)
572 dump_msg(fsg, "bulk-in", req->buf, req->length);
573
574 spin_lock_irq(&fsg->common->lock);
575 *pbusy = 1;
576 *state = BUF_STATE_BUSY;
577 spin_unlock_irq(&fsg->common->lock);
578
579 rc = usb_ep_queue(ep, req, GFP_KERNEL);
580 if (rc == 0)
581 return;
582
583 *pbusy = 0;
584 *state = BUF_STATE_EMPTY;
585
586
587
588
589
590
591
592 if (rc != -ESHUTDOWN && !(rc == -EOPNOTSUPP && req->length == 0))
593 WARNING(fsg, "error in submission: %s --> %d\n", ep->name, rc);
594}
595
596static bool start_in_transfer(struct fsg_common *common, struct fsg_buffhd *bh)
597{
598 if (!fsg_is_set(common))
599 return false;
600 start_transfer(common->fsg, common->fsg->bulk_in,
601 bh->inreq, &bh->inreq_busy, &bh->state);
602 return true;
603}
604
605static bool start_out_transfer(struct fsg_common *common, struct fsg_buffhd *bh)
606{
607 if (!fsg_is_set(common))
608 return false;
609 start_transfer(common->fsg, common->fsg->bulk_out,
610 bh->outreq, &bh->outreq_busy, &bh->state);
611 return true;
612}
613
614static int sleep_thread(struct fsg_common *common, bool can_freeze)
615{
616 int rc = 0;
617
618
619 for (;;) {
620 if (can_freeze)
621 try_to_freeze();
622 set_current_state(TASK_INTERRUPTIBLE);
623 if (signal_pending(current)) {
624 rc = -EINTR;
625 break;
626 }
627 if (common->thread_wakeup_needed)
628 break;
629 schedule();
630 }
631 __set_current_state(TASK_RUNNING);
632 common->thread_wakeup_needed = 0;
633 smp_rmb();
634 return rc;
635}
636
637
638
639
640static int do_read(struct fsg_common *common)
641{
642 struct fsg_lun *curlun = common->curlun;
643 u32 lba;
644 struct fsg_buffhd *bh;
645 int rc;
646 u32 amount_left;
647 loff_t file_offset, file_offset_tmp;
648 unsigned int amount;
649 ssize_t nread;
650
651
652
653
654
655 if (common->cmnd[0] == READ_6)
656 lba = get_unaligned_be24(&common->cmnd[1]);
657 else {
658 lba = get_unaligned_be32(&common->cmnd[2]);
659
660
661
662
663
664
665 if ((common->cmnd[1] & ~0x18) != 0) {
666 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
667 return -EINVAL;
668 }
669 }
670 if (lba >= curlun->num_sectors) {
671 curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
672 return -EINVAL;
673 }
674 file_offset = ((loff_t) lba) << curlun->blkbits;
675
676
677 amount_left = common->data_size_from_cmnd;
678 if (unlikely(amount_left == 0))
679 return -EIO;
680
681 for (;;) {
682
683
684
685
686
687
688 amount = min(amount_left, FSG_BUFLEN);
689 amount = min((loff_t)amount,
690 curlun->file_length - file_offset);
691
692
693 bh = common->next_buffhd_to_fill;
694 while (bh->state != BUF_STATE_EMPTY) {
695 rc = sleep_thread(common, false);
696 if (rc)
697 return rc;
698 }
699
700
701
702
703
704 if (amount == 0) {
705 curlun->sense_data =
706 SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
707 curlun->sense_data_info =
708 file_offset >> curlun->blkbits;
709 curlun->info_valid = 1;
710 bh->inreq->length = 0;
711 bh->state = BUF_STATE_FULL;
712 break;
713 }
714
715
716 file_offset_tmp = file_offset;
717 nread = vfs_read(curlun->filp,
718 (char __user *)bh->buf,
719 amount, &file_offset_tmp);
720 VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
721 (unsigned long long)file_offset, (int)nread);
722 if (signal_pending(current))
723 return -EINTR;
724
725 if (nread < 0) {
726 LDBG(curlun, "error in file read: %d\n", (int)nread);
727 nread = 0;
728 } else if (nread < amount) {
729 LDBG(curlun, "partial file read: %d/%u\n",
730 (int)nread, amount);
731 nread = round_down(nread, curlun->blksize);
732 }
733 file_offset += nread;
734 amount_left -= nread;
735 common->residue -= nread;
736
737
738
739
740
741
742 bh->inreq->length = nread;
743 bh->state = BUF_STATE_FULL;
744
745
746 if (nread < amount) {
747 curlun->sense_data = SS_UNRECOVERED_READ_ERROR;
748 curlun->sense_data_info =
749 file_offset >> curlun->blkbits;
750 curlun->info_valid = 1;
751 break;
752 }
753
754 if (amount_left == 0)
755 break;
756
757
758 bh->inreq->zero = 0;
759 if (!start_in_transfer(common, bh))
760
761 return -EIO;
762 common->next_buffhd_to_fill = bh->next;
763 }
764
765 return -EIO;
766}
767
768
769
770
771static int do_write(struct fsg_common *common)
772{
773 struct fsg_lun *curlun = common->curlun;
774 u32 lba;
775 struct fsg_buffhd *bh;
776 int get_some_more;
777 u32 amount_left_to_req, amount_left_to_write;
778 loff_t usb_offset, file_offset, file_offset_tmp;
779 unsigned int amount;
780 ssize_t nwritten;
781 int rc;
782
783 if (curlun->ro) {
784 curlun->sense_data = SS_WRITE_PROTECTED;
785 return -EINVAL;
786 }
787 spin_lock(&curlun->filp->f_lock);
788 curlun->filp->f_flags &= ~O_SYNC;
789 spin_unlock(&curlun->filp->f_lock);
790
791
792
793
794
795 if (common->cmnd[0] == WRITE_6)
796 lba = get_unaligned_be24(&common->cmnd[1]);
797 else {
798 lba = get_unaligned_be32(&common->cmnd[2]);
799
800
801
802
803
804
805
806 if (common->cmnd[1] & ~0x18) {
807 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
808 return -EINVAL;
809 }
810 if (!curlun->nofua && (common->cmnd[1] & 0x08)) {
811 spin_lock(&curlun->filp->f_lock);
812 curlun->filp->f_flags |= O_SYNC;
813 spin_unlock(&curlun->filp->f_lock);
814 }
815 }
816 if (lba >= curlun->num_sectors) {
817 curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
818 return -EINVAL;
819 }
820
821
822 get_some_more = 1;
823 file_offset = usb_offset = ((loff_t) lba) << curlun->blkbits;
824 amount_left_to_req = common->data_size_from_cmnd;
825 amount_left_to_write = common->data_size_from_cmnd;
826
827 while (amount_left_to_write > 0) {
828
829
830 bh = common->next_buffhd_to_fill;
831 if (bh->state == BUF_STATE_EMPTY && get_some_more) {
832
833
834
835
836
837
838 amount = min(amount_left_to_req, FSG_BUFLEN);
839
840
841 if (usb_offset >= curlun->file_length) {
842 get_some_more = 0;
843 curlun->sense_data =
844 SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
845 curlun->sense_data_info =
846 usb_offset >> curlun->blkbits;
847 curlun->info_valid = 1;
848 continue;
849 }
850
851
852 usb_offset += amount;
853 common->usb_amount_left -= amount;
854 amount_left_to_req -= amount;
855 if (amount_left_to_req == 0)
856 get_some_more = 0;
857
858
859
860
861
862
863 set_bulk_out_req_length(common, bh, amount);
864 if (!start_out_transfer(common, bh))
865
866 return -EIO;
867 common->next_buffhd_to_fill = bh->next;
868 continue;
869 }
870
871
872 bh = common->next_buffhd_to_drain;
873 if (bh->state == BUF_STATE_EMPTY && !get_some_more)
874 break;
875 if (bh->state == BUF_STATE_FULL) {
876 smp_rmb();
877 common->next_buffhd_to_drain = bh->next;
878 bh->state = BUF_STATE_EMPTY;
879
880
881 if (bh->outreq->status != 0) {
882 curlun->sense_data = SS_COMMUNICATION_FAILURE;
883 curlun->sense_data_info =
884 file_offset >> curlun->blkbits;
885 curlun->info_valid = 1;
886 break;
887 }
888
889 amount = bh->outreq->actual;
890 if (curlun->file_length - file_offset < amount) {
891 LERROR(curlun,
892 "write %u @ %llu beyond end %llu\n",
893 amount, (unsigned long long)file_offset,
894 (unsigned long long)curlun->file_length);
895 amount = curlun->file_length - file_offset;
896 }
897
898
899
900
901 amount = min(amount, bh->bulk_out_intended_length);
902
903
904 amount = round_down(amount, curlun->blksize);
905 if (amount == 0)
906 goto empty_write;
907
908
909 file_offset_tmp = file_offset;
910 nwritten = vfs_write(curlun->filp,
911 (char __user *)bh->buf,
912 amount, &file_offset_tmp);
913 VLDBG(curlun, "file write %u @ %llu -> %d\n", amount,
914 (unsigned long long)file_offset, (int)nwritten);
915 if (signal_pending(current))
916 return -EINTR;
917
918 if (nwritten < 0) {
919 LDBG(curlun, "error in file write: %d\n",
920 (int)nwritten);
921 nwritten = 0;
922 } else if (nwritten < amount) {
923 LDBG(curlun, "partial file write: %d/%u\n",
924 (int)nwritten, amount);
925 nwritten = round_down(nwritten, curlun->blksize);
926 }
927 file_offset += nwritten;
928 amount_left_to_write -= nwritten;
929 common->residue -= nwritten;
930
931
932 if (nwritten < amount) {
933 curlun->sense_data = SS_WRITE_ERROR;
934 curlun->sense_data_info =
935 file_offset >> curlun->blkbits;
936 curlun->info_valid = 1;
937 break;
938 }
939
940 empty_write:
941
942 if (bh->outreq->actual < bh->bulk_out_intended_length) {
943 common->short_packet_received = 1;
944 break;
945 }
946 continue;
947 }
948
949
950 rc = sleep_thread(common, false);
951 if (rc)
952 return rc;
953 }
954
955 return -EIO;
956}
957
958
959
960
961static int do_synchronize_cache(struct fsg_common *common)
962{
963 struct fsg_lun *curlun = common->curlun;
964 int rc;
965
966
967
968 rc = fsg_lun_fsync_sub(curlun);
969 if (rc)
970 curlun->sense_data = SS_WRITE_ERROR;
971 return 0;
972}
973
974
975
976
977static void invalidate_sub(struct fsg_lun *curlun)
978{
979 struct file *filp = curlun->filp;
980 struct inode *inode = file_inode(filp);
981 unsigned long rc;
982
983 rc = invalidate_mapping_pages(inode->i_mapping, 0, -1);
984 VLDBG(curlun, "invalidate_mapping_pages -> %ld\n", rc);
985}
986
987static int do_verify(struct fsg_common *common)
988{
989 struct fsg_lun *curlun = common->curlun;
990 u32 lba;
991 u32 verification_length;
992 struct fsg_buffhd *bh = common->next_buffhd_to_fill;
993 loff_t file_offset, file_offset_tmp;
994 u32 amount_left;
995 unsigned int amount;
996 ssize_t nread;
997
998
999
1000
1001
1002 lba = get_unaligned_be32(&common->cmnd[2]);
1003 if (lba >= curlun->num_sectors) {
1004 curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
1005 return -EINVAL;
1006 }
1007
1008
1009
1010
1011
1012 if (common->cmnd[1] & ~0x10) {
1013 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1014 return -EINVAL;
1015 }
1016
1017 verification_length = get_unaligned_be16(&common->cmnd[7]);
1018 if (unlikely(verification_length == 0))
1019 return -EIO;
1020
1021
1022 amount_left = verification_length << curlun->blkbits;
1023 file_offset = ((loff_t) lba) << curlun->blkbits;
1024
1025
1026 fsg_lun_fsync_sub(curlun);
1027 if (signal_pending(current))
1028 return -EINTR;
1029
1030 invalidate_sub(curlun);
1031 if (signal_pending(current))
1032 return -EINTR;
1033
1034
1035 while (amount_left > 0) {
1036
1037
1038
1039
1040
1041
1042 amount = min(amount_left, FSG_BUFLEN);
1043 amount = min((loff_t)amount,
1044 curlun->file_length - file_offset);
1045 if (amount == 0) {
1046 curlun->sense_data =
1047 SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
1048 curlun->sense_data_info =
1049 file_offset >> curlun->blkbits;
1050 curlun->info_valid = 1;
1051 break;
1052 }
1053
1054
1055 file_offset_tmp = file_offset;
1056 nread = vfs_read(curlun->filp,
1057 (char __user *) bh->buf,
1058 amount, &file_offset_tmp);
1059 VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
1060 (unsigned long long) file_offset,
1061 (int) nread);
1062 if (signal_pending(current))
1063 return -EINTR;
1064
1065 if (nread < 0) {
1066 LDBG(curlun, "error in file verify: %d\n", (int)nread);
1067 nread = 0;
1068 } else if (nread < amount) {
1069 LDBG(curlun, "partial file verify: %d/%u\n",
1070 (int)nread, amount);
1071 nread = round_down(nread, curlun->blksize);
1072 }
1073 if (nread == 0) {
1074 curlun->sense_data = SS_UNRECOVERED_READ_ERROR;
1075 curlun->sense_data_info =
1076 file_offset >> curlun->blkbits;
1077 curlun->info_valid = 1;
1078 break;
1079 }
1080 file_offset += nread;
1081 amount_left -= nread;
1082 }
1083 return 0;
1084}
1085
1086
1087
1088
1089static int do_inquiry(struct fsg_common *common, struct fsg_buffhd *bh)
1090{
1091 struct fsg_lun *curlun = common->curlun;
1092 u8 *buf = (u8 *) bh->buf;
1093
1094 if (!curlun) {
1095 common->bad_lun_okay = 1;
1096 memset(buf, 0, 36);
1097 buf[0] = TYPE_NO_LUN;
1098 buf[4] = 31;
1099 return 36;
1100 }
1101
1102 buf[0] = curlun->cdrom ? TYPE_ROM : TYPE_DISK;
1103 buf[1] = curlun->removable ? 0x80 : 0;
1104 buf[2] = 2;
1105 buf[3] = 2;
1106 buf[4] = 31;
1107 buf[5] = 0;
1108 buf[6] = 0;
1109 buf[7] = 0;
1110 memcpy(buf + 8, common->inquiry_string, sizeof common->inquiry_string);
1111 return 36;
1112}
1113
1114static int do_request_sense(struct fsg_common *common, struct fsg_buffhd *bh)
1115{
1116 struct fsg_lun *curlun = common->curlun;
1117 u8 *buf = (u8 *) bh->buf;
1118 u32 sd, sdinfo;
1119 int valid;
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136#if 0
1137 if (curlun && curlun->unit_attention_data != SS_NO_SENSE) {
1138 curlun->sense_data = curlun->unit_attention_data;
1139 curlun->unit_attention_data = SS_NO_SENSE;
1140 }
1141#endif
1142
1143 if (!curlun) {
1144 common->bad_lun_okay = 1;
1145 sd = SS_LOGICAL_UNIT_NOT_SUPPORTED;
1146 sdinfo = 0;
1147 valid = 0;
1148 } else {
1149 sd = curlun->sense_data;
1150 sdinfo = curlun->sense_data_info;
1151 valid = curlun->info_valid << 7;
1152 curlun->sense_data = SS_NO_SENSE;
1153 curlun->sense_data_info = 0;
1154 curlun->info_valid = 0;
1155 }
1156
1157 memset(buf, 0, 18);
1158 buf[0] = valid | 0x70;
1159 buf[2] = SK(sd);
1160 put_unaligned_be32(sdinfo, &buf[3]);
1161 buf[7] = 18 - 8;
1162 buf[12] = ASC(sd);
1163 buf[13] = ASCQ(sd);
1164 return 18;
1165}
1166
1167static int do_read_capacity(struct fsg_common *common, struct fsg_buffhd *bh)
1168{
1169 struct fsg_lun *curlun = common->curlun;
1170 u32 lba = get_unaligned_be32(&common->cmnd[2]);
1171 int pmi = common->cmnd[8];
1172 u8 *buf = (u8 *)bh->buf;
1173
1174
1175 if (pmi > 1 || (pmi == 0 && lba != 0)) {
1176 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1177 return -EINVAL;
1178 }
1179
1180 put_unaligned_be32(curlun->num_sectors - 1, &buf[0]);
1181
1182 put_unaligned_be32(curlun->blksize, &buf[4]);
1183 return 8;
1184}
1185
1186static int do_read_header(struct fsg_common *common, struct fsg_buffhd *bh)
1187{
1188 struct fsg_lun *curlun = common->curlun;
1189 int msf = common->cmnd[1] & 0x02;
1190 u32 lba = get_unaligned_be32(&common->cmnd[2]);
1191 u8 *buf = (u8 *)bh->buf;
1192
1193 if (common->cmnd[1] & ~0x02) {
1194 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1195 return -EINVAL;
1196 }
1197 if (lba >= curlun->num_sectors) {
1198 curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
1199 return -EINVAL;
1200 }
1201
1202 memset(buf, 0, 8);
1203 buf[0] = 0x01;
1204 store_cdrom_address(&buf[4], msf, lba);
1205 return 8;
1206}
1207
1208static int do_read_toc(struct fsg_common *common, struct fsg_buffhd *bh)
1209{
1210 struct fsg_lun *curlun = common->curlun;
1211 int msf = common->cmnd[1] & 0x02;
1212 int start_track = common->cmnd[6];
1213 u8 *buf = (u8 *)bh->buf;
1214
1215 if ((common->cmnd[1] & ~0x02) != 0 ||
1216 start_track > 1) {
1217 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1218 return -EINVAL;
1219 }
1220
1221 memset(buf, 0, 20);
1222 buf[1] = (20-2);
1223 buf[2] = 1;
1224 buf[3] = 1;
1225 buf[5] = 0x16;
1226 buf[6] = 0x01;
1227 store_cdrom_address(&buf[8], msf, 0);
1228
1229 buf[13] = 0x16;
1230 buf[14] = 0xAA;
1231 store_cdrom_address(&buf[16], msf, curlun->num_sectors);
1232 return 20;
1233}
1234
1235static int do_mode_sense(struct fsg_common *common, struct fsg_buffhd *bh)
1236{
1237 struct fsg_lun *curlun = common->curlun;
1238 int mscmnd = common->cmnd[0];
1239 u8 *buf = (u8 *) bh->buf;
1240 u8 *buf0 = buf;
1241 int pc, page_code;
1242 int changeable_values, all_pages;
1243 int valid_page = 0;
1244 int len, limit;
1245
1246 if ((common->cmnd[1] & ~0x08) != 0) {
1247 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1248 return -EINVAL;
1249 }
1250 pc = common->cmnd[2] >> 6;
1251 page_code = common->cmnd[2] & 0x3f;
1252 if (pc == 3) {
1253 curlun->sense_data = SS_SAVING_PARAMETERS_NOT_SUPPORTED;
1254 return -EINVAL;
1255 }
1256 changeable_values = (pc == 1);
1257 all_pages = (page_code == 0x3f);
1258
1259
1260
1261
1262
1263
1264
1265 memset(buf, 0, 8);
1266 if (mscmnd == MODE_SENSE) {
1267 buf[2] = (curlun->ro ? 0x80 : 0x00);
1268 buf += 4;
1269 limit = 255;
1270 } else {
1271 buf[3] = (curlun->ro ? 0x80 : 0x00);
1272 buf += 8;
1273 limit = 65535;
1274 }
1275
1276
1277
1278
1279
1280
1281
1282 if (page_code == 0x08 || all_pages) {
1283 valid_page = 1;
1284 buf[0] = 0x08;
1285 buf[1] = 10;
1286 memset(buf+2, 0, 10);
1287
1288 if (!changeable_values) {
1289 buf[2] = 0x04;
1290
1291
1292 put_unaligned_be16(0xffff, &buf[4]);
1293
1294
1295 put_unaligned_be16(0xffff, &buf[8]);
1296
1297 put_unaligned_be16(0xffff, &buf[10]);
1298
1299 }
1300 buf += 12;
1301 }
1302
1303
1304
1305
1306
1307 len = buf - buf0;
1308 if (!valid_page || len > limit) {
1309 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1310 return -EINVAL;
1311 }
1312
1313
1314 if (mscmnd == MODE_SENSE)
1315 buf0[0] = len - 1;
1316 else
1317 put_unaligned_be16(len - 2, buf0);
1318 return len;
1319}
1320
1321static int do_start_stop(struct fsg_common *common)
1322{
1323 struct fsg_lun *curlun = common->curlun;
1324 int loej, start;
1325
1326 if (!curlun) {
1327 return -EINVAL;
1328 } else if (!curlun->removable) {
1329 curlun->sense_data = SS_INVALID_COMMAND;
1330 return -EINVAL;
1331 } else if ((common->cmnd[1] & ~0x01) != 0 ||
1332 (common->cmnd[4] & ~0x03) != 0) {
1333 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1334 return -EINVAL;
1335 }
1336
1337 loej = common->cmnd[4] & 0x02;
1338 start = common->cmnd[4] & 0x01;
1339
1340
1341
1342
1343
1344 if (start) {
1345 if (!fsg_lun_is_open(curlun)) {
1346 curlun->sense_data = SS_MEDIUM_NOT_PRESENT;
1347 return -EINVAL;
1348 }
1349 return 0;
1350 }
1351
1352
1353 if (curlun->prevent_medium_removal) {
1354 LDBG(curlun, "unload attempt prevented\n");
1355 curlun->sense_data = SS_MEDIUM_REMOVAL_PREVENTED;
1356 return -EINVAL;
1357 }
1358
1359 if (!loej)
1360 return 0;
1361
1362 up_read(&common->filesem);
1363 down_write(&common->filesem);
1364 fsg_lun_close(curlun);
1365 up_write(&common->filesem);
1366 down_read(&common->filesem);
1367
1368 return 0;
1369}
1370
1371static int do_prevent_allow(struct fsg_common *common)
1372{
1373 struct fsg_lun *curlun = common->curlun;
1374 int prevent;
1375
1376 if (!common->curlun) {
1377 return -EINVAL;
1378 } else if (!common->curlun->removable) {
1379 common->curlun->sense_data = SS_INVALID_COMMAND;
1380 return -EINVAL;
1381 }
1382
1383 prevent = common->cmnd[4] & 0x01;
1384 if ((common->cmnd[4] & ~0x01) != 0) {
1385 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1386 return -EINVAL;
1387 }
1388
1389 if (curlun->prevent_medium_removal && !prevent)
1390 fsg_lun_fsync_sub(curlun);
1391 curlun->prevent_medium_removal = prevent;
1392 return 0;
1393}
1394
1395static int do_read_format_capacities(struct fsg_common *common,
1396 struct fsg_buffhd *bh)
1397{
1398 struct fsg_lun *curlun = common->curlun;
1399 u8 *buf = (u8 *) bh->buf;
1400
1401 buf[0] = buf[1] = buf[2] = 0;
1402 buf[3] = 8;
1403 buf += 4;
1404
1405 put_unaligned_be32(curlun->num_sectors, &buf[0]);
1406
1407 put_unaligned_be32(curlun->blksize, &buf[4]);
1408 buf[4] = 0x02;
1409 return 12;
1410}
1411
1412static int do_mode_select(struct fsg_common *common, struct fsg_buffhd *bh)
1413{
1414 struct fsg_lun *curlun = common->curlun;
1415
1416
1417 if (curlun)
1418 curlun->sense_data = SS_INVALID_COMMAND;
1419 return -EINVAL;
1420}
1421
1422
1423
1424
1425static int halt_bulk_in_endpoint(struct fsg_dev *fsg)
1426{
1427 int rc;
1428
1429 rc = fsg_set_halt(fsg, fsg->bulk_in);
1430 if (rc == -EAGAIN)
1431 VDBG(fsg, "delayed bulk-in endpoint halt\n");
1432 while (rc != 0) {
1433 if (rc != -EAGAIN) {
1434 WARNING(fsg, "usb_ep_set_halt -> %d\n", rc);
1435 rc = 0;
1436 break;
1437 }
1438
1439
1440 if (msleep_interruptible(100) != 0)
1441 return -EINTR;
1442 rc = usb_ep_set_halt(fsg->bulk_in);
1443 }
1444 return rc;
1445}
1446
1447static int wedge_bulk_in_endpoint(struct fsg_dev *fsg)
1448{
1449 int rc;
1450
1451 DBG(fsg, "bulk-in set wedge\n");
1452 rc = usb_ep_set_wedge(fsg->bulk_in);
1453 if (rc == -EAGAIN)
1454 VDBG(fsg, "delayed bulk-in endpoint wedge\n");
1455 while (rc != 0) {
1456 if (rc != -EAGAIN) {
1457 WARNING(fsg, "usb_ep_set_wedge -> %d\n", rc);
1458 rc = 0;
1459 break;
1460 }
1461
1462
1463 if (msleep_interruptible(100) != 0)
1464 return -EINTR;
1465 rc = usb_ep_set_wedge(fsg->bulk_in);
1466 }
1467 return rc;
1468}
1469
1470static int throw_away_data(struct fsg_common *common)
1471{
1472 struct fsg_buffhd *bh;
1473 u32 amount;
1474 int rc;
1475
1476 for (bh = common->next_buffhd_to_drain;
1477 bh->state != BUF_STATE_EMPTY || common->usb_amount_left > 0;
1478 bh = common->next_buffhd_to_drain) {
1479
1480
1481 if (bh->state == BUF_STATE_FULL) {
1482 smp_rmb();
1483 bh->state = BUF_STATE_EMPTY;
1484 common->next_buffhd_to_drain = bh->next;
1485
1486
1487 if (bh->outreq->actual < bh->bulk_out_intended_length ||
1488 bh->outreq->status != 0) {
1489 raise_exception(common,
1490 FSG_STATE_ABORT_BULK_OUT);
1491 return -EINTR;
1492 }
1493 continue;
1494 }
1495
1496
1497 bh = common->next_buffhd_to_fill;
1498 if (bh->state == BUF_STATE_EMPTY
1499 && common->usb_amount_left > 0) {
1500 amount = min(common->usb_amount_left, FSG_BUFLEN);
1501
1502
1503
1504
1505
1506
1507 set_bulk_out_req_length(common, bh, amount);
1508 if (!start_out_transfer(common, bh))
1509
1510 return -EIO;
1511 common->next_buffhd_to_fill = bh->next;
1512 common->usb_amount_left -= amount;
1513 continue;
1514 }
1515
1516
1517 rc = sleep_thread(common, true);
1518 if (rc)
1519 return rc;
1520 }
1521 return 0;
1522}
1523
1524static int finish_reply(struct fsg_common *common)
1525{
1526 struct fsg_buffhd *bh = common->next_buffhd_to_fill;
1527 int rc = 0;
1528
1529 switch (common->data_dir) {
1530 case DATA_DIR_NONE:
1531 break;
1532
1533
1534
1535
1536
1537
1538
1539 case DATA_DIR_UNKNOWN:
1540 if (!common->can_stall) {
1541
1542 } else if (fsg_is_set(common)) {
1543 fsg_set_halt(common->fsg, common->fsg->bulk_out);
1544 rc = halt_bulk_in_endpoint(common->fsg);
1545 } else {
1546
1547 rc = -EIO;
1548 }
1549 break;
1550
1551
1552 case DATA_DIR_TO_HOST:
1553 if (common->data_size == 0) {
1554
1555
1556
1557 } else if (!fsg_is_set(common)) {
1558 rc = -EIO;
1559
1560
1561 } else if (common->residue == 0) {
1562 bh->inreq->zero = 0;
1563 if (!start_in_transfer(common, bh))
1564 return -EIO;
1565 common->next_buffhd_to_fill = bh->next;
1566
1567
1568
1569
1570
1571
1572
1573
1574 } else {
1575 bh->inreq->zero = 1;
1576 if (!start_in_transfer(common, bh))
1577 rc = -EIO;
1578 common->next_buffhd_to_fill = bh->next;
1579 if (common->can_stall)
1580 rc = halt_bulk_in_endpoint(common->fsg);
1581 }
1582 break;
1583
1584
1585
1586
1587
1588 case DATA_DIR_FROM_HOST:
1589 if (common->residue == 0) {
1590
1591
1592
1593 } else if (common->short_packet_received) {
1594 raise_exception(common, FSG_STATE_ABORT_BULK_OUT);
1595 rc = -EINTR;
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605#if 0
1606 } else if (common->can_stall) {
1607 if (fsg_is_set(common))
1608 fsg_set_halt(common->fsg,
1609 common->fsg->bulk_out);
1610 raise_exception(common, FSG_STATE_ABORT_BULK_OUT);
1611 rc = -EINTR;
1612#endif
1613
1614
1615
1616
1617
1618 } else {
1619 rc = throw_away_data(common);
1620 }
1621 break;
1622 }
1623 return rc;
1624}
1625
1626static int send_status(struct fsg_common *common)
1627{
1628 struct fsg_lun *curlun = common->curlun;
1629 struct fsg_buffhd *bh;
1630 struct bulk_cs_wrap *csw;
1631 int rc;
1632 u8 status = US_BULK_STAT_OK;
1633 u32 sd, sdinfo = 0;
1634
1635
1636 bh = common->next_buffhd_to_fill;
1637 while (bh->state != BUF_STATE_EMPTY) {
1638 rc = sleep_thread(common, true);
1639 if (rc)
1640 return rc;
1641 }
1642
1643 if (curlun) {
1644 sd = curlun->sense_data;
1645 sdinfo = curlun->sense_data_info;
1646 } else if (common->bad_lun_okay)
1647 sd = SS_NO_SENSE;
1648 else
1649 sd = SS_LOGICAL_UNIT_NOT_SUPPORTED;
1650
1651 if (common->phase_error) {
1652 DBG(common, "sending phase-error status\n");
1653 status = US_BULK_STAT_PHASE;
1654 sd = SS_INVALID_COMMAND;
1655 } else if (sd != SS_NO_SENSE) {
1656 DBG(common, "sending command-failure status\n");
1657 status = US_BULK_STAT_FAIL;
1658 VDBG(common, " sense data: SK x%02x, ASC x%02x, ASCQ x%02x;"
1659 " info x%x\n",
1660 SK(sd), ASC(sd), ASCQ(sd), sdinfo);
1661 }
1662
1663
1664 csw = (void *)bh->buf;
1665
1666 csw->Signature = cpu_to_le32(US_BULK_CS_SIGN);
1667 csw->Tag = common->tag;
1668 csw->Residue = cpu_to_le32(common->residue);
1669 csw->Status = status;
1670
1671 bh->inreq->length = US_BULK_CS_WRAP_LEN;
1672 bh->inreq->zero = 0;
1673 if (!start_in_transfer(common, bh))
1674
1675 return -EIO;
1676
1677 common->next_buffhd_to_fill = bh->next;
1678 return 0;
1679}
1680
1681
1682
1683
1684
1685
1686
1687
1688static int check_command(struct fsg_common *common, int cmnd_size,
1689 enum data_direction data_dir, unsigned int mask,
1690 int needs_medium, const char *name)
1691{
1692 int i;
1693 unsigned int lun = common->cmnd[1] >> 5;
1694 static const char dirletter[4] = {'u', 'o', 'i', 'n'};
1695 char hdlen[20];
1696 struct fsg_lun *curlun;
1697
1698 hdlen[0] = 0;
1699 if (common->data_dir != DATA_DIR_UNKNOWN)
1700 sprintf(hdlen, ", H%c=%u", dirletter[(int) common->data_dir],
1701 common->data_size);
1702 VDBG(common, "SCSI command: %s; Dc=%d, D%c=%u; Hc=%d%s\n",
1703 name, cmnd_size, dirletter[(int) data_dir],
1704 common->data_size_from_cmnd, common->cmnd_size, hdlen);
1705
1706
1707
1708
1709
1710 if (common->data_size_from_cmnd == 0)
1711 data_dir = DATA_DIR_NONE;
1712 if (common->data_size < common->data_size_from_cmnd) {
1713
1714
1715
1716
1717
1718 common->data_size_from_cmnd = common->data_size;
1719 common->phase_error = 1;
1720 }
1721 common->residue = common->data_size;
1722 common->usb_amount_left = common->data_size;
1723
1724
1725 if (common->data_dir != data_dir && common->data_size_from_cmnd > 0) {
1726 common->phase_error = 1;
1727 return -EINVAL;
1728 }
1729
1730
1731 if (cmnd_size != common->cmnd_size) {
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746 if (cmnd_size <= common->cmnd_size) {
1747 DBG(common, "%s is buggy! Expected length %d "
1748 "but we got %d\n", name,
1749 cmnd_size, common->cmnd_size);
1750 cmnd_size = common->cmnd_size;
1751 } else {
1752 common->phase_error = 1;
1753 return -EINVAL;
1754 }
1755 }
1756
1757
1758 if (common->lun != lun)
1759 DBG(common, "using LUN %u from CBW, not LUN %u from CDB\n",
1760 common->lun, lun);
1761
1762
1763 curlun = common->curlun;
1764 if (curlun) {
1765 if (common->cmnd[0] != REQUEST_SENSE) {
1766 curlun->sense_data = SS_NO_SENSE;
1767 curlun->sense_data_info = 0;
1768 curlun->info_valid = 0;
1769 }
1770 } else {
1771 common->bad_lun_okay = 0;
1772
1773
1774
1775
1776
1777 if (common->cmnd[0] != INQUIRY &&
1778 common->cmnd[0] != REQUEST_SENSE) {
1779 DBG(common, "unsupported LUN %u\n", common->lun);
1780 return -EINVAL;
1781 }
1782 }
1783
1784
1785
1786
1787
1788 if (curlun && curlun->unit_attention_data != SS_NO_SENSE &&
1789 common->cmnd[0] != INQUIRY &&
1790 common->cmnd[0] != REQUEST_SENSE) {
1791 curlun->sense_data = curlun->unit_attention_data;
1792 curlun->unit_attention_data = SS_NO_SENSE;
1793 return -EINVAL;
1794 }
1795
1796
1797 common->cmnd[1] &= 0x1f;
1798 for (i = 1; i < cmnd_size; ++i) {
1799 if (common->cmnd[i] && !(mask & (1 << i))) {
1800 if (curlun)
1801 curlun->sense_data = SS_INVALID_FIELD_IN_CDB;
1802 return -EINVAL;
1803 }
1804 }
1805
1806
1807
1808 if (curlun && !fsg_lun_is_open(curlun) && needs_medium) {
1809 curlun->sense_data = SS_MEDIUM_NOT_PRESENT;
1810 return -EINVAL;
1811 }
1812
1813 return 0;
1814}
1815
1816
1817static int check_command_size_in_blocks(struct fsg_common *common,
1818 int cmnd_size, enum data_direction data_dir,
1819 unsigned int mask, int needs_medium, const char *name)
1820{
1821 if (common->curlun)
1822 common->data_size_from_cmnd <<= common->curlun->blkbits;
1823 return check_command(common, cmnd_size, data_dir,
1824 mask, needs_medium, name);
1825}
1826
1827static int do_scsi_command(struct fsg_common *common)
1828{
1829 struct fsg_buffhd *bh;
1830 int rc;
1831 int reply = -EINVAL;
1832 int i;
1833 static char unknown[16];
1834
1835 dump_cdb(common);
1836
1837
1838 bh = common->next_buffhd_to_fill;
1839 common->next_buffhd_to_drain = bh;
1840 while (bh->state != BUF_STATE_EMPTY) {
1841 rc = sleep_thread(common, true);
1842 if (rc)
1843 return rc;
1844 }
1845 common->phase_error = 0;
1846 common->short_packet_received = 0;
1847
1848 down_read(&common->filesem);
1849 switch (common->cmnd[0]) {
1850
1851 case INQUIRY:
1852 common->data_size_from_cmnd = common->cmnd[4];
1853 reply = check_command(common, 6, DATA_DIR_TO_HOST,
1854 (1<<4), 0,
1855 "INQUIRY");
1856 if (reply == 0)
1857 reply = do_inquiry(common, bh);
1858 break;
1859
1860 case MODE_SELECT:
1861 common->data_size_from_cmnd = common->cmnd[4];
1862 reply = check_command(common, 6, DATA_DIR_FROM_HOST,
1863 (1<<1) | (1<<4), 0,
1864 "MODE SELECT(6)");
1865 if (reply == 0)
1866 reply = do_mode_select(common, bh);
1867 break;
1868
1869 case MODE_SELECT_10:
1870 common->data_size_from_cmnd =
1871 get_unaligned_be16(&common->cmnd[7]);
1872 reply = check_command(common, 10, DATA_DIR_FROM_HOST,
1873 (1<<1) | (3<<7), 0,
1874 "MODE SELECT(10)");
1875 if (reply == 0)
1876 reply = do_mode_select(common, bh);
1877 break;
1878
1879 case MODE_SENSE:
1880 common->data_size_from_cmnd = common->cmnd[4];
1881 reply = check_command(common, 6, DATA_DIR_TO_HOST,
1882 (1<<1) | (1<<2) | (1<<4), 0,
1883 "MODE SENSE(6)");
1884 if (reply == 0)
1885 reply = do_mode_sense(common, bh);
1886 break;
1887
1888 case MODE_SENSE_10:
1889 common->data_size_from_cmnd =
1890 get_unaligned_be16(&common->cmnd[7]);
1891 reply = check_command(common, 10, DATA_DIR_TO_HOST,
1892 (1<<1) | (1<<2) | (3<<7), 0,
1893 "MODE SENSE(10)");
1894 if (reply == 0)
1895 reply = do_mode_sense(common, bh);
1896 break;
1897
1898 case ALLOW_MEDIUM_REMOVAL:
1899 common->data_size_from_cmnd = 0;
1900 reply = check_command(common, 6, DATA_DIR_NONE,
1901 (1<<4), 0,
1902 "PREVENT-ALLOW MEDIUM REMOVAL");
1903 if (reply == 0)
1904 reply = do_prevent_allow(common);
1905 break;
1906
1907 case READ_6:
1908 i = common->cmnd[4];
1909 common->data_size_from_cmnd = (i == 0) ? 256 : i;
1910 reply = check_command_size_in_blocks(common, 6,
1911 DATA_DIR_TO_HOST,
1912 (7<<1) | (1<<4), 1,
1913 "READ(6)");
1914 if (reply == 0)
1915 reply = do_read(common);
1916 break;
1917
1918 case READ_10:
1919 common->data_size_from_cmnd =
1920 get_unaligned_be16(&common->cmnd[7]);
1921 reply = check_command_size_in_blocks(common, 10,
1922 DATA_DIR_TO_HOST,
1923 (1<<1) | (0xf<<2) | (3<<7), 1,
1924 "READ(10)");
1925 if (reply == 0)
1926 reply = do_read(common);
1927 break;
1928
1929 case READ_12:
1930 common->data_size_from_cmnd =
1931 get_unaligned_be32(&common->cmnd[6]);
1932 reply = check_command_size_in_blocks(common, 12,
1933 DATA_DIR_TO_HOST,
1934 (1<<1) | (0xf<<2) | (0xf<<6), 1,
1935 "READ(12)");
1936 if (reply == 0)
1937 reply = do_read(common);
1938 break;
1939
1940 case READ_CAPACITY:
1941 common->data_size_from_cmnd = 8;
1942 reply = check_command(common, 10, DATA_DIR_TO_HOST,
1943 (0xf<<2) | (1<<8), 1,
1944 "READ CAPACITY");
1945 if (reply == 0)
1946 reply = do_read_capacity(common, bh);
1947 break;
1948
1949 case READ_HEADER:
1950 if (!common->curlun || !common->curlun->cdrom)
1951 goto unknown_cmnd;
1952 common->data_size_from_cmnd =
1953 get_unaligned_be16(&common->cmnd[7]);
1954 reply = check_command(common, 10, DATA_DIR_TO_HOST,
1955 (3<<7) | (0x1f<<1), 1,
1956 "READ HEADER");
1957 if (reply == 0)
1958 reply = do_read_header(common, bh);
1959 break;
1960
1961 case READ_TOC:
1962 if (!common->curlun || !common->curlun->cdrom)
1963 goto unknown_cmnd;
1964 common->data_size_from_cmnd =
1965 get_unaligned_be16(&common->cmnd[7]);
1966 reply = check_command(common, 10, DATA_DIR_TO_HOST,
1967 (7<<6) | (1<<1), 1,
1968 "READ TOC");
1969 if (reply == 0)
1970 reply = do_read_toc(common, bh);
1971 break;
1972
1973 case READ_FORMAT_CAPACITIES:
1974 common->data_size_from_cmnd =
1975 get_unaligned_be16(&common->cmnd[7]);
1976 reply = check_command(common, 10, DATA_DIR_TO_HOST,
1977 (3<<7), 1,
1978 "READ FORMAT CAPACITIES");
1979 if (reply == 0)
1980 reply = do_read_format_capacities(common, bh);
1981 break;
1982
1983 case REQUEST_SENSE:
1984 common->data_size_from_cmnd = common->cmnd[4];
1985 reply = check_command(common, 6, DATA_DIR_TO_HOST,
1986 (1<<4), 0,
1987 "REQUEST SENSE");
1988 if (reply == 0)
1989 reply = do_request_sense(common, bh);
1990 break;
1991
1992 case START_STOP:
1993 common->data_size_from_cmnd = 0;
1994 reply = check_command(common, 6, DATA_DIR_NONE,
1995 (1<<1) | (1<<4), 0,
1996 "START-STOP UNIT");
1997 if (reply == 0)
1998 reply = do_start_stop(common);
1999 break;
2000
2001 case SYNCHRONIZE_CACHE:
2002 common->data_size_from_cmnd = 0;
2003 reply = check_command(common, 10, DATA_DIR_NONE,
2004 (0xf<<2) | (3<<7), 1,
2005 "SYNCHRONIZE CACHE");
2006 if (reply == 0)
2007 reply = do_synchronize_cache(common);
2008 break;
2009
2010 case TEST_UNIT_READY:
2011 common->data_size_from_cmnd = 0;
2012 reply = check_command(common, 6, DATA_DIR_NONE,
2013 0, 1,
2014 "TEST UNIT READY");
2015 break;
2016
2017
2018
2019
2020
2021 case VERIFY:
2022 common->data_size_from_cmnd = 0;
2023 reply = check_command(common, 10, DATA_DIR_NONE,
2024 (1<<1) | (0xf<<2) | (3<<7), 1,
2025 "VERIFY");
2026 if (reply == 0)
2027 reply = do_verify(common);
2028 break;
2029
2030 case WRITE_6:
2031 i = common->cmnd[4];
2032 common->data_size_from_cmnd = (i == 0) ? 256 : i;
2033 reply = check_command_size_in_blocks(common, 6,
2034 DATA_DIR_FROM_HOST,
2035 (7<<1) | (1<<4), 1,
2036 "WRITE(6)");
2037 if (reply == 0)
2038 reply = do_write(common);
2039 break;
2040
2041 case WRITE_10:
2042 common->data_size_from_cmnd =
2043 get_unaligned_be16(&common->cmnd[7]);
2044 reply = check_command_size_in_blocks(common, 10,
2045 DATA_DIR_FROM_HOST,
2046 (1<<1) | (0xf<<2) | (3<<7), 1,
2047 "WRITE(10)");
2048 if (reply == 0)
2049 reply = do_write(common);
2050 break;
2051
2052 case WRITE_12:
2053 common->data_size_from_cmnd =
2054 get_unaligned_be32(&common->cmnd[6]);
2055 reply = check_command_size_in_blocks(common, 12,
2056 DATA_DIR_FROM_HOST,
2057 (1<<1) | (0xf<<2) | (0xf<<6), 1,
2058 "WRITE(12)");
2059 if (reply == 0)
2060 reply = do_write(common);
2061 break;
2062
2063
2064
2065
2066
2067
2068
2069 case FORMAT_UNIT:
2070 case RELEASE:
2071 case RESERVE:
2072 case SEND_DIAGNOSTIC:
2073
2074
2075 default:
2076unknown_cmnd:
2077 common->data_size_from_cmnd = 0;
2078 sprintf(unknown, "Unknown x%02x", common->cmnd[0]);
2079 reply = check_command(common, common->cmnd_size,
2080 DATA_DIR_UNKNOWN, ~0, 0, unknown);
2081 if (reply == 0) {
2082 common->curlun->sense_data = SS_INVALID_COMMAND;
2083 reply = -EINVAL;
2084 }
2085 break;
2086 }
2087 up_read(&common->filesem);
2088
2089 if (reply == -EINTR || signal_pending(current))
2090 return -EINTR;
2091
2092
2093 if (reply == -EINVAL)
2094 reply = 0;
2095 if (reply >= 0 && common->data_dir == DATA_DIR_TO_HOST) {
2096 reply = min((u32)reply, common->data_size_from_cmnd);
2097 bh->inreq->length = reply;
2098 bh->state = BUF_STATE_FULL;
2099 common->residue -= reply;
2100 }
2101
2102 return 0;
2103}
2104
2105
2106
2107
2108static int received_cbw(struct fsg_dev *fsg, struct fsg_buffhd *bh)
2109{
2110 struct usb_request *req = bh->outreq;
2111 struct bulk_cb_wrap *cbw = req->buf;
2112 struct fsg_common *common = fsg->common;
2113
2114
2115 if (req->status || test_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags))
2116 return -EINVAL;
2117
2118
2119 if (req->actual != US_BULK_CB_WRAP_LEN ||
2120 cbw->Signature != cpu_to_le32(
2121 US_BULK_CB_SIGN)) {
2122 DBG(fsg, "invalid CBW: len %u sig 0x%x\n",
2123 req->actual,
2124 le32_to_cpu(cbw->Signature));
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137 wedge_bulk_in_endpoint(fsg);
2138 set_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags);
2139 return -EINVAL;
2140 }
2141
2142
2143 if (cbw->Lun >= ARRAY_SIZE(common->luns) ||
2144 cbw->Flags & ~US_BULK_FLAG_IN || cbw->Length <= 0 ||
2145 cbw->Length > MAX_COMMAND_SIZE) {
2146 DBG(fsg, "non-meaningful CBW: lun = %u, flags = 0x%x, "
2147 "cmdlen %u\n",
2148 cbw->Lun, cbw->Flags, cbw->Length);
2149
2150
2151
2152
2153
2154 if (common->can_stall) {
2155 fsg_set_halt(fsg, fsg->bulk_out);
2156 halt_bulk_in_endpoint(fsg);
2157 }
2158 return -EINVAL;
2159 }
2160
2161
2162 common->cmnd_size = cbw->Length;
2163 memcpy(common->cmnd, cbw->CDB, common->cmnd_size);
2164 if (cbw->Flags & US_BULK_FLAG_IN)
2165 common->data_dir = DATA_DIR_TO_HOST;
2166 else
2167 common->data_dir = DATA_DIR_FROM_HOST;
2168 common->data_size = le32_to_cpu(cbw->DataTransferLength);
2169 if (common->data_size == 0)
2170 common->data_dir = DATA_DIR_NONE;
2171 common->lun = cbw->Lun;
2172 if (common->lun < ARRAY_SIZE(common->luns))
2173 common->curlun = common->luns[common->lun];
2174 else
2175 common->curlun = NULL;
2176 common->tag = cbw->Tag;
2177 return 0;
2178}
2179
2180static int get_next_command(struct fsg_common *common)
2181{
2182 struct fsg_buffhd *bh;
2183 int rc = 0;
2184
2185
2186 bh = common->next_buffhd_to_fill;
2187 while (bh->state != BUF_STATE_EMPTY) {
2188 rc = sleep_thread(common, true);
2189 if (rc)
2190 return rc;
2191 }
2192
2193
2194 set_bulk_out_req_length(common, bh, US_BULK_CB_WRAP_LEN);
2195 if (!start_out_transfer(common, bh))
2196
2197 return -EIO;
2198
2199
2200
2201
2202
2203
2204
2205
2206 while (bh->state != BUF_STATE_FULL) {
2207 rc = sleep_thread(common, true);
2208 if (rc)
2209 return rc;
2210 }
2211 smp_rmb();
2212 rc = fsg_is_set(common) ? received_cbw(common->fsg, bh) : -EIO;
2213 bh->state = BUF_STATE_EMPTY;
2214
2215 return rc;
2216}
2217
2218
2219
2220
2221static int alloc_request(struct fsg_common *common, struct usb_ep *ep,
2222 struct usb_request **preq)
2223{
2224 *preq = usb_ep_alloc_request(ep, GFP_ATOMIC);
2225 if (*preq)
2226 return 0;
2227 ERROR(common, "can't allocate request for %s\n", ep->name);
2228 return -ENOMEM;
2229}
2230
2231
2232static int do_set_interface(struct fsg_common *common, struct fsg_dev *new_fsg)
2233{
2234 struct fsg_dev *fsg;
2235 int i, rc = 0;
2236
2237 if (common->running)
2238 DBG(common, "reset interface\n");
2239
2240reset:
2241
2242 if (common->fsg) {
2243 fsg = common->fsg;
2244
2245 for (i = 0; i < common->fsg_num_buffers; ++i) {
2246 struct fsg_buffhd *bh = &common->buffhds[i];
2247
2248 if (bh->inreq) {
2249 usb_ep_free_request(fsg->bulk_in, bh->inreq);
2250 bh->inreq = NULL;
2251 }
2252 if (bh->outreq) {
2253 usb_ep_free_request(fsg->bulk_out, bh->outreq);
2254 bh->outreq = NULL;
2255 }
2256 }
2257
2258
2259 if (fsg->bulk_in_enabled) {
2260 usb_ep_disable(fsg->bulk_in);
2261 fsg->bulk_in_enabled = 0;
2262 }
2263 if (fsg->bulk_out_enabled) {
2264 usb_ep_disable(fsg->bulk_out);
2265 fsg->bulk_out_enabled = 0;
2266 }
2267
2268 common->fsg = NULL;
2269 wake_up(&common->fsg_wait);
2270 }
2271
2272 common->running = 0;
2273 if (!new_fsg || rc)
2274 return rc;
2275
2276 common->fsg = new_fsg;
2277 fsg = common->fsg;
2278
2279
2280 rc = config_ep_by_speed(common->gadget, &(fsg->function), fsg->bulk_in);
2281 if (rc)
2282 goto reset;
2283 rc = usb_ep_enable(fsg->bulk_in);
2284 if (rc)
2285 goto reset;
2286 fsg->bulk_in->driver_data = common;
2287 fsg->bulk_in_enabled = 1;
2288
2289 rc = config_ep_by_speed(common->gadget, &(fsg->function),
2290 fsg->bulk_out);
2291 if (rc)
2292 goto reset;
2293 rc = usb_ep_enable(fsg->bulk_out);
2294 if (rc)
2295 goto reset;
2296 fsg->bulk_out->driver_data = common;
2297 fsg->bulk_out_enabled = 1;
2298 common->bulk_out_maxpacket = usb_endpoint_maxp(fsg->bulk_out->desc);
2299 clear_bit(IGNORE_BULK_OUT, &fsg->atomic_bitflags);
2300
2301
2302 for (i = 0; i < common->fsg_num_buffers; ++i) {
2303 struct fsg_buffhd *bh = &common->buffhds[i];
2304
2305 rc = alloc_request(common, fsg->bulk_in, &bh->inreq);
2306 if (rc)
2307 goto reset;
2308 rc = alloc_request(common, fsg->bulk_out, &bh->outreq);
2309 if (rc)
2310 goto reset;
2311 bh->inreq->buf = bh->outreq->buf = bh->buf;
2312 bh->inreq->context = bh->outreq->context = bh;
2313 bh->inreq->complete = bulk_in_complete;
2314 bh->outreq->complete = bulk_out_complete;
2315 }
2316
2317 common->running = 1;
2318 for (i = 0; i < ARRAY_SIZE(common->luns); ++i)
2319 if (common->luns[i])
2320 common->luns[i]->unit_attention_data =
2321 SS_RESET_OCCURRED;
2322 return rc;
2323}
2324
2325
2326
2327
2328static int fsg_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
2329{
2330 struct fsg_dev *fsg = fsg_from_func(f);
2331 fsg->common->new_fsg = fsg;
2332 raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);
2333 return USB_GADGET_DELAYED_STATUS;
2334}
2335
2336static void fsg_disable(struct usb_function *f)
2337{
2338 struct fsg_dev *fsg = fsg_from_func(f);
2339 fsg->common->new_fsg = NULL;
2340 raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);
2341}
2342
2343
2344
2345
2346static void handle_exception(struct fsg_common *common)
2347{
2348 int i;
2349 struct fsg_buffhd *bh;
2350 enum fsg_state old_state;
2351 struct fsg_lun *curlun;
2352 unsigned int exception_req_tag;
2353
2354
2355
2356
2357
2358 for (;;) {
2359 int sig = kernel_dequeue_signal(NULL);
2360 if (!sig)
2361 break;
2362 if (sig != SIGUSR1) {
2363 if (common->state < FSG_STATE_EXIT)
2364 DBG(common, "Main thread exiting on signal\n");
2365 raise_exception(common, FSG_STATE_EXIT);
2366 }
2367 }
2368
2369
2370 if (likely(common->fsg)) {
2371 for (i = 0; i < common->fsg_num_buffers; ++i) {
2372 bh = &common->buffhds[i];
2373 if (bh->inreq_busy)
2374 usb_ep_dequeue(common->fsg->bulk_in, bh->inreq);
2375 if (bh->outreq_busy)
2376 usb_ep_dequeue(common->fsg->bulk_out,
2377 bh->outreq);
2378 }
2379
2380
2381 for (;;) {
2382 int num_active = 0;
2383 for (i = 0; i < common->fsg_num_buffers; ++i) {
2384 bh = &common->buffhds[i];
2385 num_active += bh->inreq_busy + bh->outreq_busy;
2386 }
2387 if (num_active == 0)
2388 break;
2389 if (sleep_thread(common, true))
2390 return;
2391 }
2392
2393
2394 if (common->fsg->bulk_in_enabled)
2395 usb_ep_fifo_flush(common->fsg->bulk_in);
2396 if (common->fsg->bulk_out_enabled)
2397 usb_ep_fifo_flush(common->fsg->bulk_out);
2398 }
2399
2400
2401
2402
2403
2404 spin_lock_irq(&common->lock);
2405
2406 for (i = 0; i < common->fsg_num_buffers; ++i) {
2407 bh = &common->buffhds[i];
2408 bh->state = BUF_STATE_EMPTY;
2409 }
2410 common->next_buffhd_to_fill = &common->buffhds[0];
2411 common->next_buffhd_to_drain = &common->buffhds[0];
2412 exception_req_tag = common->exception_req_tag;
2413 old_state = common->state;
2414
2415 if (old_state == FSG_STATE_ABORT_BULK_OUT)
2416 common->state = FSG_STATE_STATUS_PHASE;
2417 else {
2418 for (i = 0; i < ARRAY_SIZE(common->luns); ++i) {
2419 curlun = common->luns[i];
2420 if (!curlun)
2421 continue;
2422 curlun->prevent_medium_removal = 0;
2423 curlun->sense_data = SS_NO_SENSE;
2424 curlun->unit_attention_data = SS_NO_SENSE;
2425 curlun->sense_data_info = 0;
2426 curlun->info_valid = 0;
2427 }
2428 common->state = FSG_STATE_IDLE;
2429 }
2430 spin_unlock_irq(&common->lock);
2431
2432
2433 switch (old_state) {
2434 case FSG_STATE_ABORT_BULK_OUT:
2435 send_status(common);
2436 spin_lock_irq(&common->lock);
2437 if (common->state == FSG_STATE_STATUS_PHASE)
2438 common->state = FSG_STATE_IDLE;
2439 spin_unlock_irq(&common->lock);
2440 break;
2441
2442 case FSG_STATE_RESET:
2443
2444
2445
2446
2447
2448 if (!fsg_is_set(common))
2449 break;
2450 if (test_and_clear_bit(IGNORE_BULK_OUT,
2451 &common->fsg->atomic_bitflags))
2452 usb_ep_clear_halt(common->fsg->bulk_in);
2453
2454 if (common->ep0_req_tag == exception_req_tag)
2455 ep0_queue(common);
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466 break;
2467
2468 case FSG_STATE_CONFIG_CHANGE:
2469 do_set_interface(common, common->new_fsg);
2470 if (common->new_fsg)
2471 usb_composite_setup_continue(common->cdev);
2472 break;
2473
2474 case FSG_STATE_EXIT:
2475 case FSG_STATE_TERMINATED:
2476 do_set_interface(common, NULL);
2477 spin_lock_irq(&common->lock);
2478 common->state = FSG_STATE_TERMINATED;
2479 spin_unlock_irq(&common->lock);
2480 break;
2481
2482 case FSG_STATE_INTERFACE_CHANGE:
2483 case FSG_STATE_DISCONNECT:
2484 case FSG_STATE_COMMAND_PHASE:
2485 case FSG_STATE_DATA_PHASE:
2486 case FSG_STATE_STATUS_PHASE:
2487 case FSG_STATE_IDLE:
2488 break;
2489 }
2490}
2491
2492
2493
2494
2495static int fsg_main_thread(void *common_)
2496{
2497 struct fsg_common *common = common_;
2498
2499
2500
2501
2502
2503 allow_signal(SIGINT);
2504 allow_signal(SIGTERM);
2505 allow_signal(SIGKILL);
2506 allow_signal(SIGUSR1);
2507
2508
2509 set_freezable();
2510
2511
2512
2513
2514
2515
2516 set_fs(get_ds());
2517
2518
2519 while (common->state != FSG_STATE_TERMINATED) {
2520 if (exception_in_progress(common) || signal_pending(current)) {
2521 handle_exception(common);
2522 continue;
2523 }
2524
2525 if (!common->running) {
2526 sleep_thread(common, true);
2527 continue;
2528 }
2529
2530 if (get_next_command(common))
2531 continue;
2532
2533 spin_lock_irq(&common->lock);
2534 if (!exception_in_progress(common))
2535 common->state = FSG_STATE_DATA_PHASE;
2536 spin_unlock_irq(&common->lock);
2537
2538 if (do_scsi_command(common) || finish_reply(common))
2539 continue;
2540
2541 spin_lock_irq(&common->lock);
2542 if (!exception_in_progress(common))
2543 common->state = FSG_STATE_STATUS_PHASE;
2544 spin_unlock_irq(&common->lock);
2545
2546 if (send_status(common))
2547 continue;
2548
2549 spin_lock_irq(&common->lock);
2550 if (!exception_in_progress(common))
2551 common->state = FSG_STATE_IDLE;
2552 spin_unlock_irq(&common->lock);
2553 }
2554
2555 spin_lock_irq(&common->lock);
2556 common->thread_task = NULL;
2557 spin_unlock_irq(&common->lock);
2558
2559 if (!common->ops || !common->ops->thread_exits
2560 || common->ops->thread_exits(common) < 0) {
2561 int i;
2562
2563 down_write(&common->filesem);
2564 for (i = 0; i < ARRAY_SIZE(common->luns); --i) {
2565 struct fsg_lun *curlun = common->luns[i];
2566 if (!curlun || !fsg_lun_is_open(curlun))
2567 continue;
2568
2569 fsg_lun_close(curlun);
2570 curlun->unit_attention_data = SS_MEDIUM_NOT_PRESENT;
2571 }
2572 up_write(&common->filesem);
2573 }
2574
2575
2576 complete_and_exit(&common->thread_notifier, 0);
2577}
2578
2579
2580
2581
2582static ssize_t ro_show(struct device *dev, struct device_attribute *attr, char *buf)
2583{
2584 struct fsg_lun *curlun = fsg_lun_from_dev(dev);
2585
2586 return fsg_show_ro(curlun, buf);
2587}
2588
2589static ssize_t nofua_show(struct device *dev, struct device_attribute *attr,
2590 char *buf)
2591{
2592 struct fsg_lun *curlun = fsg_lun_from_dev(dev);
2593
2594 return fsg_show_nofua(curlun, buf);
2595}
2596
2597static ssize_t file_show(struct device *dev, struct device_attribute *attr,
2598 char *buf)
2599{
2600 struct fsg_lun *curlun = fsg_lun_from_dev(dev);
2601 struct rw_semaphore *filesem = dev_get_drvdata(dev);
2602
2603 return fsg_show_file(curlun, filesem, buf);
2604}
2605
2606static ssize_t ro_store(struct device *dev, struct device_attribute *attr,
2607 const char *buf, size_t count)
2608{
2609 struct fsg_lun *curlun = fsg_lun_from_dev(dev);
2610 struct rw_semaphore *filesem = dev_get_drvdata(dev);
2611
2612 return fsg_store_ro(curlun, filesem, buf, count);
2613}
2614
2615static ssize_t nofua_store(struct device *dev, struct device_attribute *attr,
2616 const char *buf, size_t count)
2617{
2618 struct fsg_lun *curlun = fsg_lun_from_dev(dev);
2619
2620 return fsg_store_nofua(curlun, buf, count);
2621}
2622
2623static ssize_t file_store(struct device *dev, struct device_attribute *attr,
2624 const char *buf, size_t count)
2625{
2626 struct fsg_lun *curlun = fsg_lun_from_dev(dev);
2627 struct rw_semaphore *filesem = dev_get_drvdata(dev);
2628
2629 return fsg_store_file(curlun, filesem, buf, count);
2630}
2631
2632static DEVICE_ATTR_RW(nofua);
2633
2634static DEVICE_ATTR(ro, 0, ro_show, ro_store);
2635static DEVICE_ATTR(file, 0, file_show, file_store);
2636
2637
2638
2639static void fsg_common_release(struct kref *ref);
2640
2641static void fsg_lun_release(struct device *dev)
2642{
2643
2644}
2645
2646void fsg_common_get(struct fsg_common *common)
2647{
2648 kref_get(&common->ref);
2649}
2650EXPORT_SYMBOL_GPL(fsg_common_get);
2651
2652void fsg_common_put(struct fsg_common *common)
2653{
2654 kref_put(&common->ref, fsg_common_release);
2655}
2656EXPORT_SYMBOL_GPL(fsg_common_put);
2657
2658static struct fsg_common *fsg_common_setup(struct fsg_common *common)
2659{
2660 if (!common) {
2661 common = kzalloc(sizeof(*common), GFP_KERNEL);
2662 if (!common)
2663 return ERR_PTR(-ENOMEM);
2664 common->free_storage_on_release = 1;
2665 } else {
2666 common->free_storage_on_release = 0;
2667 }
2668 init_rwsem(&common->filesem);
2669 spin_lock_init(&common->lock);
2670 kref_init(&common->ref);
2671 init_completion(&common->thread_notifier);
2672 init_waitqueue_head(&common->fsg_wait);
2673 common->state = FSG_STATE_TERMINATED;
2674 memset(common->luns, 0, sizeof(common->luns));
2675
2676 return common;
2677}
2678
2679void fsg_common_set_sysfs(struct fsg_common *common, bool sysfs)
2680{
2681 common->sysfs = sysfs;
2682}
2683EXPORT_SYMBOL_GPL(fsg_common_set_sysfs);
2684
2685static void _fsg_common_free_buffers(struct fsg_buffhd *buffhds, unsigned n)
2686{
2687 if (buffhds) {
2688 struct fsg_buffhd *bh = buffhds;
2689 while (n--) {
2690 kfree(bh->buf);
2691 ++bh;
2692 }
2693 kfree(buffhds);
2694 }
2695}
2696
2697int fsg_common_set_num_buffers(struct fsg_common *common, unsigned int n)
2698{
2699 struct fsg_buffhd *bh, *buffhds;
2700 int i;
2701
2702 buffhds = kcalloc(n, sizeof(*buffhds), GFP_KERNEL);
2703 if (!buffhds)
2704 return -ENOMEM;
2705
2706
2707 bh = buffhds;
2708 i = n;
2709 goto buffhds_first_it;
2710 do {
2711 bh->next = bh + 1;
2712 ++bh;
2713buffhds_first_it:
2714 bh->buf = kmalloc(FSG_BUFLEN, GFP_KERNEL);
2715 if (unlikely(!bh->buf))
2716 goto error_release;
2717 } while (--i);
2718 bh->next = buffhds;
2719
2720 _fsg_common_free_buffers(common->buffhds, common->fsg_num_buffers);
2721 common->fsg_num_buffers = n;
2722 common->buffhds = buffhds;
2723
2724 return 0;
2725
2726error_release:
2727
2728
2729
2730
2731 _fsg_common_free_buffers(buffhds, n);
2732
2733 return -ENOMEM;
2734}
2735EXPORT_SYMBOL_GPL(fsg_common_set_num_buffers);
2736
2737void fsg_common_remove_lun(struct fsg_lun *lun)
2738{
2739 if (device_is_registered(&lun->dev))
2740 device_unregister(&lun->dev);
2741 fsg_lun_close(lun);
2742 kfree(lun);
2743}
2744EXPORT_SYMBOL_GPL(fsg_common_remove_lun);
2745
2746static void _fsg_common_remove_luns(struct fsg_common *common, int n)
2747{
2748 int i;
2749
2750 for (i = 0; i < n; ++i)
2751 if (common->luns[i]) {
2752 fsg_common_remove_lun(common->luns[i]);
2753 common->luns[i] = NULL;
2754 }
2755}
2756
2757void fsg_common_remove_luns(struct fsg_common *common)
2758{
2759 _fsg_common_remove_luns(common, ARRAY_SIZE(common->luns));
2760}
2761EXPORT_SYMBOL_GPL(fsg_common_remove_luns);
2762
2763void fsg_common_set_ops(struct fsg_common *common,
2764 const struct fsg_operations *ops)
2765{
2766 common->ops = ops;
2767}
2768EXPORT_SYMBOL_GPL(fsg_common_set_ops);
2769
2770void fsg_common_free_buffers(struct fsg_common *common)
2771{
2772 _fsg_common_free_buffers(common->buffhds, common->fsg_num_buffers);
2773 common->buffhds = NULL;
2774}
2775EXPORT_SYMBOL_GPL(fsg_common_free_buffers);
2776
2777int fsg_common_set_cdev(struct fsg_common *common,
2778 struct usb_composite_dev *cdev, bool can_stall)
2779{
2780 struct usb_string *us;
2781
2782 common->gadget = cdev->gadget;
2783 common->ep0 = cdev->gadget->ep0;
2784 common->ep0req = cdev->req;
2785 common->cdev = cdev;
2786
2787 us = usb_gstrings_attach(cdev, fsg_strings_array,
2788 ARRAY_SIZE(fsg_strings));
2789 if (IS_ERR(us))
2790 return PTR_ERR(us);
2791
2792 fsg_intf_desc.iInterface = us[FSG_STRING_INTERFACE].id;
2793
2794
2795
2796
2797
2798
2799 common->can_stall = can_stall &&
2800 gadget_is_stall_supported(common->gadget);
2801
2802 return 0;
2803}
2804EXPORT_SYMBOL_GPL(fsg_common_set_cdev);
2805
2806static struct attribute *fsg_lun_dev_attrs[] = {
2807 &dev_attr_ro.attr,
2808 &dev_attr_file.attr,
2809 &dev_attr_nofua.attr,
2810 NULL
2811};
2812
2813static umode_t fsg_lun_dev_is_visible(struct kobject *kobj,
2814 struct attribute *attr, int idx)
2815{
2816 struct device *dev = kobj_to_dev(kobj);
2817 struct fsg_lun *lun = fsg_lun_from_dev(dev);
2818
2819 if (attr == &dev_attr_ro.attr)
2820 return lun->cdrom ? S_IRUGO : (S_IWUSR | S_IRUGO);
2821 if (attr == &dev_attr_file.attr)
2822 return lun->removable ? (S_IWUSR | S_IRUGO) : S_IRUGO;
2823 return attr->mode;
2824}
2825
2826static const struct attribute_group fsg_lun_dev_group = {
2827 .attrs = fsg_lun_dev_attrs,
2828 .is_visible = fsg_lun_dev_is_visible,
2829};
2830
2831static const struct attribute_group *fsg_lun_dev_groups[] = {
2832 &fsg_lun_dev_group,
2833 NULL
2834};
2835
2836int fsg_common_create_lun(struct fsg_common *common, struct fsg_lun_config *cfg,
2837 unsigned int id, const char *name,
2838 const char **name_pfx)
2839{
2840 struct fsg_lun *lun;
2841 char *pathbuf, *p;
2842 int rc = -ENOMEM;
2843
2844 if (id >= ARRAY_SIZE(common->luns))
2845 return -ENODEV;
2846
2847 if (common->luns[id])
2848 return -EBUSY;
2849
2850 if (!cfg->filename && !cfg->removable) {
2851 pr_err("no file given for LUN%d\n", id);
2852 return -EINVAL;
2853 }
2854
2855 lun = kzalloc(sizeof(*lun), GFP_KERNEL);
2856 if (!lun)
2857 return -ENOMEM;
2858
2859 lun->name_pfx = name_pfx;
2860
2861 lun->cdrom = !!cfg->cdrom;
2862 lun->ro = cfg->cdrom || cfg->ro;
2863 lun->initially_ro = lun->ro;
2864 lun->removable = !!cfg->removable;
2865
2866 if (!common->sysfs) {
2867
2868 lun->name = name;
2869 } else {
2870 lun->dev.release = fsg_lun_release;
2871 lun->dev.parent = &common->gadget->dev;
2872 lun->dev.groups = fsg_lun_dev_groups;
2873 dev_set_drvdata(&lun->dev, &common->filesem);
2874 dev_set_name(&lun->dev, "%s", name);
2875 lun->name = dev_name(&lun->dev);
2876
2877 rc = device_register(&lun->dev);
2878 if (rc) {
2879 pr_info("failed to register LUN%d: %d\n", id, rc);
2880 put_device(&lun->dev);
2881 goto error_sysfs;
2882 }
2883 }
2884
2885 common->luns[id] = lun;
2886
2887 if (cfg->filename) {
2888 rc = fsg_lun_open(lun, cfg->filename);
2889 if (rc)
2890 goto error_lun;
2891 }
2892
2893 pathbuf = kmalloc(PATH_MAX, GFP_KERNEL);
2894 p = "(no medium)";
2895 if (fsg_lun_is_open(lun)) {
2896 p = "(error)";
2897 if (pathbuf) {
2898 p = file_path(lun->filp, pathbuf, PATH_MAX);
2899 if (IS_ERR(p))
2900 p = "(error)";
2901 }
2902 }
2903 pr_info("LUN: %s%s%sfile: %s\n",
2904 lun->removable ? "removable " : "",
2905 lun->ro ? "read only " : "",
2906 lun->cdrom ? "CD-ROM " : "",
2907 p);
2908 kfree(pathbuf);
2909
2910 return 0;
2911
2912error_lun:
2913 if (device_is_registered(&lun->dev))
2914 device_unregister(&lun->dev);
2915 fsg_lun_close(lun);
2916 common->luns[id] = NULL;
2917error_sysfs:
2918 kfree(lun);
2919 return rc;
2920}
2921EXPORT_SYMBOL_GPL(fsg_common_create_lun);
2922
2923int fsg_common_create_luns(struct fsg_common *common, struct fsg_config *cfg)
2924{
2925 char buf[8];
2926 int i, rc;
2927
2928 fsg_common_remove_luns(common);
2929
2930 for (i = 0; i < cfg->nluns; ++i) {
2931 snprintf(buf, sizeof(buf), "lun%d", i);
2932 rc = fsg_common_create_lun(common, &cfg->luns[i], i, buf, NULL);
2933 if (rc)
2934 goto fail;
2935 }
2936
2937 pr_info("Number of LUNs=%d\n", cfg->nluns);
2938
2939 return 0;
2940
2941fail:
2942 _fsg_common_remove_luns(common, i);
2943 return rc;
2944}
2945EXPORT_SYMBOL_GPL(fsg_common_create_luns);
2946
2947void fsg_common_set_inquiry_string(struct fsg_common *common, const char *vn,
2948 const char *pn)
2949{
2950 int i;
2951
2952
2953 i = get_default_bcdDevice();
2954 snprintf(common->inquiry_string, sizeof(common->inquiry_string),
2955 "%-8s%-16s%04x", vn ?: "Linux",
2956
2957 pn ?: ((*common->luns)->cdrom
2958 ? "File-CD Gadget"
2959 : "File-Stor Gadget"),
2960 i);
2961}
2962EXPORT_SYMBOL_GPL(fsg_common_set_inquiry_string);
2963
2964static void fsg_common_release(struct kref *ref)
2965{
2966 struct fsg_common *common = container_of(ref, struct fsg_common, ref);
2967 int i;
2968
2969
2970 if (common->state != FSG_STATE_TERMINATED) {
2971 raise_exception(common, FSG_STATE_EXIT);
2972 wait_for_completion(&common->thread_notifier);
2973 common->thread_task = NULL;
2974 }
2975
2976 for (i = 0; i < ARRAY_SIZE(common->luns); ++i) {
2977 struct fsg_lun *lun = common->luns[i];
2978 if (!lun)
2979 continue;
2980 fsg_lun_close(lun);
2981 if (device_is_registered(&lun->dev))
2982 device_unregister(&lun->dev);
2983 kfree(lun);
2984 }
2985
2986 _fsg_common_free_buffers(common->buffhds, common->fsg_num_buffers);
2987 if (common->free_storage_on_release)
2988 kfree(common);
2989}
2990
2991
2992
2993
2994static int fsg_bind(struct usb_configuration *c, struct usb_function *f)
2995{
2996 struct fsg_dev *fsg = fsg_from_func(f);
2997 struct fsg_common *common = fsg->common;
2998 struct usb_gadget *gadget = c->cdev->gadget;
2999 int i;
3000 struct usb_ep *ep;
3001 unsigned max_burst;
3002 int ret;
3003 struct fsg_opts *opts;
3004
3005
3006 ret = _fsg_common_get_max_lun(common);
3007 if (ret < 0) {
3008 pr_err("There should be at least one LUN.\n");
3009 return -EINVAL;
3010 }
3011
3012 opts = fsg_opts_from_func_inst(f->fi);
3013 if (!opts->no_configfs) {
3014 ret = fsg_common_set_cdev(fsg->common, c->cdev,
3015 fsg->common->can_stall);
3016 if (ret)
3017 return ret;
3018 fsg_common_set_inquiry_string(fsg->common, NULL, NULL);
3019 }
3020
3021 if (!common->thread_task) {
3022 common->state = FSG_STATE_IDLE;
3023 common->thread_task =
3024 kthread_create(fsg_main_thread, common, "file-storage");
3025 if (IS_ERR(common->thread_task)) {
3026 int ret = PTR_ERR(common->thread_task);
3027 common->thread_task = NULL;
3028 common->state = FSG_STATE_TERMINATED;
3029 return ret;
3030 }
3031 DBG(common, "I/O thread pid: %d\n",
3032 task_pid_nr(common->thread_task));
3033 wake_up_process(common->thread_task);
3034 }
3035
3036 fsg->gadget = gadget;
3037
3038
3039 i = usb_interface_id(c, f);
3040 if (i < 0)
3041 goto fail;
3042 fsg_intf_desc.bInterfaceNumber = i;
3043 fsg->interface_number = i;
3044
3045
3046 ep = usb_ep_autoconfig(gadget, &fsg_fs_bulk_in_desc);
3047 if (!ep)
3048 goto autoconf_fail;
3049 fsg->bulk_in = ep;
3050
3051 ep = usb_ep_autoconfig(gadget, &fsg_fs_bulk_out_desc);
3052 if (!ep)
3053 goto autoconf_fail;
3054 fsg->bulk_out = ep;
3055
3056
3057 fsg_hs_bulk_in_desc.bEndpointAddress =
3058 fsg_fs_bulk_in_desc.bEndpointAddress;
3059 fsg_hs_bulk_out_desc.bEndpointAddress =
3060 fsg_fs_bulk_out_desc.bEndpointAddress;
3061
3062
3063 max_burst = min_t(unsigned, FSG_BUFLEN / 1024, 15);
3064
3065 fsg_ss_bulk_in_desc.bEndpointAddress =
3066 fsg_fs_bulk_in_desc.bEndpointAddress;
3067 fsg_ss_bulk_in_comp_desc.bMaxBurst = max_burst;
3068
3069 fsg_ss_bulk_out_desc.bEndpointAddress =
3070 fsg_fs_bulk_out_desc.bEndpointAddress;
3071 fsg_ss_bulk_out_comp_desc.bMaxBurst = max_burst;
3072
3073 ret = usb_assign_descriptors(f, fsg_fs_function, fsg_hs_function,
3074 fsg_ss_function, fsg_ss_function);
3075 if (ret)
3076 goto autoconf_fail;
3077
3078 return 0;
3079
3080autoconf_fail:
3081 ERROR(fsg, "unable to autoconfigure all endpoints\n");
3082 i = -ENOTSUPP;
3083fail:
3084
3085 if (fsg->common->state != FSG_STATE_TERMINATED) {
3086 raise_exception(fsg->common, FSG_STATE_EXIT);
3087 wait_for_completion(&fsg->common->thread_notifier);
3088 }
3089 return i;
3090}
3091
3092
3093
3094static void fsg_unbind(struct usb_configuration *c, struct usb_function *f)
3095{
3096 struct fsg_dev *fsg = fsg_from_func(f);
3097 struct fsg_common *common = fsg->common;
3098
3099 DBG(fsg, "unbind\n");
3100 if (fsg->common->fsg == fsg) {
3101 fsg->common->new_fsg = NULL;
3102 raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);
3103
3104 wait_event(common->fsg_wait, common->fsg != fsg);
3105 }
3106
3107 usb_free_all_descriptors(&fsg->function);
3108}
3109
3110static inline struct fsg_lun_opts *to_fsg_lun_opts(struct config_item *item)
3111{
3112 return container_of(to_config_group(item), struct fsg_lun_opts, group);
3113}
3114
3115static inline struct fsg_opts *to_fsg_opts(struct config_item *item)
3116{
3117 return container_of(to_config_group(item), struct fsg_opts,
3118 func_inst.group);
3119}
3120
3121static void fsg_lun_attr_release(struct config_item *item)
3122{
3123 struct fsg_lun_opts *lun_opts;
3124
3125 lun_opts = to_fsg_lun_opts(item);
3126 kfree(lun_opts);
3127}
3128
3129static struct configfs_item_operations fsg_lun_item_ops = {
3130 .release = fsg_lun_attr_release,
3131};
3132
3133static ssize_t fsg_lun_opts_file_show(struct config_item *item, char *page)
3134{
3135 struct fsg_lun_opts *opts = to_fsg_lun_opts(item);
3136 struct fsg_opts *fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
3137
3138 return fsg_show_file(opts->lun, &fsg_opts->common->filesem, page);
3139}
3140
3141static ssize_t fsg_lun_opts_file_store(struct config_item *item,
3142 const char *page, size_t len)
3143{
3144 struct fsg_lun_opts *opts = to_fsg_lun_opts(item);
3145 struct fsg_opts *fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
3146
3147 return fsg_store_file(opts->lun, &fsg_opts->common->filesem, page, len);
3148}
3149
3150CONFIGFS_ATTR(fsg_lun_opts_, file);
3151
3152static ssize_t fsg_lun_opts_ro_show(struct config_item *item, char *page)
3153{
3154 return fsg_show_ro(to_fsg_lun_opts(item)->lun, page);
3155}
3156
3157static ssize_t fsg_lun_opts_ro_store(struct config_item *item,
3158 const char *page, size_t len)
3159{
3160 struct fsg_lun_opts *opts = to_fsg_lun_opts(item);
3161 struct fsg_opts *fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
3162
3163 return fsg_store_ro(opts->lun, &fsg_opts->common->filesem, page, len);
3164}
3165
3166CONFIGFS_ATTR(fsg_lun_opts_, ro);
3167
3168static ssize_t fsg_lun_opts_removable_show(struct config_item *item,
3169 char *page)
3170{
3171 return fsg_show_removable(to_fsg_lun_opts(item)->lun, page);
3172}
3173
3174static ssize_t fsg_lun_opts_removable_store(struct config_item *item,
3175 const char *page, size_t len)
3176{
3177 return fsg_store_removable(to_fsg_lun_opts(item)->lun, page, len);
3178}
3179
3180CONFIGFS_ATTR(fsg_lun_opts_, removable);
3181
3182static ssize_t fsg_lun_opts_cdrom_show(struct config_item *item, char *page)
3183{
3184 return fsg_show_cdrom(to_fsg_lun_opts(item)->lun, page);
3185}
3186
3187static ssize_t fsg_lun_opts_cdrom_store(struct config_item *item,
3188 const char *page, size_t len)
3189{
3190 struct fsg_lun_opts *opts = to_fsg_lun_opts(item);
3191 struct fsg_opts *fsg_opts = to_fsg_opts(opts->group.cg_item.ci_parent);
3192
3193 return fsg_store_cdrom(opts->lun, &fsg_opts->common->filesem, page,
3194 len);
3195}
3196
3197CONFIGFS_ATTR(fsg_lun_opts_, cdrom);
3198
3199static ssize_t fsg_lun_opts_nofua_show(struct config_item *item, char *page)
3200{
3201 return fsg_show_nofua(to_fsg_lun_opts(item)->lun, page);
3202}
3203
3204static ssize_t fsg_lun_opts_nofua_store(struct config_item *item,
3205 const char *page, size_t len)
3206{
3207 return fsg_store_nofua(to_fsg_lun_opts(item)->lun, page, len);
3208}
3209
3210CONFIGFS_ATTR(fsg_lun_opts_, nofua);
3211
3212static struct configfs_attribute *fsg_lun_attrs[] = {
3213 &fsg_lun_opts_attr_file,
3214 &fsg_lun_opts_attr_ro,
3215 &fsg_lun_opts_attr_removable,
3216 &fsg_lun_opts_attr_cdrom,
3217 &fsg_lun_opts_attr_nofua,
3218 NULL,
3219};
3220
3221static struct config_item_type fsg_lun_type = {
3222 .ct_item_ops = &fsg_lun_item_ops,
3223 .ct_attrs = fsg_lun_attrs,
3224 .ct_owner = THIS_MODULE,
3225};
3226
3227static struct config_group *fsg_lun_make(struct config_group *group,
3228 const char *name)
3229{
3230 struct fsg_lun_opts *opts;
3231 struct fsg_opts *fsg_opts;
3232 struct fsg_lun_config config;
3233 char *num_str;
3234 u8 num;
3235 int ret;
3236
3237 num_str = strchr(name, '.');
3238 if (!num_str) {
3239 pr_err("Unable to locate . in LUN.NUMBER\n");
3240 return ERR_PTR(-EINVAL);
3241 }
3242 num_str++;
3243
3244 ret = kstrtou8(num_str, 0, &num);
3245 if (ret)
3246 return ERR_PTR(ret);
3247
3248 fsg_opts = to_fsg_opts(&group->cg_item);
3249 if (num >= FSG_MAX_LUNS)
3250 return ERR_PTR(-ERANGE);
3251
3252 mutex_lock(&fsg_opts->lock);
3253 if (fsg_opts->refcnt || fsg_opts->common->luns[num]) {
3254 ret = -EBUSY;
3255 goto out;
3256 }
3257
3258 opts = kzalloc(sizeof(*opts), GFP_KERNEL);
3259 if (!opts) {
3260 ret = -ENOMEM;
3261 goto out;
3262 }
3263
3264 memset(&config, 0, sizeof(config));
3265 config.removable = true;
3266
3267 ret = fsg_common_create_lun(fsg_opts->common, &config, num, name,
3268 (const char **)&group->cg_item.ci_name);
3269 if (ret) {
3270 kfree(opts);
3271 goto out;
3272 }
3273 opts->lun = fsg_opts->common->luns[num];
3274 opts->lun_id = num;
3275 mutex_unlock(&fsg_opts->lock);
3276
3277 config_group_init_type_name(&opts->group, name, &fsg_lun_type);
3278
3279 return &opts->group;
3280out:
3281 mutex_unlock(&fsg_opts->lock);
3282 return ERR_PTR(ret);
3283}
3284
3285static void fsg_lun_drop(struct config_group *group, struct config_item *item)
3286{
3287 struct fsg_lun_opts *lun_opts;
3288 struct fsg_opts *fsg_opts;
3289
3290 lun_opts = to_fsg_lun_opts(item);
3291 fsg_opts = to_fsg_opts(&group->cg_item);
3292
3293 mutex_lock(&fsg_opts->lock);
3294 if (fsg_opts->refcnt) {
3295 struct config_item *gadget;
3296
3297 gadget = group->cg_item.ci_parent->ci_parent;
3298 unregister_gadget_item(gadget);
3299 }
3300
3301 fsg_common_remove_lun(lun_opts->lun);
3302 fsg_opts->common->luns[lun_opts->lun_id] = NULL;
3303 lun_opts->lun_id = 0;
3304 mutex_unlock(&fsg_opts->lock);
3305
3306 config_item_put(item);
3307}
3308
3309static void fsg_attr_release(struct config_item *item)
3310{
3311 struct fsg_opts *opts = to_fsg_opts(item);
3312
3313 usb_put_function_instance(&opts->func_inst);
3314}
3315
3316static struct configfs_item_operations fsg_item_ops = {
3317 .release = fsg_attr_release,
3318};
3319
3320static ssize_t fsg_opts_stall_show(struct config_item *item, char *page)
3321{
3322 struct fsg_opts *opts = to_fsg_opts(item);
3323 int result;
3324
3325 mutex_lock(&opts->lock);
3326 result = sprintf(page, "%d", opts->common->can_stall);
3327 mutex_unlock(&opts->lock);
3328
3329 return result;
3330}
3331
3332static ssize_t fsg_opts_stall_store(struct config_item *item, const char *page,
3333 size_t len)
3334{
3335 struct fsg_opts *opts = to_fsg_opts(item);
3336 int ret;
3337 bool stall;
3338
3339 mutex_lock(&opts->lock);
3340
3341 if (opts->refcnt) {
3342 mutex_unlock(&opts->lock);
3343 return -EBUSY;
3344 }
3345
3346 ret = strtobool(page, &stall);
3347 if (!ret) {
3348 opts->common->can_stall = stall;
3349 ret = len;
3350 }
3351
3352 mutex_unlock(&opts->lock);
3353
3354 return ret;
3355}
3356
3357CONFIGFS_ATTR(fsg_opts_, stall);
3358
3359#ifdef CONFIG_USB_GADGET_DEBUG_FILES
3360static ssize_t fsg_opts_num_buffers_show(struct config_item *item, char *page)
3361{
3362 struct fsg_opts *opts = to_fsg_opts(item);
3363 int result;
3364
3365 mutex_lock(&opts->lock);
3366 result = sprintf(page, "%d", opts->common->fsg_num_buffers);
3367 mutex_unlock(&opts->lock);
3368
3369 return result;
3370}
3371
3372static ssize_t fsg_opts_num_buffers_store(struct config_item *item,
3373 const char *page, size_t len)
3374{
3375 struct fsg_opts *opts = to_fsg_opts(item);
3376 int ret;
3377 u8 num;
3378
3379 mutex_lock(&opts->lock);
3380 if (opts->refcnt) {
3381 ret = -EBUSY;
3382 goto end;
3383 }
3384 ret = kstrtou8(page, 0, &num);
3385 if (ret)
3386 goto end;
3387
3388 fsg_common_set_num_buffers(opts->common, num);
3389 ret = len;
3390
3391end:
3392 mutex_unlock(&opts->lock);
3393 return ret;
3394}
3395
3396CONFIGFS_ATTR(fsg_opts_, num_buffers);
3397#endif
3398
3399static struct configfs_attribute *fsg_attrs[] = {
3400 &fsg_opts_attr_stall,
3401#ifdef CONFIG_USB_GADGET_DEBUG_FILES
3402 &fsg_opts_attr_num_buffers,
3403#endif
3404 NULL,
3405};
3406
3407static struct configfs_group_operations fsg_group_ops = {
3408 .make_group = fsg_lun_make,
3409 .drop_item = fsg_lun_drop,
3410};
3411
3412static struct config_item_type fsg_func_type = {
3413 .ct_item_ops = &fsg_item_ops,
3414 .ct_group_ops = &fsg_group_ops,
3415 .ct_attrs = fsg_attrs,
3416 .ct_owner = THIS_MODULE,
3417};
3418
3419static void fsg_free_inst(struct usb_function_instance *fi)
3420{
3421 struct fsg_opts *opts;
3422
3423 opts = fsg_opts_from_func_inst(fi);
3424 fsg_common_put(opts->common);
3425 kfree(opts);
3426}
3427
3428static struct usb_function_instance *fsg_alloc_inst(void)
3429{
3430 struct fsg_opts *opts;
3431 struct fsg_lun_config config;
3432 int rc;
3433
3434 opts = kzalloc(sizeof(*opts), GFP_KERNEL);
3435 if (!opts)
3436 return ERR_PTR(-ENOMEM);
3437 mutex_init(&opts->lock);
3438 opts->func_inst.free_func_inst = fsg_free_inst;
3439 opts->common = fsg_common_setup(opts->common);
3440 if (IS_ERR(opts->common)) {
3441 rc = PTR_ERR(opts->common);
3442 goto release_opts;
3443 }
3444
3445 rc = fsg_common_set_num_buffers(opts->common,
3446 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS);
3447 if (rc)
3448 goto release_opts;
3449
3450 pr_info(FSG_DRIVER_DESC ", version: " FSG_DRIVER_VERSION "\n");
3451
3452 memset(&config, 0, sizeof(config));
3453 config.removable = true;
3454 rc = fsg_common_create_lun(opts->common, &config, 0, "lun.0",
3455 (const char **)&opts->func_inst.group.cg_item.ci_name);
3456 if (rc)
3457 goto release_buffers;
3458
3459 opts->lun0.lun = opts->common->luns[0];
3460 opts->lun0.lun_id = 0;
3461
3462 config_group_init_type_name(&opts->func_inst.group, "", &fsg_func_type);
3463
3464 config_group_init_type_name(&opts->lun0.group, "lun.0", &fsg_lun_type);
3465 configfs_add_default_group(&opts->lun0.group, &opts->func_inst.group);
3466
3467 return &opts->func_inst;
3468
3469release_buffers:
3470 fsg_common_free_buffers(opts->common);
3471release_opts:
3472 kfree(opts);
3473 return ERR_PTR(rc);
3474}
3475
3476static void fsg_free(struct usb_function *f)
3477{
3478 struct fsg_dev *fsg;
3479 struct fsg_opts *opts;
3480
3481 fsg = container_of(f, struct fsg_dev, function);
3482 opts = container_of(f->fi, struct fsg_opts, func_inst);
3483
3484 mutex_lock(&opts->lock);
3485 opts->refcnt--;
3486 mutex_unlock(&opts->lock);
3487
3488 kfree(fsg);
3489}
3490
3491static struct usb_function *fsg_alloc(struct usb_function_instance *fi)
3492{
3493 struct fsg_opts *opts = fsg_opts_from_func_inst(fi);
3494 struct fsg_common *common = opts->common;
3495 struct fsg_dev *fsg;
3496
3497 fsg = kzalloc(sizeof(*fsg), GFP_KERNEL);
3498 if (unlikely(!fsg))
3499 return ERR_PTR(-ENOMEM);
3500
3501 mutex_lock(&opts->lock);
3502 opts->refcnt++;
3503 mutex_unlock(&opts->lock);
3504
3505 fsg->function.name = FSG_DRIVER_DESC;
3506 fsg->function.bind = fsg_bind;
3507 fsg->function.unbind = fsg_unbind;
3508 fsg->function.setup = fsg_setup;
3509 fsg->function.set_alt = fsg_set_alt;
3510 fsg->function.disable = fsg_disable;
3511 fsg->function.free_func = fsg_free;
3512
3513 fsg->common = common;
3514
3515 return &fsg->function;
3516}
3517
3518DECLARE_USB_FUNCTION_INIT(mass_storage, fsg_alloc_inst, fsg_alloc);
3519MODULE_LICENSE("GPL");
3520MODULE_AUTHOR("Michal Nazarewicz");
3521
3522
3523
3524
3525void fsg_config_from_params(struct fsg_config *cfg,
3526 const struct fsg_module_parameters *params,
3527 unsigned int fsg_num_buffers)
3528{
3529 struct fsg_lun_config *lun;
3530 unsigned i;
3531
3532
3533 cfg->nluns =
3534 min(params->luns ?: (params->file_count ?: 1u),
3535 (unsigned)FSG_MAX_LUNS);
3536 for (i = 0, lun = cfg->luns; i < cfg->nluns; ++i, ++lun) {
3537 lun->ro = !!params->ro[i];
3538 lun->cdrom = !!params->cdrom[i];
3539 lun->removable = !!params->removable[i];
3540 lun->filename =
3541 params->file_count > i && params->file[i][0]
3542 ? params->file[i]
3543 : NULL;
3544 }
3545
3546
3547 cfg->vendor_name = NULL;
3548 cfg->product_name = NULL;
3549
3550 cfg->ops = NULL;
3551 cfg->private_data = NULL;
3552
3553
3554 cfg->can_stall = params->stall;
3555 cfg->fsg_num_buffers = fsg_num_buffers;
3556}
3557EXPORT_SYMBOL_GPL(fsg_config_from_params);
3558