MCPcopy Create free account
hub / github.com/BlitterStudio/amiberry / execscsicmd_direct

Function execscsicmd_direct

src/blkdev.cpp:2295–2353  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2293}
2294
2295static int execscsicmd_direct (int unitnum, int type, struct amigascsi *as)
2296{
2297 int io_error = 0;
2298 uae_u8 *scsi_datap, *scsi_datap_org;
2299 uae_u32 scsi_cmd_len_orig = as->cmd_len;
2300 uae_u8 cmd[16] = { 0 };
2301 uae_u8 replydata[256] = { 0 };
2302 int datalen = as->len;
2303 int senselen = as->sense_len;
2304 int replylen = 0;
2305
2306 memcpy (cmd, as->cmd, as->cmd_len);
2307 scsi_datap = scsi_datap_org = as->len ? as->data : 0;
2308 if (as->sense_len > 32)
2309 as->sense_len = 32;
2310
2311 /* never report media change state if uaescsi.device */
2312 state[unitnum].mediawaschanged = false;
2313
2314 switch (type)
2315 {
2316 case INQ_ROMD:
2317 as->status = scsi_cd_emulate (unitnum, cmd, as->cmd_len, scsi_datap, &datalen, replydata, &replylen, as->sensedata, &senselen, false);
2318 break;
2319 case INQ_SEQD:
2320 as->status = scsi_tape_emulate (state[unitnum].tape, cmd, as->cmd_len, scsi_datap, &datalen, replydata, &replylen, as->sensedata, &senselen);
2321 break;
2322 default:
2323 as->status = 2;
2324 break;
2325 }
2326
2327 as->cmdactual = as->status != 0 ? 0 : as->cmd_len; /* fake scsi_CmdActual */
2328 if (as->status) {
2329 io_error = IOERR_BadStatus;
2330 as->sactual = senselen;
2331 as->actual = 0; /* scsi_Actual */
2332 } else {
2333 int i;
2334 if (replylen > 0) {
2335 for (int i = 0; i < replylen; i++) {
2336 scsi_datap[i] = replydata[i];
2337 }
2338 datalen = replylen;
2339 }
2340 for (i = 0; i < as->sense_len; i++)
2341 as->sensedata[i] = 0;
2342 if (datalen < 0) {
2343 io_error = IOERR_NotSpecified;
2344 as->actual = 0; /* scsi_Actual */
2345 } else {
2346 as->len = datalen;
2347 io_error = 0;
2348 as->actual = as->len; /* scsi_Actual */
2349 }
2350 }
2351
2352 return io_error;

Callers 1

Calls 2

scsi_cd_emulateFunction · 0.85
scsi_tape_emulateFunction · 0.85

Tested by

no test coverage detected