diff mbox series

[v3,2/2] usb/storage: Implement block write support

Message ID 20181212201633.13641-3-lvivier@redhat.com
State Superseded
Headers show
Series usb/storage: Implement block write support | expand

Commit Message

Laurent Vivier Dec. 12, 2018, 8:16 p.m. UTC
The only missing parts were to manage the transfer direction in
do-bulk-command and to copy the data to the buffer before the
write operation.

This is needed as GRUB2 wants to write the grubenv file at start
and hangs because the data are not provided to the disk controller.

I've checked the file is correctly modified by modifying an environment
variable in GRUB2 with "set saved_entry=2" then "save_env saved_entry"
and checking the result in linux with "grub2-editenv list".

Fixes: Fixes: a0b96fe66fcd991b407c1d67ca842921e477a6fd
       (Provide "write" function in the disk-label package)
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
---
 slof/fs/usb/dev-storage.fs | 25 +++++++++++++++++++++----
 1 file changed, 21 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/slof/fs/usb/dev-storage.fs b/slof/fs/usb/dev-storage.fs
index a0a0bac..3c73075 100644
--- a/slof/fs/usb/dev-storage.fs
+++ b/slof/fs/usb/dev-storage.fs
@@ -103,7 +103,7 @@  scsi-open
 \ if sense-len is 0 then no sense data is actually present
 \
 
-: do-bulk-command ( resp-buffer resp-size -- TRUE | FALSE )
+: do-bulk-command ( dir resp-buffer resp-size -- TRUE | FALSE )
     TO resp-size
     TO resp-buffer
     udev USB_PIPE_OUT td-buf td-buf-phys dma-buf-phys usb>cmd 1F
@@ -113,13 +113,20 @@  scsi-open
     \ transfer CBW
     resp-size IF
         d# 125 us
-        udev USB_PIPE_IN td-buf td-buf-phys resp-buffer resp-size
+        IF
+            udev USB_PIPE_IN
+        ELSE
+            udev USB_PIPE_OUT
+        THEN
+        td-buf td-buf-phys resp-buffer resp-size
         usb-transfer-bulk 0= IF \ transfer data
             usb-disk-debug? IF ." Data phase failed " cr THEN
             \ FALSE EXIT
             \ in case of a stall/halted endpoint we clear the halt
             \ Fall through and try reading the CSW
         THEN
+    ELSE
+        drop
     THEN
     d# 125 us
     udev USB_PIPE_IN td-buf td-buf-phys dma-buf-phys usb>csw 0D
@@ -182,18 +189,28 @@  CONSTANT cbw-length
     build-cbw
     1 tag + to tag
 
+    \ copy command
     usb-cmd-addr
     dma-buf usb>cmd SCSI-COMMAND-OFFSET +
     usb-cmd-len
     move
 
+    \ copy data to write
+    usb-dir not IF
+        usb-buf-addr dma-buf usb>data usb-buf-len move
+    THEN
+
     \ Send it
-    dma-buf-phys usb>data usb-buf-len
+    usb-dir dma-buf-phys usb>data usb-buf-len
     do-bulk-command 0= IF
         ." USB-DISK: Bulk command failed!" cr
         0 0 -1 EXIT
     THEN
-    dma-buf usb>data usb-buf-addr usb-buf-len move
+
+    \ copy read data
+    usb-dir IF
+        dma-buf usb>data usb-buf-addr usb-buf-len move
+    THEN
 
     dma-buf usb>csw to csw-addr
     csw-addr csw>sig l@ 55534253 <> IF