aboutsummaryrefslogtreecommitdiff
path: root/slof
diff options
context:
space:
mode:
authorLaurent Vivier <lvivier@redhat.com>2018-12-12 21:23:44 +0100
committerAlexey Kardashevskiy <aik@ozlabs.ru>2018-12-18 16:01:08 +1100
commitd10500a4e0378b7f02f63f78a97e3440805f1374 (patch)
treed1032a4dcb25bc20b53eeb4f22a5304bb1ede8a8 /slof
parent7d72d327e231d8ae9f1e8bce9f20faeaa2278b24 (diff)
downloadSLOF-d10500a4e0378b7f02f63f78a97e3440805f1374.zip
SLOF-d10500a4e0378b7f02f63f78a97e3440805f1374.tar.gz
SLOF-d10500a4e0378b7f02f63f78a97e3440805f1374.tar.bz2
usb/storage: Implement block write support
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> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Diffstat (limited to 'slof')
-rw-r--r--slof/fs/usb/dev-storage.fs27
1 files changed, 22 insertions, 5 deletions
diff --git a/slof/fs/usb/dev-storage.fs b/slof/fs/usb/dev-storage.fs
index a0a0bac..db5d0a8 100644
--- a/slof/fs/usb/dev-storage.fs
+++ b/slof/fs/usb/dev-storage.fs
@@ -103,23 +103,30 @@ 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
usb-transfer-bulk 0= IF
- FALSE EXIT
+ drop FALSE EXIT
THEN
\ 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