Index: dc390/README.tmscsim =================================================================== RCS file: /usr/local/cvsroot/dc390/README.tmscsim,v retrieving revision 2.4 retrieving revision 2.5 diff -u -r2.4 -r2.5 --- README.tmscsim 1998/10/24 08:45:02 2.4 +++ README.tmscsim 1998/11/05 10:38:38 2.5 @@ -17,6 +17,7 @@ chip. AM53C974 based SCSI adapters include: Tekram DC390, DC390T Dawicontrol 2974 + QLogic Fast! PCI Basic some on-board adapters (This is most probably not a complete list) @@ -410,4 +411,4 @@ ------------------------------------------------------------------------- Written by Kurt Garloff 1998/06/11 Last updated 1998/10/15, driver revision 2.0b -$Id: README.tmscsim,v 2.4 1998/10/24 08:45:02 garloff Exp $ +$Id: README.tmscsim,v 2.5 1998/11/05 10:38:38 garloff Exp $ Index: dc390/dc390.h =================================================================== RCS file: /usr/local/cvsroot/dc390/dc390.h,v retrieving revision 2.3 retrieving revision 2.4 diff -u -r2.3 -r2.4 --- dc390.h 1998/10/24 08:45:02 2.3 +++ dc390.h 1998/11/05 10:16:42 2.4 @@ -4,7 +4,7 @@ * Description: Device Driver for Tekram DC-390(T) PCI SCSI * * Bus Master Host Adapter * ***********************************************************************/ -/* $Id: dc390.h,v 2.3 1998/10/24 08:45:02 garloff Exp $ */ +/* $Id: dc390.h,v 2.4 1998/11/05 10:16:42 garloff Exp $ */ #include @@ -16,7 +16,7 @@ #define DC390_H #define DC390_BANNER "Tekram DC390/AM53C974" -#define DC390_VERSION "2.0b 1998/10/24" +#define DC390_VERSION "2.0b1 1998/11/05" #if defined(HOSTS_C) || defined(MODULE) Index: dc390/scsiiom.c =================================================================== RCS file: /usr/local/cvsroot/dc390/scsiiom.c,v retrieving revision 2.3 retrieving revision 2.4 diff -u -r2.3 -r2.4 --- scsiiom.c 1998/10/24 09:10:28 2.3 +++ scsiiom.c 1998/11/05 10:16:43 2.4 @@ -4,7 +4,7 @@ * Description: Device Driver for Tekram DC-390 (T) PCI SCSI * * Bus Master Host Adapter * ***********************************************************************/ -/* $Id: scsiiom.c,v 2.3 1998/10/24 09:10:28 garloff Exp $ */ +/* $Id: scsiiom.c,v 2.4 1998/11/05 10:16:43 garloff Exp $ */ UCHAR dc390_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB ) @@ -252,7 +252,7 @@ if (pACB == 0) { - printk(KERN_ERR "DC390: Interrupt on uninitialized adapter!\n"); + printk(KERN_WARNING "DC390: Interrupt on uninitialized adapter!\n"); return; } DC390_LOCK_DRV; @@ -275,7 +275,7 @@ DEBUG1(printk (KERN_DEBUG "sstatus=%02x,", sstatus);) - if( pACB == (PACB )-1) { DC390_UNLOCK_DRV; return; }; + if( !pACB ) { DC390_UNLOCK_DRV; return; }; #if DMA_INT DC390_LOCK_IO; @@ -393,7 +393,7 @@ int ctr = 5000000; /* only try for about a tenth of a second */ while( --ctr && !(DC390_read8 (DMA_Status) & DMA_XFER_DONE) && pSRB->SGToBeXferLen ) DC390_write8 (DMA_Status, DMA_XFER_DONE | DMA_XFER_ABORT | DMA_XFER_ERROR | PCI_MS_ABORT); /* clear */ - if (!ctr) printk (KERN_CRIT "DC390: DataOut_0: DMA aborted unfinished: %06x bytes remain!\n", DC390_read32 (DMA_Wk_ByteCntr)); + if (!ctr) printk (KERN_CRIT "DC390: DataOut_0: DMA aborted unfinished: %06x bytes remain!!\n", DC390_read32 (DMA_Wk_ByteCntr)); DC390_write8 (DMA_Status, DMA_XFER_DONE | DMA_XFER_ABORT | DMA_XFER_ERROR | PCI_MS_ABORT); /* clear */ pSRB->TotalXferredLen += pSRB->SGToBeXferLen; pSRB->SGIndex++; @@ -445,7 +445,7 @@ int dstate = 0; while( --ctr && !((dstate = DC390_read8 (DMA_Status)) & DMA_XFER_DONE) && pSRB->SGToBeXferLen ) DC390_write8 (DMA_Status, DMA_XFER_DONE | DMA_XFER_ABORT | DMA_XFER_ERROR | PCI_MS_ABORT); /* clear */ - if (!ctr) printk (KERN_CRIT "DC390: DataIn_0: DMA aborted unfinished: %06x bytes remain!\n", DC390_read32 (DMA_Wk_ByteCntr)); + if (!ctr) printk (KERN_CRIT "DC390: DataIn_0: DMA aborted unfinished: %06x bytes remain!!\n", DC390_read32 (DMA_Wk_ByteCntr)); if (!ctr) printk (KERN_CRIT "DC390: DataIn_0: DMA State: %i\n", dstate); DEBUG1(ResidCnt = ((ULONG) DC390_read8 (CtcReg_High) << 16) \ + ((ULONG) DC390_read8 (CtcReg_Mid) << 8) \ Index: dc390/tmscsim.c =================================================================== RCS file: /usr/local/cvsroot/dc390/tmscsim.c,v retrieving revision 2.4 retrieving revision 2.5 diff -u -r2.4 -r2.5 --- tmscsim.c 1998/10/24 08:50:47 2.4 +++ tmscsim.c 1998/11/05 10:16:43 2.5 @@ -5,7 +5,9 @@ * Bus Master Host Adapter * * (C)Copyright 1995-1996 Tekram Technology Co., Ltd. * ***********************************************************************/ -/* $Id: tmscsim.c,v 2.4 1998/10/24 08:50:47 garloff Exp $ */ +/* (C) Copyright: put under GNU GPL in 10/96 * +*************************************************************************/ +/* $Id: tmscsim.c,v 2.5 1998/11/05 10:16:43 garloff Exp $ */ /* Enhancements and bugfixes by * * Kurt Garloff * ***********************************************************************/ @@ -90,6 +92,7 @@ * bios_param() now respects part. table. * * 2.0b 98/10/24 KG Docu fixes. Timeout Msg in DMA Blast. * * Disallow illegal idx in INQUIRY/REMOVE * + * 2.0b1 98/11/05 KG Cleaned up detection/initialization * ***********************************************************************/ /* Uncomment SA_INTERRUPT, if the driver refuses to share its IRQ with other devices */ @@ -206,9 +209,9 @@ # if USE_SPINLOCKS == 3 /* both */ # if defined (__SMP__) || DEBUG_SPINLOCKS > 0 -# define DC390_LOCK_INIT { spinlock_t __unlocked = SPIN_LOCK_UNLOCKED; pACB->lock = __unlocked; }; +# define DC390_LOCKA_INIT { spinlock_t __unlocked = SPIN_LOCK_UNLOCKED; pACB->lock = __unlocked; }; # else -# define DC390_LOCK_INIT +# define DC390_LOCKA_INIT # endif spinlock_t dc390_drvlock = SPIN_LOCK_UNLOCKED; @@ -228,16 +231,16 @@ # define DC390_UNLOCK_ACB spin_unlock_irqrestore (&(pACB->lock), aflags) # define DC390_LOCK_ACB_NI spin_lock (&(pACB->lock)) # define DC390_UNLOCK_ACB_NI spin_unlock (&(pACB->lock)) -//# define DC390_LOCK_INIT spin_lock_init (&(pACB->lock)) +//# define DC390_LOCKA_INIT spin_lock_init (&(pACB->lock)) # else # if USE_SPINLOCKS == 2 /* adapter specific locks */ # if defined (__SMP__) || DEBUG_SPINLOCKS > 0 -# define DC390_LOCK_INIT { spinlock_t __unlocked = SPIN_LOCK_UNLOCKED; pACB->lock = __unlocked; }; +# define DC390_LOCKA_INIT { spinlock_t __unlocked = SPIN_LOCK_UNLOCKED; pACB->lock = __unlocked; }; # else -# define DC390_LOCK_INIT +# define DC390_LOCKA_INIT # endif spinlock_t dc390_drvlock = SPIN_LOCK_UNLOCKED; # define DC390_AFLAGS unsigned long aflags; @@ -253,7 +256,7 @@ # define DC390_UNLOCK_ACB spin_unlock_irqrestore (&(pACB->lock), aflags) # define DC390_LOCK_ACB_NI spin_lock (&(pACB->lock)) # define DC390_UNLOCK_ACB_NI spin_unlock (&(pACB->lock)) -//# define DC390_LOCK_INIT spin_lock_init (&(pACB->lock)) +//# define DC390_LOCKA_INIT spin_lock_init (&(pACB->lock)) # else /* USE_SPINLOCKS == 1: global lock io_request_lock */ @@ -271,7 +274,7 @@ # define DC390_UNLOCK_ACB /* DC390_UNLOCK_IO */ # define DC390_LOCK_ACB_NI /* spin_lock (&(pACB->lock)) */ # define DC390_UNLOCK_ACB_NI /* spin_unlock (&(pACB->lock)) */ -# define DC390_LOCK_INIT /* DC390_LOCK_INIT */ +# define DC390_LOCKA_INIT /* DC390_LOCKA_INIT */ # endif /* 2 */ # endif /* 3 */ @@ -291,7 +294,7 @@ # define DC390_UNLOCK_ACB restore_flags (aflags) # define DC390_LOCK_ACB_NI # define DC390_UNLOCK_ACB_NI -# define DC390_LOCK_INIT +# define DC390_LOCKA_INIT #endif /* def */ @@ -481,9 +484,190 @@ S_IFDIR | S_IRUGO | S_IXUGO, 2 }; + /*********************************************************************** + * Functions for access to DC390 EEPROM + * and some to emulate it * - * + **********************************************************************/ + + +static void __init dc390_EnDisableCE( UCHAR mode, PDEVDECL, PUCHAR regval ) +{ + UCHAR bval; + + bval = 0; + if(mode == ENABLE_CE) + *regval = 0xc0; + else + *regval = 0x80; + PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); + if(mode == DISABLE_CE) + PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); + udelay(160); +} + +#ifndef CONFIG_SCSI_DC390T_NOGENSUPP +static void __init dc390_EEpromDefaults (UCHAR index) +{ + PUCHAR ptr; + UCHAR id; + ptr = (PUCHAR) dc390_eepromBuf[index]; + + /* Adapter Settings */ + ptr[EE_ADAPT_SCSI_ID] = (UCHAR)tmscsim[0]; /* Adapter ID */ + ptr[EE_MODE2] = (UCHAR)tmscsim[3]; + ptr[EE_DELAY] = 0; /* ?? */ + ptr[EE_TAG_CMD_NUM] = (UCHAR)tmscsim[4]; /* Tagged Comds */ + + /* Device Settings */ + for (id = 0; id < MAX_SCSI_ID; id++) + { + ptr[id<<2] = (UCHAR)tmscsim[2]; /* EE_MODE1 */ + ptr[(id<<2) + 1] = (UCHAR)tmscsim[1]; /* EE_Speed */ + }; + dc390_adapname = "AM53C974"; +} + +static void __init dc390_checkparams (void) +{ + PARSEDEBUG(printk(KERN_INFO "DC390: setup %08x %08x %08x %08x %08x\n", tmscsim[0],\ + tmscsim[1], tmscsim[2], tmscsim[3], tmscsim[4]);) + if (tmscsim[0] < 0 || tmscsim[0] > 7) /* modules-2.0.0 passes -1 as string */ + { + tmscsim[0] = 7; tmscsim[1] = 4; + tmscsim[2] = 9; tmscsim[3] = 15; + tmscsim[4] = 2; + printk (KERN_INFO "DC390: Using safe settings.\n"); + } + else + { + /* if (tmscsim[0] < 0 || tmscsim[0] > 7) tmscsim[0] = 7; */ + if (tmscsim[1] < 0 || tmscsim[1] > 7) tmscsim[1] = 4; + if (tmscsim[4] < 0 || tmscsim[4] > 5) tmscsim[4] = 4; + }; +}; +/* Override defaults on cmdline: + * tmscsim: AdaptID, MaxSpeed (Index), DevMode (Bitmapped), AdaptMode (Bitmapped) + */ +void __init dc390_setup (char *str, int *ints) +{ + int i; + for (i = 0; i < ints[0]; i++) + tmscsim[i] = ints[i+1]; + if (ints[0] > 5) + printk (KERN_NOTICE "DC390: ignore extra params!\n"); + /* dc390_checkparams (); */ +}; +#endif /* CONFIG_SCSI_DC390T_NOGENSUPP */ + + +static void __init dc390_EEpromOutDI( PDEVDECL, PUCHAR regval, UCHAR Carry ) +{ + UCHAR bval; + + bval = 0; + if(Carry) + { + bval = 0x40; + *regval = 0x80; + PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); + } + udelay(160); + bval |= 0x80; + PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); + udelay(160); + bval = 0; + PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); + udelay(160); +} + + +static UCHAR __init dc390_EEpromInDO( PDEVDECL ) +{ + UCHAR bval; + + PCI_WRITE_CONFIG_BYTE(PDEV, 0x80, 0x80); + udelay(160); + PCI_WRITE_CONFIG_BYTE(PDEV, 0x80, 0x40); + udelay(160); + PCI_READ_CONFIG_BYTE(PDEV, 0x00, &bval); + if(bval == 0x22) + return(1); + else + return(0); +} + + +static USHORT __init dc390_EEpromGetData1( PDEVDECL ) +{ + UCHAR i; + UCHAR carryFlag; + USHORT wval; + + wval = 0; + for(i=0; i<16; i++) + { + wval <<= 1; + carryFlag = dc390_EEpromInDO(PDEV); + wval |= carryFlag; + } + return(wval); +} + + +static void __init dc390_Prepare( PDEVDECL, PUCHAR regval, UCHAR EEpromCmd ) +{ + UCHAR i,j; + UCHAR carryFlag; + + carryFlag = 1; + j = 0x80; + for(i=0; i<9; i++) + { + dc390_EEpromOutDI(PDEV,regval,carryFlag); + carryFlag = (EEpromCmd & j) ? 1 : 0; + j >>= 1; + } +} + + +static void __init dc390_ReadEEprom( PDEVDECL, PUSHORT ptr) +{ + UCHAR regval,cmd; + UCHAR i; + + cmd = EEPROM_READ; + for(i=0; i<0x40; i++) + { + dc390_EnDisableCE(ENABLE_CE, PDEV, ®val); + dc390_Prepare(PDEV, ®val, cmd++); + *ptr++ = dc390_EEpromGetData1(PDEV); + dc390_EnDisableCE(DISABLE_CE, PDEV, ®val); + } +} + + +static UCHAR __init dc390_CheckEEpromCheckSum( PDEVDECL, UCHAR index ) +{ + UCHAR i; + char EEbuf[128]; + USHORT wval, *ptr = (PUSHORT)EEbuf; + + dc390_ReadEEprom( PDEV, ptr ); + memcpy (dc390_eepromBuf[index], EEbuf, EE_ADAPT_SCSI_ID); + memcpy (&dc390_eepromBuf[index][EE_ADAPT_SCSI_ID], + &EEbuf[REAL_EE_ADAPT_SCSI_ID], EE_LEN - EE_ADAPT_SCSI_ID); + wval = 0; + for(i=0; i<0x40; i++, ptr++) + wval += *ptr; + return (wval == 0x1234 ? 0 : 1); +} + + +/*********************************************************************** + * Functions for the management of the internal structures + * (DCBs, SRBs, Queueing) * **********************************************************************/ static PDCB __inline__ dc390_findDCB ( PACB pACB, Scsi_Cmnd *cmd) @@ -678,6 +862,13 @@ } +/*********************************************************************** + * Function: static void dc390_SendSRB (PACB pACB, PSRB pSRB) + * + * Purpose: Send SCSI Request Block (pSRB) to adapter (pACB) + * + ***********************************************************************/ + static void dc390_SendSRB( PACB pACB, PSRB pSRB ) { PDCB pDCB; @@ -720,6 +911,14 @@ return; } +/*********************************************************************** + * Function: static void dc390_BuildSRB (Scsi_Cmd *pcmd, PDCB pDCB, + * PSRB pSRB) + * + * Purpose: Prepare SRB for being sent to Device DCB w/ command *pcmd + * + ***********************************************************************/ + static void dc390_BuildSRB (Scsi_Cmnd* pcmd, PDCB pDCB, PSRB pSRB) { pSRB->pSRBDCB = pDCB; @@ -1076,6 +1275,8 @@ * Inputs : cmd - command to abort * * Returns : 0 on success, -1 on failure. + * + * Status: Buggy ! ***********************************************************************/ int DC390_abort (Scsi_Cmnd *cmd) @@ -1347,13 +1548,13 @@ /*********************************************************************** - * Function : static void dc390_initDCB + * Function : static void dc390_initDCB() * * Purpose : initialize the internal structures for a given DCB * * Inputs : cmd - pointer to this scsi cmd request block structure - * ***********************************************************************/ + void dc390_initDCB( PACB pACB, PDCB *ppDCB, PSCSICMD cmd ) { PEEprom prom; @@ -1412,11 +1613,11 @@ } /*********************************************************************** - * Function : static void dc390_updateDCB + * Function : static void dc390_updateDCB() * * Purpose : Set the configuration dependent DCB parameters - * ***********************************************************************/ + void dc390_updateDCB (PACB pACB, PDCB pDCB) { pDCB->IdentifyMsg = IDENTIFY (pDCB->DevMode & EN_DISCONNECT_, pDCB->UnitSCSILUN); @@ -1441,11 +1642,11 @@ /*********************************************************************** - * Function : static void dc390_updateDCBs + * Function : static void dc390_updateDCBs () * * Purpose : Set the configuration dependent DCB params for all DCBs - * ***********************************************************************/ + static void dc390_updateDCBs (PACB pACB) { int i; @@ -1459,13 +1660,13 @@ /*********************************************************************** - * Function : static void dc390_initSRB + * Function : static void dc390_initSRB() * * Purpose : initialize the internal structures for a given SRB * * Inputs : psrb - pointer to this scsi request block structure - * ***********************************************************************/ + static void __inline__ dc390_initSRB( PSRB psrb ) { /* psrb->PhysSRB = virt_to_phys( psrb ); */ @@ -1489,13 +1690,14 @@ /*********************************************************************** - * Function : static void dc390_initACB + * Function : static void dc390_initACB () * * Purpose : initialize the internal structures for a given SCSI host * * Inputs : psh - pointer to this host adapter's structure - * + * io_port, Irq, index: Resources and adapter index ***********************************************************************/ + void __init dc390_initACB (PSH psh, ULONG io_port, UCHAR Irq, UCHAR index) { PACB pACB; @@ -1510,7 +1712,7 @@ psh->irq = Irq; pACB = (PACB) psh->hostdata; - DC390_LOCK_INIT; + DC390_LOCKA_INIT; DC390_LOCK_ACB; pACB->pScsiHost = psh; @@ -1554,33 +1756,44 @@ /*********************************************************************** - * Function : static int dc390_initAdapter + * Function : static int dc390_initAdapter () * * Purpose : initialize the SCSI chip ctrl registers * * Inputs : psh - pointer to this host adapter's structure + * io_port, Irq, index: Resources * + * Outputs: 0 on success, -1 on error ***********************************************************************/ + int __init dc390_initAdapter (PSH psh, ULONG io_port, UCHAR Irq, UCHAR index) { - PACB pACB, pacb; + PACB pACB, pACB2; UCHAR used_irq = 0, dstate; int i; + + pACB = (PACB) psh->hostdata; + + for ( pACB2 = dc390_pACB_start; pACB2 ; ) + { + if( pACB2->IRQLevel == Irq ) + { + used_irq = 1; + break; + } + else + pACB2 = pACB2->pNextACB; + } - pacb = dc390_pACB_start; - if( pacb != NULL ) - { - for ( ; (pacb != (PACB) -1) ; ) + if (check_region (io_port, psh->n_io_port)) { - if( pacb->IRQLevel == Irq ) - { - used_irq = 1; - break; - } - else - pacb = pacb->pNextACB; + printk(KERN_ERR "DC390: register IO ports error!\n"); + return( -1 ); } - } + else + request_region (io_port, psh->n_io_port, "tmscsim"); + + DC390_read8_ (INT_Status, io_port); /* Reset Pending INT */ if( !used_irq ) { @@ -1591,18 +1804,22 @@ } } - if (check_region (io_port, psh->n_io_port)) - { - printk(KERN_ERR "DC390: register IO ports error!\n"); - return( -1 ); - } + if( !dc390_pACB_start ) + { + pACB2 = NULL; + dc390_pACB_start = pACB; + dc390_pACB_current = pACB; + pACB->pNextACB = NULL; + } else - request_region (io_port, psh->n_io_port, "tmscsim"); - - pACB = (PACB) psh->hostdata; - /* pACB->IOPortBase = (USHORT) io_port; */ + { + pACB2 = dc390_pACB_current; + dc390_pACB_current->pNextACB = pACB; + dc390_pACB_current = pACB; + pACB->pNextACB = NULL; + }; - DC390_write8_ (CtrlReg1, DIS_INT_ON_SCSI_RST | psh->this_id, io_port); /* Disable SCSI bus reset interrupt */ + DC390_write8 (CtrlReg1, DIS_INT_ON_SCSI_RST | psh->this_id); /* Disable SCSI bus reset interrupt */ if (pACB->Gmode2 & RST_SCSI_BUS) { @@ -1612,6 +1829,7 @@ udelay(1000); }; pACB->ACBFlag = 0; + DC390_read8 (INT_Status); /* Reset Pending INT */ DC390_write8 (Scsi_TimeOut, SEL_TIMEOUT); /* 250ms selection timeout */ DC390_write8 (Clk_Factor, CLK_FREQ_40MHZ); /* Conversion factor = 0 , 40MHz clock */ @@ -1630,194 +1848,24 @@ } -static void __init dc390_EnDisableCE( UCHAR mode, PDEVDECL, PUCHAR regval ) -{ - UCHAR bval; - - bval = 0; - if(mode == ENABLE_CE) - *regval = 0xc0; - else - *regval = 0x80; - PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); - if(mode == DISABLE_CE) - PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); - udelay(160); -} - -#ifndef CONFIG_SCSI_DC390T_NOGENSUPP -static void __init dc390_EEpromDefaults (UCHAR index) -{ - PUCHAR ptr; - UCHAR id; - ptr = (PUCHAR) dc390_eepromBuf[index]; - - /* Adapter Settings */ - ptr[EE_ADAPT_SCSI_ID] = (UCHAR)tmscsim[0]; /* Adapter ID */ - ptr[EE_MODE2] = (UCHAR)tmscsim[3]; - ptr[EE_DELAY] = 0; /* ?? */ - ptr[EE_TAG_CMD_NUM] = (UCHAR)tmscsim[4]; /* Tagged Comds */ - - /* Device Settings */ - for (id = 0; id < MAX_SCSI_ID; id++) - { - ptr[id<<2] = (UCHAR)tmscsim[2]; /* EE_MODE1 */ - ptr[(id<<2) + 1] = (UCHAR)tmscsim[1]; /* EE_Speed */ - }; - dc390_adapname = "AM53C974"; -} - -static void __init dc390_checkparams (void) -{ - PARSEDEBUG(printk(KERN_INFO "DC390: setup %08x %08x %08x %08x %08x\n", tmscsim[0],\ - tmscsim[1], tmscsim[2], tmscsim[3], tmscsim[4]);) - if (tmscsim[0] < 0 || tmscsim[0] > 7) /* modules-2.0.0 passes -1 as string */ - { - tmscsim[0] = 7; tmscsim[1] = 4; - tmscsim[2] = 9; tmscsim[3] = 15; - tmscsim[4] = 2; - printk (KERN_INFO "DC390: Using safe settings.\n"); - } - else - { - /* if (tmscsim[0] < 0 || tmscsim[0] > 7) tmscsim[0] = 7; */ - if (tmscsim[1] < 0 || tmscsim[1] > 7) tmscsim[1] = 4; - if (tmscsim[4] < 0 || tmscsim[4] > 5) tmscsim[4] = 4; - }; -}; -/* Override defaults on cmdline: - * tmscsim: AdaptID, MaxSpeed (Index), DevMode (Bitmapped), AdaptMode (Bitmapped) - */ -void __init dc390_setup (char *str, int *ints) -{ - int i; - for (i = 0; i < ints[0]; i++) - tmscsim[i] = ints[i+1]; - if (ints[0] > 5) - printk (KERN_NOTICE "DC390: ignore extra params!\n"); - /* dc390_checkparams (); */ -}; -#endif /* CONFIG_SCSI_DC390T_NOGENSUPP */ - - -static void __init dc390_EEpromOutDI( PDEVDECL, PUCHAR regval, UCHAR Carry ) -{ - UCHAR bval; - - bval = 0; - if(Carry) - { - bval = 0x40; - *regval = 0x80; - PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); - } - udelay(160); - bval |= 0x80; - PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); - udelay(160); - bval = 0; - PCI_WRITE_CONFIG_BYTE(PDEV, *regval, bval); - udelay(160); -} - - -static UCHAR __init dc390_EEpromInDO( PDEVDECL ) -{ - UCHAR bval; - - PCI_WRITE_CONFIG_BYTE(PDEV, 0x80, 0x80); - udelay(160); - PCI_WRITE_CONFIG_BYTE(PDEV, 0x80, 0x40); - udelay(160); - PCI_READ_CONFIG_BYTE(PDEV, 0x00, &bval); - if(bval == 0x22) - return(1); - else - return(0); -} - - -static USHORT __init dc390_EEpromGetData1( PDEVDECL ) -{ - UCHAR i; - UCHAR carryFlag; - USHORT wval; - - wval = 0; - for(i=0; i<16; i++) - { - wval <<= 1; - carryFlag = dc390_EEpromInDO(PDEV); - wval |= carryFlag; - } - return(wval); -} - - -static void __init dc390_Prepare( PDEVDECL, PUCHAR regval, UCHAR EEpromCmd ) -{ - UCHAR i,j; - UCHAR carryFlag; - - carryFlag = 1; - j = 0x80; - for(i=0; i<9; i++) - { - dc390_EEpromOutDI(PDEV,regval,carryFlag); - carryFlag = (EEpromCmd & j) ? 1 : 0; - j >>= 1; - } -} - - -static void __init dc390_ReadEEprom( PDEVDECL, PUSHORT ptr) -{ - UCHAR regval,cmd; - UCHAR i; - - cmd = EEPROM_READ; - for(i=0; i<0x40; i++) - { - dc390_EnDisableCE(ENABLE_CE, PDEV, ®val); - dc390_Prepare(PDEV, ®val, cmd++); - *ptr++ = dc390_EEpromGetData1(PDEV); - dc390_EnDisableCE(DISABLE_CE, PDEV, ®val); - } -} - - -static UCHAR __init dc390_CheckEEpromCheckSum( PDEVDECL, UCHAR index ) -{ - UCHAR i; - char EEbuf[128]; - USHORT wval, *ptr = (PUSHORT)EEbuf; - - dc390_ReadEEprom( PDEV, ptr ); - memcpy (dc390_eepromBuf[index], EEbuf, EE_ADAPT_SCSI_ID); - memcpy (&dc390_eepromBuf[index][EE_ADAPT_SCSI_ID], - &EEbuf[REAL_EE_ADAPT_SCSI_ID], EE_LEN - EE_ADAPT_SCSI_ID); - wval = 0; - for(i=0; i<0x40; i++, ptr++) - wval += *ptr; - return (wval == 0x1234 ? 0 : 1); -} - - /*********************************************************************** - * Function : static int DC390_init (struct Scsi_Host *host) + * Function : static int DC390_init (struct Scsi_Host *host, ...) * * Purpose : initialize the internal structures for a given SCSI host * - * Inputs : host - pointer to this host adapter's structure/ + * Inputs : host - pointer to this host adapter's structure + * io_port - IO ports mapped to this adapter + * Irq - IRQ assigned to this adpater + * PDEVDECL - PCI access handle + * index - Adapter index * - * Preconditions : when this function is called, the chip_type - * field of the pACB structure MUST have been set. + * Outputs: 0 on success, -1 on error * * Note: written in capitals, because the locking is only done here, * not in DC390_detect, called from outside ***********************************************************************/ -static int __init DC390_init (PSHT psht, ULONG io_port, UCHAR Irq, PDEVDECL, int index) +static int __init DC390_init (PSHT psht, ULONG io_port, UCHAR Irq, PDEVDECL, UCHAR index) { PSH psh; PACB pACB; @@ -1846,7 +1894,7 @@ if( !psh ) return( -1 ); pACB = (PACB) psh->hostdata; - DC390_LOCK_INIT; + DC390_LOCKA_INIT; DC390_LOCK_ACB; #if 0 @@ -1866,33 +1914,17 @@ DEBUG0(printk("DC390: Index %02i,", index);) dc390_initACB( psh, io_port, Irq, index ); + pACB = (PACB) psh->hostdata; + PDEVSET; - DC390_read8_ (INT_Status, io_port); /* Reset Pending INT */ - if( !dc390_initAdapter( psh, io_port, Irq, index ) ) { - pACB = (PACB) psh->hostdata; - if( !dc390_pACB_start ) - { - dc390_pACB_start = pACB; - dc390_pACB_current = pACB; - pACB->pNextACB = (PACB) -1; - } - else - { - dc390_pACB_current->pNextACB = pACB; - dc390_pACB_current = pACB; - pACB->pNextACB = (PACB) -1; - } - DEBUG0(printk("DC390: pACB = %8x, pDCBmap = %8x, pSRB_array = %8x\n",\ (UINT) pACB, (UINT) pACB->DCBmap, (UINT) pACB->SRB_array);) DEBUG0(printk("DC390: ACB size= %4x, DCB size= %4x, SRB size= %4x\n",\ sizeof(DC390_ACB), sizeof(DC390_DCB), sizeof(DC390_SRB) );) - DC390_read8_ (INT_Status, io_port); /* Reset Pending INT */ - DC390_UNLOCK_ACB; return (0); } @@ -1960,7 +1992,6 @@ PDEVDECL0; UCHAR irq; UINT io_port; - UCHAR adaptCnt = 0; /* Number of boards detected */ DC390_IFLAGS DC390_DFLAGS DC390_LOCK_DRV; @@ -1972,29 +2003,36 @@ { DC390_LOCK_IO; /* Remove this when going to new eh */ PCI_GET_IO_AND_IRQ; - DEBUG0(printk(KERN_DEBUG "DC390(%i): IO_PORT=%04x,IRQ=%x\n", adaptCnt, (UINT) io_port, irq);) + DEBUG0(printk(KERN_DEBUG "DC390(%i): IO_PORT=%04x,IRQ=%x\n", dc390_adapterCnt, (UINT) io_port, irq);) - if( !DC390_init(psht, io_port, irq, PDEV, adaptCnt)) + if( !DC390_init(psht, io_port, irq, PDEV, dc390_adapterCnt)) { PCI_SET_MASTER; dc390_set_pci_cfg (PDEV); - adaptCnt++; + dc390_adapterCnt++; }; DC390_UNLOCK_IO; /* Remove when going to new eh */ } else printk (KERN_ERR "DC390: No PCI BIOS found!\n"); - if (adaptCnt) + if (dc390_adapterCnt) psht->proc_dir = &DC390_proc_scsi_tmscsim; - printk(KERN_INFO "DC390: %i adapters found\n", adaptCnt); - dc390_adapterCnt = adaptCnt; + printk(KERN_INFO "DC390: %i adapters found\n", dc390_adapterCnt); DC390_UNLOCK_DRV; - return( adaptCnt ); + return( dc390_adapterCnt ); } +/*********************************************************************** + * Functions: dc390_inquiry(), dc390_inquiry_done() + * + * Purpose: When changing speed etc., we have to issue an INQUIRY + * command to make sure, we agree upon the nego parameters + * with the device + ***********************************************************************/ + static void dc390_inquiry_done (Scsi_Cmnd* cmd) { printk (KERN_INFO "DC390: INQUIRY (ID %02x LUN %02x) returned %08x\n", @@ -2367,8 +2405,6 @@ * ********************************************************************/ -/* KG: proc_info taken from driver aha152x.c */ - #undef SPRINTF #define SPRINTF(args...) pos += sprintf(pos, ## args) @@ -2529,7 +2565,7 @@ if (host->irq != IRQ_NONE) { for (irq_count = 0, pACB = dc390_pACB_start; - pACB && pACB != (PACB)-1; pACB = pACB->pNextACB) + pACB; pACB = pACB->pNextACB) { if ( pACB->IRQLevel == host->irq ) ++irq_count;