vserver 1.9.3
[linux-2.6.git] / drivers / scsi / scsiiom.c
index 89b9576..bc69079 100644 (file)
@@ -213,8 +213,17 @@ dc390_dma_intr (struct dc390_acb* pACB)
 }
 #endif
 
+
+static void __inline__
+dc390_InvalidCmd(struct dc390_acb* pACB)
+{
+       if (pACB->pActiveDCB->pActiveSRB->SRBState & (SRB_START_ | SRB_MSGOUT))
+               DC390_write8(ScsiCmd, CLEAR_FIFO_CMD);
+}
+
+
 static irqreturn_t __inline__
-DC390_Interrupt( int irq, void *dev_id, struct pt_regs *regs)
+DC390_Interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
     struct dc390_acb *pACB, *pACB2;
     struct dc390_dcb *pDCB;
@@ -594,7 +603,7 @@ dc390_MsgIn_reject (struct dc390_acb* pACB, struct dc390_srb* pSRB)
 }
 
 /* abort command */
-static void __inline__
+static void
 dc390_EnableMsgOut_Abort ( struct dc390_acb* pACB, struct dc390_srb* pSRB )
 {
     pSRB->MsgOutBuf[0] = ABORT; 
@@ -890,14 +899,22 @@ dc390_DataIO_Comm( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 ioDir)
 
     if (pSRB == pACB->pTmpSRB)
     {
-       if (pDCB) printk (KERN_ERR "DC390: pSRB == pTmpSRB! (TagQ Error?) (%02i-%i)\n",
-                         pDCB->TargetID, pDCB->TargetLUN);
-       else printk (KERN_ERR "DC390: pSRB == pTmpSRB! (TagQ Error?) (DCB 0!)\n");
-
-       pSRB->pSRBDCB = pDCB;
-       dc390_EnableMsgOut_Abort (pACB, pSRB);
-       if (pDCB) pDCB->DCBFlag |= ABORT_DEV;
-       return;
+       if (pDCB)
+               printk(KERN_ERR "DC390: pSRB == pTmpSRB! (TagQ Error?) (%02i-%i)\n", pDCB->TargetID, pDCB->TargetLUN);
+       else
+               printk(KERN_ERR "DC390: pSRB == pTmpSRB! (TagQ Error?) (DCB 0!)\n");
+
+       /* Try to recover - some broken disks react badly to tagged INQUIRY */
+       if (pDCB && pACB->scan_devices && pDCB->GoingSRBCnt == 1) {
+               pSRB = pDCB->pGoingSRB;
+               pDCB->pActiveSRB = pSRB;
+       } else {
+               pSRB->pSRBDCB = pDCB;
+               dc390_EnableMsgOut_Abort(pACB, pSRB);
+               if (pDCB)
+                       pDCB->DCBFlag |= ABORT_DEV;
+               return;
+       }
     }
 
     if( pSRB->SGIndex < pSRB->SGcount )
@@ -1138,7 +1155,7 @@ dc390_Disconnect( struct dc390_acb* pACB )
      }
     DC390_write8 (ScsiCmd, EN_SEL_RESEL);
     pSRB = pDCB->pActiveSRB;
-    pACB->pActiveDCB = 0;
+    pACB->pActiveDCB = NULL;
     pSRB->ScsiPhase = SCSI_NOP0;
     if( pSRB->SRBState & SRB_UNEXPECT_RESEL )
     {
@@ -1158,7 +1175,7 @@ dc390_Disconnect( struct dc390_acb* pACB )
            dc390_Free_insert (pACB, pSRB);
            pSRB = psrb;
        }
-       pDCB->pGoingSRB = 0;
+       pDCB->pGoingSRB = NULL;
        dc390_Waiting_process (pACB);
     }
     else
@@ -1187,7 +1204,7 @@ dc390_Disconnect( struct dc390_acb* pACB )
        {
 disc1:
            dc390_freetag (pDCB, pSRB);
-           pDCB->pActiveSRB = 0;
+           pDCB->pActiveSRB = NULL;
            pSRB->SRBState = SRB_FREE;
            dc390_SRBdone( pACB, pDCB, pSRB);
        }
