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