Commit 8466fc34 authored by David Elliott's avatar David Elliott Committed by Alexandre Julliard

- New function in aspi.c SCSI_Fix_CMD_LEN which determines if Linux is

guessing the command length correctly, and if not, tell's it what's up. - Changed strcat to strcpy in SendASPI32Command to avoid requiring the caller to clear the fields. - Added a new field to HA_Unique content to fix some applications. Will fix this for good at a later date. - Added TRACE to GetASPI32DLLVersion (and FIXME when not running under Linux) - Added some constants to winescsi.h (with the help of Bernd Bernie Meyer <bmeyer@cs.monash.edu.au>)
parent ae3716d6
......@@ -199,6 +199,22 @@ SCSI_OpenDevice( int h, int c, int t, int d )
}
#ifdef linux
/* SCSI_Fix_CMD_LEN
* Checks to make sure the CMD_LEN is correct
*/
void
SCSI_Fix_CMD_LEN(int fd, int cmd, int len)
{
int index=(cmd>>5)&7;
if (len!=scsi_command_size[index])
{
TRACE("CDBLen for command %d claims to be %d, expected %d\n",
cmd, len, scsi_command_size[index]);
ioctl(fd,SG_NEXT_CMD_LEN,&len);
}
}
int
SCSI_LinuxSetTimeout( int fd, int timeout )
{
......
......@@ -363,6 +363,8 @@ ASPI_ExecScsiCmd(SRB_ExecSCSICmd *lpPRB)
sg_hd->reply_len = out_len;
}
SCSI_Fix_CMD_LEN(fd, lpPRB->CDBByte[0], lpPRB->SRB_CDBLen);
if(!SCSI_LinuxDeviceIo( fd,
sg_hd, in_len,
sg_reply_hdr, out_len,
......@@ -453,7 +455,7 @@ error_exit:
*/
DWORD WINAPI GetASPI32SupportInfo()
{
return ((SS_COMP << 8) | 1); /* FIXME: get # of host adapters installed */
return ((SS_COMP << 8) | ASPI_GetNumControllers());
}
......@@ -468,10 +470,11 @@ DWORD __cdecl SendASPI32Command(LPSRB lpSRB)
lpSRB->inquiry.SRB_Status = SS_COMP; /* completed successfully */
lpSRB->inquiry.HA_Count = 1; /* not always */
lpSRB->inquiry.HA_SCSI_ID = 7; /* not always ID 7 */
strcat(lpSRB->inquiry.HA_ManagerId, "ASPI for WIN32"); /* max 15 chars, don't change */
strcat(lpSRB->inquiry.HA_Identifier, "Wine host"); /* FIXME: return host adapter name */
strcpy(lpSRB->inquiry.HA_ManagerId, "ASPI for WIN32"); /* max 15 chars, don't change */
strcpy(lpSRB->inquiry.HA_Identifier, "Wine host"); /* FIXME: return host adapter name */
memset(lpSRB->inquiry.HA_Unique, 0, 16); /* default HA_Unique content */
lpSRB->inquiry.HA_Unique[6] = 0x02; /* Maximum Transfer Length (128K, Byte> 4-7) */
lpSRB->inquiry.HA_Unique[3] = 0x08; /* Maximum number of SCSI targets */
FIXME("ASPI: Partially implemented SC_HA_INQUIRY for adapter %d.\n", lpSRB->inquiry.SRB_HaId);
return SS_COMP;
......@@ -540,8 +543,10 @@ DWORD __cdecl SendASPI32Command(LPSRB lpSRB)
DWORD WINAPI GetASPI32DLLVersion()
{
#ifdef linux
TRACE("Returning version 1\n");
return (DWORD)1;
#else
FIXME("Please add SCSI support for your operating system, returning 0\n");
return (DWORD)0;
#endif
}
......
......@@ -5,6 +5,16 @@
/* Copy of info from 2.2.x kernel */
#define SG_MAX_SENSE 16 /* too little, unlikely to change in 2.2.x */
#define SG_NEXT_CMD_LEN 0x2283 /* override SCSI command length with given
number on the next write() on this file descriptor */
/* This is what the linux kernel thinks.... */
const static unsigned char scsi_command_size[8] =
{
6, 10, 10, 12,
12, 12, 10, 10
};
struct sg_header
{
int pack_len; /* [o] reply_len (ie useless), ignored as input */
......@@ -54,6 +64,9 @@ SCSI_LinuxDeviceIo( int fd,
struct sg_header * lpvInBuffer, DWORD cbInBuffer,
struct sg_header * lpvOutBuffer, DWORD cbOutBuffer,
LPDWORD lpcbBytesReturned );
void
SCSI_Fix_CMD_LEN( int fd, int cmd, int len );
#endif
BOOL
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment