111 lines
3.5 KiB
Diff
111 lines
3.5 KiB
Diff
From 54b418a32c1e12265dd421f0289b45f77fd38fc1 Mon Sep 17 00:00:00 2001
|
|
From: Laurent Vivier <lvivier@redhat.com>
|
|
Date: Thu, 20 Dec 2018 11:33:01 +0000
|
|
Subject: [PATCH 3/3] usb/storage: Implement block write support
|
|
|
|
RH-Author: Laurent Vivier <lvivier@redhat.com>
|
|
Message-id: <20181220113301.29914-3-lvivier@redhat.com>
|
|
Patchwork-id: 83709
|
|
O-Subject: [RHEL-8.0 SLOF PATCH 2/2] usb/storage: Implement block write support
|
|
Bugzilla: 1654196
|
|
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
RH-Acked-by: David Gibson <dgibson@redhat.com>
|
|
RH-Acked-by: Serhii Popovych <spopovyc@redhat.com>
|
|
|
|
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>
|
|
(cherry picked from commit d10500a4e0378b7f02f63f78a97e3440805f1374)
|
|
Signed-off-by: Laurent Vivier <lvivier@redhat.com>
|
|
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
slof/fs/usb/dev-storage.fs | 27 ++++++++++++++++++++++-----
|
|
1 file 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
|
|
--
|
|
1.8.3.1
|
|
|