s5p: usbd: separate power key cancel and usb disconnect
authorMinkyu Kang <mk7.kang@samsung.com>
Mon, 20 Dec 2010 08:49:12 +0000 (17:49 +0900)
committerMinkyu Kang <mk7.kang@samsung.com>
Mon, 20 Dec 2010 08:49:12 +0000 (17:49 +0900)
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
arch/arm/cpu/armv7/s5p-common/usb_downloader.c
common/cmd_usbd.c

index db42d21..f83964f 100644 (file)
@@ -231,7 +231,7 @@ static int usb_receive_packet(void)
 
                if (!s5p_usb_connected) {
                        puts("Disconnected!!\n");
-                       return 0;
+                       return -1;
                }
 
                if (s5p_receive_done) {
index 3a22ed2..23e8e5e 100644 (file)
@@ -1110,7 +1110,7 @@ static int process_data(struct usbd_ops *usbd)
 
                /* Receive image by using dma */
                recvlen = usbd->recv_data();
-               if (recvlen == 0) {
+               if (recvlen < 0) {
                        send_ack(usbd, STATUS_ERROR);
                        return 0;
                } else if (recvlen < len) {
@@ -1416,6 +1416,7 @@ int do_usbd_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        struct usbd_ops *usbd;
        int err;
+       int ret;
 
        if (argc > 1)
                down_mode = simple_strtoul(argv[1], NULL, 10);
@@ -1458,7 +1459,8 @@ int do_usbd_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        usbd->recv_setup(usbd->rx_data, usbd->rx_len);
 
        /* detect the download request from Host PC */
-       if (usbd->recv_data()) {
+       ret = usbd->recv_data();
+       if (ret > 0) {
                if (strncmp(usbd->rx_data, recv_key, strlen(recv_key)) == 0) {
                        printf("Download request from the Host PC\n");
                        msleep(30);
@@ -1469,9 +1471,12 @@ int do_usbd_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                        printf("No download request from the Host PC!! 1\n");
                        return 0;
                }
-       } else {
+       } else if (ret < 0) {
                usbd->down_cancel(1);
                return 0;
+       } else {
+               usbd->down_cancel(0);
+               return 0;
        }
 
        usbd->down_start();
@@ -1481,14 +1486,18 @@ int do_usbd_down(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        while (1) {
                usbd->recv_setup(usbd->rx_data, usbd->rx_len);
 
-               if (usbd->recv_data()) {
+               ret = usbd->recv_data();
+               if (ret > 0) {
                        if (process_data(usbd) == 0) {
                                usbd->down_cancel(1);
                                return 0;
                        }
-               } else {
+               } else if (ret < 0) {
                        usbd->down_cancel(1);
                        return 0;
+               } else {
+                       usbd->down_cancel(0);
+                       return 0;
                }
        }