Ticket #1694: os_linux.cpp.diff

File os_linux.cpp.diff, 3.1 KB (added by steven.song, 15 months ago)
  • os_linux.cpp

     
    13991399  unsigned int m_eid;
    14001400  unsigned int m_sid;
    14011401
    1402   bool scsi_cmd(int cdbLen, void *cdb, int dataLen, void *data, int direction);
     1402  bool scsi_cmd(scsi_cmnd_io *iop);
    14031403};
    14041404
    14051405linux_sssraid_device::linux_sssraid_device(smart_interface *intf,
     
    14391439    pout("%s", buff);
    14401440  }
    14411441
    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);
    14441443  return r;
    14451444}
    14461445
    14471446/* 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)
     1447bool linux_sssraid_device::scsi_cmd(scsi_cmnd_io *iop)
    14501448{
    14511449  struct sg_io_v4 io_hdr_v4;
    14521450  struct cmd_scsi_passthrough scsi_param;
     
    14571455  memset(&bsg_param, 0, sizeof(bsg_param));
    14581456  scsi_param.sense_buffer = sense_buff;
    14591457  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);
    14621460  scsi_param.loc.enc_id = m_eid;
    14631461  scsi_param.loc.slot_id = m_sid;
    14641462
     
    14711469  io_hdr_v4.request = (uintptr_t)(&bsg_param);
    14721470  io_hdr_v4.timeout =  BSG_APPEND_TIMEOUT_MS + DEFAULT_CONMMAND_TIMEOUT_MS;
    14731471
    1474   switch (dxfer_dir) {
     1472  switch (iop->dxfer_dir) {
    14751473    case DXFER_NONE:
     1474      bsg_param.ioctl_pthru.opcode = ADM_RAID_SET;
     1475      break;
    14761476    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;
    14791479      bsg_param.ioctl_pthru.opcode = ADM_RAID_READ;
    14801480      break;
    14811481    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;
    14841484      bsg_param.ioctl_pthru.opcode = ADM_RAID_WRITE;
    14851485      break;
    14861486    default:
     
    14911491  bsg_param.msgcode = ADM_BSG_MSGCODE_SCSI_PTHRU;
    14921492  bsg_param.ioctl_pthru.timeout_ms = DEFAULT_CONMMAND_TIMEOUT_MS;
    14931493  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;
    14961496
    14971497  bsg_param.ioctl_pthru.info_0.cdb_len = scsi_param.cdb_len;
    14981498  bsg_param.ioctl_pthru.sense_addr = (uintptr_t)scsi_param.sense_buffer;
     
    15111511    return (r);
    15121512  }
    15131513
     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
    15141524  return true;
    15151525}
    15161526