Fixed all the signedness, non-constant initializer, and shadowed variable warnings in disk/zip.c and scsi/scsi_disk.c.
This commit is contained in:
@@ -9,7 +9,7 @@
|
|||||||
* Implementation of the Iomega ZIP drive with SCSI(-like)
|
* Implementation of the Iomega ZIP drive with SCSI(-like)
|
||||||
* commands, for both ATAPI and SCSI usage.
|
* commands, for both ATAPI and SCSI usage.
|
||||||
*
|
*
|
||||||
* Version: @(#)zip.c 1.0.21 2018/05/28
|
* Version: @(#)zip.c 1.0.22 2018/09/12
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -129,13 +129,15 @@ const uint8_t zip_command_flags[0x100] =
|
|||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
static uint64_t zip_mode_sense_page_flags = (1LL << GPMODE_R_W_ERROR_PAGE) |
|
static uint64_t zip_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE |
|
||||||
(1LL << 0x02LL) | (1LL << 0x2FLL) |
|
GPMODEP_UNK_PAGE_02 |
|
||||||
(1LL << GPMODE_ALL_PAGES);
|
GPMODEP_UNK_PAGE_2F |
|
||||||
static uint64_t zip_250_mode_sense_page_flags = (1LL << GPMODE_R_W_ERROR_PAGE) |
|
GPMODEP_ALL_PAGES);
|
||||||
(1LL << 0x05LL) | (1LL << 0x08LL) |
|
static uint64_t zip_250_mode_sense_page_flags = (GPMODEP_R_W_ERROR_PAGE |
|
||||||
(1LL << 0x2FLL) |
|
GPMODEP_UNK_PAGE_05 |
|
||||||
(1LL << GPMODE_ALL_PAGES);
|
GPMODEP_UNK_PAGE_08 |
|
||||||
|
GPMODEP_UNK_PAGE_2F |
|
||||||
|
GPMODEP_ALL_PAGES);
|
||||||
|
|
||||||
|
|
||||||
static const mode_sense_pages_t zip_mode_sense_pages_default =
|
static const mode_sense_pages_t zip_mode_sense_pages_default =
|
||||||
@@ -854,13 +856,13 @@ zip_mode_sense_read(zip_t *dev, uint8_t page_control, uint8_t page, uint8_t pos)
|
|||||||
static uint32_t
|
static uint32_t
|
||||||
zip_mode_sense(zip_t *dev, uint8_t *buf, uint32_t pos, uint8_t type, uint8_t block_descriptor_len)
|
zip_mode_sense(zip_t *dev, uint8_t *buf, uint32_t pos, uint8_t type, uint8_t block_descriptor_len)
|
||||||
{
|
{
|
||||||
uint64_t page_flags;
|
uint64_t pf;
|
||||||
uint8_t page_control = (type >> 6) & 3;
|
uint8_t page_control = (type >> 6) & 3;
|
||||||
|
|
||||||
if (dev->drv->is_250)
|
if (dev->drv->is_250)
|
||||||
page_flags = zip_250_mode_sense_page_flags;
|
pf = zip_250_mode_sense_page_flags;
|
||||||
else
|
else
|
||||||
page_flags = zip_mode_sense_page_flags;
|
pf = zip_mode_sense_page_flags;
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int j = 0;
|
int j = 0;
|
||||||
@@ -889,7 +891,7 @@ zip_mode_sense(zip_t *dev, uint8_t *buf, uint32_t pos, uint8_t type, uint8_t blo
|
|||||||
|
|
||||||
for (i = 0; i < 0x40; i++) {
|
for (i = 0; i < 0x40; i++) {
|
||||||
if ((type == GPMODE_ALL_PAGES) || (type == i)) {
|
if ((type == GPMODE_ALL_PAGES) || (type == i)) {
|
||||||
if (page_flags & (1LL << dev->current_page_code)) {
|
if (pf & (1LL << dev->current_page_code)) {
|
||||||
buf[pos++] = zip_mode_sense_read(dev, page_control, i, 0);
|
buf[pos++] = zip_mode_sense_read(dev, page_control, i, 0);
|
||||||
msplen = zip_mode_sense_read(dev, page_control, i, 1);
|
msplen = zip_mode_sense_read(dev, page_control, i, 1);
|
||||||
buf[pos++] = msplen;
|
buf[pos++] = msplen;
|
||||||
@@ -907,7 +909,7 @@ zip_mode_sense(zip_t *dev, uint8_t *buf, uint32_t pos, uint8_t type, uint8_t blo
|
|||||||
static void
|
static void
|
||||||
zip_update_request_length(zip_t *dev, int len, int block_len)
|
zip_update_request_length(zip_t *dev, int len, int block_len)
|
||||||
{
|
{
|
||||||
uint32_t bt, min_len = 0;
|
int bt, min_len = 0;
|
||||||
|
|
||||||
dev->max_transfer_len = dev->request_length;
|
dev->max_transfer_len = dev->request_length;
|
||||||
|
|
||||||
@@ -1227,7 +1229,7 @@ zip_data_phase_error(zip_t *dev)
|
|||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
zip_blocks(zip_t *dev, uint32_t *len, int first_batch, int out)
|
zip_blocks(zip_t *dev, int32_t *len, int first_batch, int out)
|
||||||
{
|
{
|
||||||
dev->data_pos = 0;
|
dev->data_pos = 0;
|
||||||
|
|
||||||
@@ -1447,7 +1449,7 @@ zip_request_sense_for_scsi(zip_t *dev, uint8_t *buffer, uint8_t alloc_length)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
zip_set_buf_len(zip_t *dev, int32_t *BufLen, uint32_t *src_len)
|
zip_set_buf_len(zip_t *dev, int32_t *BufLen, int32_t *src_len)
|
||||||
{
|
{
|
||||||
if (dev->drv->bus_type == ZIP_BUS_SCSI) {
|
if (dev->drv->bus_type == ZIP_BUS_SCSI) {
|
||||||
if (*BufLen == -1)
|
if (*BufLen == -1)
|
||||||
@@ -1485,9 +1487,10 @@ zip_command(zip_t *dev, uint8_t *cdb)
|
|||||||
{
|
{
|
||||||
int pos = 0, block_desc = 0;
|
int pos = 0, block_desc = 0;
|
||||||
int ret;
|
int ret;
|
||||||
uint32_t len, max_len;
|
int32_t len, max_len;
|
||||||
uint32_t alloc_length, i = 0;
|
int32_t alloc_length;
|
||||||
unsigned size_idx, idx = 0;
|
uint32_t i = 0;
|
||||||
|
int size_idx, idx = 0;
|
||||||
unsigned preamble_len;
|
unsigned preamble_len;
|
||||||
int32_t blen = 0;
|
int32_t blen = 0;
|
||||||
int32_t *BufLen;
|
int32_t *BufLen;
|
||||||
@@ -1660,7 +1663,7 @@ zip_command(zip_t *dev, uint8_t *cdb)
|
|||||||
dev->requested_blocks = max_len;
|
dev->requested_blocks = max_len;
|
||||||
dev->packet_len = alloc_length;
|
dev->packet_len = alloc_length;
|
||||||
|
|
||||||
zip_set_buf_len(dev, BufLen, &dev->packet_len);
|
zip_set_buf_len(dev, BufLen, (int32_t *) &dev->packet_len);
|
||||||
|
|
||||||
zip_data_command_finish(dev, alloc_length, 512, alloc_length, 0);
|
zip_data_command_finish(dev, alloc_length, 512, alloc_length, 0);
|
||||||
|
|
||||||
@@ -1747,7 +1750,7 @@ zip_command(zip_t *dev, uint8_t *cdb)
|
|||||||
dev->requested_blocks = max_len;
|
dev->requested_blocks = max_len;
|
||||||
dev->packet_len = max_len << 9;
|
dev->packet_len = max_len << 9;
|
||||||
|
|
||||||
zip_set_buf_len(dev, BufLen, &dev->packet_len);
|
zip_set_buf_len(dev, BufLen, (int32_t *) &dev->packet_len);
|
||||||
|
|
||||||
zip_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1);
|
zip_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1);
|
||||||
|
|
||||||
@@ -1809,7 +1812,7 @@ zip_command(zip_t *dev, uint8_t *cdb)
|
|||||||
dev->requested_blocks = max_len;
|
dev->requested_blocks = max_len;
|
||||||
dev->packet_len = alloc_length;
|
dev->packet_len = alloc_length;
|
||||||
|
|
||||||
zip_set_buf_len(dev, BufLen, &dev->packet_len);
|
zip_set_buf_len(dev, BufLen, (int32_t *) &dev->packet_len);
|
||||||
|
|
||||||
zip_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1);
|
zip_data_command_finish(dev, dev->packet_len, 512, dev->packet_len, 1);
|
||||||
|
|
||||||
@@ -2059,7 +2062,7 @@ atapi_out:
|
|||||||
|
|
||||||
zip_buf_alloc(dev, 8);
|
zip_buf_alloc(dev, 8);
|
||||||
|
|
||||||
if (zip_read_capacity(dev, dev->current_cdb, zipbufferb, &len) == 0) {
|
if (zip_read_capacity(dev, dev->current_cdb, zipbufferb, (uint32_t *) &len) == 0) {
|
||||||
zip_buf_free(dev);
|
zip_buf_free(dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -2165,9 +2168,11 @@ zip_phase_data_out(zip_t *dev)
|
|||||||
|
|
||||||
uint8_t hdr_len, val, old_val, ch;
|
uint8_t hdr_len, val, old_val, ch;
|
||||||
|
|
||||||
uint32_t last_to_write = 0, len = 0;
|
uint32_t last_to_write = 0;
|
||||||
uint32_t c, h, s;
|
uint32_t c, h, s;
|
||||||
|
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
switch(dev->current_cdb[0]) {
|
switch(dev->current_cdb[0]) {
|
||||||
case GPCMD_VERIFY_6:
|
case GPCMD_VERIFY_6:
|
||||||
case GPCMD_VERIFY_10:
|
case GPCMD_VERIFY_10:
|
||||||
|
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* SCSI controller handler header.
|
* SCSI controller handler header.
|
||||||
*
|
*
|
||||||
* Version: @(#)scsi_h 1.0.17 2018/06/02
|
* Version: @(#)scsi_h 1.0.18 2018/09/12
|
||||||
*
|
*
|
||||||
* Authors: TheCollector1995, <mariogplayer@gmail.com>
|
* Authors: TheCollector1995, <mariogplayer@gmail.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -105,9 +105,16 @@
|
|||||||
|
|
||||||
/* Mode page codes for presence */
|
/* Mode page codes for presence */
|
||||||
#define GPMODEP_R_W_ERROR_PAGE 0x0000000000000002LL
|
#define GPMODEP_R_W_ERROR_PAGE 0x0000000000000002LL
|
||||||
|
#define GPMODEP_UNK_PAGE_02 0x0000000000000004LL
|
||||||
|
#define GPMODEP_UNK_PAGE_03 0x0000000000000008LL
|
||||||
|
#define GPMODEP_UNK_PAGE_04 0x0000000000000010LL
|
||||||
|
#define GPMODEP_UNK_PAGE_05 0x0000000000000020LL
|
||||||
|
#define GPMODEP_UNK_PAGE_08 0x0000000000000100LL
|
||||||
#define GPMODEP_CDROM_PAGE 0x0000000000002000LL
|
#define GPMODEP_CDROM_PAGE 0x0000000000002000LL
|
||||||
#define GPMODEP_CDROM_AUDIO_PAGE 0x0000000000004000LL
|
#define GPMODEP_CDROM_AUDIO_PAGE 0x0000000000004000LL
|
||||||
#define GPMODEP_CAPABILITIES_PAGE 0x0000040000000000LL
|
#define GPMODEP_CAPABILITIES_PAGE 0x0000040000000000LL
|
||||||
|
#define GPMODEP_UNK_PAGE_2F 0x0000800000000000LL
|
||||||
|
#define GPMODEP_UNK_PAGE_30 0x0001000000000000LL
|
||||||
#define GPMODEP_ALL_PAGES 0x8000000000000000LL
|
#define GPMODEP_ALL_PAGES 0x8000000000000000LL
|
||||||
|
|
||||||
/* SCSI Status Codes */
|
/* SCSI Status Codes */
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Emulation of SCSI fixed disks.
|
* Emulation of SCSI fixed disks.
|
||||||
*
|
*
|
||||||
* Version: @(#)scsi_disk.c 1.0.20 2018/05/28
|
* Version: @(#)scsi_disk.c 1.0.21 2018/09/12
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -126,7 +126,10 @@ const uint8_t scsi_disk_command_flags[0x100] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
uint64_t scsi_disk_mode_sense_page_flags = (1LL << 0x03) | (1LL << 0x04) | (1LL << 0x30) | (1LL << 0x3F);
|
uint64_t scsi_disk_mode_sense_page_flags = (GPMODEP_UNK_PAGE_03 |
|
||||||
|
GPMODEP_UNK_PAGE_04 |
|
||||||
|
GPMODEP_UNK_PAGE_30 |
|
||||||
|
GPMODEP_ALL_PAGES);
|
||||||
|
|
||||||
/* This should be done in a better way but for time being, it's been done this way so it's not as huge and more readable. */
|
/* This should be done in a better way but for time being, it's been done this way so it's not as huge and more readable. */
|
||||||
static const mode_sense_pages_t scsi_disk_mode_sense_pages_default =
|
static const mode_sense_pages_t scsi_disk_mode_sense_pages_default =
|
||||||
@@ -572,16 +575,29 @@ scsi_disk_request_sense_for_scsi(scsi_disk_t *dev, uint8_t *buffer, uint8_t allo
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
scsi_disk_set_buf_len(scsi_disk_t *dev, int32_t *BufLen, int32_t *src_len)
|
||||||
|
{
|
||||||
|
if (*BufLen == -1)
|
||||||
|
*BufLen = *src_len;
|
||||||
|
else {
|
||||||
|
*BufLen = MIN(*src_len, *BufLen);
|
||||||
|
*src_len = *BufLen;
|
||||||
|
}
|
||||||
|
scsi_disk_log("SCSI HD %i: Actual transfer length: %i\n", dev->id, *BufLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb)
|
scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb)
|
||||||
{
|
{
|
||||||
uint8_t *hdbufferb;
|
uint8_t *hdbufferb;
|
||||||
int32_t *BufLen;
|
int32_t *BufLen;
|
||||||
uint32_t len;
|
int32_t len, max_len, alloc_length;
|
||||||
int max_len, pos = 0;
|
int pos = 0;
|
||||||
unsigned idx = 0;
|
int idx = 0;
|
||||||
unsigned size_idx, preamble_len;
|
unsigned size_idx, preamble_len;
|
||||||
uint32_t alloc_length, last_sector = 0;
|
uint32_t last_sector = 0;
|
||||||
char device_identify[9] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', 0 };
|
char device_identify[9] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', 0 };
|
||||||
char device_identify_ex[15] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 };
|
char device_identify_ex[15] = { '8', '6', 'B', '_', 'H', 'D', '0', '0', ' ', 'v', '1', '.', '0', '0', 0 };
|
||||||
int block_desc = 0;
|
int block_desc = 0;
|
||||||
@@ -646,8 +662,8 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb)
|
|||||||
case GPCMD_REQUEST_SENSE:
|
case GPCMD_REQUEST_SENSE:
|
||||||
/* If there's a unit attention condition and there's a buffered not ready, a standalone REQUEST SENSE
|
/* If there's a unit attention condition and there's a buffered not ready, a standalone REQUEST SENSE
|
||||||
should forget about the not ready, and report unit attention straight away. */
|
should forget about the not ready, and report unit attention straight away. */
|
||||||
if ((*BufLen == -1) || (cdb[4] < *BufLen))
|
len = cdb[4];
|
||||||
*BufLen = cdb[4];
|
scsi_disk_set_buf_len(dev, BufLen, &len);
|
||||||
|
|
||||||
if (*BufLen < cdb[4])
|
if (*BufLen < cdb[4])
|
||||||
cdb[4] = *BufLen;
|
cdb[4] = *BufLen;
|
||||||
@@ -660,10 +676,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb)
|
|||||||
|
|
||||||
case GPCMD_MECHANISM_STATUS:
|
case GPCMD_MECHANISM_STATUS:
|
||||||
len = (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
|
len = (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
|
||||||
|
scsi_disk_set_buf_len(dev, BufLen, &len);
|
||||||
if ((*BufLen == -1) || (len < *BufLen))
|
|
||||||
*BufLen = len;
|
|
||||||
|
|
||||||
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN);
|
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||||
scsi_disk_data_command_finish(dev, 8, 8, len, 0);
|
scsi_disk_data_command_finish(dev, 8, 8, len, 0);
|
||||||
break;
|
break;
|
||||||
@@ -704,9 +717,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb)
|
|||||||
|
|
||||||
alloc_length = dev->packet_len = max_len << 9;
|
alloc_length = dev->packet_len = max_len << 9;
|
||||||
|
|
||||||
if ((*BufLen == -1) || (alloc_length < *BufLen))
|
scsi_disk_set_buf_len(dev, BufLen, &alloc_length);
|
||||||
*BufLen = alloc_length;
|
|
||||||
|
|
||||||
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN);
|
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||||
|
|
||||||
if (dev->requested_blocks > 1)
|
if (dev->requested_blocks > 1)
|
||||||
@@ -770,9 +781,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb)
|
|||||||
|
|
||||||
alloc_length = dev->packet_len = max_len << 9;
|
alloc_length = dev->packet_len = max_len << 9;
|
||||||
|
|
||||||
if ((*BufLen == -1) || (alloc_length < *BufLen))
|
scsi_disk_set_buf_len(dev, BufLen, &alloc_length);
|
||||||
*BufLen = alloc_length;
|
|
||||||
|
|
||||||
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_OUT);
|
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_OUT);
|
||||||
|
|
||||||
if (dev->requested_blocks > 1)
|
if (dev->requested_blocks > 1)
|
||||||
@@ -810,9 +819,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb)
|
|||||||
|
|
||||||
alloc_length = dev->packet_len = max_len << 9;
|
alloc_length = dev->packet_len = max_len << 9;
|
||||||
|
|
||||||
if ((*BufLen == -1) || (alloc_length < *BufLen))
|
scsi_disk_set_buf_len(dev, BufLen, &alloc_length);
|
||||||
*BufLen = alloc_length;
|
|
||||||
|
|
||||||
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_OUT);
|
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_OUT);
|
||||||
|
|
||||||
if (dev->requested_blocks > 1)
|
if (dev->requested_blocks > 1)
|
||||||
@@ -865,9 +872,7 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb)
|
|||||||
else if (len < alloc_length)
|
else if (len < alloc_length)
|
||||||
alloc_length = len;
|
alloc_length = len;
|
||||||
|
|
||||||
if ((*BufLen == -1) || (alloc_length < *BufLen))
|
scsi_disk_set_buf_len(dev, BufLen, &alloc_length);
|
||||||
*BufLen = alloc_length;
|
|
||||||
|
|
||||||
scsi_disk_log("SCSI HDD %i: Reading mode page: %02X...\n", dev->id, cdb[2]);
|
scsi_disk_log("SCSI HDD %i: Reading mode page: %02X...\n", dev->id, cdb[2]);
|
||||||
|
|
||||||
scsi_disk_data_command_finish(dev, len, len, alloc_length, 0);
|
scsi_disk_data_command_finish(dev, len, len, alloc_length, 0);
|
||||||
@@ -882,12 +887,9 @@ scsi_disk_command(scsi_disk_t *dev, uint8_t *cdb)
|
|||||||
else
|
else
|
||||||
len = (cdb[7] << 8) | cdb[8];
|
len = (cdb[7] << 8) | cdb[8];
|
||||||
|
|
||||||
if ((*BufLen == -1) || (len < *BufLen))
|
scsi_disk_set_buf_len(dev, BufLen, &len);
|
||||||
*BufLen = len;
|
|
||||||
|
|
||||||
dev->total_length = len;
|
dev->total_length = len;
|
||||||
dev->do_page_save = cdb[1] & 1;
|
dev->do_page_save = cdb[1] & 1;
|
||||||
|
|
||||||
scsi_disk_data_command_finish(dev, len, len, len, 1);
|
scsi_disk_data_command_finish(dev, len, len, len, 1);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -989,8 +991,7 @@ atapi_out:
|
|||||||
if (len > max_len)
|
if (len > max_len)
|
||||||
len = max_len;
|
len = max_len;
|
||||||
|
|
||||||
if ((*BufLen == -1) || (len < *BufLen))
|
scsi_disk_set_buf_len(dev, BufLen, &len);
|
||||||
*BufLen = len;
|
|
||||||
|
|
||||||
if (len > *BufLen)
|
if (len > *BufLen)
|
||||||
len = *BufLen;
|
len = *BufLen;
|
||||||
@@ -1023,13 +1024,12 @@ atapi_out:
|
|||||||
case GPCMD_READ_CDROM_CAPACITY:
|
case GPCMD_READ_CDROM_CAPACITY:
|
||||||
dev->temp_buffer = (uint8_t *) malloc(8);
|
dev->temp_buffer = (uint8_t *) malloc(8);
|
||||||
|
|
||||||
if (scsi_disk_read_capacity(dev, dev->current_cdb, dev->temp_buffer, &len) == 0) {
|
if (scsi_disk_read_capacity(dev, dev->current_cdb, dev->temp_buffer, (uint32_t *) &len) == 0) {
|
||||||
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
|
scsi_disk_set_phase(dev, SCSI_PHASE_STATUS);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*BufLen == -1) || (len < *BufLen))
|
scsi_disk_set_buf_len(dev, BufLen, &len);
|
||||||
*BufLen = len;
|
|
||||||
|
|
||||||
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN);
|
scsi_disk_set_phase(dev, SCSI_PHASE_DATA_IN);
|
||||||
scsi_disk_data_command_finish(dev, len, len, len, 0);
|
scsi_disk_data_command_finish(dev, len, len, len, 0);
|
||||||
@@ -1070,7 +1070,7 @@ scsi_disk_phase_data_in(scsi_disk_t *dev)
|
|||||||
case GPCMD_READ_10:
|
case GPCMD_READ_10:
|
||||||
case GPCMD_READ_12:
|
case GPCMD_READ_12:
|
||||||
if ((dev->requested_blocks > 0) && (*BufLen > 0)) {
|
if ((dev->requested_blocks > 0) && (*BufLen > 0)) {
|
||||||
if (dev->packet_len > *BufLen)
|
if (dev->packet_len > (uint32_t) *BufLen)
|
||||||
hdd_image_read(dev->id, dev->sector_pos, *BufLen >> 9, hdbufferb);
|
hdd_image_read(dev->id, dev->sector_pos, *BufLen >> 9, hdbufferb);
|
||||||
else
|
else
|
||||||
hdd_image_read(dev->id, dev->sector_pos, dev->requested_blocks, hdbufferb);
|
hdd_image_read(dev->id, dev->sector_pos, dev->requested_blocks, hdbufferb);
|
||||||
@@ -1126,7 +1126,7 @@ scsi_disk_phase_data_out(scsi_disk_t *dev)
|
|||||||
case GPCMD_WRITE_12:
|
case GPCMD_WRITE_12:
|
||||||
case GPCMD_WRITE_AND_VERIFY_12:
|
case GPCMD_WRITE_AND_VERIFY_12:
|
||||||
if ((dev->requested_blocks > 0) && (*BufLen > 0)) {
|
if ((dev->requested_blocks > 0) && (*BufLen > 0)) {
|
||||||
if (dev->packet_len > *BufLen)
|
if (dev->packet_len > (uint32_t) *BufLen)
|
||||||
hdd_image_write(dev->id, dev->sector_pos, *BufLen >> 9, hdbufferb);
|
hdd_image_write(dev->id, dev->sector_pos, *BufLen >> 9, hdbufferb);
|
||||||
else
|
else
|
||||||
hdd_image_write(dev->id, dev->sector_pos, dev->requested_blocks, hdbufferb);
|
hdd_image_write(dev->id, dev->sector_pos, dev->requested_blocks, hdbufferb);
|
||||||
@@ -1138,7 +1138,7 @@ scsi_disk_phase_data_out(scsi_disk_t *dev)
|
|||||||
else
|
else
|
||||||
last_to_write = dev->sector_pos + dev->sector_len - 1;
|
last_to_write = dev->sector_pos + dev->sector_len - 1;
|
||||||
|
|
||||||
for (i = dev->sector_pos; i <= last_to_write; i++) {
|
for (i = dev->sector_pos; i <= (int) last_to_write; i++) {
|
||||||
if (dev->current_cdb[1] & 2) {
|
if (dev->current_cdb[1] & 2) {
|
||||||
hdbufferb[0] = (i >> 24) & 0xff;
|
hdbufferb[0] = (i >> 24) & 0xff;
|
||||||
hdbufferb[1] = (i >> 16) & 0xff;
|
hdbufferb[1] = (i >> 16) & 0xff;
|
||||||
|
Reference in New Issue
Block a user