Index: dc390/dc390.h =================================================================== RCS file: /usr/local/cvsroot/dc390/dc390.h,v retrieving revision 2.28 retrieving revision 2.29 diff -u -r2.28 -r2.29 --- dc390/dc390.h 1999/07/04 20:37:22 2.28 +++ dc390/dc390.h 1999/07/05 08:25:11 2.29 @@ -4,7 +4,7 @@ * Description: Device Driver for Tekram DC-390(T) PCI SCSI * * Bus Master Host Adapter * ***********************************************************************/ -/* $Id: dc390.h,v 2.28 1999/07/04 20:37:22 garloff Exp $ */ +/* $Id: dc390.h,v 2.29 1999/07/05 08:25:11 garloff Exp $ */ #include @@ -16,7 +16,7 @@ #define DC390_H #define DC390_BANNER "Tekram DC390/AM53C974" -#define DC390_VERSION "2.0d12 1999/07/04" +#define DC390_VERSION "2.0d13 1999/07/05" #if defined(HOSTS_C) || defined(MODULE) Index: dc390/scsiiom.c =================================================================== RCS file: /usr/local/cvsroot/dc390/scsiiom.c,v retrieving revision 2.40 retrieving revision 2.41 diff -u -r2.40 -r2.41 --- dc390/scsiiom.c 1999/07/04 20:37:22 2.40 +++ dc390/scsiiom.c 1999/07/05 08:25:11 2.41 @@ -4,7 +4,7 @@ * Description: Device Driver for Tekram DC-390 (T) PCI SCSI * * Bus Master Host Adapter * ***********************************************************************/ -/* $Id: scsiiom.c,v 2.40 1999/07/04 20:37:22 garloff Exp $ */ +/* $Id: scsiiom.c,v 2.41 1999/07/05 08:25:11 garloff Exp $ */ static void __inline__ dc390_freetag (PDCB pDCB, PSRB pSRB) @@ -1339,14 +1339,13 @@ void 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);) @@ -1547,7 +1546,7 @@ (pcmd->sense_buffer[2] & 0xf) == ILLEGAL_REQUEST) || host_byte(pcmd->result) & DID_ERROR ) { /* 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)) ) @@ -1575,7 +1574,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 { @@ -1587,32 +1586,18 @@ (pcmd->lun == pACB->pScsiHost->max_lun - 1) ) pACB->scan_devices = 0; }; -/* dc390_ReleaseSRB( pDCB, 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; - } + if (!DCB_removed) dc390_Going_remove (pDCB, pSRB); /* Add to free list */ dc390_Free_insert (pACB, pSRB); - pDCB->GoingSRBCnt--; DEBUG0(printk (KERN_DEBUG "DC390: SRBdone: done pid %li\n", pcmd->pid);) DC390_UNLOCK_ACB_NI; - pcmd->scsi_done( pcmd ); + pcmd->scsi_done (pcmd); DC390_LOCK_ACB_NI; - dc390_Query_to_Waiting ( pACB ); - dc390_Waiting_process ( pACB ); + dc390_Query_to_Waiting (pACB); + dc390_Waiting_process (pACB); return; } Index: dc390/tmscsim.c =================================================================== RCS file: /usr/local/cvsroot/dc390/tmscsim.c,v retrieving revision 2.43 retrieving revision 2.44 diff -u -r2.43 -r2.44 --- dc390/tmscsim.c 1999/07/04 20:37:22 2.43 +++ dc390/tmscsim.c 1999/07/05 08:25:11 2.44 @@ -7,7 +7,7 @@ ***********************************************************************/ /* (C) Copyright: put under GNU GPL in 10/96 (see README.tmscsim) * *************************************************************************/ -/* $Id: tmscsim.c,v 2.43 1999/07/04 20:37:22 garloff Exp $ */ +/* $Id: tmscsim.c,v 2.44 1999/07/05 08:25:11 garloff Exp $ */ /* Enhancements and bugfixes by * * Kurt Garloff * ***********************************************************************/ @@ -122,6 +122,7 @@ * cleaned. * * 2.0d1199/06/28 KG cmd->result now identical to 2.0d2 * * 2.0d1299/07/04 KG Changed order of processing in IRQ * + * 2.0d1399/07/05 KG Don't update DCB fields if removed * ***********************************************************************/ /* Uncomment SA_INTERRUPT, if the driver refuses to share its IRQ with other devices */ @@ -846,6 +847,25 @@ pDCB->pGoingLast = pSRB; /* No next one in sent list */ pSRB->pNextSRB = NULL; +}; + +static __inline__ void dc390_Going_remove (PDCB pDCB, PSRB pSRB) +{ + DEBUG0(printk("DC390: Remove SRB %p from Going\n", pSRB);) + if (pSRB == pDCB->pGoingSRB) + pDCB->pGoingSRB = pSRB->pNextSRB; + else + { + PSRB psrb = pDCB->pGoingSRB; + while (psrb && psrb->pNextSRB != pSRB) + psrb = psrb->pNextSRB; + if (!psrb) + { printk (KERN_ERR "DC390: Remove non-ex. SRB %p from Going!\n", pSRB); return; } + psrb->pNextSRB = pSRB->pNextSRB; + if (pSRB == pDCB->pGoingLast) + pDCB->pGoingLast = psrb; + } + pDCB->GoingSRBCnt--; }; /* Moves SRB from Going list to the top of Waiting list */