Important upstream fix for the S3 ViRGE cards.
Some more ZIP driver cleanups and simplifications.
This commit is contained in:
@@ -773,10 +773,8 @@ read_capacity(void *p, uint8_t *cdb, uint8_t *buffer, uint32_t *len)
|
|||||||
zip_t *dev = (zip_t *)p;
|
zip_t *dev = (zip_t *)p;
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
size = (dev->drv->is_250) ? dev->drv->medium_size : ZIP_SECTORS;
|
|
||||||
|
|
||||||
/* IMPORTANT: we return is the last LBA block. */
|
/* IMPORTANT: we return is the last LBA block. */
|
||||||
size--;
|
size = dev->drv->medium_size - 1;
|
||||||
|
|
||||||
memset(buffer, 0, 8);
|
memset(buffer, 0, 8);
|
||||||
buffer[0] = (size >> 24) & 0xff;
|
buffer[0] = (size >> 24) & 0xff;
|
||||||
@@ -840,17 +838,10 @@ mode_sense(zip_t *dev, uint8_t *buf, uint32_t pos, uint8_t page, uint8_t block_d
|
|||||||
pf = (dev->drv->is_250) ? mode_sense_page_flags250 : mode_sense_page_flags;
|
pf = (dev->drv->is_250) ? mode_sense_page_flags250 : mode_sense_page_flags;
|
||||||
|
|
||||||
if (block_descriptor_len) {
|
if (block_descriptor_len) {
|
||||||
if (dev->drv->is_250) {
|
buf[pos++] = ((dev->drv->medium_size >> 24) & 0xff);
|
||||||
buf[pos++] = ((dev->drv->medium_size >> 24) & 0xff);
|
buf[pos++] = ((dev->drv->medium_size >> 16) & 0xff);
|
||||||
buf[pos++] = ((dev->drv->medium_size >> 16) & 0xff);
|
buf[pos++] = ((dev->drv->medium_size >> 8) & 0xff);
|
||||||
buf[pos++] = ((dev->drv->medium_size >> 8) & 0xff);
|
buf[pos++] = ( dev->drv->medium_size & 0xff);
|
||||||
buf[pos++] = ( dev->drv->medium_size & 0xff);
|
|
||||||
} else {
|
|
||||||
buf[pos++] = ((ZIP_SECTORS >> 24) & 0xff);
|
|
||||||
buf[pos++] = ((ZIP_SECTORS >> 16) & 0xff);
|
|
||||||
buf[pos++] = ((ZIP_SECTORS >> 8) & 0xff);
|
|
||||||
buf[pos++] = ( ZIP_SECTORS & 0xff);
|
|
||||||
}
|
|
||||||
buf[pos++] = 0; /* Reserved. */
|
buf[pos++] = 0; /* Reserved. */
|
||||||
buf[pos++] = 0; /* Block length (0x200 = 512 bytes). */
|
buf[pos++] = 0; /* Block length (0x200 = 512 bytes). */
|
||||||
buf[pos++] = 2;
|
buf[pos++] = 2;
|
||||||
@@ -1530,7 +1521,7 @@ zip_command(void *p, uint8_t *cdb)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GPCMD_FORMAT_UNIT:
|
case GPCMD_FORMAT_UNIT:
|
||||||
if ((dev->drv->bus_type == ZIP_BUS_SCSI) && dev->drv->read_only) {
|
if (dev->drv->read_only) {
|
||||||
write_protected(dev);
|
write_protected(dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1696,7 +1687,7 @@ zip_command(void *p, uint8_t *cdb)
|
|||||||
set_phase(dev, SCSI_PHASE_DATA_OUT);
|
set_phase(dev, SCSI_PHASE_DATA_OUT);
|
||||||
alloc_length = 512;
|
alloc_length = 512;
|
||||||
|
|
||||||
if ((dev->drv->bus_type == ZIP_BUS_SCSI) && dev->drv->read_only) {
|
if (dev->drv->read_only) {
|
||||||
write_protected(dev);
|
write_protected(dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1724,18 +1715,10 @@ zip_command(void *p, uint8_t *cdb)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev->drv->is_250) {
|
if ((dev->sector_pos >= dev->drv->medium_size) ||
|
||||||
if ((dev->sector_pos >= dev->drv->medium_size) ||
|
((dev->sector_pos + dev->sector_len - 1) >= dev->drv->medium_size)) {
|
||||||
((dev->sector_pos + dev->sector_len - 1) >= dev->drv->medium_size)) {
|
lba_out_of_range(dev);
|
||||||
lba_out_of_range(dev);
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((dev->sector_pos >= ZIP_SECTORS) ||
|
|
||||||
((dev->sector_pos + dev->sector_len - 1) >= ZIP_SECTORS)) {
|
|
||||||
lba_out_of_range(dev);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! dev->sector_len) {
|
if (! dev->sector_len) {
|
||||||
@@ -1782,7 +1765,7 @@ zip_command(void *p, uint8_t *cdb)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((dev->drv->bus_type == ZIP_BUS_SCSI) && dev->drv->read_only) {
|
if (dev->drv->read_only) {
|
||||||
write_protected(dev);
|
write_protected(dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1790,18 +1773,10 @@ zip_command(void *p, uint8_t *cdb)
|
|||||||
dev->sector_len = (cdb[7] << 8) | cdb[8];
|
dev->sector_len = (cdb[7] << 8) | cdb[8];
|
||||||
dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
|
dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
|
||||||
|
|
||||||
if (dev->drv->is_250) {
|
if ((dev->sector_pos >= dev->drv->medium_size) ||
|
||||||
if ((dev->sector_pos >= dev->drv->medium_size) ||
|
((dev->sector_pos + dev->sector_len - 1) >= dev->drv->medium_size)) {
|
||||||
((dev->sector_pos + dev->sector_len - 1) >= dev->drv->medium_size)) {
|
lba_out_of_range(dev);
|
||||||
lba_out_of_range(dev);
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((dev->sector_pos >= ZIP_SECTORS) ||
|
|
||||||
((dev->sector_pos + dev->sector_len - 1) >= ZIP_SECTORS)) {
|
|
||||||
lba_out_of_range(dev);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! dev->sector_len) {
|
if (! dev->sector_len) {
|
||||||
@@ -2106,6 +2081,11 @@ atapi_out:
|
|||||||
|
|
||||||
/* Current/Maximum capacity header */
|
/* Current/Maximum capacity header */
|
||||||
if (dev->drv->is_250) {
|
if (dev->drv->is_250) {
|
||||||
|
/*
|
||||||
|
* ZIP 250 also supports ZIP 100 media, so if the
|
||||||
|
* medium is inserted, we return the inserted
|
||||||
|
* medium's size, otherwise, the ZIP 250 size.
|
||||||
|
*/
|
||||||
if (dev->drv->f != NULL) {
|
if (dev->drv->f != NULL) {
|
||||||
dev->buffer[pos++] = (dev->drv->medium_size >> 24) & 0xff;
|
dev->buffer[pos++] = (dev->drv->medium_size >> 24) & 0xff;
|
||||||
dev->buffer[pos++] = (dev->drv->medium_size >> 16) & 0xff;
|
dev->buffer[pos++] = (dev->drv->medium_size >> 16) & 0xff;
|
||||||
@@ -2120,6 +2100,10 @@ atapi_out:
|
|||||||
dev->buffer[pos++] = 3; /* Maximum medium capacity */
|
dev->buffer[pos++] = 3; /* Maximum medium capacity */
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
/*
|
||||||
|
* ZIP 100 only supports ZIP 100 media, so we
|
||||||
|
* always return the ZIP 100 size.
|
||||||
|
*/
|
||||||
dev->buffer[pos++] = (ZIP_SECTORS >> 24) & 0xff;
|
dev->buffer[pos++] = (ZIP_SECTORS >> 24) & 0xff;
|
||||||
dev->buffer[pos++] = (ZIP_SECTORS >> 16) & 0xff;
|
dev->buffer[pos++] = (ZIP_SECTORS >> 16) & 0xff;
|
||||||
dev->buffer[pos++] = (ZIP_SECTORS >> 8) & 0xff;
|
dev->buffer[pos++] = (ZIP_SECTORS >> 8) & 0xff;
|
||||||
@@ -2195,10 +2179,7 @@ phase_data_out(zip_t *dev)
|
|||||||
|
|
||||||
case GPCMD_WRITE_SAME_10:
|
case GPCMD_WRITE_SAME_10:
|
||||||
if (!dev->current_cdb[7] && !dev->current_cdb[8]) {
|
if (!dev->current_cdb[7] && !dev->current_cdb[8]) {
|
||||||
if (dev->drv->is_250)
|
last_to_write = (dev->drv->medium_size - 1);
|
||||||
last_to_write = (dev->drv->medium_size - 1);
|
|
||||||
else
|
|
||||||
last_to_write = (ZIP_SECTORS - 1);
|
|
||||||
} else
|
} else
|
||||||
last_to_write = dev->sector_pos + dev->sector_len - 1;
|
last_to_write = dev->sector_pos + dev->sector_len - 1;
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* S3 ViRGE emulation.
|
* S3 ViRGE emulation.
|
||||||
*
|
*
|
||||||
* Version: @(#)vid_s3_virge.c 1.0.13 2018/10/08
|
* Version: @(#)vid_s3_virge.c 1.0.14 2018/10/26
|
||||||
*
|
*
|
||||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -638,7 +638,7 @@ static void s3_virge_recalctimings(svga_t *svga)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virge->chip == S3_VIRGEVX)
|
if (virge->chip != S3_VIRGEVX)
|
||||||
{
|
{
|
||||||
if ((svga->bpp == 15) || (svga->bpp == 16))
|
if ((svga->bpp == 15) || (svga->bpp == 16))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user