~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/drivers/usb/gadget/storage_common.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * storage_common.c -- Common definitions for mass storage functionality
 
3
 *
 
4
 * Copyright (C) 2003-2008 Alan Stern
 
5
 * Copyeight (C) 2009 Samsung Electronics
 
6
 * Author: Michal Nazarewicz (m.nazarewicz@samsung.com)
 
7
 *
 
8
 * Ported to u-boot:
 
9
 * Andrzej Pietrasiewicz <andrzej.p@samsung.com>
 
10
 *
 
11
 * Code refactoring & cleanup:
 
12
 * Łukasz Majewski <l.majewski@samsung.com>
 
13
 *
 
14
 * SPDX-License-Identifier:     GPL-2.0+
 
15
 */
 
16
 
 
17
 
 
18
/*
 
19
 * This file requires the following identifiers used in USB strings to
 
20
 * be defined (each of type pointer to char):
 
21
 *  - fsg_string_manufacturer -- name of the manufacturer
 
22
 *  - fsg_string_product      -- name of the product
 
23
 *  - fsg_string_serial       -- product's serial
 
24
 *  - fsg_string_config       -- name of the configuration
 
25
 *  - fsg_string_interface    -- name of the interface
 
26
 * The first four are only needed when FSG_DESCRIPTORS_DEVICE_STRINGS
 
27
 * macro is defined prior to including this file.
 
28
 */
 
29
 
 
30
/*
 
31
 * When FSG_NO_INTR_EP is defined fsg_fs_intr_in_desc and
 
32
 * fsg_hs_intr_in_desc objects as well as
 
33
 * FSG_FS_FUNCTION_PRE_EP_ENTRIES and FSG_HS_FUNCTION_PRE_EP_ENTRIES
 
34
 * macros are not defined.
 
35
 *
 
36
 * When FSG_NO_DEVICE_STRINGS is defined FSG_STRING_MANUFACTURER,
 
37
 * FSG_STRING_PRODUCT, FSG_STRING_SERIAL and FSG_STRING_CONFIG are not
 
38
 * defined (as well as corresponding entries in string tables are
 
39
 * missing) and FSG_STRING_INTERFACE has value of zero.
 
40
 *
 
41
 * When FSG_NO_OTG is defined fsg_otg_desc won't be defined.
 
42
 */
 
43
 
 
44
/*
 
45
 * When FSG_BUFFHD_STATIC_BUFFER is defined when this file is included
 
46
 * the fsg_buffhd structure's buf field will be an array of FSG_BUFLEN
 
47
 * characters rather then a pointer to void.
 
48
 */
 
49
 
 
50
 
 
51
/* #include <asm/unaligned.h> */
 
52
 
 
53
 
 
54
/*
 
55
 * Thanks to NetChip Technologies for donating this product ID.
 
56
 *
 
57
 * DO NOT REUSE THESE IDs with any other driver!!  Ever!!
 
58
 * Instead:  allocate your own, using normal USB-IF procedures.
 
59
 */
 
60
#define FSG_VENDOR_ID   0x0525  /* NetChip */
 
61
#define FSG_PRODUCT_ID  0xa4a5  /* Linux-USB File-backed Storage Gadget */
 
62
 
 
63
/*-------------------------------------------------------------------------*/
 
64
 
 
65
#ifndef DEBUG
 
66
#undef VERBOSE_DEBUG
 
67
#undef DUMP_MSGS
 
68
#endif /* !DEBUG */
 
69
 
 
70
#ifdef VERBOSE_DEBUG
 
71
#define VLDBG   LDBG
 
72
#else
 
73
#define VLDBG(lun, fmt, args...) do { } while (0)
 
74
#endif /* VERBOSE_DEBUG */
 
75
 
 
76
/*
 
77
#define LDBG(lun, fmt, args...)   dev_dbg (&(lun)->dev, fmt, ## args)
 
78
#define LERROR(lun, fmt, args...) dev_err (&(lun)->dev, fmt, ## args)
 
79
#define LWARN(lun, fmt, args...)  dev_warn(&(lun)->dev, fmt, ## args)
 
80
#define LINFO(lun, fmt, args...)  dev_info(&(lun)->dev, fmt, ## args)
 
81
*/
 
82
 
 
83
#define LDBG(lun, fmt, args...) do { } while (0)
 
84
#define LERROR(lun, fmt, args...) do { } while (0)
 
85
#define LWARN(lun, fmt, args...) do { } while (0)
 
86
#define LINFO(lun, fmt, args...) do { } while (0)
 
87
 
 
88
/*
 
89
 * Keep those macros in sync with those in
 
90
 * include/linux/usb/composite.h or else GCC will complain.  If they
 
91
 * are identical (the same names of arguments, white spaces in the
 
92
 * same places) GCC will allow redefinition otherwise (even if some
 
93
 * white space is removed or added) warning will be issued.
 
94
 *
 
95
 * Those macros are needed here because File Storage Gadget does not
 
96
 * include the composite.h header.  For composite gadgets those macros
 
97
 * are redundant since composite.h is included any way.
 
98
 *
 
99
 * One could check whether those macros are already defined (which
 
100
 * would indicate composite.h had been included) or not (which would
 
101
 * indicate we were in FSG) but this is not done because a warning is
 
102
 * desired if definitions here differ from the ones in composite.h.
 
103
 *
 
104
 * We want the definitions to match and be the same in File Storage
 
105
 * Gadget as well as Mass Storage Function (and so composite gadgets
 
106
 * using MSF).  If someone changes them in composite.h it will produce
 
107
 * a warning in this file when building MSF.
 
108
 */
 
109
 
 
110
#define DBG(d, fmt, args...)     debug(fmt , ## args)
 
111
#define VDBG(d, fmt, args...)    debug(fmt , ## args)
 
112
/* #define ERROR(d, fmt, args...)   printf(fmt , ## args) */
 
113
/* #define WARNING(d, fmt, args...) printf(fmt , ## args) */
 
114
/* #define INFO(d, fmt, args...)    printf(fmt , ## args) */
 
115
 
 
116
/* #define DBG(d, fmt, args...)     do { } while (0) */
 
117
/* #define VDBG(d, fmt, args...)    do { } while (0) */
 
118
#define ERROR(d, fmt, args...)   do { } while (0)
 
119
#define WARNING(d, fmt, args...) do { } while (0)
 
120
#define INFO(d, fmt, args...)    do { } while (0)
 
121
 
 
122
#ifdef DUMP_MSGS
 
123
 
 
124
/* dump_msg(fsg, const char * label, const u8 * buf, unsigned length); */
 
125
# define dump_msg(fsg, label, buf, length) do {                         \
 
126
        if (length < 512) {                                             \
 
127
                DBG(fsg, "%s, length %u:\n", label, length);            \
 
128
                print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET,      \
 
129
                               16, 1, buf, length, 0);                  \
 
130
        }                                                               \
 
131
} while (0)
 
132
 
 
133
#  define dump_cdb(fsg) do { } while (0)
 
134
 
 
135
#else
 
136
 
 
137
#  define dump_msg(fsg, /* const char * */ label, \
 
138
                   /* const u8 * */ buf, /* unsigned */ length) do { } while (0)
 
139
 
 
140
#  ifdef VERBOSE_DEBUG
 
141
 
 
142
#    define dump_cdb(fsg)                                               \
 
143
        print_hex_dump(KERN_DEBUG, "SCSI CDB: ", DUMP_PREFIX_NONE,      \
 
144
                       16, 1, (fsg)->cmnd, (fsg)->cmnd_size, 0)         \
 
145
 
 
146
#  else
 
147
 
 
148
#    define dump_cdb(fsg) do { } while (0)
 
149
 
 
150
#  endif /* VERBOSE_DEBUG */
 
151
 
 
152
#endif /* DUMP_MSGS */
 
153
 
 
154
/*-------------------------------------------------------------------------*/
 
155
 
 
156
/* SCSI device types */
 
157
#define TYPE_DISK       0x00
 
158
#define TYPE_CDROM      0x05
 
159
 
 
160
/* USB protocol value = the transport method */
 
161
#define USB_PR_CBI      0x00            /* Control/Bulk/Interrupt */
 
162
#define USB_PR_CB       0x01            /* Control/Bulk w/o interrupt */
 
163
#define USB_PR_BULK     0x50            /* Bulk-only */
 
164
 
 
165
/* USB subclass value = the protocol encapsulation */
 
166
#define USB_SC_RBC      0x01            /* Reduced Block Commands (flash) */
 
167
#define USB_SC_8020     0x02            /* SFF-8020i, MMC-2, ATAPI (CD-ROM) */
 
