brintos

brintos / linux-shallow public Read only

0
0
Text · 11.6 KiB · e1ee8ef Raw
378 lines · c
1/*=======================================================/2  Header file for nsp_cs.c3      By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>4 5    Ver.1.0 : Cut unused lines.6    Ver 0.1 : Initial version.7 8    This software may be used and distributed according to the terms of9    the GNU General Public License.10 11=========================================================*/12 13#ifndef  __nsp_cs__14#define  __nsp_cs__15 16/* for debugging */17//#define NSP_DEBUG 918 19/*20#define static21#define inline22*/23 24/************************************25 * Some useful macros...26 */27 28/* SCSI initiator must be ID 7 */29#define NSP_INITIATOR_ID  730 31#define NSP_SELTIMEOUT 20032 33/***************************************************************************34 * register definitions35 ***************************************************************************/36/*========================================================================37 * base register38 ========================================================================*/39#define	IRQCONTROL	0x00  /* R */40#  define IRQCONTROL_RESELECT_CLEAR     BIT(0)41#  define IRQCONTROL_PHASE_CHANGE_CLEAR BIT(1)42#  define IRQCONTROL_TIMER_CLEAR        BIT(2)43#  define IRQCONTROL_FIFO_CLEAR         BIT(3)44#  define IRQCONTROL_ALLMASK            0xff45#  define IRQCONTROL_ALLCLEAR           (IRQCONTROL_RESELECT_CLEAR     | \46					 IRQCONTROL_PHASE_CHANGE_CLEAR | \47					 IRQCONTROL_TIMER_CLEAR        | \48					 IRQCONTROL_FIFO_CLEAR          )49#  define IRQCONTROL_IRQDISABLE         0xf050 51#define	IRQSTATUS	0x00  /* W */52#  define IRQSTATUS_SCSI  BIT(0)53#  define IRQSTATUS_TIMER BIT(2)54#  define IRQSTATUS_FIFO  BIT(3)55#  define IRQSTATUS_MASK  0x0f56 57#define	IFSELECT	0x01 /* W */58#  define IF_IFSEL    BIT(0)59#  define IF_REGSEL   BIT(2)60 61#define	FIFOSTATUS	0x01 /* R */62#  define FIFOSTATUS_CHIP_REVISION_MASK 0x0f63#  define FIFOSTATUS_CHIP_ID_MASK       0x7064#  define FIFOSTATUS_FULL_EMPTY         BIT(7)65 66#define	INDEXREG	0x02 /* R/W */67#define	DATAREG		0x03 /* R/W */68#define	FIFODATA	0x04 /* R/W */69#define	FIFODATA1	0x05 /* R/W */70#define	FIFODATA2	0x06 /* R/W */71#define	FIFODATA3	0x07 /* R/W */72 73/*====================================================================74 * indexed register75 ====================================================================*/76#define EXTBUSCTRL	0x10 /* R/W,deleted */77 78#define CLOCKDIV	0x11 /* R/W */79#  define CLOCK_40M 0x0280#  define CLOCK_20M 0x0181#  define FAST_20   BIT(2)82 83#define TERMPWRCTRL	0x13 /* R/W */84#  define POWER_ON BIT(0)85 86#define SCSIIRQMODE	0x15 /* R/W */87#  define SCSI_PHASE_CHANGE_EI BIT(0)88#  define RESELECT_EI          BIT(4)89#  define FIFO_IRQ_EI          BIT(5)90#  define SCSI_RESET_IRQ_EI    BIT(6)91 92#define IRQPHASESENCE	0x16 /* R */93#  define LATCHED_MSG      BIT(0)94#  define LATCHED_IO       BIT(1)95#  define LATCHED_CD       BIT(2)96#  define LATCHED_BUS_FREE BIT(3)97#  define PHASE_CHANGE_IRQ BIT(4)98#  define RESELECT_IRQ     BIT(5)99#  define FIFO_IRQ         BIT(6)100#  define SCSI_RESET_IRQ   BIT(7)101 102#define TIMERCOUNT	0x17 /* R/W */103 104#define SCSIBUSCTRL	0x18 /* R/W */105#  define SCSI_SEL         BIT(0)106#  define SCSI_RST         BIT(1)107#  define SCSI_DATAOUT_ENB BIT(2)108#  define SCSI_ATN         BIT(3)109#  define SCSI_ACK         BIT(4)110#  define SCSI_BSY         BIT(5)111#  define AUTODIRECTION    BIT(6)112#  define ACKENB           BIT(7)113 114#define SCSIBUSMON	0x19 /* R */115 116#define SETARBIT	0x1A /* W */117#  define ARBIT_GO         BIT(0)118#  define ARBIT_FLAG_CLEAR BIT(1)119 120#define ARBITSTATUS	0x1A /* R */121/*#  define ARBIT_GO        BIT(0)*/122#  define ARBIT_WIN        BIT(1)123#  define ARBIT_FAIL       BIT(2)124#  define RESELECT_FLAG    BIT(3)125 126#define PARITYCTRL	0x1B  /* W */127#define PARITYSTATUS	0x1B  /* R */128 129#define COMMANDCTRL	0x1C  /* W */130#  define CLEAR_COMMAND_POINTER BIT(0)131#  define AUTO_COMMAND_GO       BIT(1)132 133#define RESELECTID	0x1C  /* R   */134#define COMMANDDATA	0x1D  /* R/W */135 136#define POINTERCLR	0x1E  /*   W */137#  define POINTER_CLEAR      BIT(0)138#  define ACK_COUNTER_CLEAR  BIT(1)139#  define REQ_COUNTER_CLEAR  BIT(2)140#  define HOST_COUNTER_CLEAR BIT(3)141#  define READ_SOURCE        (BIT(4) | BIT(5))142#    define ACK_COUNTER        (0)143#    define REQ_COUNTER        (BIT(4))144#    define HOST_COUNTER       (BIT(5))145 146#define TRANSFERCOUNT	0x1E  /* R   */147 148#define TRANSFERMODE	0x20  /* R/W */149#  define MODE_MEM8   BIT(0)150#  define MODE_MEM32  BIT(1)151#  define MODE_ADR24  BIT(2)152#  define MODE_ADR32  BIT(3)153#  define MODE_IO8    BIT(4)154#  define MODE_IO32   BIT(5)155#  define TRANSFER_GO BIT(6)156#  define BRAIND      BIT(7)157 158#define SYNCREG		0x21 /* R/W */159#  define SYNCREG_OFFSET_MASK  0x0f160#  define SYNCREG_PERIOD_MASK  0xf0161#  define SYNCREG_PERIOD_SHIFT 4162 163#define SCSIDATALATCH	0x22 /*   W */164#define SCSIDATAIN	0x22 /* R   */165#define SCSIDATAWITHACK	0x23 /* R/W */166#define SCAMCONTROL	0x24 /*   W */167#define SCAMSTATUS	0x24 /* R   */168#define SCAMDATA	0x25 /* R/W */169 170#define OTHERCONTROL	0x26 /* R/W */171#  define TPL_ROM_WRITE_EN BIT(0)172#  define TPWR_OUT         BIT(1)173#  define TPWR_SENSE       BIT(2)174#  define RA8_CONTROL      BIT(3)175 176#define ACKWIDTH	0x27 /* R/W */177#define CLRTESTPNT	0x28 /*   W */178#define ACKCNTLD	0x29 /*   W */179#define REQCNTLD	0x2A /*   W */180#define HSTCNTLD	0x2B /*   W */181#define CHECKSUM	0x2C /* R/W */182 183/************************************************************************184 * Input status bit definitions.185 ************************************************************************/186#define S_MESSAGE	BIT(0)    /* Message line from SCSI bus      */187#define S_IO		BIT(1)    /* Input/Output line from SCSI bus */188#define S_CD		BIT(2)    /* Command/Data line from SCSI bus */189#define S_BUSY		BIT(3)    /* Busy line from SCSI bus         */190#define S_ACK		BIT(4)    /* Acknowledge line from SCSI bus  */191#define S_REQUEST	BIT(5)    /* Request line from SCSI bus      */192#define S_SELECT	BIT(6)	  /*                                 */193#define S_ATN		BIT(7)	  /*                                 */194 195/***********************************************************************196 * Useful Bus Monitor status combinations.197 ***********************************************************************/198#define BUSMON_SEL         S_SELECT199#define BUSMON_BSY         S_BUSY200#define BUSMON_REQ         S_REQUEST201#define BUSMON_IO          S_IO202#define BUSMON_ACK         S_ACK203#define BUSMON_BUS_FREE    0204#define BUSMON_COMMAND     ( S_BUSY | S_CD |                    S_REQUEST )205#define BUSMON_MESSAGE_IN  ( S_BUSY | S_CD | S_IO | S_MESSAGE | S_REQUEST )206#define BUSMON_MESSAGE_OUT ( S_BUSY | S_CD |        S_MESSAGE | S_REQUEST )207#define BUSMON_DATA_IN     ( S_BUSY |        S_IO |             S_REQUEST )208#define BUSMON_DATA_OUT    ( S_BUSY |                           S_REQUEST )209#define BUSMON_STATUS      ( S_BUSY | S_CD | S_IO |             S_REQUEST )210#define BUSMON_SELECT      (                 S_IO |                        S_SELECT )211#define BUSMON_RESELECT    (                 S_IO |                        S_SELECT )212#define BUSMON_PHASE_MASK  (          S_CD | S_IO | S_MESSAGE |            S_SELECT )213 214#define BUSPHASE_SELECT      ( BUSMON_SELECT      & BUSMON_PHASE_MASK )215#define BUSPHASE_COMMAND     ( BUSMON_COMMAND     & BUSMON_PHASE_MASK )216#define BUSPHASE_MESSAGE_IN  ( BUSMON_MESSAGE_IN  & BUSMON_PHASE_MASK )217#define BUSPHASE_MESSAGE_OUT ( BUSMON_MESSAGE_OUT & BUSMON_PHASE_MASK )218#define BUSPHASE_DATA_IN     ( BUSMON_DATA_IN     & BUSMON_PHASE_MASK )219#define BUSPHASE_DATA_OUT    ( BUSMON_DATA_OUT    & BUSMON_PHASE_MASK )220#define BUSPHASE_STATUS      ( BUSMON_STATUS      & BUSMON_PHASE_MASK )221 222/*====================================================================*/223 224typedef struct scsi_info_t {225	struct pcmcia_device	*p_dev;226	struct Scsi_Host      *host;227	int                    stop;228} scsi_info_t;229 230 231/* synchronous transfer negotiation data */232typedef struct _sync_data {233	unsigned int SyncNegotiation;234#define SYNC_NOT_YET 0235#define SYNC_OK      1236#define SYNC_NG      2237 238	unsigned int  SyncPeriod;239	unsigned int  SyncOffset;240	unsigned char SyncRegister;241	unsigned char AckWidth;242} sync_data;243 244typedef struct _nsp_hw_data {245	unsigned int  BaseAddress;246	unsigned int  NumAddress;247	unsigned int  IrqNumber;248 249	unsigned long MmioAddress;250#define NSP_MMIO_OFFSET 0x0800251	unsigned long MmioLength;252 253	unsigned char ScsiClockDiv;254 255	unsigned char TransferMode;256 257	int           TimerCount;258	int           SelectionTimeOut;259	struct scsi_cmnd *CurrentSC;260	//int           CurrnetTarget;261 262	int           FifoCount;263 264#define MSGBUF_SIZE 20265	unsigned char MsgBuffer[MSGBUF_SIZE];266	int MsgLen;267 268#define N_TARGET 8269	sync_data     Sync[N_TARGET];270 271	char nspinfo[110];     /* description */272	spinlock_t Lock;273 274	scsi_info_t   *ScsiInfo; /* attach <-> detect glue */275 276 277#ifdef NSP_DEBUG278	int CmdId; /* Accepted command serial number.279		      Used for debugging.             */280#endif281} nsp_hw_data;282 283/****************************************************************************284 *285 */286 287/* Card service functions */288static void        nsp_cs_detach (struct pcmcia_device *p_dev);289static void        nsp_cs_release(struct pcmcia_device *link);290static int        nsp_cs_config (struct pcmcia_device *link);291 292/* Linux SCSI subsystem specific functions */293static struct Scsi_Host *nsp_detect     (struct scsi_host_template *sht);294static const  char      *nsp_info       (struct Scsi_Host *shpnt);295static        int        nsp_show_info  (struct seq_file *m,296	                                 struct Scsi_Host *host);297static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt);298 299/* Error handler */300/*static int nsp_eh_abort       (struct scsi_cmnd *SCpnt);*/301/*static int nsp_eh_device_reset(struct scsi_cmnd *SCpnt);*/302static int nsp_eh_bus_reset    (struct scsi_cmnd *SCpnt);303static int nsp_eh_host_reset   (struct scsi_cmnd *SCpnt);304static int nsp_bus_reset       (nsp_hw_data *data);305 306/* */307static void nsphw_init           (nsp_hw_data *data);308static bool nsphw_start_selection(struct scsi_cmnd *SCpnt);309static void nsp_start_timer      (struct scsi_cmnd *SCpnt, int time);310static int  nsp_fifo_count       (struct scsi_cmnd *SCpnt);311static void nsp_pio_read         (struct scsi_cmnd *SCpnt);312static void nsp_pio_write        (struct scsi_cmnd *SCpnt);313static int  nsp_nexus            (struct scsi_cmnd *SCpnt);314static void nsp_scsi_done        (struct scsi_cmnd *SCpnt);315static int  nsp_analyze_sdtr     (struct scsi_cmnd *SCpnt);316static int  nsp_negate_signal    (struct scsi_cmnd *SCpnt,317				  unsigned char mask, char *str);318static int  nsp_expect_signal    (struct scsi_cmnd *SCpnt,319				  unsigned char current_phase,320				  unsigned char  mask);321static int  nsp_xfer             (struct scsi_cmnd *SCpnt, int phase);322static int  nsp_dataphase_bypass (struct scsi_cmnd *SCpnt);323static void nsp_reselected       (struct scsi_cmnd *SCpnt);324static struct Scsi_Host *nsp_detect(struct scsi_host_template *sht);325 326/* Interrupt handler */327//static irqreturn_t nspintr(int irq, void *dev_id);328 329/* Debug */330#ifdef NSP_DEBUG331static void show_command (struct scsi_cmnd *SCpnt);332static void show_phase   (struct scsi_cmnd *SCpnt);333static void show_busphase(unsigned char stat);334static void show_message (nsp_hw_data *data);335#else336# define show_command(ptr)   /* */337# define show_phase(SCpnt)   /* */338# define show_busphase(stat) /* */339# define show_message(data)  /* */340#endif341 342/*343 * SCSI phase344 */345enum _scsi_phase {346	PH_UNDETERMINED ,347	PH_ARBSTART     ,348	PH_SELSTART     ,349	PH_SELECTED     ,350	PH_COMMAND      ,351	PH_DATA         ,352	PH_STATUS       ,353	PH_MSG_IN       ,354	PH_MSG_OUT      ,355	PH_DISCONNECT   ,356	PH_RESELECT     ,357	PH_ABORT        ,358	PH_RESET359};360 361enum _data_in_out {362	IO_UNKNOWN,363	IO_IN,364	IO_OUT365};366 367enum _burst_mode {368	BURST_IO8   = 0,369	BURST_IO32  = 1,370	BURST_MEM32 = 2,371};372 373/* scatter-gather table */374#define BUFFER_ADDR(SCpnt) ((char *)(sg_virt(nsp_priv(SCpnt)->buffer)))375 376#endif  /*__nsp_cs__*/377/* end */378