@@ -1325,6 +1342,35 @@ dc390_add_dev (struct dc390_acb* pACB, struct dc390_dcb* pDCB, PSCSI_INQDATA ptr
 }
 
 
+static void __inline__
+dc390_RequestSense(struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* pSRB)
+{
+       struct scsi_cmnd *pcmd;
+
+       pcmd = pSRB->pcmd;
+
+       REMOVABLEDEBUG(printk(KERN_INFO "DC390: RequestSense(Cmd %02x, Id %02x, LUN %02x)\n",\
+                             pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN));
+
+       pSRB->SRBFlag |= AUTO_REQSENSE;
+       pSRB->SavedSGCount = pcmd->use_sg;
+       pSRB->SavedTotXLen = pSRB->TotalXferredLen;
+       pSRB->AdaptStatus = 0;
+       pSRB->TargetStatus = 0; /* CHECK_CONDITION<<1; */
+
+       /* We are called from SRBdone, original PCI mapping has been removed
+        * already, new one is set up from StartSCSI */
+       pSRB->SGIndex = 0;
+
+       pSRB->TotalXferredLen = 0;
+       pSRB->SGToBeXferLen = 0;
+       if (dc390_StartSCSI(pACB, pDCB, pSRB)) {
+               dc390_Going_to_Waiting(pDCB, pSRB);
+               dc390_waiting_timer(pACB, HZ/5);
+       }
+}
+
+
 static void
 dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* pSRB )
 {
@@ -1352,26 +1398,7 @@ dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb*
        pSRB->SRBFlag &= ~AUTO_REQSENSE;
        pSRB->AdaptStatus = 0;
        pSRB->TargetStatus = CHECK_CONDITION << 1;
-#ifdef DC390_REMOVABLEDEBUG
-       switch (pcmd->sense_buffer[2] & 0x0f)
-       {           
-        case NOT_READY: printk (KERN_INFO "DC390: ReqSense: NOT_READY (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i)\n",
-                                pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN,
-                                status, pACB->scan_devices); break;
-        case UNIT_ATTENTION: printk (KERN_INFO "DC390: ReqSense: UNIT_ATTENTION (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i)\n",
-                                     pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN,
-                                     status, pACB->scan_devices); break;
-        case ILLEGAL_REQUEST: printk (KERN_INFO "DC390: ReqSense: ILLEGAL_REQUEST (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i)\n",
-                                      pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN,
-                                      status, pACB->scan_devices); break;
-        case MEDIUM_ERROR: printk (KERN_INFO "DC390: ReqSense: MEDIUM_ERROR (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i)\n",
-                                   pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN,
-                                   status, pACB->scan_devices); break;
-        case HARDWARE_ERROR: printk (KERN_INFO "DC390: ReqSense: HARDWARE_ERROR (Cmnd = 0x%02x, Dev = %i-%i, Stat = %i, Scan = %i)\n",
-                                     pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN,
-                                     status, pACB->scan_devices); break;
-       }
-#endif
+
        //pcmd->result = MK_RES(DRIVER_SENSE,DID_OK,0,status);
        if (status == (CHECK_CONDITION << 1))
        {
@@ -1525,23 +1552,6 @@ dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb*
            pDCB->Inquiry7 = ptr->Flags;
 
 ckc_e:
-    if( pACB->scan_devices )
-    {
-       if( pcmd->cmnd[0] == TEST_UNIT_READY ||
-           pcmd->cmnd[0] == INQUIRY)
-       {
-#ifdef DC390_DEBUG0
-           printk (KERN_INFO "DC390: %s: result: %08x", 
-                   (pcmd->cmnd[0] == INQUIRY? "INQUIRY": "TEST_UNIT_READY"),
-                   pcmd->result);
-           if (pcmd->result & (DRIVER_SENSE << 24)) printk (" (sense: %02x %02x %02x %02x)\n",
-                                  pcmd->sense_buffer[0], pcmd->sense_buffer[1],
-                                  pcmd->sense_buffer[2], pcmd->sense_buffer[3]);
-           else printk ("\n");
-#endif
-       }
-    }
-
     if( pcmd->cmnd[0] == INQUIRY && 
        (pcmd->result == (DID_OK << 16) || status_byte(pcmd->result) & CHECK_CONDITION) )
      {
@@ -1586,18 +1596,6 @@ dc390_DoingSRB_Done(struct dc390_acb* pACB, struct scsi_cmnd *cmd)
            psrb2 = psrb->pNextSRB;
            pcmd = psrb->pcmd;
            dc390_Free_insert (pACB, psrb);
-#ifndef USE_NEW_EH
-           /* New EH will crash on being given timed out cmnds */
-           if (pcmd == cmd)
-               pcmd->result = MK_RES(0,DID_ABORT,0,0);
-           else
-               pcmd->result = MK_RES(0,DID_RESET,0,0);
-
-/*         ReleaseSRB( pDCB, pSRB ); */
-
-           DEBUG0(printk (KERN_DEBUG "DC390: DoingSRB_Done: done pid %li\n", pcmd->pid));
-           pcmd->scsi_done( pcmd );
-#endif 
            psrb  = psrb2;
        }
        pdcb->GoingSRBCnt = 0;
@@ -1646,7 +1644,7 @@ dc390_ScsiRstDetect( struct dc390_acb* pACB )
        pACB->ACBFlag |= RESET_DETECT;
 
        dc390_ResetDevParam( pACB );
-       dc390_DoingSRB_Done( pACB, 0 );
+       dc390_DoingSRB_Done( pACB, NULL );
        //dc390_RecoverSRB( pACB );
        pACB->pActiveDCB = NULL;
        pACB->ACBFlag = 0;
@@ -1654,51 +1652,3 @@ dc390_ScsiRstDetect( struct dc390_acb* pACB )
     }
     return;
 }
