Ticket #1694: os_linux.cpp.diff
File os_linux.cpp.diff, 3.1 KB (added by , 2 years ago) |
---|
-
os_linux.cpp
1399 1399 unsigned int m_eid; 1400 1400 unsigned int m_sid; 1401 1401 1402 bool scsi_cmd( int cdbLen, void *cdb, int dataLen, void *data, int direction);1402 bool scsi_cmd(scsi_cmnd_io *iop); 1403 1403 }; 1404 1404 1405 1405 linux_sssraid_device::linux_sssraid_device(smart_interface *intf, … … 1439 1439 pout("%s", buff); 1440 1440 } 1441 1441 1442 bool r = scsi_cmd(iop->cmnd_len, iop->cmnd, 1443 iop->dxfer_len, iop->dxferp, iop->dxfer_dir); 1442 bool r = scsi_cmd(iop); 1444 1443 return r; 1445 1444 } 1446 1445 1447 1446 /* Issue passthrough scsi commands to sssraid controllers */ 1448 bool linux_sssraid_device::scsi_cmd(int cdbLen, void *cdb, 1449 int dataLen, void *data, int dxfer_dir) 1447 bool linux_sssraid_device::scsi_cmd(scsi_cmnd_io *iop) 1450 1448 { 1451 1449 struct sg_io_v4 io_hdr_v4; 1452 1450 struct cmd_scsi_passthrough scsi_param; … … 1457 1455 memset(&bsg_param, 0, sizeof(bsg_param)); 1458 1456 scsi_param.sense_buffer = sense_buff; 1459 1457 scsi_param.sense_buffer_len = 96; 1460 scsi_param.cdb_len = cdbLen;1461 memcpy(scsi_param.cdb, cdb, cdbLen);1458 scsi_param.cdb_len = iop->cmnd_len; 1459 memcpy(scsi_param.cdb, iop->cmnd, iop->cmnd_len); 1462 1460 scsi_param.loc.enc_id = m_eid; 1463 1461 scsi_param.loc.slot_id = m_sid; 1464 1462 … … 1471 1469 io_hdr_v4.request = (uintptr_t)(&bsg_param); 1472 1470 io_hdr_v4.timeout = BSG_APPEND_TIMEOUT_MS + DEFAULT_CONMMAND_TIMEOUT_MS; 1473 1471 1474 switch ( dxfer_dir) {1472 switch (iop->dxfer_dir) { 1475 1473 case DXFER_NONE: 1474 bsg_param.ioctl_pthru.opcode = ADM_RAID_SET; 1475 break; 1476 1476 case DXFER_FROM_DEVICE: 1477 io_hdr_v4.din_xferp = (uintptr_t) data;1478 io_hdr_v4.din_xfer_len = dataLen;1477 io_hdr_v4.din_xferp = (uintptr_t)iop->dxferp; 1478 io_hdr_v4.din_xfer_len = iop->dxfer_len; 1479 1479 bsg_param.ioctl_pthru.opcode = ADM_RAID_READ; 1480 1480 break; 1481 1481 case DXFER_TO_DEVICE: 1482 io_hdr_v4.dout_xferp = (uintptr_t) data;1483 io_hdr_v4.dout_xfer_len = dataLen;1482 io_hdr_v4.dout_xferp = (uintptr_t)iop->dxferp; 1483 io_hdr_v4.dout_xfer_len = iop->dxfer_len; 1484 1484 bsg_param.ioctl_pthru.opcode = ADM_RAID_WRITE; 1485 1485 break; 1486 1486 default: … … 1491 1491 bsg_param.msgcode = ADM_BSG_MSGCODE_SCSI_PTHRU; 1492 1492 bsg_param.ioctl_pthru.timeout_ms = DEFAULT_CONMMAND_TIMEOUT_MS; 1493 1493 bsg_param.ioctl_pthru.info_1.subopcode = ADM_CMD_SCSI_PASSTHROUGH; 1494 bsg_param.ioctl_pthru.addr = (uintptr_t) data;1495 bsg_param.ioctl_pthru.data_len = dataLen;1494 bsg_param.ioctl_pthru.addr = (uintptr_t)iop->dxferp; 1495 bsg_param.ioctl_pthru.data_len = iop->dxfer_len; 1496 1496 1497 1497 bsg_param.ioctl_pthru.info_0.cdb_len = scsi_param.cdb_len; 1498 1498 bsg_param.ioctl_pthru.sense_addr = (uintptr_t)scsi_param.sense_buffer; … … 1511 1511 return (r); 1512 1512 } 1513 1513 1514 iop->scsi_status = io_hdr_v4.device_status; 1515 1516 int len = ( iop->max_sense_len < io_hdr_v4.max_response_len ) ? 1517 iop->max_sense_len : io_hdr_v4.max_response_len; 1518 1519 if (iop->sensep != NULL && len > 0) { 1520 memcpy((uint8_t*)iop->sensep, (uint8_t*)io_hdr_v4.response, len); 1521 iop->resp_sense_len = len; 1522 } 1523 1514 1524 return true; 1515 1525 } 1516 1526