168
#define USB_SC_QIC      0x03            /* QIC-157 (tape) */
 
169
#define USB_SC_UFI      0x04            /* UFI (floppy) */
 
170
#define USB_SC_8070     0x05            /* SFF-8070i (removable) */
 
171
#define USB_SC_SCSI     0x06            /* Transparent SCSI */
 
172
 
 
173
/* Bulk-only data structures */
 
174
 
 
175
/* Command Block Wrapper */
 
176
struct fsg_bulk_cb_wrap {
 
177
        __le32  Signature;              /* Contains 'USBC' */
 
178
        u32     Tag;                    /* Unique per command id */
 
179
        __le32  DataTransferLength;     /* Size of the data */
 
180
        u8      Flags;                  /* Direction in bit 7 */
 
181
        u8      Lun;                    /* LUN (normally 0) */
 
182
        u8      Length;                 /* Of the CDB, <= MAX_COMMAND_SIZE */
 
183
        u8      CDB[16];                /* Command Data Block */
 
184
};
 
185
 
 
186
#define USB_BULK_CB_WRAP_LEN    31
 
187
#define USB_BULK_CB_SIG         0x43425355      /* Spells out USBC */
 
188
#define USB_BULK_IN_FLAG        0x80
 
189
 
 
190
/* Command Status Wrapper */
 
191
struct bulk_cs_wrap {
 
192
        __le32  Signature;              /* Should = 'USBS' */
 
193
        u32     Tag;                    /* Same as original command */
 
194
        __le32  Residue;                /* Amount not transferred */
 
195
        u8      Status;                 /* See below */
 
196
};
 
197
 
 
198
#define USB_BULK_CS_WRAP_LEN    13
 
199
#define USB_BULK_CS_SIG         0x53425355      /* Spells out 'USBS' */
 
200
#define USB_STATUS_PASS         0
 
201
#define USB_STATUS_FAIL         1
 
202
#define USB_STATUS_PHASE_ERROR  2
 
203
 
 
204
/* Bulk-only class specific requests */
 
205
#define USB_BULK_RESET_REQUEST          0xff
 
206
#define USB_BULK_GET_MAX_LUN_REQUEST    0xfe
 
207
 
 
208
/* CBI Interrupt data structure */
 
209
struct interrupt_data {
 
210
        u8      bType;
 
211
        u8      bValue;
 
212
};
 
213
 
 
214
#define CBI_INTERRUPT_DATA_LEN          2
 
215
 
 
216
/* CBI Accept Device-Specific Command request */
 
217
#define USB_CBI_ADSC_REQUEST            0x00
 
218
 
 
219
/* Length of a SCSI Command Data Block */
 
220
#define MAX_COMMAND_SIZE        16
 
221
 
 
222
/* SCSI commands that we recognize */
 
223
#define SC_FORMAT_UNIT                  0x04
 
224
#define SC_INQUIRY                      0x12
 
225
#define SC_MODE_SELECT_6                0x15
 
226
#define SC_MODE_SELECT_10               0x55
 
227
#define SC_MODE_SENSE_6                 0x1a
 
228
#define SC_MODE_SENSE_10                0x5a
 
229
#define SC_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
 
230
#define SC_READ_6                       0x08
 
231
#define SC_READ_10                      0x28
 
232
#define SC_READ_12                      0xa8
 
233
#define SC_READ_CAPACITY                0x25
 
234
#define SC_READ_FORMAT_CAPACITIES       0x23
 
235
#define SC_READ_HEADER                  0x44
 
236
#define SC_READ_TOC                     0x43
 
237
#define SC_RELEASE                      0x17
 
238
#define SC_REQUEST_SENSE                0x03
 
239
#define SC_RESERVE                      0x16
 
240
#define SC_SEND_DIAGNOSTIC              0x1d
 
241
#define SC_START_STOP_UNIT              0x1b
 
242
#define SC_SYNCHRONIZE_CACHE            0x35
 
243
#define SC_TEST_UNIT_READY              0x00
 
244
#define SC_VERIFY                       0x2f
 
245
#define SC_WRITE_6                      0x0a
 
246
#define SC_WRITE_10                     0x2a
 
247
#define SC_WRITE_12                     0xaa
 
248
 
 
249
/* SCSI Sense Key/Additional Sense Code/ASC Qualifier values */
 
