diff options
-rw-r--r-- | drivers/scsi/tmscsim.c | 29 | ||||
-rw-r--r-- | drivers/scsi/tmscsim.h | 9 |
2 files changed, 15 insertions, 23 deletions
diff --git a/drivers/scsi/tmscsim.c b/drivers/scsi/tmscsim.c index 73c5ca082e6..e8260f2dba0 100644 --- a/drivers/scsi/tmscsim.c +++ b/drivers/scsi/tmscsim.c | |||
@@ -1564,7 +1564,8 @@ dc390_Disconnect( struct dc390_acb* pACB ) | |||
1564 | if( (pSRB->SRBState & (SRB_START_+SRB_MSGOUT)) || | 1564 | if( (pSRB->SRBState & (SRB_START_+SRB_MSGOUT)) || |
1565 | !(pSRB->SRBState & (SRB_DISCONNECT+SRB_COMPLETED)) ) | 1565 | !(pSRB->SRBState & (SRB_DISCONNECT+SRB_COMPLETED)) ) |
1566 | { /* Selection time out */ | 1566 | { /* Selection time out */ |
1567 | pSRB->TargetStatus = SCSI_STAT_SEL_TIMEOUT; | 1567 | pSRB->AdaptStatus = H_SEL_TIMEOUT; |
1568 | pSRB->TargetStatus = 0; | ||
1568 | goto disc1; | 1569 | goto disc1; |
1569 | } | 1570 | } |
1570 | else if (!(pSRB->SRBState & SRB_DISCONNECT) && (pSRB->SRBState & SRB_COMPLETED)) | 1571 | else if (!(pSRB->SRBState & SRB_DISCONNECT) && (pSRB->SRBState & SRB_COMPLETED)) |
@@ -1713,17 +1714,17 @@ dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* | |||
1713 | { /* Last command was a Request Sense */ | 1714 | { /* Last command was a Request Sense */ |
1714 | pSRB->SRBFlag &= ~AUTO_REQSENSE; | 1715 | pSRB->SRBFlag &= ~AUTO_REQSENSE; |
1715 | pSRB->AdaptStatus = 0; | 1716 | pSRB->AdaptStatus = 0; |
1716 | pSRB->TargetStatus = CHECK_CONDITION << 1; | 1717 | pSRB->TargetStatus = SAM_STAT_CHECK_CONDITION; |
1717 | 1718 | ||
1718 | //pcmd->result = MK_RES(DRIVER_SENSE,DID_OK,0,status); | 1719 | //pcmd->result = MK_RES(DRIVER_SENSE,DID_OK,0,status); |
1719 | if (status == (CHECK_CONDITION << 1)) | 1720 | if (status == SAM_STAT_CHECK_CONDITION) |
1720 | pcmd->result = MK_RES_LNX(0, DID_BAD_TARGET, 0, /*CHECK_CONDITION*/0); | 1721 | pcmd->result = MK_RES_LNX(0, DID_BAD_TARGET, 0, /*CHECK_CONDITION*/0); |
1721 | else /* Retry */ | 1722 | else /* Retry */ |
1722 | { | 1723 | { |
1723 | if( pSRB->pcmd->cmnd[0] == TEST_UNIT_READY /* || pSRB->pcmd->cmnd[0] == START_STOP */) | 1724 | if( pSRB->pcmd->cmnd[0] == TEST_UNIT_READY /* || pSRB->pcmd->cmnd[0] == START_STOP */) |
1724 | { | 1725 | { |
1725 | /* Don't retry on TEST_UNIT_READY */ | 1726 | /* Don't retry on TEST_UNIT_READY */ |
1726 | pcmd->result = MK_RES_LNX(DRIVER_SENSE,DID_OK,0,CHECK_CONDITION); | 1727 | pcmd->result = MK_RES_LNX(DRIVER_SENSE, DID_OK, 0, SAM_STAT_CHECK_CONDITION); |
1727 | REMOVABLEDEBUG(printk(KERN_INFO "Cmd=%02x, Result=%08x, XferL=%08x\n",pSRB->pcmd->cmnd[0],\ | 1728 | REMOVABLEDEBUG(printk(KERN_INFO "Cmd=%02x, Result=%08x, XferL=%08x\n",pSRB->pcmd->cmnd[0],\ |
1728 | (u32) pcmd->result, (u32) pSRB->TotalXferredLen)); | 1729 | (u32) pcmd->result, (u32) pSRB->TotalXferredLen)); |
1729 | } else { | 1730 | } else { |
@@ -1739,7 +1740,7 @@ dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* | |||
1739 | } | 1740 | } |
1740 | if( status ) | 1741 | if( status ) |
1741 | { | 1742 | { |
1742 | if( status_byte(status) == CHECK_CONDITION ) | 1743 | if (status == SAM_STAT_CHECK_CONDITION) |
1743 | { | 1744 | { |
1744 | if (dc390_RequestSense(pACB, pDCB, pSRB)) { | 1745 | if (dc390_RequestSense(pACB, pDCB, pSRB)) { |
1745 | SET_RES_DID(pcmd->result, DID_ERROR); | 1746 | SET_RES_DID(pcmd->result, DID_ERROR); |
@@ -1747,7 +1748,7 @@ dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* | |||
1747 | } | 1748 | } |
1748 | return; | 1749 | return; |
1749 | } | 1750 | } |
1750 | else if( status_byte(status) == QUEUE_FULL ) | 1751 | else if (status == SAM_STAT_TASK_SET_FULL) |
1751 | { | 1752 | { |
1752 | scsi_track_queue_full(pcmd->device, pDCB->GoingSRBCnt - 1); | 1753 | scsi_track_queue_full(pcmd->device, pDCB->GoingSRBCnt - 1); |
1753 | scsi_sg_count(pcmd) = pSRB->SavedSGCount; | 1754 | scsi_sg_count(pcmd) = pSRB->SavedSGCount; |
@@ -1755,14 +1756,7 @@ dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* | |||
1755 | pSRB->TotalXferredLen = 0; | 1756 | pSRB->TotalXferredLen = 0; |
1756 | SET_RES_DID(pcmd->result, DID_SOFT_ERROR); | 1757 | SET_RES_DID(pcmd->result, DID_SOFT_ERROR); |
1757 | } | 1758 | } |
1758 | else if(status == SCSI_STAT_SEL_TIMEOUT) | 1759 | else if (status == SAM_STAT_BUSY && |
1759 | { | ||
1760 | pSRB->AdaptStatus = H_SEL_TIMEOUT; | ||
1761 | pSRB->TargetStatus = 0; | ||
1762 | pcmd->result = MK_RES(0,DID_NO_CONNECT,0,0); | ||
1763 | /* Devices are removed below ... */ | ||
1764 | } | ||
1765 | else if (status_byte(status) == BUSY && | ||
1766 | (pcmd->cmnd[0] == TEST_UNIT_READY || pcmd->cmnd[0] == INQUIRY) && | 1760 | (pcmd->cmnd[0] == TEST_UNIT_READY || pcmd->cmnd[0] == INQUIRY) && |
1767 | pACB->scan_devices) | 1761 | pACB->scan_devices) |
1768 | { | 1762 | { |
@@ -1780,12 +1774,17 @@ dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* | |||
1780 | else | 1774 | else |
1781 | { /* Target status == 0 */ | 1775 | { /* Target status == 0 */ |
1782 | status = pSRB->AdaptStatus; | 1776 | status = pSRB->AdaptStatus; |
1783 | if(status & H_OVER_UNDER_RUN) | 1777 | if (status == H_OVER_UNDER_RUN) |
1784 | { | 1778 | { |
1785 | pSRB->TargetStatus = 0; | 1779 | pSRB->TargetStatus = 0; |
1786 | SET_RES_DID(pcmd->result,DID_OK); | 1780 | SET_RES_DID(pcmd->result,DID_OK); |
1787 | SET_RES_MSG(pcmd->result,pSRB->EndMessage); | 1781 | SET_RES_MSG(pcmd->result,pSRB->EndMessage); |
1788 | } | 1782 | } |
1783 | else if (status == H_SEL_TIMEOUT) | ||
1784 | { | ||
1785 | pcmd->result = MK_RES(0, DID_NO_CONNECT, 0, 0); | ||
1786 | /* Devices are removed below ... */ | ||
1787 | } | ||
1789 | else if( pSRB->SRBStatus & PARITY_ERROR) | 1788 | else if( pSRB->SRBStatus & PARITY_ERROR) |
1790 | { | 1789 | { |
1791 | //pcmd->result = MK_RES(0,DID_PARITY,pSRB->EndMessage,0); | 1790 | //pcmd->result = MK_RES(0,DID_PARITY,pSRB->EndMessage,0); |
diff --git a/drivers/scsi/tmscsim.h b/drivers/scsi/tmscsim.h index c3d8c80cfb3..c74c72aadb0 100644 --- a/drivers/scsi/tmscsim.h +++ b/drivers/scsi/tmscsim.h | |||
@@ -258,13 +258,6 @@ struct dc390_srb SRB_array[MAX_SRB_CNT]; /* 50 SRBs */ | |||
258 | #define H_BAD_CCB_OR_SG 0x1A | 258 | #define H_BAD_CCB_OR_SG 0x1A |
259 | #define H_ABORT 0x0FF | 259 | #define H_ABORT 0x0FF |
260 | 260 | ||
261 | /*; SCSI Status byte codes*/ | ||
262 | /* The values defined in include/scsi/scsi.h, to be shifted << 1 */ | ||
263 | |||
264 | #define SCSI_STAT_UNEXP_BUS_F 0xFD /*; Unexpect Bus Free */ | ||
265 | #define SCSI_STAT_BUS_RST_DETECT 0xFE /*; Scsi Bus Reset detected */ | ||
266 | #define SCSI_STAT_SEL_TIMEOUT 0xFF /*; Selection Time out */ | ||
267 | |||
268 | /* cmd->result */ | 261 | /* cmd->result */ |
269 | #define RES_TARGET 0x000000FF /* Target State */ | 262 | #define RES_TARGET 0x000000FF /* Target State */ |
270 | #define RES_TARGET_LNX STATUS_MASK /* Only official ... */ | 263 | #define RES_TARGET_LNX STATUS_MASK /* Only official ... */ |
@@ -273,7 +266,7 @@ struct dc390_srb SRB_array[MAX_SRB_CNT]; /* 50 SRBs */ | |||
273 | #define RES_DRV 0xFF000000 /* DRIVER_ codes */ | 266 | #define RES_DRV 0xFF000000 /* DRIVER_ codes */ |
274 | 267 | ||
275 | #define MK_RES(drv,did,msg,tgt) ((int)(drv)<<24 | (int)(did)<<16 | (int)(msg)<<8 | (int)(tgt)) | 268 | #define MK_RES(drv,did,msg,tgt) ((int)(drv)<<24 | (int)(did)<<16 | (int)(msg)<<8 | (int)(tgt)) |
276 | #define MK_RES_LNX(drv,did,msg,tgt) ((int)(drv)<<24 | (int)(did)<<16 | (int)(msg)<<8 | (int)(tgt)<<1) | 269 | #define MK_RES_LNX(drv,did,msg,tgt) ((int)(drv)<<24 | (int)(did)<<16 | (int)(msg)<<8 | (int)(tgt)) |
277 | 270 | ||
278 | #define SET_RES_TARGET(who, tgt) do { who &= ~RES_TARGET; who |= (int)(tgt); } while (0) | 271 | #define SET_RES_TARGET(who, tgt) do { who &= ~RES_TARGET; who |= (int)(tgt); } while (0) |
279 | #define SET_RES_TARGET_LNX(who, tgt) do { who &= ~RES_TARGET_LNX; who |= (int)(tgt) << 1; } while (0) | 272 | #define SET_RES_TARGET_LNX(who, tgt) do { who &= ~RES_TARGET_LNX; who |= (int)(tgt) << 1; } while (0) |