Implement CDROM_ScsiPassThrough and CDROM_ScsiPassThroughDirect on
NetBSD.
This commit is contained in:
parent
b2f32bc604
commit
d1d5ca539d
|
@ -1409,6 +1409,67 @@ static DWORD CDROM_ScsiPassThroughDirect(int dev, PSCSI_PASS_THROUGH_DIRECT pPac
|
||||||
|
|
||||||
pPacket->ScsiStatus = cmd.stat;
|
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);
|
ret = CDROM_GetStatusCode(io);
|
||||||
#endif
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1479,6 +1540,75 @@ static DWORD CDROM_ScsiPassThrough(int dev, PSCSI_PASS_THROUGH pPacket)
|
||||||
|
|
||||||
pPacket->ScsiStatus = cmd.stat;
|
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);
|
ret = CDROM_GetStatusCode(io);
|
||||||
#endif
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue