Commit d1d5ca53 authored by Yorick Hardy's avatar Yorick Hardy Committed by Alexandre Julliard

Implement CDROM_ScsiPassThrough and CDROM_ScsiPassThroughDirect on

NetBSD.
parent b2f32bc6
......@@ -1410,6 +1410,67 @@ static DWORD CDROM_ScsiPassThroughDirect(int dev, PSCSI_PASS_THROUGH_DIRECT pPac
pPacket->ScsiStatus = cmd.stat;
ret = CDROM_GetStatusCode(io);
#elif defined(__NetBSD__)
scsireq_t cmd;
int io;
if (pPacket->Length < sizeof(SCSI_PASS_THROUGH_DIRECT))
return STATUS_BUFFER_TOO_SMALL;
if (pPacket->CdbLength > 12)
return STATUS_INVALID_PARAMETER;
if (pPacket->SenseInfoLength > SENSEBUFLEN)
return STATUS_INVALID_PARAMETER;
memset(&cmd, 0, sizeof(cmd));
memcpy(&(cmd.cmd), &(pPacket->Cdb), pPacket->CdbLength);
cmd.cmdlen = pPacket->CdbLength;
cmd.databuf = pPacket->DataBuffer;
cmd.datalen = pPacket->DataTransferLength;
cmd.senselen = pPacket->SenseInfoLength;
cmd.timeout = pPacket->TimeOutValue*1000; /* in milliseconds */
switch (pPacket->DataIn)
{
case SCSI_IOCTL_DATA_OUT:
cmd.flags |= SCCMD_WRITE;
break;
case SCSI_IOCTL_DATA_IN:
cmd.flags |= SCCMD_READ;
break;
case SCSI_IOCTL_DATA_UNSPECIFIED:
cmd.flags = 0;
break;
default:
return STATUS_INVALID_PARAMETER;
}
io = ioctl(cdrom_cache[dev].fd, SCIOCCOMMAND, &cmd);
switch (cmd.retsts)
{
case SCCMD_OK: break;
case SCCMD_TIMEOUT: return STATUS_TIMEOUT;
break;
case SCCMD_BUSY: return STATUS_DEVICE_BUSY;
break;
case SCCMD_SENSE: break;
case SCCMD_UNKNOWN: return STATUS_UNSUCCESSFUL;
break;
}
if (pPacket->SenseInfoLength != 0)
{
memcpy((char*)pPacket + pPacket->SenseInfoOffset,
cmd.sense, pPacket->SenseInfoLength);
}
pPacket->ScsiStatus = cmd.status;
ret = CDROM_GetStatusCode(io);
#endif
return ret;
}
......@@ -1480,6 +1541,75 @@ static DWORD CDROM_ScsiPassThrough(int dev, PSCSI_PASS_THROUGH pPacket)
pPacket->ScsiStatus = cmd.stat;
ret = CDROM_GetStatusCode(io);
#elif defined(__NetBSD__)
scsireq_t cmd;
int io;
if (pPacket->Length < sizeof(SCSI_PASS_THROUGH))
return STATUS_BUFFER_TOO_SMALL;
if (pPacket->CdbLength > 12)
return STATUS_INVALID_PARAMETER;
if (pPacket->SenseInfoLength > SENSEBUFLEN)
return STATUS_INVALID_PARAMETER;
memset(&cmd, 0, sizeof(cmd));
memcpy(&(cmd.cmd), &(pPacket->Cdb), pPacket->CdbLength);
if ( pPacket->DataBufferOffset > 0x1000 )
{
cmd.databuf = (void*)pPacket->DataBufferOffset;
}
else
{
cmd.databuf = (char*)pPacket + pPacket->DataBufferOffset;
}
cmd.cmdlen = pPacket->CdbLength;
cmd.datalen = pPacket->DataTransferLength;
cmd.senselen = pPacket->SenseInfoLength;
cmd.timeout = pPacket->TimeOutValue*1000; /* in milliseconds */
switch (pPacket->DataIn)
{
case SCSI_IOCTL_DATA_OUT:
cmd.flags |= SCCMD_WRITE;
break;
case SCSI_IOCTL_DATA_IN:
cmd.flags |= SCCMD_READ;
break;
case SCSI_IOCTL_DATA_UNSPECIFIED:
cmd.flags = 0;
break;
default:
return STATUS_INVALID_PARAMETER;
}
io = ioctl(cdrom_cache[dev].fd, SCIOCCOMMAND, &cmd);
switch (cmd.retsts)
{
case SCCMD_OK: break;
case SCCMD_TIMEOUT: return STATUS_TIMEOUT;
break;
case SCCMD_BUSY: return STATUS_DEVICE_BUSY;
break;
case SCCMD_SENSE: break;
case SCCMD_UNKNOWN: return STATUS_UNSUCCESSFUL;
break;
}
if (pPacket->SenseInfoLength != 0)
{
memcpy((char*)pPacket + pPacket->SenseInfoOffset,
cmd.sense, pPacket->SenseInfoLength);
}
pPacket->ScsiStatus = cmd.status;
ret = CDROM_GetStatusCode(io);
#endif
return ret;
}
......
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