📄 nsp_cs.h
字号:
/*=======================================================/ Header file for nsp_cs.c By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp> Ver.1.0 : Cut unused lines. Ver 0.1 : Initial version. This software may be used and distributed according to the terms of the GNU General Public License.=========================================================*//* $Id: nsp_cs.h,v 1.27 2001/09/10 10:31:13 elca Exp $ */#ifndef __nsp_cs__#define __nsp_cs__/* for debugging *//*#define PCMCIA_DEBUG 9*//*#define static#define inline*//************************************ * Some useful macros... */#define Number(arr) ((int) (sizeof(arr) / sizeof(arr[0])))#define BIT(x) (1<<(x))#define MIN(a,b) ((a) > (b) ? (b) : (a))/* SCSI initiator must be 7 */#define SCSI_INITIATOR_ID 7#define NSP_SELTIMEOUT 200/* base register */#define IRQCONTROL 0x00# define IRQCONTROL_RESELECT_CLEAR BIT(0)# define IRQCONTROL_PHASE_CHANGE_CLEAR BIT(1)# define IRQCONTROL_TIMER_CLEAR BIT(2)# define IRQCONTROL_FIFO_CLEAR BIT(3)# define IRQCONTROL_ALLMASK 0xff# define IRQCONTROL_ALLCLEAR 0x0f# define IRQCONTROL_IRQDISABLE 0xf0#define IRQSTATUS 0x00# define IRQSTATUS_SCSI BIT(0)# define IRQSTATUS_TIMER BIT(2)# define IRQSTATUS_FIFO BIT(3)# define IRQSTATUS_MASK 0x0f#define IFSELECT 0x01# define IF_IFSEL BIT(0)# define IF_REGSEL BIT(2)#define FIFOSTATUS 0x01# define FIFOSTATUS_CHIP_REVISION 0x0f# define FIFOSTATUS_CHIP_ID 0x70# define FIFOSTATUS_FULL_EMPTY 0x80#define INDEXREG 0x02#define DATAREG 0x03#define FIFODATA 0x04#define FIFODATA1 0x05#define FIFODATA2 0x06#define FIFODATA3 0x07/* indexed register */#define EXTBUSCTRL 0x10#define CLOCKDIV 0x11# define CLOCK_40M 0x02# define CLOCK_20M 0x01#define TERMPWRCTRL 0x13# define POWER_ON BIT(0)#define SCSIIRQMODE 0x15# define SCSI_PHASE_CHANGE_EI BIT(0)# define RESELECT_EI BIT(4)# define FIFO_IRQ_EI BIT(5)# define SCSI_RESET_IRQ_EI BIT(6)#define IRQPHASESENCE 0x16# define LATCHED_MSG BIT(0)# define LATCHED_IO BIT(1)# define LATCHED_CD BIT(2)# define LATCHED_BUS_FREE BIT(3)# define PHASE_CHANGE_IRQ BIT(4)# define RESELECT_IRQ BIT(5)# define FIFO_IRQ BIT(6)# define SCSI_RESET_IRQ BIT(7)#define TIMERCOUNT 0x17#define SCSIBUSCTRL 0x18# define SCSI_SEL BIT(0)# define SCSI_RST BIT(1)# define SCSI_DATAOUT_ENB BIT(2)# define SCSI_ATN BIT(3)# define SCSI_ACK BIT(4)# define SCSI_BSY BIT(5)# define AUTODIRECTION BIT(6)# define ACKENB BIT(7)#define SCSIBUSMON 0x19#define SETARBIT 0x1A# define ARBIT_GO BIT(0)# define ARBIT_FLAG_CLEAR BIT(1)#define ARBITSTATUS 0x1A/*# define ARBIT_GO BIT(0)*/# define ARBIT_WIN BIT(1)# define ARBIT_FAIL BIT(2)# define RESELECT_FLAG BIT(3)#define PARITYCTRL 0x1B /* W */#define PARITYSTATUS 0x1B /* R */#define COMMANDCTRL 0x1C /* W */# define CLEAR_COMMAND_POINTER BIT(0)# define AUTO_COMMAND_GO BIT(1)#define RESELECTID 0x1C /* R */#define COMMANDDATA 0x1D#define POINTERCLR 0x1E /* W */# define POINTER_CLEAR BIT(0)# define ACK_COUNTER_CLEAR BIT(1)# define REQ_COUNTER_CLEAR BIT(2)# define HOST_COUNTER_CLEAR BIT(3)# define READ_SOURCE 0x30#define TRANSFERCOUNT 0x1E /* R */#define TRANSFERMODE 0x20# define MODE_MEM8 BIT(0)# define MODE_MEM32 BIT(1)# define MODE_ADR24 BIT(2)# define MODE_ADR32 BIT(3)# define MODE_IO8 BIT(4)# define MODE_IO32 BIT(5)# define TRANSFER_GO BIT(6)# define BRAIND BIT(7)#define SYNCREG 0x21# define SYNCREG_OFFSET_MASK 0x0f# define SYNCREG_PERIOD_MASK 0xf0# define SYNCREG_PERIOD_SHIFT 4#define SCSIDATALATCH 0x22#define SCSIDATAIN 0x22#define SCSIDATAWITHACK 0x23#define SCAMCONTROL 0x24#define SCAMSTATUS 0x24#define SCAMDATA 0x25#define OTHERCONTROL 0x26# define TPL_ROM_WRITE_EN BIT(0)# define TPWR_OUT BIT(1)# define TPWR_SENSE BIT(2)# define RA8_CONTROL BIT(3)#define ACKWIDTH 0x27#define CLRTESTPNT 0x28#define ACKCNTLD 0x29#define REQCNTLD 0x2A#define HSTCNTLD 0x2B#define CHECKSUM 0x2C/* * Input status bit definitions. */#define S_ATN 0x80 /**/#define S_SELECT 0x40 /**/#define S_REQUEST 0x20 /* Request line from SCSI bus*/#define S_ACK 0x10 /* Acknowlege line from SCSI bus*/#define S_BUSY 0x08 /* Busy line from SCSI bus*/#define S_CD 0x04 /* Command/Data line from SCSI bus*/#define S_IO 0x02 /* Input/Output line from SCSI bus*/#define S_MESSAGE 0x01 /* Message line from SCSI bus*//* * Useful Bus Monitor status combinations. */#define BUSMON_SEL S_SELECT#define BUSMON_BSY S_BUSY#define BUSMON_REQ S_REQUEST#define BUSMON_IO S_IO#define BUSMON_ACK S_ACK#define BUSMON_BUS_FREE 0#define BUSMON_COMMAND ( S_BUSY | S_CD | S_REQUEST )#define BUSMON_MESSAGE_IN ( S_BUSY | S_MESSAGE | S_IO | S_CD | S_REQUEST )#define BUSMON_MESSAGE_OUT ( S_BUSY | S_MESSAGE | S_CD | S_REQUEST )#define BUSMON_DATA_IN ( S_BUSY | S_IO | S_REQUEST )#define BUSMON_DATA_OUT ( S_BUSY | S_REQUEST )#define BUSMON_STATUS ( S_BUSY | S_IO | S_CD | S_REQUEST )#define BUSMON_RESELECT ( S_SELECT | S_IO )#define BUSMON_PHASE_MASK ( S_SELECT | S_CD | S_MESSAGE | S_IO )#define BUSPHASE_COMMAND ( BUSMON_COMMAND & BUSMON_PHASE_MASK )#define BUSPHASE_MESSAGE_IN ( BUSMON_MESSAGE_IN & BUSMON_PHASE_MASK )#define BUSPHASE_MESSAGE_OUT ( BUSMON_MESSAGE_OUT & BUSMON_PHASE_MASK )#define BUSPHASE_DATA_IN ( BUSMON_DATA_IN & BUSMON_PHASE_MASK )#define BUSPHASE_DATA_OUT ( BUSMON_DATA_OUT & BUSMON_PHASE_MASK )#define BUSPHASE_STATUS ( BUSMON_STATUS & BUSMON_PHASE_MASK )#define BUSPHASE_SELECT ( S_SELECT | S_IO )/* synchronous transfer negotiation data */typedef struct _sync_data { unsigned int SyncNegotiation;#define SYNC_NOT_YET 0#define SYNC_OK 1#define SYNC_NG 2 unsigned int SyncPeriod; unsigned int SyncOffset; unsigned char SyncRegister; unsigned char AckWidth;} sync_data;typedef struct _nsp_data { unsigned int BaseAddress; unsigned int NumAddress; unsigned int IrqNumber; unsigned char ScsiClockDiv; unsigned char TransferMode; int TimerCount; int SelectionTimeOut; Scsi_Cmnd *CurrentSC; int FifoCount;#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) int Residual;#define RESID data->Residual#else#define RESID SCpnt->resid#endif#define MSGBUF_SIZE 20 unsigned char MsgBuffer[MSGBUF_SIZE]; int MsgLen;#define N_TARGET 8#define N_LUN 8 sync_data Sync[N_TARGET][N_LUN];} nsp_hw_data;static void nsp_cs_release(u_long arg);static int nsp_cs_event(event_t event, int priority, event_callback_args_t *args);static dev_link_t *nsp_cs_attach(void);static void nsp_cs_detach(dev_link_t *);static unsigned int nsphw_start_selection(Scsi_Cmnd *SCpnt, nsp_hw_data *data);static void nsp_start_timer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int time);static int nsp_detect(Scsi_Host_Template * );static int nsp_release(struct Scsi_Host *shpnt);static const char * nsp_info(struct Scsi_Host *shpnt);static int nsp_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *));static int nsp_abort(Scsi_Cmnd *);static int nsp_reset(Scsi_Cmnd *, unsigned int);static int nsp_eh_abort(Scsi_Cmnd * SCpnt);static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt);static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt);static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt);static int nsp_fifo_count(Scsi_Cmnd *SCpnt);static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data);static int nsp_nexus(Scsi_Cmnd *SCpnt, nsp_hw_data *data);#ifdef PCMCIA_DEBUGstatic void show_command(Scsi_Cmnd *ptr);static void show_phase(Scsi_Cmnd *SCpnt);static void show_busphase(unsigned char stat);static void show_message(nsp_hw_data *data);#else# define show_command(ptr) /* */# define show_phase(SCpnt) /* */# define show_busphase(stat) /* */# define show_message(data) /* */#endif/* * SCSI phase */enum _scsi_phase { PH_UNDETERMINED, PH_ARBSTART, PH_SELSTART, PH_SELECTED, PH_COMMAND, PH_DATA, PH_STATUS, PH_MSG_IN, PH_MSG_OUT, PH_DISCONNECT, PH_RESELECT};enum _data_in_out { IO_UNKNOWN, IO_IN, IO_OUT};/* SCSI messaage */#define MSG_COMMAND_COMPLETE 0x00#define MSG_EXTENDED 0x01#define MSG_NO_OPERATION 0x08#define MSG_EXT_SDTR 0x01#endif /*__nsp_cs__*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -