SCSI cleanup and finishing of the AHA-1640 driver. Boots fine, fully auto-config through MCA.
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
# Modified Makefile for Win32 (MinGW32) environment.
|
# Modified Makefile for Win32 (MinGW32) environment.
|
||||||
#
|
#
|
||||||
# Version: @(#)Makefile.mingw 1.0.39 2017/08/26
|
# Version: @(#)Makefile.mingw 1.0.40 2017/08/27
|
||||||
#
|
#
|
||||||
# Authors: Miran Grca, <mgrca8@gmail.com>
|
# Authors: Miran Grca, <mgrca8@gmail.com>
|
||||||
# Fred N. van Kempen, <decwiz@yahoo.com>
|
# Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
@@ -28,7 +28,9 @@ STUFF =
|
|||||||
# -DANSI_CFG forces the config file to ANSI encoding.
|
# -DANSI_CFG forces the config file to ANSI encoding.
|
||||||
# -DENABLE_VRAM_DUMP enables Video Ram dumping.
|
# -DENABLE_VRAM_DUMP enables Video Ram dumping.
|
||||||
# -DENABLE_LOG_BREAKPOINT enables extra logging.
|
# -DENABLE_LOG_BREAKPOINT enables extra logging.
|
||||||
# -DENABLE_BUSLOGIC_LOG enables extra logging.
|
# -DENABLE_SCSI_BIOS_COMMAND_LOG=n enables extra logging.
|
||||||
|
# -DENABLE_AHA154X_LOG=n enables extra logging.
|
||||||
|
# -DENABLE_BUSLOGIC_LOG=n enables extra logging.
|
||||||
# -DENABLE_CDROM_LOG enables extra logging.
|
# -DENABLE_CDROM_LOG enables extra logging.
|
||||||
# -DENABLE_D86F_LOG enables extra logging.
|
# -DENABLE_D86F_LOG enables extra logging.
|
||||||
# -DENABLE_FDC_LOG enables extra logging.
|
# -DENABLE_FDC_LOG enables extra logging.
|
||||||
|
|||||||
@@ -8,12 +8,11 @@
|
|||||||
*
|
*
|
||||||
* Handling of the SCSI controllers.
|
* Handling of the SCSI controllers.
|
||||||
*
|
*
|
||||||
* Version: @(#)scsi.c 1.0.2 2017/08/23
|
* Version: @(#)scsi.c 1.0.3 2017/08/27
|
||||||
*
|
*
|
||||||
* Authors: TheCollector1995, <mariogplayer@gmail.com>
|
* Authors: TheCollector1995, <mariogplayer@gmail.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Copyright 2008-2017 TheCollector1995.
|
|
||||||
* Copyright 2016,2017 Miran Grca.
|
* Copyright 2016,2017 Miran Grca.
|
||||||
* Copyright 2017 Fred N. van Kempen.
|
* Copyright 2017 Fred N. van Kempen.
|
||||||
*/
|
*/
|
||||||
@@ -29,6 +28,7 @@
|
|||||||
#include "scsi_buslogic.h"
|
#include "scsi_buslogic.h"
|
||||||
|
|
||||||
|
|
||||||
|
scsi_device_t SCSIDevices[SCSI_ID_MAX][SCSI_LUN_MAX];
|
||||||
uint8_t SCSIPhase = SCSI_PHASE_BUS_FREE;
|
uint8_t SCSIPhase = SCSI_PHASE_BUS_FREE;
|
||||||
uint8_t SCSIStatus = SCSI_STATUS_OK;
|
uint8_t SCSIStatus = SCSI_STATUS_OK;
|
||||||
uint8_t scsi_cdrom_id = 3; /*common setting*/
|
uint8_t scsi_cdrom_id = 3; /*common setting*/
|
||||||
@@ -116,18 +116,13 @@ void scsi_card_init(void)
|
|||||||
pclog("Building SCSI CD-ROM map...\n");
|
pclog("Building SCSI CD-ROM map...\n");
|
||||||
build_scsi_cdrom_map();
|
build_scsi_cdrom_map();
|
||||||
|
|
||||||
for (i=0; i<16; i++)
|
for (i=0; i<SCSI_ID_MAX; i++) {
|
||||||
{
|
for (j=0; j<SCSI_LUN_MAX; j++) {
|
||||||
for (j=0; j<8; j++)
|
|
||||||
{
|
|
||||||
if (scsi_hard_disks[i][j] != 0xff) {
|
if (scsi_hard_disks[i][j] != 0xff) {
|
||||||
SCSIDevices[i][j].LunType = SCSI_DISK;
|
SCSIDevices[i][j].LunType = SCSI_DISK;
|
||||||
}
|
} else if (scsi_cdrom_drives[i][j] != 0xff) {
|
||||||
else if (scsi_cdrom_drives[i][j] != 0xff) {
|
|
||||||
SCSIDevices[i][j].LunType = SCSI_CDROM;
|
SCSIDevices[i][j].LunType = SCSI_CDROM;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
SCSIDevices[i][j].LunType = SCSI_NONE;
|
SCSIDevices[i][j].LunType = SCSI_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -144,13 +139,10 @@ void scsi_card_reset(void)
|
|||||||
{
|
{
|
||||||
void *p = NULL;
|
void *p = NULL;
|
||||||
|
|
||||||
if (scsi_cards[scsi_card_current].device)
|
if (scsi_cards[scsi_card_current].device) {
|
||||||
{
|
|
||||||
p = device_get_priv(scsi_cards[scsi_card_current].device);
|
p = device_get_priv(scsi_cards[scsi_card_current].device);
|
||||||
if (p)
|
if (p) {
|
||||||
{
|
if (scsi_cards[scsi_card_current].reset) {
|
||||||
if (scsi_cards[scsi_card_current].reset)
|
|
||||||
{
|
|
||||||
scsi_cards[scsi_card_current].reset(p);
|
scsi_cards[scsi_card_current].reset(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -168,19 +160,15 @@ void SCSIReset(uint8_t id, uint8_t lun)
|
|||||||
scsi_hd_reset(cdrom_id);
|
scsi_hd_reset(cdrom_id);
|
||||||
SCSIDevices[id][lun].LunType = SCSI_DISK;
|
SCSIDevices[id][lun].LunType = SCSI_DISK;
|
||||||
} else {
|
} else {
|
||||||
if (cdrom_id != 0xff)
|
if (cdrom_id != 0xff) {
|
||||||
{
|
|
||||||
cdrom_reset(cdrom_id);
|
cdrom_reset(cdrom_id);
|
||||||
SCSIDevices[id][lun].LunType = SCSI_CDROM;
|
SCSIDevices[id][lun].LunType = SCSI_CDROM;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
SCSIDevices[id][lun].LunType = SCSI_NONE;
|
SCSIDevices[id][lun].LunType = SCSI_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(SCSIDevices[id][lun].CmdBuffer != NULL)
|
if (SCSIDevices[id][lun].CmdBuffer != NULL) {
|
||||||
{
|
|
||||||
free(SCSIDevices[id][lun].CmdBuffer);
|
free(SCSIDevices[id][lun].CmdBuffer);
|
||||||
SCSIDevices[id][lun].CmdBuffer = NULL;
|
SCSIDevices[id][lun].CmdBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
190
src/scsi/scsi.h
190
src/scsi/scsi.h
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* SCSI controller handler header.
|
* SCSI controller handler header.
|
||||||
*
|
*
|
||||||
* Version: @(#)scsi_h 1.0.4 2017/08/26
|
* Version: @(#)scsi_h 1.0.5 2017/08/27
|
||||||
*
|
*
|
||||||
* Authors: TheCollector1995, <mariogplayer@gmail.com>
|
* Authors: TheCollector1995, <mariogplayer@gmail.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -28,73 +28,78 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Configuration. */
|
||||||
|
#define SCSI_ID_MAX 8 /* 16 on wide buses */
|
||||||
|
#define SCSI_LUN_MAX 8 /* always 8 */
|
||||||
|
|
||||||
|
|
||||||
/* SCSI commands. */
|
/* SCSI commands. */
|
||||||
#define GPCMD_TEST_UNIT_READY 0x00
|
#define GPCMD_TEST_UNIT_READY 0x00
|
||||||
#define GPCMD_REZERO_UNIT 0x01
|
#define GPCMD_REZERO_UNIT 0x01
|
||||||
#define GPCMD_REQUEST_SENSE 0x03
|
#define GPCMD_REQUEST_SENSE 0x03
|
||||||
#define GPCMD_FORMAT_UNIT 0x04
|
#define GPCMD_FORMAT_UNIT 0x04
|
||||||
#define GPCMD_READ_6 0x08
|
#define GPCMD_READ_6 0x08
|
||||||
#define GPCMD_WRITE_6 0x0a
|
#define GPCMD_WRITE_6 0x0a
|
||||||
#define GPCMD_SEEK_6 0x0b
|
#define GPCMD_SEEK_6 0x0b
|
||||||
#define GPCMD_INQUIRY 0x12
|
#define GPCMD_INQUIRY 0x12
|
||||||
#define GPCMD_VERIFY_6 0x13
|
#define GPCMD_VERIFY_6 0x13
|
||||||
#define GPCMD_MODE_SELECT_6 0x15
|
#define GPCMD_MODE_SELECT_6 0x15
|
||||||
#define GPCMD_MODE_SENSE_6 0x1a
|
#define GPCMD_MODE_SENSE_6 0x1a
|
||||||
#define GPCMD_START_STOP_UNIT 0x1b
|
#define GPCMD_START_STOP_UNIT 0x1b
|
||||||
#define GPCMD_PREVENT_REMOVAL 0x1e
|
#define GPCMD_PREVENT_REMOVAL 0x1e
|
||||||
#define GPCMD_READ_CDROM_CAPACITY 0x25
|
#define GPCMD_READ_CDROM_CAPACITY 0x25
|
||||||
#define GPCMD_READ_10 0x28
|
#define GPCMD_READ_10 0x28
|
||||||
#define GPCMD_WRITE_10 0x2a
|
#define GPCMD_WRITE_10 0x2a
|
||||||
#define GPCMD_SEEK_10 0x2b
|
#define GPCMD_SEEK_10 0x2b
|
||||||
#define GPCMD_VERIFY_10 0x2f
|
#define GPCMD_VERIFY_10 0x2f
|
||||||
#define GPCMD_READ_SUBCHANNEL 0x42
|
#define GPCMD_READ_SUBCHANNEL 0x42
|
||||||
#define GPCMD_READ_TOC_PMA_ATIP 0x43
|
#define GPCMD_READ_TOC_PMA_ATIP 0x43
|
||||||
#define GPCMD_READ_HEADER 0x44
|
#define GPCMD_READ_HEADER 0x44
|
||||||
#define GPCMD_PLAY_AUDIO_10 0x45
|
#define GPCMD_PLAY_AUDIO_10 0x45
|
||||||
#define GPCMD_GET_CONFIGURATION 0x46
|
#define GPCMD_GET_CONFIGURATION 0x46
|
||||||
#define GPCMD_PLAY_AUDIO_MSF 0x47
|
#define GPCMD_PLAY_AUDIO_MSF 0x47
|
||||||
#define GPCMD_PLAY_AUDIO_TRACK_INDEX 0x48
|
#define GPCMD_PLAY_AUDIO_TRACK_INDEX 0x48
|
||||||
#define GPCMD_GET_EVENT_STATUS_NOTIFICATION 0x4a
|
#define GPCMD_GET_EVENT_STATUS_NOTIFICATION 0x4a
|
||||||
#define GPCMD_PAUSE_RESUME 0x4b
|
#define GPCMD_PAUSE_RESUME 0x4b
|
||||||
#define GPCMD_STOP_PLAY_SCAN 0x4e
|
#define GPCMD_STOP_PLAY_SCAN 0x4e
|
||||||
#define GPCMD_READ_DISC_INFORMATION 0x51
|
#define GPCMD_READ_DISC_INFORMATION 0x51
|
||||||
#define GPCMD_READ_TRACK_INFORMATION 0x52
|
#define GPCMD_READ_TRACK_INFORMATION 0x52
|
||||||
#define GPCMD_MODE_SELECT_10 0x55
|
#define GPCMD_MODE_SELECT_10 0x55
|
||||||
#define GPCMD_MODE_SENSE_10 0x5a
|
#define GPCMD_MODE_SENSE_10 0x5a
|
||||||
#define GPCMD_PLAY_AUDIO_12 0xa5
|
#define GPCMD_PLAY_AUDIO_12 0xa5
|
||||||
#define GPCMD_READ_12 0xa8
|
#define GPCMD_READ_12 0xa8
|
||||||
#define GPCMD_WRITE_12 0xaa
|
#define GPCMD_WRITE_12 0xaa
|
||||||
#define GPCMD_READ_DVD_STRUCTURE 0xad /* For reading. */
|
#define GPCMD_READ_DVD_STRUCTURE 0xad /* For reading. */
|
||||||
#define GPCMD_VERIFY_12 0xaf
|
#define GPCMD_VERIFY_12 0xaf
|
||||||
#define GPCMD_PLAY_CD_OLD 0xb4
|
#define GPCMD_PLAY_CD_OLD 0xb4
|
||||||
#define GPCMD_READ_CD_OLD 0xb8
|
#define GPCMD_READ_CD_OLD 0xb8
|
||||||
#define GPCMD_READ_CD_MSF 0xb9
|
#define GPCMD_READ_CD_MSF 0xb9
|
||||||
#define GPCMD_SCAN 0xba
|
#define GPCMD_SCAN 0xba
|
||||||
#define GPCMD_SET_SPEED 0xbb
|
#define GPCMD_SET_SPEED 0xbb
|
||||||
#define GPCMD_PLAY_CD 0xbc
|
#define GPCMD_PLAY_CD 0xbc
|
||||||
#define GPCMD_MECHANISM_STATUS 0xbd
|
#define GPCMD_MECHANISM_STATUS 0xbd
|
||||||
#define GPCMD_READ_CD 0xbe
|
#define GPCMD_READ_CD 0xbe
|
||||||
#define GPCMD_SEND_DVD_STRUCTURE 0xbf /* This is for writing only, irrelevant to PCem. */
|
#define GPCMD_SEND_DVD_STRUCTURE 0xbf /* This is for writing only, irrelevant to PCem. */
|
||||||
#define GPCMD_PAUSE_RESUME_ALT 0xc2
|
#define GPCMD_PAUSE_RESUME_ALT 0xc2
|
||||||
#define GPCMD_SCAN_ALT 0xcd /* Should be equivalent to 0xba */
|
#define GPCMD_SCAN_ALT 0xcd /* Should be equivalent to 0xba */
|
||||||
#define GPCMD_SET_SPEED_ALT 0xda /* Should be equivalent to 0xbb */
|
#define GPCMD_SET_SPEED_ALT 0xda /* Should be equivalent to 0xbb */
|
||||||
|
|
||||||
/* Mode page codes for mode sense/set */
|
/* Mode page codes for mode sense/set */
|
||||||
#define GPMODE_R_W_ERROR_PAGE 0x01
|
#define GPMODE_R_W_ERROR_PAGE 0x01
|
||||||
#define GPMODE_CDROM_PAGE 0x0d
|
#define GPMODE_CDROM_PAGE 0x0d
|
||||||
#define GPMODE_CDROM_AUDIO_PAGE 0x0e
|
#define GPMODE_CDROM_AUDIO_PAGE 0x0e
|
||||||
#define GPMODE_CAPABILITIES_PAGE 0x2a
|
#define GPMODE_CAPABILITIES_PAGE 0x2a
|
||||||
#define GPMODE_ALL_PAGES 0x3f
|
#define GPMODE_ALL_PAGES 0x3f
|
||||||
|
|
||||||
/* SCSI Status Codes */
|
/* SCSI Status Codes */
|
||||||
#define SCSI_STATUS_OK 0
|
#define SCSI_STATUS_OK 0
|
||||||
#define SCSI_STATUS_CHECK_CONDITION 2
|
#define SCSI_STATUS_CHECK_CONDITION 2
|
||||||
|
|
||||||
/* SCSI Sense Keys */
|
/* SCSI Sense Keys */
|
||||||
#define SENSE_NONE 0
|
#define SENSE_NONE 0
|
||||||
#define SENSE_NOT_READY 2
|
#define SENSE_NOT_READY 2
|
||||||
#define SENSE_ILLEGAL_REQUEST 5
|
#define SENSE_ILLEGAL_REQUEST 5
|
||||||
#define SENSE_UNIT_ATTENTION 6
|
#define SENSE_UNIT_ATTENTION 6
|
||||||
|
|
||||||
/* SCSI Additional Sense Codes */
|
/* SCSI Additional Sense Codes */
|
||||||
#define ASC_AUDIO_PLAY_OPERATION 0x00
|
#define ASC_AUDIO_PLAY_OPERATION 0x00
|
||||||
@@ -193,45 +198,43 @@
|
|||||||
#define CHECK_READY 2
|
#define CHECK_READY 2
|
||||||
#define ALLOW_UA 1
|
#define ALLOW_UA 1
|
||||||
|
|
||||||
extern uint8_t SCSICommandTable[0x100];
|
|
||||||
|
|
||||||
extern uint8_t mode_sense_pages[0x40];
|
extern uint8_t SCSICommandTable[0x100];
|
||||||
|
extern uint8_t mode_sense_pages[0x40];
|
||||||
extern int readcdmode;
|
extern int readcdmode;
|
||||||
|
|
||||||
/* Mode sense/select stuff. */
|
/* Mode sense/select stuff. */
|
||||||
extern uint8_t mode_pages_in[256][256];
|
extern uint8_t mode_pages_in[256][256];
|
||||||
|
extern uint8_t page_flags[256];
|
||||||
|
extern uint8_t prefix_len;
|
||||||
|
extern uint8_t page_current;
|
||||||
#define PAGE_CHANGEABLE 1
|
#define PAGE_CHANGEABLE 1
|
||||||
#define PAGE_CHANGED 2
|
#define PAGE_CHANGED 2
|
||||||
|
|
||||||
extern uint8_t page_flags[256];
|
|
||||||
extern uint8_t prefix_len;
|
|
||||||
extern uint8_t page_current;
|
|
||||||
|
|
||||||
extern uint32_t DataLength;
|
extern uint32_t DataLength;
|
||||||
extern uint32_t DataPointer;
|
extern uint32_t DataPointer;
|
||||||
|
|
||||||
extern int SectorLBA;
|
extern int SectorLBA;
|
||||||
extern int SectorLen;
|
extern int SectorLen;
|
||||||
|
|
||||||
extern int MediaPresent;
|
extern int MediaPresent;
|
||||||
|
|
||||||
extern uint8_t SCSIStatus;
|
extern uint8_t SCSIStatus;
|
||||||
extern uint8_t SCSIPhase;
|
extern uint8_t SCSIPhase;
|
||||||
extern uint8_t scsi_cdrom_id;
|
extern uint8_t scsi_cdrom_id;
|
||||||
|
|
||||||
struct
|
struct {
|
||||||
{
|
uint8_t SenseBuffer[18];
|
||||||
uint8_t SenseBuffer[18];
|
uint8_t SenseLength;
|
||||||
uint8_t SenseLength;
|
uint8_t UnitAttention;
|
||||||
uint8_t UnitAttention;
|
uint8_t SenseKey;
|
||||||
uint8_t SenseKey;
|
uint8_t Asc;
|
||||||
uint8_t Asc;
|
uint8_t Ascq;
|
||||||
uint8_t Ascq;
|
|
||||||
} SCSISense;
|
} SCSISense;
|
||||||
|
|
||||||
extern int cd_status;
|
extern int cd_status;
|
||||||
extern int prev_status;
|
extern int prev_status;
|
||||||
|
|
||||||
#define SCSI_NONE 0
|
#define SCSI_NONE 0
|
||||||
#define SCSI_DISK 1
|
#define SCSI_DISK 1
|
||||||
@@ -248,13 +251,16 @@ extern int prev_status;
|
|||||||
#define SCSI_PHASE_BUS_FREE ( 8 )
|
#define SCSI_PHASE_BUS_FREE ( 8 )
|
||||||
#define SCSI_PHASE_SELECT ( 9 )
|
#define SCSI_PHASE_SELECT ( 9 )
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
typedef struct {
|
||||||
uint8_t *CmdBuffer;
|
uint8_t *CmdBuffer;
|
||||||
uint32_t CmdBufferLength;
|
uint32_t CmdBufferLength;
|
||||||
int LunType;
|
int LunType;
|
||||||
uint32_t InitLength;
|
uint32_t InitLength;
|
||||||
} SCSIDevices[16][8];
|
} scsi_device_t;
|
||||||
|
|
||||||
|
|
||||||
|
extern scsi_device_t SCSIDevices[SCSI_ID_MAX][SCSI_LUN_MAX];
|
||||||
|
|
||||||
extern void SCSIReset(uint8_t id, uint8_t lun);
|
extern void SCSIReset(uint8_t id, uint8_t lun);
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -8,445 +8,443 @@
|
|||||||
*
|
*
|
||||||
* The shared AHA and Buslogic SCSI BIOS command handler.
|
* The shared AHA and Buslogic SCSI BIOS command handler.
|
||||||
*
|
*
|
||||||
* Version: @(#)scsi_bios_command.c 1.0.0 2017/08/26
|
* Version: @(#)scsi_bios_command.c 1.0.1 2017/08/27
|
||||||
*
|
*
|
||||||
* Authors: TheCollector1995, <mariogplayer@gmail.com>
|
* Authors: TheCollector1995, <mariogplayer@gmail.com>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
* Fred N. van Kempen, <decwiz@yahoo.com>
|
* Fred N. van Kempen, <decwiz@yahoo.com>
|
||||||
* Copyright 2016,2017 Miran Grca.
|
* Copyright 2017 Miran Grca.
|
||||||
* Copyright 2017 Fred N. van Kempen.
|
* Copyright 2017 Fred N. van Kempen.
|
||||||
*/
|
*/
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "../ibm.h"
|
#include "../ibm.h"
|
||||||
#include "../dma.h"
|
#include "../dma.h"
|
||||||
#include "scsi.h"
|
#include "scsi.h"
|
||||||
#include "scsi_bios_command.h"
|
#include "scsi_bios_command.h"
|
||||||
#include "scsi_device.h"
|
#include "scsi_device.h"
|
||||||
|
|
||||||
/* #define ENABLE_SCSI_BIOS_COMMAND_LOG 0 */
|
|
||||||
int scsi_bios_command_do_log = 0;
|
#if ENABLE_SCSI_BIOS_COMMAND_LOG
|
||||||
|
int scsi_bios_command_do_log = ENABLE_SCSI_BIOS_COMMAND_LOG;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
scsi_bios_command_log(const char *format, ...)
|
cmd_log(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
#ifdef ENABLE_SCSI_BIOS_COMMAND_LOG
|
#if ENABLE_SCSI_BIOS_COMMAND_LOG
|
||||||
if (scsi_bios_command_do_log)
|
va_list ap;
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, format);
|
if (scsi_bios_command_do_log) {
|
||||||
vprintf(format, ap);
|
va_start(ap, fmt);
|
||||||
va_end(ap);
|
vprintf(fmt, ap);
|
||||||
fflush(stdout);
|
va_end(ap);
|
||||||
}
|
fflush(stdout);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t scsi_bios_completion_code(uint8_t *sense)
|
|
||||||
|
static void
|
||||||
|
target_check(uint8_t id, uint8_t lun)
|
||||||
{
|
{
|
||||||
switch (sense[12])
|
if (! scsi_device_valid(id, lun)) {
|
||||||
{
|
fatal("BIOS INT13 device on %02i:%02i has disappeared\n", id, lun);
|
||||||
case 0x00:
|
}
|
||||||
return 0x00;
|
|
||||||
case 0x20:
|
|
||||||
return 0x01;
|
|
||||||
case 0x12:
|
|
||||||
case 0x21:
|
|
||||||
return 0x02;
|
|
||||||
case 0x27:
|
|
||||||
return 0x03;
|
|
||||||
case 0x14: case 0x16:
|
|
||||||
return 0x04;
|
|
||||||
case 0x10: case 0x11:
|
|
||||||
return 0x10;
|
|
||||||
case 0x17: case 0x18:
|
|
||||||
return 0x11;
|
|
||||||
case 0x01: case 0x03: case 0x05: case 0x06: case 0x07: case 0x08: case 0x09:
|
|
||||||
case 0x1B: case 0x1C: case 0x1D:
|
|
||||||
case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46:
|
|
||||||
case 0x47: case 0x48: case 0x49:
|
|
||||||
return 0x20;
|
|
||||||
case 0x15:
|
|
||||||
case 0x02:
|
|
||||||
return 0x40;
|
|
||||||
case 0x04:
|
|
||||||
case 0x28: case 0x29: case 0x2A:
|
|
||||||
return 0xAA;
|
|
||||||
default:
|
|
||||||
return 0xFF;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t scsi_bios_command_08(uint8_t id, uint8_t lun, uint8_t *buffer)
|
|
||||||
|
static uint8_t
|
||||||
|
completion_code(uint8_t *sense)
|
||||||
{
|
{
|
||||||
uint32_t len = 0;
|
switch (sense[12]) {
|
||||||
uint8_t cdb[12] = { GPCMD_READ_CDROM_CAPACITY, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
case 0x00:
|
||||||
uint8_t rcbuf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
return(0x00);
|
||||||
int ret = 0;
|
|
||||||
int i = 0;
|
|
||||||
uint8_t sc = 0;
|
|
||||||
|
|
||||||
ret = scsi_device_read_capacity(id, lun, cdb, rcbuf, &len);
|
case 0x20:
|
||||||
sc = scsi_bios_completion_code(scsi_device_sense(id, lun));
|
return(0x01);
|
||||||
|
|
||||||
if (ret == 0)
|
case 0x12:
|
||||||
{
|
case 0x21:
|
||||||
return sc;
|
return(0x02);
|
||||||
}
|
|
||||||
|
|
||||||
memset(buffer, 0, 6);
|
case 0x27:
|
||||||
|
return(0x03);
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
case 0x14:
|
||||||
{
|
case 0x16:
|
||||||
buffer[i] = rcbuf[i];
|
return(0x04);
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 4; i < 6; i++)
|
case 0x10:
|
||||||
{
|
case 0x11:
|
||||||
buffer[i] = rcbuf[(i + 2) ^ 1];
|
return(0x10);
|
||||||
}
|
|
||||||
|
|
||||||
scsi_bios_command_log("BIOS Command 0x08: %02X %02X %02X %02X %02X %02X\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
|
case 0x17:
|
||||||
|
case 0x18:
|
||||||
|
return(0x11);
|
||||||
|
|
||||||
return 0;
|
case 0x01:
|
||||||
|
case 0x03:
|
||||||
|
case 0x05:
|
||||||
|
case 0x06:
|
||||||
|
case 0x07:
|
||||||
|
case 0x08:
|
||||||
|
case 0x09:
|
||||||
|
case 0x1B:
|
||||||
|
case 0x1C:
|
||||||
|
case 0x1D:
|
||||||
|
case 0x40:
|
||||||
|
case 0x41:
|
||||||
|
case 0x42:
|
||||||
|
case 0x43:
|
||||||
|
case 0x44:
|
||||||
|
case 0x45:
|
||||||
|
case 0x46:
|
||||||
|
case 0x47:
|
||||||
|
case 0x48:
|
||||||
|
case 0x49:
|
||||||
|
return(0x20);
|
||||||
|
|
||||||
|
case 0x15:
|
||||||
|
case 0x02:
|
||||||
|
return(0x40);
|
||||||
|
|
||||||
|
case 0x04:
|
||||||
|
case 0x28:
|
||||||
|
case 0x29:
|
||||||
|
case 0x2a:
|
||||||
|
return(0xaa);
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
return(0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
int scsi_bios_command_15(uint8_t id, uint8_t lun, uint8_t *buffer)
|
|
||||||
|
uint8_t
|
||||||
|
scsi_bios_command_08(uint8_t id, uint8_t lun, uint8_t *buffer)
|
||||||
{
|
{
|
||||||
uint32_t len = 0;
|
uint8_t cdb[12] = { GPCMD_READ_CDROM_CAPACITY, 0,0,0,0,0,0,0,0,0,0,0 };
|
||||||
uint8_t cdb[12] = { GPCMD_READ_CDROM_CAPACITY, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
uint8_t rcbuf[8] = { 0,0,0,0,0,0,0,0 };
|
||||||
uint8_t rcbuf[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
uint32_t len = 0;
|
||||||
int ret = 0;
|
int i, ret, sc;
|
||||||
int i = 0;
|
|
||||||
uint8_t sc = 0;
|
|
||||||
|
|
||||||
ret = scsi_device_read_capacity(id, lun, cdb, rcbuf, &len);
|
ret = scsi_device_read_capacity(id, lun, cdb, rcbuf, &len);
|
||||||
sc = scsi_bios_completion_code(scsi_device_sense(id, lun));
|
sc = completion_code(scsi_device_sense(id, lun));
|
||||||
|
if (ret == 0) return(sc);
|
||||||
|
|
||||||
memset(buffer, 0, 6);
|
memset(buffer, 0x00, 6);
|
||||||
|
for (i=0; i<4; i++)
|
||||||
|
buffer[i] = rcbuf[i];
|
||||||
|
for (i=4; i<6; i++)
|
||||||
|
buffer[i] = rcbuf[(i + 2) ^ 1];
|
||||||
|
cmd_log("BIOS Command 0x08: %02X %02X %02X %02X %02X %02X\n",
|
||||||
|
buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
|
||||||
|
|
||||||
for (i = 0; i < 4; i++)
|
return(0);
|
||||||
{
|
|
||||||
buffer[i] = (ret == 0) ? 0 : rcbuf[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
scsi_device_type_data(id, lun, &(buffer[4]), &(buffer[5]));
|
|
||||||
|
|
||||||
scsi_bios_command_log("BIOS Command 0x15: %02X %02X %02X %02X %02X %02X\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
|
|
||||||
|
|
||||||
return sc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scsi_bios_command_id_check(uint8_t id, uint8_t lun)
|
|
||||||
|
int
|
||||||
|
scsi_bios_command_15(uint8_t id, uint8_t lun, uint8_t *buffer)
|
||||||
{
|
{
|
||||||
if (!scsi_device_valid(id, lun))
|
uint8_t cdb[12] = { GPCMD_READ_CDROM_CAPACITY, 0,0,0,0,0,0,0,0,0,0,0 };
|
||||||
{
|
uint8_t rcbuf[8] = { 0,0,0,0,0,0,0,0 };
|
||||||
fatal("BIOS INT13 CD-ROM on %02i:%02i has disappeared\n", id, lun);
|
uint32_t len = 0;
|
||||||
}
|
int i, ret, sc;
|
||||||
|
|
||||||
|
ret = scsi_device_read_capacity(id, lun, cdb, rcbuf, &len);
|
||||||
|
sc = completion_code(scsi_device_sense(id, lun));
|
||||||
|
|
||||||
|
memset(buffer, 0x00, 6);
|
||||||
|
for (i=0; i<4; i++)
|
||||||
|
buffer[i] = (ret == 0) ? 0 : rcbuf[i];
|
||||||
|
|
||||||
|
scsi_device_type_data(id, lun, &(buffer[4]), &(buffer[5]));
|
||||||
|
|
||||||
|
cmd_log("BIOS Command 0x15: %02X %02X %02X %02X %02X %02X\n",
|
||||||
|
buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
|
||||||
|
|
||||||
|
return(sc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* This returns the completion code. */
|
/* This returns the completion code. */
|
||||||
uint8_t scsi_bios_command(uint8_t last_id, BIOSCMD *BiosCmd, int8_t islba)
|
uint8_t
|
||||||
|
scsi_bios_command(uint8_t max_id, BIOSCMD *cmd, int8_t islba)
|
||||||
{
|
{
|
||||||
uint32_t dma_address;
|
uint8_t cdb[12] = { 0,0,0,0,0,0,0,0,0,0,0,0 };
|
||||||
uint32_t lba;
|
scsi_device_t *dev;
|
||||||
int sector_len = BiosCmd->secount;
|
uint32_t dma_address;
|
||||||
int block_shift = 9;
|
uint32_t lba;
|
||||||
uint8_t ret = 0;
|
int sector_len = cmd->secount;
|
||||||
uint8_t cdb[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
int block_shift;
|
||||||
|
uint8_t ret;
|
||||||
|
|
||||||
if (islba)
|
if (islba)
|
||||||
lba = lba32_blk(BiosCmd);
|
lba = lba32_blk(cmd);
|
||||||
else
|
else
|
||||||
lba = (BiosCmd->u.chs.cyl << 9) + (BiosCmd->u.chs.head << 5) + BiosCmd->u.chs.sec;
|
lba = (cmd->u.chs.cyl << 9) + (cmd->u.chs.head << 5) + cmd->u.chs.sec;
|
||||||
|
|
||||||
scsi_bios_command_log("BIOS Command = 0x%02X\n", BiosCmd->command);
|
cmd_log("BIOS Command = 0x%02X\n", cmd->command);
|
||||||
|
|
||||||
if ((BiosCmd->id > last_id) || (BiosCmd->lun > 7)) {
|
if ((cmd->id > max_id) || (cmd->lun > 7)) return(0x80);
|
||||||
return 0x80;
|
|
||||||
}
|
|
||||||
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = 0;
|
/* Get pointer to selected device. */
|
||||||
|
dev = &SCSIDevices[cmd->id][cmd->lun];
|
||||||
|
dev->InitLength = 0;
|
||||||
|
|
||||||
if (!scsi_device_present(BiosCmd->id, BiosCmd->lun))
|
if (! scsi_device_present(cmd->id, cmd->lun)) {
|
||||||
{
|
cmd_log("BIOS Target ID %i and LUN %i have no device attached\n",
|
||||||
scsi_bios_command_log("BIOS Target ID %i and LUN %i have no device attached\n",BiosCmd->id,BiosCmd->lun);
|
cmd->id, cmd->lun);
|
||||||
return 0x80;
|
return(0x80);
|
||||||
}
|
}
|
||||||
|
|
||||||
dma_address = ADDR_TO_U32(BiosCmd->dma_address);
|
dma_address = ADDR_TO_U32(cmd->dma_address);
|
||||||
|
|
||||||
scsi_bios_command_log("BIOS Data Buffer write: length %d, pointer 0x%04X\n", sector_len, dma_address);
|
cmd_log("BIOS Data Buffer write: length %d, pointer 0x%04X\n",
|
||||||
|
sector_len, dma_address);
|
||||||
|
|
||||||
if (SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer != NULL)
|
if (dev->CmdBuffer != NULL) {
|
||||||
{
|
free(dev->CmdBuffer);
|
||||||
free(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer);
|
dev->CmdBuffer = NULL;
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = NULL;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
block_shift = scsi_device_block_shift(BiosCmd->id, BiosCmd->lun);
|
block_shift = scsi_device_block_shift(cmd->id, cmd->lun);
|
||||||
|
|
||||||
switch(BiosCmd->command)
|
switch(cmd->command) {
|
||||||
{
|
case 0x00: /* Reset Disk System, in practice it's a nop */
|
||||||
case 0x00: /* Reset Disk System, in practice it's a nop */
|
return(0);
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x01: /* Read Status of Last Operation */
|
case 0x01: /* Read Status of Last Operation */
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
/* Assuming 14 bytes because that's the default length for SCSI sense, and no command-specific
|
/*
|
||||||
indication is given. */
|
* Assuming 14 bytes because that is the default
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = 14;
|
* length for SCSI sense, and no command-specific
|
||||||
|
* indication is given.
|
||||||
|
*/
|
||||||
|
dev->InitLength = 14;
|
||||||
|
dev->CmdBuffer = (uint8_t *)malloc(14);
|
||||||
|
memset(dev->CmdBuffer, 0x00, 14);
|
||||||
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = (uint8_t *) malloc(14);
|
|
||||||
memset(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer, 0, 14);
|
|
||||||
|
|
||||||
/* SCSIStatus = scsi_bios_command_08(BiosCmd->id, BiosCmd->lun, SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer) ? SCSI_STATUS_OK : SCSI_STATUS_CHECK_CONDITION; */
|
|
||||||
|
|
||||||
if (sector_len > 0)
|
|
||||||
{
|
|
||||||
scsi_bios_command_log("BusLogic BIOS DMA: Reading 14 bytes at %08X\n", dma_address);
|
|
||||||
DMAPageWrite(dma_address, (char *)scsi_device_sense(BiosCmd->id, BiosCmd->lun), 14);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer != NULL)
|
|
||||||
{
|
|
||||||
free(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer);
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0x02: /* Read Desired Sectors to Memory */
|
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
|
||||||
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = sector_len << block_shift;
|
|
||||||
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = (uint8_t *) malloc(sector_len << block_shift);
|
|
||||||
memset(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer, 0, sector_len << block_shift);
|
|
||||||
|
|
||||||
cdb[0] = GPCMD_READ_10;
|
|
||||||
cdb[1] = (BiosCmd->lun & 7) << 5;
|
|
||||||
cdb[2] = (lba >> 24) & 0xff;
|
|
||||||
cdb[3] = (lba >> 16) & 0xff;
|
|
||||||
cdb[4] = (lba >> 8) & 0xff;
|
|
||||||
cdb[5] = lba & 0xff;
|
|
||||||
cdb[7] = (sector_len >> 8) & 0xff;
|
|
||||||
cdb[8] = sector_len & 0xff;
|
|
||||||
#if 0
|
#if 0
|
||||||
pclog("BIOS CMD(READ, %08lx, %d)\n", lba, BiosCmd->secount);
|
SCSIStatus = scsi_bios_command_08(cmd->id, cmd->lun, dev->CmdBuffer) ? SCSI_STATUS_OK : SCSI_STATUS_CHECK_CONDITION;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
scsi_device_command(BiosCmd->id, BiosCmd->lun, 12, cdb);
|
if (sector_len > 0) {
|
||||||
|
cmd_log("BIOS DMA: Reading 14 bytes at %08X\n",
|
||||||
|
dma_address);
|
||||||
|
DMAPageWrite(dma_address,
|
||||||
|
(char *)scsi_device_sense(cmd->id, cmd->lun), 14);
|
||||||
|
}
|
||||||
|
|
||||||
if (sector_len > 0)
|
if (dev->CmdBuffer != NULL) {
|
||||||
{
|
free(dev->CmdBuffer);
|
||||||
scsi_bios_command_log("BIOS DMA: Reading %i bytes at %08X\n", sector_len << block_shift, dma_address);
|
dev->CmdBuffer = NULL;
|
||||||
DMAPageWrite(dma_address, (char *)SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer, sector_len << block_shift);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer != NULL)
|
return(0);
|
||||||
{
|
|
||||||
free(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer);
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return scsi_bios_completion_code(scsi_device_sense(BiosCmd->id, BiosCmd->lun));
|
case 0x02: /* Read Desired Sectors to Memory */
|
||||||
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
break;
|
dev->InitLength = sector_len << block_shift;
|
||||||
|
dev->CmdBuffer = (uint8_t *)malloc(dev->InitLength);
|
||||||
|
memset(dev->CmdBuffer, 0x00, dev->InitLength);
|
||||||
|
|
||||||
case 0x03: /* Write Desired Sectors from Memory */
|
cdb[0] = GPCMD_READ_10;
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
cdb[1] = (cmd->lun & 7) << 5;
|
||||||
|
cdb[2] = (lba >> 24) & 0xff;
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = sector_len << block_shift;
|
cdb[3] = (lba >> 16) & 0xff;
|
||||||
|
cdb[4] = (lba >> 8) & 0xff;
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = (uint8_t *) malloc(sector_len << block_shift);
|
cdb[5] = lba & 0xff;
|
||||||
memset(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer, 0, sector_len << block_shift);
|
cdb[7] = (sector_len >> 8) & 0xff;
|
||||||
|
cdb[8] = sector_len & 0xff;
|
||||||
if (sector_len > 0)
|
|
||||||
{
|
|
||||||
scsi_bios_command_log("BIOS DMA: Reading %i bytes at %08X\n", sector_len << block_shift, dma_address);
|
|
||||||
DMAPageRead(dma_address, (char *)SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer, sector_len << block_shift);
|
|
||||||
}
|
|
||||||
|
|
||||||
cdb[0] = GPCMD_WRITE_10;
|
|
||||||
cdb[1] = (BiosCmd->lun & 7) << 5;
|
|
||||||
cdb[2] = (lba >> 24) & 0xff;
|
|
||||||
cdb[3] = (lba >> 16) & 0xff;
|
|
||||||
cdb[4] = (lba >> 8) & 0xff;
|
|
||||||
cdb[5] = lba & 0xff;
|
|
||||||
cdb[7] = (sector_len >> 8) & 0xff;
|
|
||||||
cdb[8] = sector_len & 0xff;
|
|
||||||
#if 0
|
#if 0
|
||||||
pclog("BIOS CMD(WRITE, %08lx, %d)\n", lba, BiosCmd->secount);
|
cmd_log("BIOS CMD(READ, %08lx, %d)\n", lba, cmd->secount);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
scsi_device_command(BiosCmd->id, BiosCmd->lun, 12, cdb);
|
scsi_device_command(cmd->id, cmd->lun, 12, cdb);
|
||||||
|
if (sector_len > 0) {
|
||||||
|
cmd_log("BIOS DMA: Reading %i bytes at %08X\n",
|
||||||
|
dev->InitLength, dma_address);
|
||||||
|
DMAPageWrite(dma_address,
|
||||||
|
(char *)dev->CmdBuffer, dev->InitLength);
|
||||||
|
}
|
||||||
|
|
||||||
if (SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer != NULL)
|
if (dev->CmdBuffer != NULL) {
|
||||||
{
|
free(dev->CmdBuffer);
|
||||||
free(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer);
|
dev->CmdBuffer = NULL;
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = NULL;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return scsi_bios_completion_code(scsi_device_sense(BiosCmd->id, BiosCmd->lun));
|
return(completion_code(scsi_device_sense(cmd->id, cmd->lun)));
|
||||||
|
|
||||||
break;
|
case 0x03: /* Write Desired Sectors from Memory */
|
||||||
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
case 0x04: /* Verify Desired Sectors */
|
dev->InitLength = sector_len << block_shift;
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
dev->CmdBuffer = (uint8_t *)malloc(dev->InitLength);
|
||||||
|
memset(dev->CmdBuffer, 0x00, dev->InitLength);
|
||||||
|
|
||||||
cdb[0] = GPCMD_VERIFY_10;
|
if (sector_len > 0) {
|
||||||
cdb[1] = (BiosCmd->lun & 7) << 5;
|
cmd_log("BIOS DMA: Reading %i bytes at %08X\n",
|
||||||
cdb[2] = (lba >> 24) & 0xff;
|
dev->InitLength, dma_address);
|
||||||
cdb[3] = (lba >> 16) & 0xff;
|
DMAPageRead(dma_address,
|
||||||
cdb[4] = (lba >> 8) & 0xff;
|
(char *)dev->CmdBuffer, dev->InitLength);
|
||||||
cdb[5] = lba & 0xff;
|
}
|
||||||
cdb[7] = (sector_len >> 8) & 0xff;
|
|
||||||
cdb[8] = sector_len & 0xff;
|
|
||||||
|
|
||||||
scsi_device_command(BiosCmd->id, BiosCmd->lun, 12, cdb);
|
cdb[0] = GPCMD_WRITE_10;
|
||||||
|
cdb[1] = (cmd->lun & 7) << 5;
|
||||||
|
cdb[2] = (lba >> 24) & 0xff;
|
||||||
|
cdb[3] = (lba >> 16) & 0xff;
|
||||||
|
cdb[4] = (lba >> 8) & 0xff;
|
||||||
|
cdb[5] = lba & 0xff;
|
||||||
|
cdb[7] = (sector_len >> 8) & 0xff;
|
||||||
|
cdb[8] = sector_len & 0xff;
|
||||||
|
#if 0
|
||||||
|
cmd_log("BIOS CMD(WRITE, %08lx, %d)\n", lba, cmd->secount);
|
||||||
|
#endif
|
||||||
|
|
||||||
return scsi_bios_completion_code(scsi_device_sense(BiosCmd->id, BiosCmd->lun));
|
scsi_device_command(cmd->id, cmd->lun, 12, cdb);
|
||||||
|
|
||||||
break;
|
if (dev->CmdBuffer != NULL) {
|
||||||
|
free(dev->CmdBuffer);
|
||||||
|
dev->CmdBuffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
case 0x05: /* Format Track, invalid since SCSI has no tracks */
|
return(completion_code(scsi_device_sense(cmd->id, cmd->lun)));
|
||||||
return 1;
|
|
||||||
|
|
||||||
break;
|
case 0x04: /* Verify Desired Sectors */
|
||||||
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
case 0x06: /* Identify SCSI Devices, in practice it's a nop */
|
cdb[0] = GPCMD_VERIFY_10;
|
||||||
return 0;
|
cdb[1] = (cmd->lun & 7) << 5;
|
||||||
|
cdb[2] = (lba >> 24) & 0xff;
|
||||||
|
cdb[3] = (lba >> 16) & 0xff;
|
||||||
|
cdb[4] = (lba >> 8) & 0xff;
|
||||||
|
cdb[5] = lba & 0xff;
|
||||||
|
cdb[7] = (sector_len >> 8) & 0xff;
|
||||||
|
cdb[8] = sector_len & 0xff;
|
||||||
|
|
||||||
break;
|
scsi_device_command(cmd->id, cmd->lun, 12, cdb);
|
||||||
|
|
||||||
case 0x07: /* Format Unit */
|
return(completion_code(scsi_device_sense(cmd->id, cmd->lun)));
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
|
||||||
|
|
||||||
cdb[0] = GPCMD_FORMAT_UNIT;
|
case 0x05: /* Format Track, invalid since SCSI has no tracks */
|
||||||
cdb[1] = (BiosCmd->lun & 7) << 5;
|
//FIXME: add a longer delay here --FvK
|
||||||
|
return(1);
|
||||||
|
|
||||||
scsi_device_command(BiosCmd->id, BiosCmd->lun, 12, cdb);
|
case 0x06: /* Identify SCSI Devices, in practice it's a nop */
|
||||||
|
//FIXME: add a longer delay here --FvK
|
||||||
|
return(0);
|
||||||
|
|
||||||
return scsi_bios_completion_code(scsi_device_sense(BiosCmd->id, BiosCmd->lun));
|
case 0x07: /* Format Unit */
|
||||||
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
break;
|
cdb[0] = GPCMD_FORMAT_UNIT;
|
||||||
|
cdb[1] = (cmd->lun & 7) << 5;
|
||||||
|
|
||||||
case 0x08: /* Read Drive Parameters */
|
scsi_device_command(cmd->id, cmd->lun, 12, cdb);
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
|
||||||
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = 6;
|
return(completion_code(scsi_device_sense(cmd->id, cmd->lun)));
|
||||||
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = (uint8_t *) malloc(6);
|
case 0x08: /* Read Drive Parameters */
|
||||||
memset(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer, 0, 6);
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
ret = scsi_bios_command_08(BiosCmd->id, BiosCmd->lun, SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer);
|
dev->InitLength = 6;
|
||||||
|
dev->CmdBuffer = (uint8_t *)malloc(dev->InitLength);
|
||||||
|
memset(dev->CmdBuffer, 0x00, dev->InitLength);
|
||||||
|
|
||||||
scsi_bios_command_log("BIOS DMA: Reading 6 bytes at %08X\n", dma_address);
|
ret = scsi_bios_command_08(cmd->id, cmd->lun, dev->CmdBuffer);
|
||||||
DMAPageWrite(dma_address, (char *)SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer, 6);
|
|
||||||
|
|
||||||
if (SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer != NULL)
|
cmd_log("BIOS DMA: Reading 6 bytes at %08X\n", dma_address);
|
||||||
{
|
DMAPageWrite(dma_address,
|
||||||
free(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer);
|
(char *)dev->CmdBuffer, dev->InitLength);
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
if (dev->CmdBuffer != NULL) {
|
||||||
|
free(dev->CmdBuffer);
|
||||||
|
dev->CmdBuffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
return(ret);
|
||||||
|
|
||||||
case 0x09: /* Initialize Drive Pair Characteristics, in practice it's a nop */
|
case 0x09: /* Initialize Drive Pair Characteristics, in practice it's a nop */
|
||||||
return 0;
|
//FIXME: add a longer delay here --FvK
|
||||||
|
return(0);
|
||||||
|
|
||||||
break;
|
case 0x0c: /* Seek */
|
||||||
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
case 0x0C: /* Seek */
|
//FIXME: is this needed? Looks like a copy-paste leftover.. --FvK
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
dev->InitLength = sector_len << block_shift;
|
||||||
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = sector_len << block_shift;
|
cdb[0] = GPCMD_SEEK_10;
|
||||||
|
cdb[1] = (cmd->lun & 7) << 5;
|
||||||
|
cdb[2] = (lba >> 24) & 0xff;
|
||||||
|
cdb[3] = (lba >> 16) & 0xff;
|
||||||
|
cdb[4] = (lba >> 8) & 0xff;
|
||||||
|
cdb[5] = lba & 0xff;
|
||||||
|
|
||||||
cdb[0] = GPCMD_SEEK_10;
|
scsi_device_command(cmd->id, cmd->lun, 12, cdb);
|
||||||
cdb[1] = (BiosCmd->lun & 7) << 5;
|
|
||||||
cdb[2] = (lba >> 24) & 0xff;
|
|
||||||
cdb[3] = (lba >> 16) & 0xff;
|
|
||||||
cdb[4] = (lba >> 8) & 0xff;
|
|
||||||
cdb[5] = lba & 0xff;
|
|
||||||
|
|
||||||
scsi_device_command(BiosCmd->id, BiosCmd->lun, 12, cdb);
|
return((SCSIStatus == SCSI_STATUS_OK) ? 1 : 0);
|
||||||
|
|
||||||
return (SCSIStatus == SCSI_STATUS_OK) ? 1 : 0;
|
case 0x0d: /* Alternate Disk Reset, in practice it's a nop */
|
||||||
|
//FIXME: add a longer delay here --FvK
|
||||||
|
return(0);
|
||||||
|
|
||||||
break;
|
case 0x10: /* Test Drive Ready */
|
||||||
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
case 0x0D: /* Alternate Disk Reset, in practice it's a nop */
|
cdb[0] = GPCMD_TEST_UNIT_READY;
|
||||||
return 0;
|
cdb[1] = (cmd->lun & 7) << 5;
|
||||||
|
|
||||||
break;
|
scsi_device_command(cmd->id, cmd->lun, 12, cdb);
|
||||||
|
|
||||||
case 0x10: /* Test Drive Ready */
|
return(completion_code(scsi_device_sense(cmd->id, cmd->lun)));
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
|
||||||
|
|
||||||
cdb[0] = GPCMD_TEST_UNIT_READY;
|
case 0x11: /* Recalibrate */
|
||||||
cdb[1] = (BiosCmd->lun & 7) << 5;
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
scsi_device_command(BiosCmd->id, BiosCmd->lun, 12, cdb);
|
cdb[0] = GPCMD_REZERO_UNIT;
|
||||||
|
cdb[1] = (cmd->lun & 7) << 5;
|
||||||
|
|
||||||
return scsi_bios_completion_code(scsi_device_sense(BiosCmd->id, BiosCmd->lun));
|
scsi_device_command(cmd->id, cmd->lun, 12, cdb);
|
||||||
|
|
||||||
break;
|
return(completion_code(scsi_device_sense(cmd->id, cmd->lun)));
|
||||||
|
|
||||||
case 0x11: /* Recalibrate */
|
case 0x14: /* Controller Diagnostic */
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
//FIXME: add a longer delay here --FvK
|
||||||
|
return(0);
|
||||||
|
|
||||||
cdb[0] = GPCMD_REZERO_UNIT;
|
case 0x15: /* Read DASD Type */
|
||||||
cdb[1] = (BiosCmd->lun & 7) << 5;
|
target_check(cmd->id, cmd->lun);
|
||||||
|
|
||||||
scsi_device_command(BiosCmd->id, BiosCmd->lun, 12, cdb);
|
dev->InitLength = 6;
|
||||||
|
dev->CmdBuffer = (uint8_t *)malloc(dev->InitLength);
|
||||||
|
memset(dev->CmdBuffer, 0x00, dev->InitLength);
|
||||||
|
|
||||||
return scsi_bios_completion_code(scsi_device_sense(BiosCmd->id, BiosCmd->lun));
|
ret = scsi_bios_command_15(cmd->id, cmd->lun, dev->CmdBuffer);
|
||||||
|
|
||||||
break;
|
cmd_log("BIOS DMA: Reading 6 bytes at %08X\n", dma_address);
|
||||||
|
DMAPageWrite(dma_address,
|
||||||
|
(char *)dev->CmdBuffer, dev->InitLength);
|
||||||
|
|
||||||
case 0x14: /* Controller Diagnostic */
|
if (dev->CmdBuffer != NULL) {
|
||||||
return 0;
|
free(dev->CmdBuffer);
|
||||||
|
dev->CmdBuffer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
return(ret);
|
||||||
|
|
||||||
case 0x15: /* Read DASD Type */
|
default:
|
||||||
scsi_bios_command_id_check(BiosCmd->id, BiosCmd->lun);
|
cmd_log("BIOS: Unimplemented command: %02X\n", cmd->command);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].InitLength = 6;
|
cmd_log("BIOS Request complete\n");
|
||||||
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = (uint8_t *) malloc(6);
|
|
||||||
memset(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer, 0, 6);
|
|
||||||
|
|
||||||
ret = scsi_bios_command_15(BiosCmd->id, BiosCmd->lun, SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer);
|
|
||||||
|
|
||||||
scsi_bios_command_log("BusLogic BIOS DMA: Reading 6 bytes at %08X\n", dma_address);
|
|
||||||
DMAPageWrite(dma_address, (char *)SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer, 6);
|
|
||||||
|
|
||||||
if (SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer != NULL)
|
|
||||||
{
|
|
||||||
free(SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer);
|
|
||||||
SCSIDevices[BiosCmd->id][BiosCmd->lun].CmdBuffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
scsi_bios_command_log("BusLogic BIOS: Unimplemented command: %02X\n", BiosCmd->command);
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
pclog("BIOS Request complete\n");
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user