250
#define SS_NO_SENSE                             0
 
251
#define SS_COMMUNICATION_FAILURE                0x040800
 
252
#define SS_INVALID_COMMAND                      0x052000
 
253
#define SS_INVALID_FIELD_IN_CDB                 0x052400
 
254
#define SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE   0x052100
 
255
#define SS_LOGICAL_UNIT_NOT_SUPPORTED           0x052500
 
256
#define SS_MEDIUM_NOT_PRESENT                   0x023a00
 
257
#define SS_MEDIUM_REMOVAL_PREVENTED             0x055302
 
258
#define SS_NOT_READY_TO_READY_TRANSITION        0x062800
 
259
#define SS_RESET_OCCURRED                       0x062900
 
260
#define SS_SAVING_PARAMETERS_NOT_SUPPORTED      0x053900
 
261
#define SS_UNRECOVERED_READ_ERROR               0x031100
 
262
#define SS_WRITE_ERROR                          0x030c02
 
263
#define SS_WRITE_PROTECTED                      0x072700
 
264
 
 
265
#define SK(x)           ((u8) ((x) >> 16))      /* Sense Key byte, etc. */
 
266
#define ASC(x)          ((u8) ((x) >> 8))
 
267
#define ASCQ(x)         ((u8) (x))
 
268
 
 
269
struct device_attribute { int i; };
 
270
struct rw_semaphore { int i; };
 
271
#define down_write(...)                 do { } while (0)
 
272
#define up_write(...)                   do { } while (0)
 
273
#define down_read(...)                  do { } while (0)
 
274
#define up_read(...)                    do { } while (0)
 
275
#define ETOOSMALL       525
 
276
 
 
277
#include <usb_mass_storage.h>
 
278
 
 
279
/*-------------------------------------------------------------------------*/
 
280
 
 
281
struct fsg_lun {
 
282
        loff_t          file_length;
 
283
        loff_t          num_sectors;
 
284
 
 
285
        unsigned int    initially_ro:1;
 
286
        unsigned int    ro:1;
 
287
        unsigned int    removable:1;
 
288
        unsigned int    cdrom:1;
 
289
        unsigned int    prevent_medium_removal:1;
 
290
        unsigned int    registered:1;
 
291
        unsigned int    info_valid:1;
 
292
        unsigned int    nofua:1;
 
293
 
 
294
        u32             sense_data;
 
295
        u32             sense_data_info;
 
296
        u32             unit_attention_data;
 
297
 
 
298
        struct device   dev;
 
299
};
 
300
 
 
301
#define fsg_lun_is_open(curlun) ((curlun)->filp != NULL)
 
302
#if 0
 
303
static struct fsg_lun *fsg_lun_from_dev(struct device *dev)
 
304
{
 
305
        return container_of(dev, struct fsg_lun, dev);
 
306
}
 
307
#endif
 
308
 
 
309
/* Big enough to hold our biggest descriptor */
 
310
#define EP0_BUFSIZE     256
 
311
#define DELAYED_STATUS  (EP0_BUFSIZE + 999)     /* An impossibly large value */
 
312
 
 
313
/* Number of buffers we will use.  2 is enough for double-buffering */
 
314
#ifndef CONFIG_CI_UDC
 
315
#define FSG_NUM_BUFFERS 2
 
316
#else
 
317
#define FSG_NUM_BUFFERS 1 /* ci_udc only allows 1 req per ep at present */
 
318
#endif
 
319
 
 
320
/* Default size of buffer length. */
 
321
#define FSG_BUFLEN      ((u32)16384)
 
322
 
 
323
/* Maximal number of LUNs supported in mass storage function */
 
324
#define FSG_MAX_LUNS    8
 
325
 
 
326
enum fsg_buffer_state {
 
327
        BUF_STATE_EMPTY = 0,
 
328
        BUF_STATE_FULL,
 
329
        BUF_STATE_BUSY
 
330
};
 
