Index: dc395x_trm.c =================================================================== RCS file: /usr/local/cvsroot/dc395/dc395x_trm.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- dc395x_trm.c 1999/07/18 23:50:03 1.13 +++ dc395x_trm.c 1999/07/19 13:52:00 1.14 @@ -24,6 +24,7 @@ //* Copy SyncMode to LUNs //* 1.09 99/07/18 Kurt Garloff Fix Oops. Fix recognition of devs. //* Fixed TagQ: MaxCommand limit! +//* 1.10 99/07/19 KG Defines for switching off features. //*********************************************************************** /* ************************************************************************* @@ -54,9 +55,18 @@ ************************************************************************* */ +/* Debugging */ +//#define DC395x_trm_DEBUG_KG //#define DC395x_trm_DEBUG0 //#define DC395x_trm_DEBUG1 +/* DISable features */ +//#define DC395x_NO_DISCONNECT +//#define DC395x_NO_TAGQ +//#define DC395x_NO_SYNC +//#define DC395x_NO_WIDE + + #include #ifdef MODULE @@ -258,39 +268,38 @@ PSCSICMD pQIORBhead; PSCSICMD pQIORBtail; - +/* 0x10: */ PSCSICMD AboIORBhead; PSCSICMD AboIORBtail; - WORD QIORBCnt; - WORD AboIORBcnt; - PSRB pWaitingSRB; PSRB pWaitLastSRB; +/* 0x20: */ + WORD QIORBCnt; + WORD AboIORBcnt; PSRB pGoingSRB; PSRB pGoingLastSRB; PSRB pActiveSRB; - WORD GoingSRBCnt; +/* 0x30: */ + DWORD TagMask; - WORD WaitSRBCnt; WORD MaxCommand; + BYTE AdaptIndex; /* UnitInfo struc start */ + BYTE UnitIndex; /* nth Unit on this card */ - DWORD TagMask; + WORD GoingSRBCnt; + WORD WaitSRBCnt; - WORD AdaptIndex; /* UnitInfo struc start */ - WORD UnitIndex; /* nth Unit on this card */ - - BYTE InqDataBuf[8]; - - BYTE CapacityBuf[8]; - BYTE TargetID; /* SCSI Target ID (SCSI Only) */ BYTE TargetLUN; /* SCSI Log. Unit (SCSI Only) */ BYTE IdentifyMsg; BYTE DevMode; - +/* 0x40: */ + BYTE InqDataBuf[8]; + BYTE CapacityBuf[8]; +/* 0x50: */ BYTE AdpMode; BYTE SyncMode; /* 0:async mode */ BYTE MinNegoPeriod; /* for nego. */ @@ -300,6 +309,7 @@ BYTE UnitCtrlFlag; BYTE DCBFlag; BYTE DevType; +/* 0x58: */ /* BYTE Reserved2[3]; for dword alignment */ }; typedef struct _DCB DC395X_TRM_DCB, *PDCB; @@ -359,7 +369,7 @@ BYTE DCBmap[DC395x_trm_MAX_SCSI_ID]; - DC395X_TRM_DCB DCB_array[DC395x_trm_MAX_TARGETS_NUM]; /* +74h, Len=3E8 */ + DC395X_TRM_DCB DCB_array[DC395x_trm_MAX_DCB]; /* +74h, Len=3E8 */ BYTE Reserved1[2]; /* for dword alignment */ @@ -1024,7 +1034,7 @@ BYTE NvramVendorID[2]; /* 5,6 Vendor ID */ BYTE NvramDeviceID[2]; /* 7,8 Device ID */ BYTE NvramReserved; /* 9 Reserved */ - NVRAMTARGETTYPE NvramTarget[DC395x_trm_MAX_TARGETS_NUM]; + NVRAMTARGETTYPE NvramTarget[DC395x_trm_MAX_SCSI_ID]; /** 10,11,12,13 ** 14,15,16,17 ** .... @@ -1571,8 +1581,10 @@ pACB = (PACB) cmd->host->hostdata; +#ifdef DC395x_trm_DEBUG_KG printk(KERN_INFO "DC395x_queue_command 0x%02x (pid=%li, target=%i-%i)\n", cmd->cmnd[0], cmd->pid, cmd->target, cmd->lun); +#endif //DC395x_TRM_ACB_LOCK(pACB,acb_flags); @@ -1583,7 +1595,7 @@ pACB->scan_devices = 0; DC395x_TRM_pPrevDCB->pNextDCB = pACB->pLinkDCB; } - else if( (pACB->scan_devices) && (cmd->cmnd[0] == 8) ) + else if( (pACB->scan_devices) && (cmd->cmnd[0] == READ_6) ) { pACB->scan_devices = 0; DC395x_TRM_pPrevDCB->pNextDCB = pACB->pLinkDCB; @@ -1599,7 +1611,7 @@ } if( (pACB->scan_devices) && !(pACB->DCBmap[cmd->target] & (1 << cmd->lun)) ) { - if( pACB->DeviceCnt < DC395x_trm_MAX_TARGETS_NUM ) + if( pACB->DeviceCnt < DC395x_trm_MAX_SCSI_ID ) { pACB->DCBmap[cmd->target] |= (1 << cmd->lun); pDCB = pACB->pDCB_free; @@ -1634,9 +1646,7 @@ */ pDCB = pACB->pLinkDCB; while( (pDCB->TargetID != cmd->target) || (pDCB->TargetLUN != cmd->lun) ) - { pDCB = pDCB->pNextDCB; - } } cmd->scsi_done = done; @@ -2096,16 +2106,21 @@ WORD DC395x_trm_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB ) { WORD ioport, return_code; - BYTE tag_number, scsicommand, i, command, identify_message; + BYTE scsistatus, scsicommand, i, command, identify_message; PBYTE ptr; - DWORD tag_mask; #ifdef DC395x_trm_DEBUG0 printk(KERN_INFO "DC395x_StartSCSI..............\n "); #endif - pSRB->TagNumber = 31;/* pACB->TagMaxNum: had error read in eeprom*/ + pSRB->TagNumber = 31; /* pACB->TagMaxNum: had error read in eeprom */ ioport = pACB->IOPortBase; + scsistatus = inb (ioport+TRM_S1040_SCSI_SIGNAL); + if (0 /*scsistatus & 0x20*/) + { + printk ("DC395x: StartSCSI: BUSY %02x !\n", scsistatus); + return 1; + }; outb(pACB->AdaptSCSIID,ioport+TRM_S1040_SCSI_HOSTID); outb(pDCB->TargetID,ioport+TRM_S1040_SCSI_TARGETID); outb(pDCB->SyncPeriod,ioport+TRM_S1040_SCSI_SYNC); @@ -2143,14 +2158,15 @@ outb(identify_message,ioport+TRM_S1040_SCSI_FIFO); scsicommand = SCMD_SEL_ATN; pSRB->SRBState = SRB_START_; +#ifndef DC395x_NO_TAGQ if(pDCB->SyncMode & EN_TAG_QUEUEING) { /* Send Tag message */ /* ** Get tag id */ - tag_mask = 1; - tag_number = 0; + DWORD tag_mask = 1; + BYTE tag_number = 0; while( tag_mask & pDCB->TagMask ) { tag_mask = tag_mask << 1; @@ -2168,18 +2184,21 @@ */ outb(MSG_SIMPLE_QTAG,ioport+TRM_S1040_SCSI_FIFO); outb(tag_number,ioport+TRM_S1040_SCSI_FIFO); - printk (KERN_INFO "DC395x: Start_SCSI (pid %li): Tag %i\n", pSRB->pcmd->pid, tag_number); pDCB->TagMask |= tag_mask; pSRB->TagNumber = tag_number; scsicommand = SCMD_SEL_ATN3; pSRB->SRBState = SRB_START_; } +#endif } polling: /* ** Send CDB ..command block ......... */ +#ifdef DC395x_trm_DEBUG_KG + printk (KERN_INFO "DC395x: Start_SCSI (pid %li): Tag %i\n", pSRB->pcmd->pid, pSRB->TagNumber); +#endif if( pSRB->SRBFlag & AUTO_REQSENSE ) { outb(REQUEST_SENSE,ioport+TRM_S1040_SCSI_FIFO); @@ -2322,6 +2341,8 @@ printk(KERN_INFO "scsi_intstatus=%02x \n", scsi_intstatus); #endif //DC395x_TRM_ACB_LOCK(pACB,acb_flags); + if (scsi_intstatus & INT_SELTIMEOUT) + printk (KERN_INFO "DC395x: Sel Timeout IRQ\n"); if(scsi_intstatus & (INT_SELTIMEOUT | INT_DISCONNECT)) { @@ -2333,6 +2354,10 @@ DC395x_trm_Reselect( pACB ); goto out_unlock; } + if(scsi_intstatus & INT_SELECT) + { + printk (KERN_INFO "DC395x: Host does not support target mode!\n"); + } if(scsi_intstatus & INT_SCSIRESET) { DC395x_trm_ScsiRstDetect( pACB ); @@ -3427,7 +3452,7 @@ pDCB = pACB->pActiveDCB; if (!pDCB) { - printk(KERN_INFO " Exception Disconnect pDCB=NULL........\n "); + printk(KERN_ERR "Exception Disconnect pDCB=NULL !!\n "); j = 400; while (--j) udelay(1000); outw((DO_CLRFIFO | DO_HWRESELECT),ioport+TRM_S1040_SCSI_CONTROL); @@ -3440,17 +3465,13 @@ outw((DO_CLRFIFO | DO_HWRESELECT),ioport+TRM_S1040_SCSI_CONTROL); if( pSRB->SRBState & SRB_UNEXPECT_RESEL ) { -#ifdef DC395x_trm_DEBUG0 - printk(KERN_INFO " SRB_UNEXPECT_RESEL..............\n "); -#endif + printk(KERN_ERR "DC395x: Unexpected Reselection (%i-%i)\n", pDCB->TargetID, pDCB->TargetLUN); pSRB->SRBState = 0; DC395x_trm_DoWaitingSRB( pACB ); } else if( pSRB->SRBState & SRB_ABORT_SENT ) { -#ifdef DC395x_trm_DEBUG0 - printk(KERN_INFO " SRB_ABORT_SENT..............\n "); -#endif + printk(KERN_ERR "DC395x: SRB_ABORT_SENT\n"); pDCB->TagMask = 0; pDCB->DCBFlag = 0; count= pDCB->GoingSRBCnt; @@ -3486,8 +3507,10 @@ else { pSRB->TargetStatus = SCSI_STAT_SEL_TIMEOUT; - printk ("DC395x: Selection Timeout (pid %li, target %i-%i)\n", +#ifdef DC395x_trm_DEBUG_KG + printk (KERN_INFO "DC395x: Selection Timeout (pid %li, target %i-%i)\n", pSRB->pcmd->pid, pSRB->pcmd->target, pSRB->pcmd->lun); +#endif goto disc1; } } @@ -3622,8 +3645,10 @@ //DWORD drv_flags=0; pcmd = pSRB->pcmd; +#ifdef DC395x_trm_DEBUG_KG printk(KERN_INFO "DC395x_SRBdone (pid %li, target %i-%i): ", pSRB->pcmd->pid, pSRB->pcmd->target, pSRB->pcmd->lun); +#endif status = pSRB->TargetStatus; if(pSRB->SRBFlag & AUTO_REQSENSE) { @@ -3751,8 +3776,11 @@ { pACB->DeviceCnt++; DC395x_TRM_pPrevDCB = pDCB; - pACB->pDCB_free = (PDCB) ((DWORD) (pACB->pDCB_free) + sizeof( DC395X_TRM_DCB )); + //printk (KERN_INFO "DC395x: pDCB_free: %p", pACB->pDCB_free); + pACB->pDCB_free += 1; + //printk (" -> %p\n", pACB->pDCB_free); pDCB->DevType = ptr->DevType & SCSI_DEVTYPE; +#ifndef DC395x_NO_TAGQ if( (pDCB->DevType == TYPE_DISK) || (pDCB->DevType == TYPE_MOD) ) { if( ( ((ptr->Vers & 0x07) >= 2) || ((ptr->RDF & 0x0F) == 2) ) && @@ -3765,6 +3793,7 @@ pDCB->TagMask = 0; } } +#endif }/*bval1 == SCSI_NODEV*/ }/*pSRB->CmdBlock[0] == INQUIRY*/ }/* pACB->scan_devices */ @@ -3802,7 +3831,9 @@ pDCB->GoingSRBCnt--; //DC395x_TRM_DRV_UNLOCK(drv_flags); +#ifdef DC395x_trm_DEBUG_KG printk ("0x%08x\n", pcmd->result); +#endif DC395x_trm_DoWaitingSRB( pACB ); @@ -3833,6 +3864,7 @@ printk(KERN_INFO "DC395x_DoingSRB_Done: pids "); pDCB = pACB->pLinkDCB; + if (!pDCB) return; pDCBTemp = pDCB; do { @@ -3859,7 +3891,7 @@ pDCBTemp->TagMask = 0; pDCBTemp = pDCBTemp->pNextDCB; } - while( pDCBTemp != pDCB ); + while( pDCBTemp != pDCB && pDCBTemp ); printk ("\n"); } @@ -3942,8 +3974,10 @@ PSCSICMD pcmd; pcmd = pSRB->pcmd; +#ifdef DC395x_trm_DEBUG_KG printk(KERN_INFO "DC395x_RequestSense for pid %li, target %i-%i\n", pcmd->pid, pcmd->target, pcmd->lun); +#endif pSRB->SRBFlag |= AUTO_REQSENSE; pSRB->Segment0[0] = *((PDWORD) &(pSRB->CmdBlock[0])); pSRB->Segment0[1] = *((PDWORD) &(pSRB->CmdBlock[4])); @@ -4073,13 +4107,21 @@ PeriodIndex = pEEpromBuf->NvramTarget[cmd->target].NvmTarPeriod & 0x07; pDCB->MinNegoPeriod = dc395x_trm_clock_period[ PeriodIndex ] ; +#ifndef DC395x_NO_WIDE if ((pDCB->DevMode & NTC_DO_WIDE_NEGO) && (pACB->Config & HCC_WIDE_CARD)) pDCB->SyncMode |= WIDE_NEGO_ENABLE; +#endif +#ifndef DC395x_NO_SYNC if (pDCB->DevMode & NTC_DO_SYNC_NEGO) if( !(cmd->lun) || DC395x_TRM_CurrSyncOffset ) pDCB->SyncMode |= SYNC_NEGO_ENABLE; +#endif /* $$$$$$$ */ +#ifndef DC395x_NO_DISCONNECT pDCB->IdentifyMsg = IDENTIFY(pDCB->DevMode & NTC_DO_DISCONNECT, cmd->lun); +#else + pDCB->IdentifyMsg = IDENTIFY(0, cmd->lun); +#endif /* $$$$$$$ */ if (pDCB->TargetLUN != 0) { @@ -4087,14 +4129,17 @@ PDCB prevDCB = pACB->pLinkDCB; while (prevDCB->TargetID != pDCB->TargetID) prevDCB = prevDCB->pNextDCB; +#ifdef DC395x_trm_DEBUG_KG printk ("DC395x: Copy settings from %02i-%02i to %02i-%02i\n", prevDCB->TargetID, prevDCB->TargetLUN, pDCB->TargetID, pDCB->TargetLUN); +#endif pDCB->SyncMode = prevDCB->SyncMode; pDCB->SyncPeriod = prevDCB->SyncPeriod; pDCB->MinNegoPeriod = prevDCB->MinNegoPeriod; pDCB->SyncOffset = prevDCB->SyncOffset; }; + //pDCB->pNextDCB = pACB->pLinkDCB; } @@ -5042,6 +5087,16 @@ dcbpnt = dcbpnt->pNextDCB; } +#ifdef DC395x_trm_DEBUG_KG + SPRINTF ("DCB list for ACB %p:\n", acbpnt); + dcbpnt = acbpnt->pLinkDCB; + SPRINTF ("%p", dcbpnt); + for (dev = 0; dev < acbpnt->DeviceCnt; dev++, dcbpnt=dcbpnt->pNextDCB) + SPRINTF ("->%p", dcbpnt->pNextDCB); + SPRINTF("\n"); + SPRINTF ("Next free DCB: %p\n", acbpnt->pDCB_free); +#endif + *start = buffer + offset; DC395x_UNLOCK_IO; Index: dc395x_trm.h =================================================================== RCS file: /usr/local/cvsroot/dc395/dc395x_trm.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- dc395x_trm.h 1999/07/18 23:50:03 1.7 +++ dc395x_trm.h 1999/07/19 13:52:01 1.8 @@ -18,7 +18,7 @@ #define DC395x_trm_H #define DC395x_BANNER "Tekram DC395U/UW/F DC315/U" -#define DC395x_VERSION "1.09, 1999/07/18" +#define DC395x_VERSION "1.10, 1999/07/19" /* Kernel version autodetection */ #include @@ -38,8 +38,8 @@ #define DC395x_trm_MAX_CMD_QUEUE 20 #define DC395x_trm_MAX_QTAGS 32 #define DC395x_trm_MAX_ADAPTER_NUM 4 -#define DC395x_trm_MAX_TARGETS_NUM 16 #define DC395x_trm_MAX_SCSI_ID 16 +#define DC395x_trm_MAX_DCB 20 #define DC395x_trm_MAX_CAN_QUEUE 7 * DC395x_trm_MAX_QTAGS #define DC395x_trm_MAX_CMD_PER_LUN DC395x_trm_MAX_QTAGS #define DC395x_trm_MAX_SG_TABLESIZE 64