-
-
-static void __inline__
-dc390_RequestSense( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* pSRB )
-{
-    struct scsi_cmnd *pcmd;
-
-    pcmd = pSRB->pcmd;
-
-    REMOVABLEDEBUG(printk (KERN_INFO "DC390: RequestSense (Cmd %02x, Id %02x, LUN %02x)\n",\
-           pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN));
-
-    pSRB->SRBFlag |= AUTO_REQSENSE;
-    //pSRB->Segment0[0] = (u32) pSRB->CmdBlock[0];
-    //pSRB->Segment0[1] = (u32) pSRB->CmdBlock[4];
-    //pSRB->Segment1[0] = ((u32)(pcmd->cmd_len) << 8) + pSRB->SGcount;
-    //pSRB->Segment1[1] = pSRB->TotalXferredLen;
-    pSRB->SavedSGCount = pcmd->use_sg;
-    pSRB->SavedTotXLen = pSRB->TotalXferredLen;
-    pSRB->AdaptStatus = 0;
-    pSRB->TargetStatus = 0; /* CHECK_CONDITION<<1; */
-
-    /* We are called from SRBdone, original PCI mapping has been removed
-     * already, new one is set up from StartSCSI */
-    pSRB->SGIndex = 0;
-
-    //pSRB->CmdBlock[0] = REQUEST_SENSE;
-    //pSRB->CmdBlock[1] = pDCB->TargetLUN << 5;
-    //(u16) pSRB->CmdBlock[2] = 0;
-    //(u16) pSRB->CmdBlock[4] = sizeof(pcmd->sense_buffer);
-    //pSRB->ScsiCmdLen = 6;
-
-    pSRB->TotalXferredLen = 0;
-    pSRB->SGToBeXferLen = 0;
-    if( dc390_StartSCSI( pACB, pDCB, pSRB ) ) {
-       dc390_Going_to_Waiting ( pDCB, pSRB );
-       dc390_waiting_timer (pACB, HZ/5);
-    }
-}
-
-
-
-static void __inline__
-dc390_InvalidCmd( struct dc390_acb* pACB )
-{
-    if( pACB->pActiveDCB->pActiveSRB->SRBState & (SRB_START_+SRB_MSGOUT) )
-       DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
-}