]> git.sur5r.net Git - u-boot/blobdiff - drivers/usb/gadget/f_mass_storage.c
Merge branch 'u-boot-ti/master' into 'u-boot-arm/master'
[u-boot] / drivers / usb / gadget / f_mass_storage.c
index 6ecdea3e14c22e3443f01ea4bcf7cd086711d7a1..b1fe8bd3a805df4a1d97d50395a128a30ad21eaa 100644 (file)
 #include <config.h>
 #include <malloc.h>
 #include <common.h>
+#include <usb.h>
 
 #include <linux/err.h>
 #include <linux/usb/ch9.h>
@@ -441,7 +442,7 @@ static void set_bulk_out_req_length(struct fsg_common *common,
 
 /*-------------------------------------------------------------------------*/
 
-struct ums_board_info                  *ums_info;
+struct ums *ums;
 struct fsg_common *the_fsg_common;
 
 static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep)
@@ -675,6 +676,18 @@ static int sleep_thread(struct fsg_common *common)
                        k++;
                }
 
+               if (k == 10) {
+                       /* Handle CTRL+C */
+                       if (ctrlc())
+                               return -EPIPE;
+#ifdef CONFIG_USB_CABLE_CHECK
+                       /* Check cable connection */
+                       if (!usb_cable_connected())
+                               return -EIO;
+#endif
+                       k = 0;
+               }
+
                usb_gadget_handle_interrupts();
        }
        common->thread_wakeup_needed = 0;
@@ -757,14 +770,14 @@ static int do_read(struct fsg_common *common)
                }
 
                /* Perform the read */
-               nread = 0;
-               rc = ums_info->read_sector(&(ums_info->ums_dev),
-                                          file_offset / SECTOR_SIZE,
-                                          amount / SECTOR_SIZE,
-                                          (char __user *)bh->buf);
-               if (rc)
+               rc = ums->read_sector(ums,
+                                     file_offset / SECTOR_SIZE,
+                                     amount / SECTOR_SIZE,
+                                     (char __user *)bh->buf);
+               if (!rc)
                        return -EIO;
-               nread = amount;
+
+               nread = rc * SECTOR_SIZE;
 
                VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
                                (unsigned long long) file_offset,
@@ -931,13 +944,13 @@ static int do_write(struct fsg_common *common)
                        amount = bh->outreq->actual;
 
                        /* Perform the write */
-                       rc = ums_info->write_sector(&(ums_info->ums_dev),
+                       rc = ums->write_sector(ums,
                                               file_offset / SECTOR_SIZE,
                                               amount / SECTOR_SIZE,
                                               (char __user *)bh->buf);
-                       if (rc)
+                       if (!rc)
                                return -EIO;
-                       nwritten = amount;
+                       nwritten = rc * SECTOR_SIZE;
 
                        VLDBG(curlun, "file write %u @ %llu -> %d\n", amount,
                                        (unsigned long long) file_offset,
@@ -959,6 +972,8 @@ static int do_write(struct fsg_common *common)
 
                        /* If an error occurred, report it and its position */
                        if (nwritten < amount) {
+                               printf("nwritten:%d amount:%d\n", nwritten,
+                                      amount);
                                curlun->sense_data = SS_WRITE_ERROR;
                                curlun->info_valid = 1;
                                break;
@@ -1045,14 +1060,13 @@ static int do_verify(struct fsg_common *common)
                }
 
                /* Perform the read */
-               nread = 0;
-               rc = ums_info->read_sector(&(ums_info->ums_dev),
-                                          file_offset / SECTOR_SIZE,
-                                          amount / SECTOR_SIZE,
-                                          (char __user *)bh->buf);
-               if (rc)
+               rc = ums->read_sector(ums,
+                                     file_offset / SECTOR_SIZE,
+                                     amount / SECTOR_SIZE,
+                                     (char __user *)bh->buf);
+               if (!rc)
                        return -EIO;
-               nread = amount;
+               nread = rc * SECTOR_SIZE;
 
                VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
                                (unsigned long long) file_offset,
@@ -1100,7 +1114,7 @@ static int do_inquiry(struct fsg_common *common, struct fsg_buffhd *bh)
        buf[4] = 31;            /* Additional length */
                                /* No special options */
        sprintf((char *) (buf + 8), "%-8s%-16s%04x", (char*) vendor_id ,
-                       ums_info->name, (u16) 0xffff);
+                       ums->name, (u16) 0xffff);
 
        return 36;
 }
@@ -2386,6 +2400,7 @@ static void handle_exception(struct fsg_common *common)
 
 int fsg_main_thread(void *common_)
 {
+       int ret;
        struct fsg_common       *common = the_fsg_common;
        /* The main loop */
        do {
@@ -2395,12 +2410,16 @@ int fsg_main_thread(void *common_)
                }
 
                if (!common->running) {
-                       sleep_thread(common);
+                       ret = sleep_thread(common);
+                       if (ret)
+                               return ret;
+
                        continue;
                }
 
-               if (get_next_command(common))
-                       continue;
+               ret = get_next_command(common);
+               if (ret)
+                       return ret;
 
                if (!exception_in_progress(common))
                        common->state = FSG_STATE_DATA_PHASE;
@@ -2753,9 +2772,9 @@ int fsg_add(struct usb_configuration *c)
        return fsg_bind_config(c->cdev, c, fsg_common);
 }
 
-int fsg_init(struct ums_board_info *ums)
+int fsg_init(struct ums *ums_dev)
 {
-       ums_info = ums;
+       ums = ums_dev;
 
        return 0;
 }