331
 
 
332
struct fsg_buffhd {
 
333
#ifdef FSG_BUFFHD_STATIC_BUFFER
 
334
        char                            buf[FSG_BUFLEN];
 
335
#else
 
336
        void                            *buf;
 
337
#endif
 
338
        enum fsg_buffer_state           state;
 
339
        struct fsg_buffhd               *next;
 
340
 
 
341
        /*
 
342
         * The NetChip 2280 is faster, and handles some protocol faults
 
343
         * better, if we don't submit any short bulk-out read requests.
 
344
         * So we will record the intended request length here.
 
345
         */
 
346
        unsigned int                    bulk_out_intended_length;
 
347
 
 
348
        struct usb_request              *inreq;
 
349
        int                             inreq_busy;
 
350
        struct usb_request              *outreq;
 
351
        int                             outreq_busy;
 
352
};
 
353
 
 
354
enum fsg_state {
 
355
        /* This one isn't used anywhere */
 
356
        FSG_STATE_COMMAND_PHASE = -10,
 
357
        FSG_STATE_DATA_PHASE,
 
358
        FSG_STATE_STATUS_PHASE,
 
359
 
 
360
        FSG_STATE_IDLE = 0,
 
361
        FSG_STATE_ABORT_BULK_OUT,
 
362
        FSG_STATE_RESET,
 
363
        FSG_STATE_INTERFACE_CHANGE,
 
364
        FSG_STATE_CONFIG_CHANGE,
 
365
        FSG_STATE_DISCONNECT,
 
366
        FSG_STATE_EXIT,
 
367
        FSG_STATE_TERMINATED
 
368
};
 
369
 
 
370
enum data_direction {
 
371
        DATA_DIR_UNKNOWN = 0,
 
372
        DATA_DIR_FROM_HOST,
 
373
        DATA_DIR_TO_HOST,
 
374
        DATA_DIR_NONE
 
375
};
 
376
 
 
377
/*-------------------------------------------------------------------------*/
 
378
 
 
379
static inline u32 get_unaligned_be24(u8 *buf)
 
380
{
 
381
        return 0xffffff & (u32) get_unaligned_be32(buf - 1);
 
382
}
 
383
 
 
384
/*-------------------------------------------------------------------------*/
 
385
 
 
386
enum {
 
387
#ifndef FSG_NO_DEVICE_STRINGS
 
388
        FSG_STRING_MANUFACTURER = 1,
 
389
        FSG_STRING_PRODUCT,
 
390
        FSG_STRING_SERIAL,
 
391
        FSG_STRING_CONFIG,
 
392
#endif
 
393
        FSG_STRING_INTERFACE
 
394
};
 
395
 
 
396
#ifndef FSG_NO_OTG
 
397
static struct usb_otg_descriptor
 
398
fsg_otg_desc = {
 
399
        .bLength =              sizeof fsg_otg_desc,
 
400
        .bDescriptorType =      USB_DT_OTG,
 
401
 
 
402
        .bmAttributes =         USB_OTG_SRP,
 
403
};
 
404
#endif
 
405
 
 
406
/* There is only one interface. */
 
407
 
 
408
static struct usb_interface_descriptor
 
409
fsg_intf_desc = {
 
410
        .bLength =              sizeof fsg_intf_desc,
 
411
        .bDescriptorType =      USB_DT_INTERFACE,
 
412
 
 
413
        .bNumEndpoints =        2,              /* Adjusted during fsg_bind() */
 
414
        .bInterfaceClass =      USB_CLASS_MASS_STORAGE,
 
415
        .bInterfaceSubClass =   USB_SC_SCSI,    /* Adjusted during fsg_bind() */
 
416
        .bInterfaceProtocol =   USB_PR_BULK,    /* Adjusted during fsg_bind() */
 
417
        .iInterface =           FSG_STRING_INTERFACE,
 
418
};
 
419
 
 
420
/*
 
421
 * Three full-speed endpoint descriptors: bulk-in, bulk-out, and
 
422
 * interrupt-in.
 
423
 */
 
424
 
 
425
static struct usb_endpoint_descriptor
 
426
fsg_fs_bulk_in_desc = {
 
427
        .bLength =              USB_DT_ENDPOINT_SIZE,
 
428
        .bDescriptorType =      USB_DT_ENDPOINT,
 
429
 
 
430
        .bEndpointAddress =     USB_DIR_IN,
 
431
        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 
432
        /* wMaxPacketSize set by autoconfiguration */
 
433
};
 
434
 
 
435
static struct usb_endpoint_descriptor
 
