Ticket #1694: 3snic.dff

File 3snic.dff, 5.5 KB (added by steven.song, 15 months ago)
Line 
1Index: ChangeLog
2===================================================================
3--- ChangeLog (revision 5456)
4+++ ChangeLog (working copy)
5@@ -1,5 +1,10 @@
6 $Id$
7
8+2023-02-17 Steven Song <steven.song@3snic.com>
9+
10+ os_linux.cpp: Fix CK_COND issue for SATA disk and use C++11 or
11+ later structure initialization.
12+
13 2023-02-14 WHR <whr@rivoreo.one>
14
15 atacmds.cpp: fix a logical error in function ataReadExtSelfTestLog
16Index: os_linux.cpp
17===================================================================
18--- os_linux.cpp (revision 5456)
19+++ os_linux.cpp (working copy)
20@@ -1399,7 +1399,7 @@
21 unsigned int m_eid;
22 unsigned int m_sid;
23
24- bool scsi_cmd(int cdbLen, void *cdb, int dataLen, void *data, int direction);
25+ bool scsi_cmd(scsi_cmnd_io *iop);
26 };
27
28 linux_sssraid_device::linux_sssraid_device(smart_interface *intf,
29@@ -1439,26 +1439,21 @@
30 pout("%s", buff);
31 }
32
33- bool r = scsi_cmd(iop->cmnd_len, iop->cmnd,
34- iop->dxfer_len, iop->dxferp, iop->dxfer_dir);
35+ bool r = scsi_cmd(iop);
36 return r;
37 }
38
39 /* Issue passthrough scsi commands to sssraid controllers */
40-bool linux_sssraid_device::scsi_cmd(int cdbLen, void *cdb,
41- int dataLen, void *data, int dxfer_dir)
42+bool linux_sssraid_device::scsi_cmd(scsi_cmnd_io *iop)
43 {
44- struct sg_io_v4 io_hdr_v4;
45- struct cmd_scsi_passthrough scsi_param;
46+ struct sg_io_v4 io_hdr_v4{};
47+ struct cmd_scsi_passthrough scsi_param{};
48 unsigned char sense_buff[96] = { 0 };
49- struct bsg_ioctl_cmd bsg_param;
50- memset(&io_hdr_v4, 0, sizeof(io_hdr_v4));
51- memset(&scsi_param, 0, sizeof(scsi_param));
52- memset(&bsg_param, 0, sizeof(bsg_param));
53+ struct bsg_ioctl_cmd bsg_param{};
54 scsi_param.sense_buffer = sense_buff;
55 scsi_param.sense_buffer_len = 96;
56- scsi_param.cdb_len = cdbLen;
57- memcpy(scsi_param.cdb, cdb, cdbLen);
58+ scsi_param.cdb_len = iop->cmnd_len;
59+ memcpy(scsi_param.cdb, iop->cmnd, iop->cmnd_len);
60 scsi_param.loc.enc_id = m_eid;
61 scsi_param.loc.slot_id = m_sid;
62
63@@ -1471,16 +1466,18 @@
64 io_hdr_v4.request = (uintptr_t)(&bsg_param);
65 io_hdr_v4.timeout = BSG_APPEND_TIMEOUT_MS + DEFAULT_CONMMAND_TIMEOUT_MS;
66
67- switch (dxfer_dir) {
68+ switch (iop->dxfer_dir) {
69 case DXFER_NONE:
70+ bsg_param.ioctl_pthru.opcode = ADM_RAID_SET;
71+ break;
72 case DXFER_FROM_DEVICE:
73- io_hdr_v4.din_xferp = (uintptr_t)data;
74- io_hdr_v4.din_xfer_len = dataLen;
75+ io_hdr_v4.din_xferp = (uintptr_t)iop->dxferp;
76+ io_hdr_v4.din_xfer_len = iop->dxfer_len;
77 bsg_param.ioctl_pthru.opcode = ADM_RAID_READ;
78 break;
79 case DXFER_TO_DEVICE:
80- io_hdr_v4.dout_xferp = (uintptr_t)data;
81- io_hdr_v4.dout_xfer_len = dataLen;
82+ io_hdr_v4.dout_xferp = (uintptr_t)iop->dxferp;
83+ io_hdr_v4.dout_xfer_len = iop->dxfer_len;
84 bsg_param.ioctl_pthru.opcode = ADM_RAID_WRITE;
85 break;
86 default:
87@@ -1491,8 +1488,8 @@
88 bsg_param.msgcode = ADM_BSG_MSGCODE_SCSI_PTHRU;
89 bsg_param.ioctl_pthru.timeout_ms = DEFAULT_CONMMAND_TIMEOUT_MS;
90 bsg_param.ioctl_pthru.info_1.subopcode = ADM_CMD_SCSI_PASSTHROUGH;
91- bsg_param.ioctl_pthru.addr = (uintptr_t)data;
92- bsg_param.ioctl_pthru.data_len = dataLen;
93+ bsg_param.ioctl_pthru.addr = (uintptr_t)iop->dxferp;
94+ bsg_param.ioctl_pthru.data_len = iop->dxfer_len;
95
96 bsg_param.ioctl_pthru.info_0.cdb_len = scsi_param.cdb_len;
97 bsg_param.ioctl_pthru.sense_addr = (uintptr_t)scsi_param.sense_buffer;
98@@ -1507,10 +1504,21 @@
99 memcpy(&bsg_param.ioctl_pthru.cdw16, scsi_param.cdb, scsi_param.cdb_len);
100
101 int r = ioctl(get_fd(), SG_IO, &io_hdr_v4);
102- if (r < 0) {
103- return (r);
104+ if (r != 0) {
105+ return set_err((errno ? errno : EIO), "scsi_cmd ioctl failed: %d %d,%d",
106+ errno, scsi_param.loc.enc_id, scsi_param.loc.slot_id);
107 }
108
109+ iop->scsi_status = io_hdr_v4.device_status;
110+
111+ int len = ( iop->max_sense_len < io_hdr_v4.max_response_len ) ?
112+ iop->max_sense_len : io_hdr_v4.max_response_len;
113+
114+ if (iop->sensep && len > 0) {
115+ memcpy(iop->sensep, reinterpret_cast<void *>(io_hdr_v4.response), len);
116+ iop->resp_sense_len = len;
117+ }
118+
119 return true;
120 }
121
122@@ -3257,13 +3265,11 @@
123 int
124 linux_smart_interface::sssraid_pdlist_cmd(int bus_no, uint16_t start_idx_param, void *buf, size_t bufsize, uint8_t *statusp)
125 {
126- struct sg_io_v4 io_hdr_v4;
127+ struct sg_io_v4 io_hdr_v4{};
128 unsigned char sense_buff[ADM_SCSI_CDB_SENSE_MAX_LEN] = { 0 };
129- struct bsg_ioctl_cmd bsg_param;
130+ struct bsg_ioctl_cmd bsg_param{};
131 u8 cmd_param[24] = { 0 };
132
133- memset(&io_hdr_v4, 0, sizeof(io_hdr_v4));
134- memset(&bsg_param, 0, sizeof(bsg_param));
135 io_hdr_v4.guard = 'Q';
136 io_hdr_v4.protocol = BSG_PROTOCOL_SCSI;
137 io_hdr_v4.subprotocol = BSG_SUB_PROTOCOL_SCSI_TRANSPORT;
138@@ -3286,7 +3292,7 @@
139 bsg_param.ioctl_r64.info_1.data_len = bufsize;
140 bsg_param.ioctl_r64.data_len = bufsize;
141 bsg_param.ioctl_r64.info_1.param_len = sizeof(struct cmd_pdlist_idx);
142- memset(&cmd_param, 0, 24);
143+
144 struct cmd_pdlist_idx *p_cmd_param = (struct cmd_pdlist_idx *)(&cmd_param);
145 p_cmd_param->start_idx = start_idx_param;
146 p_cmd_param->count = CMD_PDLIST_ONCE_NUM;
147@@ -3321,10 +3327,9 @@
148 linux_smart_interface::sssraid_pd_add_list(int bus_no, smart_device_list & devlist)
149 {
150 unsigned disk_num = 0;
151- struct cmd_pdlist_entry pdlist[CMD_PDS_MAX_NUM];
152+ struct cmd_pdlist_entry pdlist[CMD_PDS_MAX_NUM]{};
153 while (disk_num < CMD_PDS_MAX_NUM) {
154- struct cmd_show_pdlist list;
155- memset(&list, 0, sizeof(list));
156+ struct cmd_show_pdlist list{};
157 if (sssraid_pdlist_cmd(bus_no, disk_num, &list, sizeof(struct cmd_show_pdlist), NULL) < 0)
158 {
159 return (-1);