⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nsp_cs.h

📁 linux-2.6.15.6
💻 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.19 2003/08/18 11:09:19 elca Exp $ */#ifndef  __nsp_cs__#define  __nsp_cs__/* for debugging *///#define NSP_DEBUG 9/*#define static#define inline*//************************************ * Some useful macros... */#define BIT(x)      (1L << (x))/* SCSI initiator must be ID 7 */#define NSP_INITIATOR_ID  7#define NSP_SELTIMEOUT 200/*************************************************************************** * register definitions ***************************************************************************//*======================================================================== * base register ========================================================================*/#define	IRQCONTROL	0x00  /* R */#  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           (IRQCONTROL_RESELECT_CLEAR     | \					 IRQCONTROL_PHASE_CHANGE_CLEAR | \					 IRQCONTROL_TIMER_CLEAR        | \					 IRQCONTROL_FIFO_CLEAR          )#  define IRQCONTROL_IRQDISABLE         0xf0#define	IRQSTATUS	0x00  /* W */#  define IRQSTATUS_SCSI  BIT(0)#  define IRQSTATUS_TIMER BIT(2)#  define IRQSTATUS_FIFO  BIT(3)#  define IRQSTATUS_MASK  0x0f#define	IFSELECT	0x01 /* W */#  define IF_IFSEL    BIT(0)#  define IF_REGSEL   BIT(2)#define	FIFOSTATUS	0x01 /* R */#  define FIFOSTATUS_CHIP_REVISION_MASK 0x0f#  define FIFOSTATUS_CHIP_ID_MASK       0x70#  define FIFOSTATUS_FULL_EMPTY         BIT(7)#define	INDEXREG	0x02 /* R/W */#define	DATAREG		0x03 /* R/W */#define	FIFODATA	0x04 /* R/W */#define	FIFODATA1	0x05 /* R/W */#define	FIFODATA2	0x06 /* R/W */#define	FIFODATA3	0x07 /* R/W *//*==================================================================== * indexed register ====================================================================*/#define EXTBUSCTRL	0x10 /* R/W,deleted */#define CLOCKDIV	0x11 /* R/W */#  define CLOCK_40M 0x02#  define CLOCK_20M 0x01#  define FAST_20   BIT(2)#define TERMPWRCTRL	0x13 /* R/W */#  define POWER_ON BIT(0)#define SCSIIRQMODE	0x15 /* R/W */#  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 /* R */#  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 /* R/W */#define SCSIBUSCTRL	0x18 /* R/W */#  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 /* R */#define SETARBIT	0x1A /* W */#  define ARBIT_GO         BIT(0)#  define ARBIT_FLAG_CLEAR BIT(1)#define ARBITSTATUS	0x1A /* R *//*#  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  /* R/W */#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        (BIT(4) | BIT(5))#    define ACK_COUNTER        (0)#    define REQ_COUNTER        (BIT(4))#    define HOST_COUNTER       (BIT(5))#define TRANSFERCOUNT	0x1E  /* R   */#define TRANSFERMODE	0x20  /* R/W */#  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 /* R/W */#  define SYNCREG_OFFSET_MASK  0x0f#  define SYNCREG_PERIOD_MASK  0xf0#  define SYNCREG_PERIOD_SHIFT 4#define SCSIDATALATCH	0x22 /*   W */#define SCSIDATAIN	0x22 /* R   */#define SCSIDATAWITHACK	0x23 /* R/W */#define SCAMCONTROL	0x24 /*   W */#define SCAMSTATUS	0x24 /* R   */#define SCAMDATA	0x25 /* R/W */#define OTHERCONTROL	0x26 /* R/W */#  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 /* R/W */#define CLRTESTPNT	0x28 /*   W */#define ACKCNTLD	0x29 /*   W */#define REQCNTLD	0x2A /*   W */#define HSTCNTLD	0x2B /*   W */#define CHECKSUM	0x2C /* R/W *//************************************************************************ * Input status bit definitions. ************************************************************************/#define S_MESSAGE	BIT(0)    /* Message line from SCSI bus      */#define S_IO		BIT(1)    /* Input/Output line from SCSI bus */#define S_CD		BIT(2)    /* Command/Data line from SCSI bus */#define S_BUSY		BIT(3)    /* Busy line from SCSI bus         */#define S_ACK		BIT(4)    /* Acknowlege line from SCSI bus   */#define S_REQUEST	BIT(5)    /* Request line from SCSI bus      */#define S_SELECT	BIT(6)	  /*                                 */#define S_ATN		BIT(7)	  /*                                 *//*********************************************************************** * 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_CD | S_IO | S_MESSAGE | S_REQUEST )#define BUSMON_MESSAGE_OUT ( S_BUSY | S_CD |        S_MESSAGE | 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_CD | S_IO |             S_REQUEST )#define BUSMON_SELECT      (                 S_IO |                        S_SELECT )#define BUSMON_RESELECT    (                 S_IO |                        S_SELECT )#define BUSMON_PHASE_MASK  (          S_CD | S_IO | S_MESSAGE |            S_SELECT )#define BUSPHASE_SELECT      ( BUSMON_SELECT      & BUSMON_PHASE_MASK )#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 )/*====================================================================*/typedef struct scsi_info_t {	dev_link_t             link;	struct Scsi_Host      *host;#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,74))	dev_node_t             node;#else	int	               ndev;	dev_node_t             node[8];	struct bus_operations *bus;#endif	int                    stop;} scsi_info_t;/* 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_hw_data {	unsigned int  BaseAddress;	unsigned int  NumAddress;	unsigned int  IrqNumber;	unsigned long MmioAddress;#define NSP_MMIO_OFFSET 0x0800	unsigned long MmioLength;	unsigned char ScsiClockDiv;	unsigned char TransferMode;	int           TimerCount;	int           SelectionTimeOut;	Scsi_Cmnd    *CurrentSC;	//int           CurrnetTarget;	int           FifoCount;#define MSGBUF_SIZE 20	unsigned char MsgBuffer[MSGBUF_SIZE];	int MsgLen;#define N_TARGET 8	sync_data     Sync[N_TARGET];	char nspinfo[110];     /* description */	spinlock_t Lock;	scsi_info_t   *ScsiInfo; /* attach <-> detect glue */#ifdef NSP_DEBUG	int CmdId; /* Accepted command serial number.		      Used for debugging.             */#endif} nsp_hw_data;/**************************************************************************** * *//* Card service functions */static dev_link_t *nsp_cs_attach (void);static void        nsp_cs_detach (dev_link_t *link);static void        nsp_cs_release(dev_link_t *link);static void        nsp_cs_config (dev_link_t *link);static int         nsp_cs_event  (event_t event, int priority, event_callback_args_t *args);/* Linux SCSI subsystem specific functions */static struct Scsi_Host *nsp_detect     (struct scsi_host_template *sht);#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))static        int        nsp_detect_old (struct scsi_host_template *sht);static        int        nsp_release_old(struct Scsi_Host *shpnt);#endifstatic const  char      *nsp_info       (struct Scsi_Host *shpnt);static        int        nsp_proc_info  (#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))	                                 struct Scsi_Host *host,#endif					 char   *buffer,					 char  **start,					 off_t   offset,					 int     length,#if !(LINUX_VERSION_CODE > KERNEL_VERSION(2,5,73))					 int     hostno,#endif					 int     inout);static        int        nsp_queuecommand(Scsi_Cmnd *SCpnt, void (* done)(Scsi_Cmnd *SCpnt));/* Error handler *//*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_bus_reset       (nsp_hw_data *data);/* */static int  nsphw_init           (nsp_hw_data *data);static int  nsphw_start_selection(Scsi_Cmnd *SCpnt);static void nsp_start_timer      (Scsi_Cmnd *SCpnt, int time);static int  nsp_fifo_count       (Scsi_Cmnd *SCpnt);static void nsp_pio_read         (Scsi_Cmnd *SCpnt);static void nsp_pio_write        (Scsi_Cmnd *SCpnt);static int  nsp_nexus            (Scsi_Cmnd *SCpnt);static void nsp_scsi_done        (Scsi_Cmnd *SCpnt);static int  nsp_analyze_sdtr     (Scsi_Cmnd *SCpnt);static int  nsp_negate_signal    (Scsi_Cmnd *SCpnt, unsigned char mask, char *str);static int  nsp_expect_signal    (Scsi_Cmnd *SCpnt, unsigned char current_phase, unsigned char  mask);static int  nsp_xfer             (Scsi_Cmnd *SCpnt, int phase);static int  nsp_dataphase_bypass (Scsi_Cmnd *SCpnt);static int  nsp_reselected       (Scsi_Cmnd *SCpnt);static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht);/* Interrupt handler *///static irqreturn_t nspintr(int irq, void *dev_id, struct pt_regs *regs);/* Module entry point*/static int  __init nsp_cs_init(void);static void __exit nsp_cs_exit(void);/* Debug */#ifdef NSP_DEBUGstatic void show_command (Scsi_Cmnd *SCpnt);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     ,	PH_ABORT        ,	PH_RESET};enum _data_in_out {	IO_UNKNOWN,	IO_IN,	IO_OUT};enum _burst_mode {	BURST_IO8   = 0,	BURST_IO32  = 1,	BURST_MEM32 = 2,};/************************************************************************** * SCSI messaage */#define MSG_COMMAND_COMPLETE 0x00#define MSG_EXTENDED         0x01#define MSG_ABORT            0x06#define MSG_NO_OPERATION     0x08#define MSG_BUS_DEVICE_RESET 0x0c#define MSG_EXT_SDTR         0x01/************************************************************************** * Compatibility functions *//* for Kernel 2.4 */#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0))#  define scsi_register_host(template)   scsi_register_module(MODULE_SCSI_HA, template)#  define scsi_unregister_host(template) scsi_unregister_module(MODULE_SCSI_HA, template)#  define scsi_host_put(host)            scsi_unregister(host)typedef void irqreturn_t;#  define IRQ_NONE      /* */#  define IRQ_HANDLED   /* */#  define IRQ_RETVAL(x) /* *//* This is ad-hoc version of scsi_host_get_next() */static inline struct Scsi_Host *scsi_host_get_next(struct Scsi_Host *host){	if (host == NULL) {		return scsi_hostlist;	} else {		return host->next;	}}/* This is ad-hoc version of scsi_host_hn_get() */static inline struct Scsi_Host *scsi_host_hn_get(unsigned short hostno){	struct Scsi_Host *host;	for (host = scsi_host_get_next(NULL); host != NULL;	     host = scsi_host_get_next(host)) {		if (host->host_no == hostno) {			break;		}	}	return host;}static void cs_error(client_handle_t handle, int func, int ret){	error_info_t err = { func, ret };	pcmcia_report_error(handle, &err);}/* scatter-gather table */#  define BUFFER_ADDR (SCpnt->SCp.buffer->address)#endif/* for Kernel 2.6 */#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))/* scatter-gather table */#  define BUFFER_ADDR ((char *)((unsigned int)(SCpnt->SCp.buffer->page) + SCpnt->SCp.buffer->offset))#endif#endif  /*__nsp_cs__*//* end */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -