| .. | .. |
|---|
| 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; |
|---|