Index: dc390/scsiiom.c =================================================================== RCS file: /usr/local/cvsroot/dc390/scsiiom.c,v retrieving revision 2.15 retrieving revision 2.15.2.1 diff -u -r2.15 -r2.15.2.1 --- dc390/scsiiom.c 1998/12/25 17:33:27 2.15 +++ dc390/scsiiom.c 1999/07/05 15:09:01 2.15.2.1 @@ -4,7 +4,7 @@ * Description: Device Driver for Tekram DC-390 (T) PCI SCSI * * Bus Master Host Adapter * ***********************************************************************/ -/* $Id: scsiiom.c,v 2.15 1998/12/25 17:33:27 garloff Exp $ */ +/* $Id: scsiiom.c,v 2.15.2.1 1999/07/05 15:09:01 garloff Exp $ */ UCHAR dc390_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB ) @@ -1251,7 +1251,10 @@ DCBDEBUG(printk (KERN_INFO "DC390: Driver about to free DCB (ID %i, LUN %i): 0x%08x\n",\ pDCB->UnitSCSIID, pDCB->UnitSCSILUN, (int)pDCB);) - kfree (pDCB); if (pDCB == pACB->pActiveDCB) pACB->pActiveDCB = 0; + if (pDCB == pACB->pActiveDCB) pACB->pActiveDCB = 0; + if (pDCB == pACB->pLinkDCB) pACB->pLinkDCB = pDCB->pNextDCB; + if (pDCB == pACB->pDCBRunRobin) pACB->pDCBRunRobin = pDCB->pNextDCB; + kfree (pDCB); pACB->DCBCnt--; /* pACB->DeviceCnt--; */ }; @@ -1313,13 +1316,13 @@ dc390_SRBdone( PACB pACB, PDCB pDCB, PSRB pSRB ) { PSRB psrb; - UCHAR bval, status, i; + UCHAR bval, status, i, DCB_removed; PSCSICMD pcmd; PSCSI_INQDATA ptr; PSGL ptr2; ULONG swlval; - pcmd = pSRB->pcmd; + pcmd = pSRB->pcmd; DCB_removed = 0; status = pSRB->TargetStatus; DEBUG0(printk (" SRBdone (%02x,%08x), SRB %p, pid %li\n", status, pcmd->result,\ pSRB, pcmd->pid);) @@ -1517,7 +1520,7 @@ (pcmd->sense_buffer[2] & 0xf) == ILLEGAL_REQUEST) || pcmd->result & DID_ERROR << 16) { /* device not present: remove */ - dc390_remove_dev (pACB, pDCB); + dc390_remove_dev (pACB, pDCB); DCB_removed = 1; if( (pcmd->target == pACB->pScsiHost->max_id - 1) && ((pcmd->lun == 0) || (pcmd->lun == pACB->pScsiHost->max_lun - 1)) ) @@ -1543,7 +1546,7 @@ if ((ptr->DevType & SCSI_DEVTYPE) == TYPE_NODEV) { /* device not present: remove */ - dc390_remove_dev (pACB, pDCB); + dc390_remove_dev (pACB, pDCB); DCB_removed = 1; } else { @@ -1557,22 +1560,25 @@ }; /* dc390_ReleaseSRB( pDCB, pSRB ); */ - if(pSRB == pDCB->pGoingSRB ) + if (!DCB_removed) { - pDCB->pGoingSRB = pSRB->pNextSRB; - } - else - { - psrb = pDCB->pGoingSRB; - while( psrb->pNextSRB != pSRB ) - psrb = psrb->pNextSRB; - psrb->pNextSRB = pSRB->pNextSRB; - if( pSRB == pDCB->pGoingLast ) - pDCB->pGoingLast = psrb; - } + if(pSRB == pDCB->pGoingSRB ) + { + pDCB->pGoingSRB = pSRB->pNextSRB; + } + else + { + psrb = pDCB->pGoingSRB; + while( psrb->pNextSRB != pSRB ) + psrb = psrb->pNextSRB; + psrb->pNextSRB = pSRB->pNextSRB; + if( pSRB == pDCB->pGoingLast ) + pDCB->pGoingLast = psrb; + } + pDCB->GoingSRBCnt--; + }; pSRB->pNextSRB = pACB->pFreeSRB; pACB->pFreeSRB = pSRB; - pDCB->GoingSRBCnt--; dc390_DoWaitingSRB( pACB ); @@ -1580,7 +1586,7 @@ pcmd->scsi_done( pcmd ); DC390_LOCK_ACB_NI; - if( pDCB->QIORBCnt ) + if( !(DCB_removed) && (pDCB->QIORBCnt) ) dc390_DoNextCmd( pACB, pDCB ); return; }