SCSI write support (for usbms mainly).
* grub-core/disk/scsi.c (grub_scsi_write10): Uncomment. Make buffer a const pointer. (grub_scsi_write): Implement. * include/grub/scsi.h (grub_scsi_dev): Make write buffer a const pointer
This commit is contained in:
parent
67639fd75e
commit
cc774926f1
5 changed files with 47 additions and 12 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2012-01-30 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
SCSI write support (for usbms mainly).
|
||||||
|
|
||||||
|
* grub-core/disk/scsi.c (grub_scsi_write10): Uncomment. Make buffer
|
||||||
|
a const pointer.
|
||||||
|
(grub_scsi_write): Implement.
|
||||||
|
* include/grub/scsi.h (grub_scsi_dev): Make write buffer a const pointer
|
||||||
|
|
||||||
2012-01-30 Vladimir Serbinenko <phcoder@gmail.com>
|
2012-01-30 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/io/lzopio.c (uncompress_block): Fix use of incorrect
|
* grub-core/io/lzopio.c (uncompress_block): Fix use of incorrect
|
||||||
|
|
|
@ -537,7 +537,7 @@ grub_atapi_write (struct grub_scsi *scsi __attribute__((unused)),
|
||||||
grub_size_t cmdsize __attribute__((unused)),
|
grub_size_t cmdsize __attribute__((unused)),
|
||||||
char *cmd __attribute__((unused)),
|
char *cmd __attribute__((unused)),
|
||||||
grub_size_t size __attribute__((unused)),
|
grub_size_t size __attribute__((unused)),
|
||||||
char *buf __attribute__((unused)))
|
const char *buf __attribute__((unused)))
|
||||||
{
|
{
|
||||||
// XXX: scsi.mod does not use write yet.
|
// XXX: scsi.mod does not use write yet.
|
||||||
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "ATAPI write not implemented");
|
return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET, "ATAPI write not implemented");
|
||||||
|
|
|
@ -253,12 +253,11 @@ grub_scsi_read12 (grub_disk_t disk, grub_disk_addr_t sector,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* Send a SCSI request for DISK: write the data stored in BUF to SIZE
|
/* Send a SCSI request for DISK: write the data stored in BUF to SIZE
|
||||||
sectors starting with SECTOR. */
|
sectors starting with SECTOR. */
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_scsi_write10 (grub_disk_t disk, grub_disk_addr_t sector,
|
grub_scsi_write10 (grub_disk_t disk, grub_disk_addr_t sector,
|
||||||
grub_size_t size, char *buf)
|
grub_size_t size, const char *buf)
|
||||||
{
|
{
|
||||||
grub_scsi_t scsi;
|
grub_scsi_t scsi;
|
||||||
struct grub_scsi_write10 wr;
|
struct grub_scsi_write10 wr;
|
||||||
|
@ -287,6 +286,8 @@ grub_scsi_write10 (grub_disk_t disk, grub_disk_addr_t sector,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
|
||||||
/* Send a SCSI request for DISK: write the data stored in BUF to SIZE
|
/* Send a SCSI request for DISK: write the data stored in BUF to SIZE
|
||||||
sectors starting with SECTOR. */
|
sectors starting with SECTOR. */
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
|
@ -595,13 +596,38 @@ grub_scsi_write (grub_disk_t disk __attribute((unused)),
|
||||||
grub_size_t size __attribute((unused)),
|
grub_size_t size __attribute((unused)),
|
||||||
const char *buf __attribute((unused)))
|
const char *buf __attribute((unused)))
|
||||||
{
|
{
|
||||||
#if 0
|
grub_scsi_t scsi;
|
||||||
/* XXX: Not tested yet! */
|
|
||||||
|
|
||||||
/* XXX: This should depend on the device type? */
|
scsi = disk->data;
|
||||||
return grub_scsi_write10 (disk, sector, size, buf);
|
|
||||||
#endif
|
if (scsi->devtype == grub_scsi_devtype_cdrom)
|
||||||
return GRUB_ERR_NOT_IMPLEMENTED_YET;
|
return grub_error (GRUB_ERR_IO, "no CD burning");
|
||||||
|
|
||||||
|
while (size)
|
||||||
|
{
|
||||||
|
/* PATA doesn't support more than 32K reads.
|
||||||
|
Not sure about AHCI and USB. If it's confirmed that either of
|
||||||
|
them can do bigger reads reliably this value can be moved to 'scsi'
|
||||||
|
structure. */
|
||||||
|
grub_size_t len = 32768 >> disk->log_sector_size;
|
||||||
|
grub_err_t err;
|
||||||
|
if (len > size)
|
||||||
|
len = size;
|
||||||
|
/* Depending on the type, select a read function. */
|
||||||
|
switch (scsi->devtype)
|
||||||
|
{
|
||||||
|
case grub_scsi_devtype_direct:
|
||||||
|
err = grub_scsi_write10 (disk, sector, len, buf);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
size -= len;
|
||||||
|
sector += len;
|
||||||
|
buf += len << disk->log_sector_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -388,9 +388,9 @@ grub_usbms_read (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_usbms_write (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
grub_usbms_write (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
||||||
grub_size_t size, char *buf)
|
grub_size_t size, const char *buf)
|
||||||
{
|
{
|
||||||
return grub_usbms_transfer (scsi, cmdsize, cmd, size, buf, 1);
|
return grub_usbms_transfer (scsi, cmdsize, cmd, size, (char *) buf, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
|
|
|
@ -69,7 +69,7 @@ struct grub_scsi_dev
|
||||||
/* Write SIZE bytes from BUF to the device SCSI after sending the
|
/* Write SIZE bytes from BUF to the device SCSI after sending the
|
||||||
command CMD of size CMDSIZE. */
|
command CMD of size CMDSIZE. */
|
||||||
grub_err_t (*write) (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
grub_err_t (*write) (struct grub_scsi *scsi, grub_size_t cmdsize, char *cmd,
|
||||||
grub_size_t size, char *buf);
|
grub_size_t size, const char *buf);
|
||||||
|
|
||||||
/* The next scsi device. */
|
/* The next scsi device. */
|
||||||
struct grub_scsi_dev *next;
|
struct grub_scsi_dev *next;
|
||||||
|
|
Loading…
Reference in a new issue