436
fsg_fs_bulk_out_desc = {
 
437
        .bLength =              USB_DT_ENDPOINT_SIZE,
 
438
        .bDescriptorType =      USB_DT_ENDPOINT,
 
439
 
 
440
        .bEndpointAddress =     USB_DIR_OUT,
 
441
        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 
442
        /* wMaxPacketSize set by autoconfiguration */
 
443
};
 
444
 
 
445
#ifndef FSG_NO_INTR_EP
 
446
 
 
447
static struct usb_endpoint_descriptor
 
448
fsg_fs_intr_in_desc = {
 
449
        .bLength =              USB_DT_ENDPOINT_SIZE,
 
450
        .bDescriptorType =      USB_DT_ENDPOINT,
 
451
 
 
452
        .bEndpointAddress =     USB_DIR_IN,
 
453
        .bmAttributes =         USB_ENDPOINT_XFER_INT,
 
454
        .wMaxPacketSize =       cpu_to_le16(2),
 
455
        .bInterval =            32,     /* frames -> 32 ms */
 
456
};
 
457
 
 
458
#ifndef FSG_NO_OTG
 
459
#  define FSG_FS_FUNCTION_PRE_EP_ENTRIES        2
 
460
#else
 
461
#  define FSG_FS_FUNCTION_PRE_EP_ENTRIES        1
 
462
#endif
 
463
 
 
464
#endif
 
465
 
 
466
static struct usb_descriptor_header *fsg_fs_function[] = {
 
467
#ifndef FSG_NO_OTG
 
468
        (struct usb_descriptor_header *) &fsg_otg_desc,
 
469
#endif
 
470
        (struct usb_descriptor_header *) &fsg_intf_desc,
 
471
        (struct usb_descriptor_header *) &fsg_fs_bulk_in_desc,
 
472
        (struct usb_descriptor_header *) &fsg_fs_bulk_out_desc,
 
473
#ifndef FSG_NO_INTR_EP
 
474
        (struct usb_descriptor_header *) &fsg_fs_intr_in_desc,
 
475
#endif
 
476
        NULL,
 
477
};
 
478
 
 
479
/*
 
480
 * USB 2.0 devices need to expose both high speed and full speed
 
481
 * descriptors, unless they only run at full speed.
 
482
 *
 
483
 * That means alternate endpoint descriptors (bigger packets)
 
484
 * and a "device qualifier" ... plus more construction options
 
485
 * for the configuration descriptor.
 
486
 */
 
487
static struct usb_endpoint_descriptor
 
488
fsg_hs_bulk_in_desc = {
 
489
        .bLength =              USB_DT_ENDPOINT_SIZE,
 
490
        .bDescriptorType =      USB_DT_ENDPOINT,
 
491
 
 
492
        /* bEndpointAddress copied from fs_bulk_in_desc during fsg_bind() */
 
493
        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 
494
        .wMaxPacketSize =       cpu_to_le16(512),
 
495
};
 
496
 
 
497
static struct usb_endpoint_descriptor
 
498
fsg_hs_bulk_out_desc = {
 
499
        .bLength =              USB_DT_ENDPOINT_SIZE,
 
500
        .bDescriptorType =      USB_DT_ENDPOINT,
 
501
 
 
502
        /* bEndpointAddress copied from fs_bulk_out_desc during fsg_bind() */
 
503
        .bmAttributes =         USB_ENDPOINT_XFER_BULK,
 
504
        .wMaxPacketSize =       cpu_to_le16(512),
 
505
        .bInterval =            1,      /* NAK every 1 uframe */
 
506
};
 
507
 
 
508
#ifndef FSG_NO_INTR_EP
 
509
 
 
510
static struct usb_endpoint_descriptor
 
511
fsg_hs_intr_in_desc = {
 
512
        .bLength =              USB_DT_ENDPOINT_SIZE,
 
513
        .bDescriptorType =      USB_DT_ENDPOINT,
 
514
 
 
515
        /* bEndpointAddress copied from fs_intr_in_desc during fsg_bind() */
 
516
        .bmAttributes =         USB_ENDPOINT_XFER_INT,
 
517
        .wMaxPacketSize =       cpu_to_le16(2),
 
518
        .bInterval =            9,      /* 2**(9-1) = 256 uframes -> 32 ms */
 
519
};
 
520
 
 
521
#ifndef FSG_NO_OTG
 
522
#  define FSG_HS_FUNCTION_PRE_EP_ENTRIES        2
 
523
#else
 
524
#  define FSG_HS_FUNCTION_PRE_EP_ENTRIES        1
 
