OSDN Git Service

ANDROID: usb: gadget: f_mtp: Set 0xFFFFFFFF in mtp header ContainerLength field
authorWitold Sciuk <witold.sciuk@intel.com>
Sat, 13 Feb 2016 10:08:37 +0000 (11:08 +0100)
committerBadhri Jagan Sridharan <badhri@google.com>
Wed, 3 May 2017 17:59:57 +0000 (17:59 +0000)
Value 0xFFFFFFFF should be set according specification
of MTP for large files when fileSize + mtpHeader is greater
than 0xFFFFFFFF.
MTP Specification, Appendix H - USB Optimizations

Patchset: mtp

Change-Id: I6213de052914350be2f87b73f8135f9c0cd05d7c
Signed-off-by: Witold Sciuk <witold.sciuk@intel.com>
Signed-off-by: Konrad Leszczynski <konrad.leszczynski@intel.com>
Signed-off-by: Russ Weight <russell.h.weight@intel.com>
drivers/usb/gadget/function/f_mtp.c

index b37cc8d..0fa79b0 100644 (file)
@@ -43,6 +43,7 @@
 #define MTP_BULK_BUFFER_SIZE       16384
 #define INTR_BUFFER_SIZE           28
 #define MAX_INST_NAME_LEN          40
+#define MTP_MAX_FILE_SIZE          0xFFFFFFFFL
 
 /* String IDs */
 #define INTERFACE_STRING_INDEX 0
@@ -766,7 +767,12 @@ static void send_file_work(struct work_struct *data)
                if (hdr_size) {
                        /* prepend MTP data header */
                        header = (struct mtp_data_header *)req->buf;
-                       header->length = __cpu_to_le32(count);
+                       /*
+                         * set file size with header according to
+                         * MTP Specification v1.0
+                         */
+                       header->length = (count > MTP_MAX_FILE_SIZE) ?
+                               MTP_MAX_FILE_SIZE : __cpu_to_le32(count);
                        header->type = __cpu_to_le16(2); /* data packet */
                        header->command = __cpu_to_le16(dev->xfer_command);
                        header->transaction_id =