.. | .. |
---|
152 | 152 | |
---|
153 | 153 | if (scsi_bufflen(cmd)) { |
---|
154 | 154 | cmd->SCp.buffer = scsi_sglist(cmd); |
---|
155 | | - cmd->SCp.buffers_residual = scsi_sg_count(cmd) - 1; |
---|
156 | 155 | cmd->SCp.ptr = sg_virt(cmd->SCp.buffer); |
---|
157 | 156 | cmd->SCp.this_residual = cmd->SCp.buffer->length; |
---|
158 | 157 | } else { |
---|
159 | 158 | cmd->SCp.buffer = NULL; |
---|
160 | | - cmd->SCp.buffers_residual = 0; |
---|
161 | 159 | cmd->SCp.ptr = NULL; |
---|
162 | 160 | cmd->SCp.this_residual = 0; |
---|
163 | 161 | } |
---|
164 | 162 | |
---|
165 | 163 | cmd->SCp.Status = 0; |
---|
166 | 164 | 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); |
---|
167 | 189 | } |
---|
168 | 190 | |
---|
169 | 191 | /** |
---|
.. | .. |
---|
275 | 297 | static void NCR5380_print(struct Scsi_Host *instance) |
---|
276 | 298 | { |
---|
277 | 299 | struct NCR5380_hostdata *hostdata = shost_priv(instance); |
---|
278 | | - unsigned char status, data, basr, mr, icr, i; |
---|
| 300 | + unsigned char status, basr, mr, icr, i; |
---|
279 | 301 | |
---|
280 | | - data = NCR5380_read(CURRENT_SCSI_DATA_REG); |
---|
281 | 302 | status = NCR5380_read(STATUS_REG); |
---|
282 | 303 | mr = NCR5380_read(MODE_REG); |
---|
283 | 304 | icr = NCR5380_read(INITIATOR_COMMAND_REG); |
---|
.. | .. |
---|
1200 | 1221 | |
---|
1201 | 1222 | out: |
---|
1202 | 1223 | if (!hostdata->selecting) |
---|
1203 | | - return NULL; |
---|
| 1224 | + return false; |
---|
1204 | 1225 | hostdata->selecting = NULL; |
---|
1205 | 1226 | return ret; |
---|
1206 | 1227 | } |
---|
.. | .. |
---|
1375 | 1396 | * MESSAGE OUT phase and sending an ABORT message. |
---|
1376 | 1397 | * @instance: relevant scsi host instance |
---|
1377 | 1398 | * |
---|
1378 | | - * Returns 0 on success, -1 on failure. |
---|
| 1399 | + * Returns 0 on success, negative error code on failure. |
---|
1379 | 1400 | */ |
---|
1380 | 1401 | |
---|
1381 | 1402 | static int do_abort(struct Scsi_Host *instance) |
---|
.. | .. |
---|
1400 | 1421 | |
---|
1401 | 1422 | rc = NCR5380_poll_politely(hostdata, STATUS_REG, SR_REQ, SR_REQ, 10 * HZ); |
---|
1402 | 1423 | if (rc < 0) |
---|
1403 | | - goto timeout; |
---|
| 1424 | + goto out; |
---|
1404 | 1425 | |
---|
1405 | 1426 | tmp = NCR5380_read(STATUS_REG) & PHASE_MASK; |
---|
1406 | 1427 | |
---|
.. | .. |
---|
1411 | 1432 | ICR_BASE | ICR_ASSERT_ATN | ICR_ASSERT_ACK); |
---|
1412 | 1433 | rc = NCR5380_poll_politely(hostdata, STATUS_REG, SR_REQ, 0, 3 * HZ); |
---|
1413 | 1434 | if (rc < 0) |
---|
1414 | | - goto timeout; |
---|
| 1435 | + goto out; |
---|
1415 | 1436 | NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN); |
---|
1416 | 1437 | } |
---|
1417 | 1438 | |
---|
.. | .. |
---|
1420 | 1441 | len = 1; |
---|
1421 | 1442 | phase = PHASE_MSGOUT; |
---|
1422 | 1443 | NCR5380_transfer_pio(instance, &phase, &len, &msgptr); |
---|
| 1444 | + if (len) |
---|
| 1445 | + rc = -ENXIO; |
---|
1423 | 1446 | |
---|
1424 | 1447 | /* |
---|
1425 | 1448 | * If we got here, and the command completed successfully, |
---|
1426 | 1449 | * we're about to go into bus free state. |
---|
1427 | 1450 | */ |
---|
1428 | 1451 | |
---|
1429 | | - return len ? -1 : 0; |
---|
1430 | | - |
---|
1431 | | -timeout: |
---|
| 1452 | +out: |
---|
1432 | 1453 | NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); |
---|
1433 | | - return -1; |
---|
| 1454 | + return rc; |
---|
1434 | 1455 | } |
---|
1435 | 1456 | |
---|
1436 | 1457 | /* |
---|
.. | .. |
---|
1675 | 1696 | sun3_dma_setup_done != cmd) { |
---|
1676 | 1697 | int count; |
---|
1677 | 1698 | |
---|
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); |
---|
1684 | 1700 | |
---|
1685 | 1701 | count = sun3scsi_dma_xfer_len(hostdata, cmd); |
---|
1686 | 1702 | |
---|
.. | .. |
---|
1730 | 1746 | * scatter-gather list, move onto the next one. |
---|
1731 | 1747 | */ |
---|
1732 | 1748 | |
---|
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)); |
---|
1742 | 1754 | |
---|
1743 | 1755 | /* |
---|
1744 | 1756 | * The preferred transfer method is going to be |
---|
.. | .. |
---|
1766 | 1778 | scmd_printk(KERN_INFO, cmd, |
---|
1767 | 1779 | "switching to slow handshake\n"); |
---|
1768 | 1780 | 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); |
---|
1773 | 1783 | } |
---|
1774 | 1784 | } else { |
---|
1775 | 1785 | /* Transfer a small chunk so that the |
---|
.. | .. |
---|
1809 | 1819 | cmd->result &= ~0xffff; |
---|
1810 | 1820 | cmd->result |= cmd->SCp.Status; |
---|
1811 | 1821 | cmd->result |= cmd->SCp.Message << 8; |
---|
| 1822 | + |
---|
| 1823 | + set_resid_from_SCp(cmd); |
---|
1812 | 1824 | |
---|
1813 | 1825 | if (cmd->cmnd[0] == REQUEST_SENSE) |
---|
1814 | 1826 | complete_cmd(instance, cmd); |
---|
.. | .. |
---|
1930 | 1942 | if (!hostdata->connected) |
---|
1931 | 1943 | return; |
---|
1932 | 1944 | |
---|
1933 | | - /* Fall through to reject message */ |
---|
1934 | | - |
---|
| 1945 | + /* Reject message */ |
---|
| 1946 | + fallthrough; |
---|
| 1947 | + default: |
---|
1935 | 1948 | /* |
---|
1936 | 1949 | * If we get something weird that we aren't expecting, |
---|
1937 | | - * reject it. |
---|
| 1950 | + * log it. |
---|
1938 | 1951 | */ |
---|
1939 | | - default: |
---|
1940 | 1952 | if (tmp == EXTENDED_MESSAGE) |
---|
1941 | 1953 | scmd_printk(KERN_INFO, cmd, |
---|
1942 | 1954 | "rejecting unknown extended message code %02x, length %d\n", |
---|
.. | .. |
---|
2133 | 2145 | if (sun3_dma_setup_done != tmp) { |
---|
2134 | 2146 | int count; |
---|
2135 | 2147 | |
---|
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); |
---|
2142 | 2149 | |
---|
2143 | 2150 | count = sun3scsi_dma_xfer_len(hostdata, tmp); |
---|
2144 | 2151 | |
---|
.. | .. |
---|
2276 | 2283 | dsprintk(NDEBUG_ABORT, instance, "abort: cmd %p is connected\n", cmd); |
---|
2277 | 2284 | hostdata->connected = NULL; |
---|
2278 | 2285 | hostdata->dma_len = 0; |
---|
2279 | | - if (do_abort(instance)) { |
---|
| 2286 | + if (do_abort(instance) < 0) { |
---|
2280 | 2287 | set_host_byte(cmd, DID_ERROR); |
---|
2281 | 2288 | complete_cmd(instance, cmd); |
---|
2282 | 2289 | result = FAILED; |
---|