aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/tmscsim.c29
-rw-r--r--drivers/scsi/tmscsim.h9
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)