525
#endif
 
526
 
 
527
#endif
 
528
 
 
529
static struct usb_descriptor_header *fsg_hs_function[] = {
 
530
#ifndef FSG_NO_OTG
 
531
        (struct usb_descriptor_header *) &fsg_otg_desc,
 
532
#endif
 
533
        (struct usb_descriptor_header *) &fsg_intf_desc,
 
534
        (struct usb_descriptor_header *) &fsg_hs_bulk_in_desc,
 
535
        (struct usb_descriptor_header *) &fsg_hs_bulk_out_desc,
 
536
#ifndef FSG_NO_INTR_EP
 
537
        (struct usb_descriptor_header *) &fsg_hs_intr_in_desc,
 
538
#endif
 
539
        NULL,
 
540
};
 
541
 
 
542
/* Maxpacket and other transfer characteristics vary by speed. */
 
543
static struct usb_endpoint_descriptor *
 
544
fsg_ep_desc(struct usb_gadget *g, struct usb_endpoint_descriptor *fs,
 
545
                struct usb_endpoint_descriptor *hs)
 
546
{
 
547
        if (gadget_is_dualspeed(g) && g->speed == USB_SPEED_HIGH)
 
548
                return hs;
 
549
        return fs;
 
550
}
 
551
 
 
552
/* Static strings, in UTF-8 (for simplicity we use only ASCII characters) */
 
553
static struct usb_string                fsg_strings[] = {
 
554
#ifndef FSG_NO_DEVICE_STRINGS
 
555
        {FSG_STRING_MANUFACTURER,       fsg_string_manufacturer},
 
556
        {FSG_STRING_PRODUCT,            fsg_string_product},
 
557
        {FSG_STRING_SERIAL,             fsg_string_serial},
 
558
        {FSG_STRING_CONFIG,             fsg_string_config},
 
559
#endif
 
560
        {FSG_STRING_INTERFACE,          fsg_string_interface},
 
561
        {}
 
562
};
 
563
 
 
564
static struct usb_gadget_strings        fsg_stringtab = {
 
565
        .language       = 0x0409,               /* en-us */
 
566
        .strings        = fsg_strings,
 
567
};
 
568
 
 
569
/*-------------------------------------------------------------------------*/
 
570
 
 
571
/*
 
572
 * If the next two routines are called while the gadget is registered,
 
573
 * the caller must own fsg->filesem for writing.
 
574
 */
 
575
 
 
576
static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
 
577
{
 
578
        int                             ro;
 
579
 
 
580
        /* R/W if we can, R/O if we must */
 
581
        ro = curlun->initially_ro;
 
582
 
 
583
        curlun->ro = ro;
 
584
        curlun->file_length = ums->num_sectors << 9;
 
585
        curlun->num_sectors = ums->num_sectors;
 
586
        debug("open backing file: %s\n", filename);
 
587
 
 
588
        return 0;
 
589
}
 
590
 
 
591
static void fsg_lun_close(struct fsg_lun *curlun)
 
592
{
 
593
}
 
594
 
 
595
/*-------------------------------------------------------------------------*/
 
596
 
 
597
/*
 
598
 * Sync the file data, don't bother with the metadata.
 
599
 * This code was copied from fs/buffer.c:sys_fdatasync().
 
600
 */
 
601
static int fsg_lun_fsync_sub(struct fsg_lun *curlun)
 
602
{
 
603
        return 0;
 
604
}
 
605
 
 
606
static void store_cdrom_address(u8 *dest, int msf, u32 addr)
 
607
{
 
608
        if (msf) {
 
609
                /* Convert to Minutes-Seconds-Frames */
 
610
                addr >>= 2;             /* Convert to 2048-byte frames */
 
611
                addr += 2*75;           /* Lead-in occupies 2 seconds */
 
612
                dest[3] = addr % 75;    /* Frames */
 
613
                addr /= 75;
 
614
                dest[2] = addr % 60;    /* Seconds */
 
615
                addr /= 60;
 
616
                dest[1] = addr;         /* Minutes */
 
617
                dest[0] = 0;            /* Reserved */
 
618
        } else {
 
619
                /* Absolute sector */
 
620
                put_unaligned_be32(addr, dest);
 
621
        }
 
622
}
 
623
 
 
624
/*-------------------------------------------------------------------------*/