www.pudn.com > ScriptsSample.zip > S8XX.C


/*--------------------------------------------------*/ 
/*                                                  */ 
/* Module S8XX.C                                    */ 
/*                                                  */ 
/* Symbios 53C8XX family specific functions for     */ 
/* sample code.                                     */ 
/*                                                  */ 
/* Adapted from Symbios Logic                       */ 
/*    Software Development Kit                      */ 
/*                                                  */ 
/* Project: A Programmer's Guide to SCSI            */ 
/* Copyright (C) 1997, Brian Sawert.                */ 
/* All rights reserved.                             */ 
/*                                                  */ 
/*--------------------------------------------------*/ 
 
 
#include  
#include  
#include  
 
#include "gen_tool.h"         // generic tools 
#include "spci.h"             // PCI definitions 
#include "s8xx.h"             // Symbios 8XX definitions 
 
 
/*---------- defines and macros ----------*/ 
 
/*---------- global variables ----------*/ 
 
/*---------- external variables ----------*/ 
 
/*---------- local functions ----------*/ 
 
/*---------- external functions ----------*/ 
 
/*---------- function definitions ----------*/ 
 
 
/*--------------------------------------------------*/ 
/*                                                  */ 
/* Routine to initialize 53C8XX chip.               */ 
/*                                                  */ 
/* Usage:   WORD init_8xx(pci_device *ppcidevice,   */ 
/*    c8xx_device *pc8xxdev)                        */ 
/*                                                  */ 
/* Parameters:                                      */ 
/*    ppcidev:       pointer to pci_device struct   */ 
/*    pc8xxdev:      pointer to c8xx_device struct  */ 
/*                                                  */ 
/* Return value:                                    */ 
/*    Returns 1 on success, 0 otherwise.            */ 
/*                                                  */ 
/*--------------------------------------------------*/ 
 
WORD init_8xx(pci_device *ppcidev, 
   c8xx_device *pc8xxdev) 
{ 
   BYTE burst_len; 
 
 
   if (!(ppcidev->dev_id == pc8xxdev->dev_id && 
      (ppcidev->rev_id & 0xF0) == pc8xxdev->rev_id)) { 
   // device is not 53C8XX chip 
      return 0; 
   } 
 
   // reset the chip 
   IOWrite8(ppcidev->io_base + ISTAT, 0x40); 
   delay(3); 
 
   // clear the chip reset 
   IOWrite8(ppcidev->io_base + ISTAT, 0x00); 
 
   // reset the SCSI bus 
   IOWrite8(ppcidev->io_base + SCNTL1, 0x08); 
   delay(3); 
 
   // clear the SCSI reset 
   IOWrite8(ppcidev->io_base + SCNTL1, 0x0); 
 
   // clear the interrupt from the SCSI reset 
   IORead32(ppcidev->io_base + SIEN0); 
 
   // set up burst mode length for 53C825 
   burst_len = pc8xxdev->max_burst_a << 6; 
 
   // clear current burst length 
   RMWoff(ppcidev->io_base + CTEST5, 0x04); 
   RMWoff(ppcidev->io_base + DMODE, 0xC0); 
 
   // set new burst length (just use lower 2 bits) 
   RMWon(ppcidev->io_base + DMODE, burst_len); 
 
   // set clock conversion factor for 53C825 
   RMWon(ppcidev->io_base + SCNTL3, DEF_CLOCK); 
 
   // set chip SCSI ID and reselect response 
   RMWon(ppcidev->io_base + SCID, 
      (0x40 | pc8xxdev->scsi_id)); 
 
	// set response ID 
   RMWon(ppcidev->io_base + RESPID0, 0x80); 
 
   // turn on parity checking and ATN on parity error 
   RMWon(ppcidev->io_base + SCNTL0, 0x0A); 
 
   // set selection timeout to 250 ms 
   RMWon(ppcidev->io_base + STIME0, DEF_SELECT_TO); 
 
   return 1; 
}