[SLOF] [PATCH v4 2/2] usb/storage: Implement block write support
Thomas Huth
thuth at redhat.com
Thu Dec 13 07:32:49 AEDT 2018
On 2018-12-12 21:23, Laurent Vivier wrote:
> 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 at 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
>
LGTM now, thanks!
Reviewed-by: Thomas Huth <thuth at redhat.com>
More information about the SLOF
mailing list