hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/scsi/NCR5380.c
....@@ -152,18 +152,40 @@
152152
153153 if (scsi_bufflen(cmd)) {
154154 cmd->SCp.buffer = scsi_sglist(cmd);
155
- cmd->SCp.buffers_residual = scsi_sg_count(cmd) - 1;
156155 cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
157156 cmd->SCp.this_residual = cmd->SCp.buffer->length;
158157 } else {
159158 cmd->SCp.buffer = NULL;
160
- cmd->SCp.buffers_residual = 0;
161159 cmd->SCp.ptr = NULL;
162160 cmd->SCp.this_residual = 0;
163161 }
164162
165163 cmd->SCp.Status = 0;
166164 cmd->SCp.Message = 0;
165
+}
166
+
167
+static inline void advance_sg_buffer(struct scsi_cmnd *cmd)
168
+{
169
+ struct scatterlist *s = cmd->SCp.buffer;
170
+
171
+ if (!cmd->SCp.this_residual && s && !sg_is_last(s)) {
172
+ cmd->SCp.buffer = sg_next(s);
173
+ cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
174
+ cmd->SCp.this_residual = cmd->SCp.buffer->length;
175
+ }
176
+}
177
+
178
+static inline void set_resid_from_SCp(struct scsi_cmnd *cmd)
179
+{
180
+ int resid = cmd->SCp.this_residual;
181
+ struct scatterlist *s = cmd->SCp.buffer;
182
+
183
+ if (s)
184
+ while (!sg_is_last(s)) {
185
+ s = sg_next(s);
186
+ resid += s->length;
187
+ }
188
+ scsi_set_resid(cmd, resid);
167189 }
168190
169191 /**
....@@ -275,9 +297,8 @@
275297 static void NCR5380_print(struct Scsi_Host *instance)
276298 {
277299 struct NCR5380_hostdata *hostdata = shost_priv(instance);
278
- unsigned char status, data, basr, mr, icr, i;
300
+ unsigned char status, basr, mr, icr, i;
279301
280
- data = NCR5380_read(CURRENT_SCSI_DATA_REG);
281302 status = NCR5380_read(STATUS_REG);
282303 mr = NCR5380_read(MODE_REG);
283304 icr = NCR5380_read(INITIATOR_COMMAND_REG);
....@@ -1200,7 +1221,7 @@
12001221
12011222 out:
12021223 if (!hostdata->selecting)
1203
- return NULL;
1224
+ return false;
12041225 hostdata->selecting = NULL;
12051226 return ret;
12061227 }
....@@ -1375,7 +1396,7 @@
13751396 * MESSAGE OUT phase and sending an ABORT message.
13761397 * @instance: relevant scsi host instance
13771398 *
1378
- * Returns 0 on success, -1 on failure.
1399
+ * Returns 0 on success, negative error code on failure.
13791400 */
13801401
13811402 static int do_abort(struct Scsi_Host *instance)
....@@ -1400,7 +1421,7 @@
14001421
14011422 rc = NCR5380_poll_politely(hostdata, STATUS_REG, SR_REQ, SR_REQ, 10 * HZ);
14021423 if (rc < 0)
1403
- goto timeout;
1424
+ goto out;
14041425
14051426 tmp = NCR5380_read(STATUS_REG) & PHASE_MASK;
14061427
....@@ -1411,7 +1432,7 @@
14111432 ICR_BASE | ICR_ASSERT_ATN | ICR_ASSERT_ACK);
14121433 rc = NCR5380_poll_politely(hostdata, STATUS_REG, SR_REQ, 0, 3 * HZ);
14131434 if (rc < 0)
1414
- goto timeout;
1435
+ goto out;
14151436 NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
14161437 }
14171438
....@@ -1420,17 +1441,17 @@
14201441 len = 1;
14211442 phase = PHASE_MSGOUT;
14221443 NCR5380_transfer_pio(instance, &phase, &len, &msgptr);
1444
+ if (len)
1445
+ rc = -ENXIO;
14231446
14241447 /*
14251448 * If we got here, and the command completed successfully,
14261449 * we're about to go into bus free state.
14271450 */
14281451
1429
- return len ? -1 : 0;
1430
-
1431
-timeout:
1452
+out:
14321453 NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
1433
- return -1;
1454
+ return rc;
14341455 }
14351456
14361457 /*
....@@ -1675,12 +1696,7 @@
16751696 sun3_dma_setup_done != cmd) {
16761697 int count;
16771698
1678
- if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
1679
- ++cmd->SCp.buffer;
1680
- --cmd->SCp.buffers_residual;
1681
- cmd->SCp.this_residual = cmd->SCp.buffer->length;
1682
- cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
1683
- }
1699
+ advance_sg_buffer(cmd);
16841700
16851701 count = sun3scsi_dma_xfer_len(hostdata, cmd);
16861702
....@@ -1730,15 +1746,11 @@
17301746 * scatter-gather list, move onto the next one.
17311747 */
17321748
1733
- if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
1734
- ++cmd->SCp.buffer;
1735
- --cmd->SCp.buffers_residual;
1736
- cmd->SCp.this_residual = cmd->SCp.buffer->length;
1737
- cmd->SCp.ptr = sg_virt(cmd->SCp.buffer);
1738
- dsprintk(NDEBUG_INFORMATION, instance, "%d bytes and %d buffers left\n",
1739
- cmd->SCp.this_residual,
1740
- cmd->SCp.buffers_residual);
1741
- }
1749
+ advance_sg_buffer(cmd);
1750
+ dsprintk(NDEBUG_INFORMATION, instance,
1751
+ "this residual %d, sg ents %d\n",
1752
+ cmd->SCp.this_residual,
1753
+ sg_nents(cmd->SCp.buffer));
17421754
17431755 /*
17441756 * The preferred transfer method is going to be
....@@ -1766,10 +1778,8 @@
17661778 scmd_printk(KERN_INFO, cmd,
17671779 "switching to slow handshake\n");
17681780 cmd->device->borken = 1;
1769
- sink = 1;
1770
- do_abort(instance);
1771
- cmd->result = DID_ERROR << 16;
1772
- /* XXX - need to source or sink data here, as appropriate */
1781
+ do_reset(instance);
1782
+ bus_reset_cleanup(instance);
17731783 }
17741784 } else {
17751785 /* Transfer a small chunk so that the
....@@ -1809,6 +1819,8 @@
18091819 cmd->result &= ~0xffff;
18101820 cmd->result |= cmd->SCp.Status;
18111821 cmd->result |= cmd->SCp.Message << 8;
1822
+
1823
+ set_resid_from_SCp(cmd);
18121824
18131825 if (cmd->cmnd[0] == REQUEST_SENSE)
18141826 complete_cmd(instance, cmd);
....@@ -1930,13 +1942,13 @@
19301942 if (!hostdata->connected)
19311943 return;
19321944
1933
- /* Fall through to reject message */
1934
-
1945
+ /* Reject message */
1946
+ fallthrough;
1947
+ default:
19351948 /*
19361949 * If we get something weird that we aren't expecting,
1937
- * reject it.
1950
+ * log it.
19381951 */
1939
- default:
19401952 if (tmp == EXTENDED_MESSAGE)
19411953 scmd_printk(KERN_INFO, cmd,
19421954 "rejecting unknown extended message code %02x, length %d\n",
....@@ -2133,12 +2145,7 @@
21332145 if (sun3_dma_setup_done != tmp) {
21342146 int count;
21352147
2136
- if (!tmp->SCp.this_residual && tmp->SCp.buffers_residual) {
2137
- ++tmp->SCp.buffer;
2138
- --tmp->SCp.buffers_residual;
2139
- tmp->SCp.this_residual = tmp->SCp.buffer->length;
2140
- tmp->SCp.ptr = sg_virt(tmp->SCp.buffer);
2141
- }
2148
+ advance_sg_buffer(tmp);
21422149
21432150 count = sun3scsi_dma_xfer_len(hostdata, tmp);
21442151
....@@ -2276,7 +2283,7 @@
22762283 dsprintk(NDEBUG_ABORT, instance, "abort: cmd %p is connected\n", cmd);
22772284 hostdata->connected = NULL;
22782285 hostdata->dma_len = 0;
2279
- if (do_abort(instance)) {
2286
+ if (do_abort(instance) < 0) {
22802287 set_host_byte(cmd, DID_ERROR);
22812288 complete_cmd(instance, cmd);
22822289 result = FAILED;