1/*=======================================================/ 2 Header file for nsp_cs.c 3 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 of 9 the GNU General Public License. 10 11=========================================================*/ 12 13/* $Id: nsp_cs.h,v 1.1.1.1 2008/10/15 03:26:55 james26_jang Exp $ */ 14 15#ifndef __nsp_cs__ 16#define __nsp_cs__ 17 18/* for debugging */ 19/*#define PCMCIA_DEBUG 9*/ 20 21/* 22#define static 23#define inline 24*/ 25 26/************************************ 27 * Some useful macros... 28 */ 29#define Number(arr) ((int) (sizeof(arr) / sizeof(arr[0]))) 30#define BIT(x) (1<<(x)) 31#define MIN(a,b) ((a) > (b) ? (b) : (a)) 32 33/* SCSI initiator must be 7 */ 34#define SCSI_INITIATOR_ID 7 35 36#define NSP_SELTIMEOUT 200 37 38/* base register */ 39#define IRQCONTROL 0x00 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 0xff 45# define IRQCONTROL_ALLCLEAR 0x0f 46# define IRQCONTROL_IRQDISABLE 0xf0 47 48#define IRQSTATUS 0x00 49# define IRQSTATUS_SCSI BIT(0) 50# define IRQSTATUS_TIMER BIT(2) 51# define IRQSTATUS_FIFO BIT(3) 52# define IRQSTATUS_MASK 0x0f 53 54#define IFSELECT 0x01 55# define IF_IFSEL BIT(0) 56# define IF_REGSEL BIT(2) 57 58#define FIFOSTATUS 0x01 59# define FIFOSTATUS_CHIP_REVISION 0x0f 60# define FIFOSTATUS_CHIP_ID 0x70 61# define FIFOSTATUS_FULL_EMPTY 0x80 62 63#define INDEXREG 0x02 64#define DATAREG 0x03 65#define FIFODATA 0x04 66#define FIFODATA1 0x05 67#define FIFODATA2 0x06 68#define FIFODATA3 0x07 69 70/* indexed register */ 71#define EXTBUSCTRL 0x10 72 73#define CLOCKDIV 0x11 74# define CLOCK_40M 0x02 75# define CLOCK_20M 0x01 76 77#define TERMPWRCTRL 0x13 78# define POWER_ON BIT(0) 79 80#define SCSIIRQMODE 0x15 81# define SCSI_PHASE_CHANGE_EI BIT(0) 82# define RESELECT_EI BIT(4) 83# define FIFO_IRQ_EI BIT(5) 84# define SCSI_RESET_IRQ_EI BIT(6) 85 86#define IRQPHASESENCE 0x16 87# define LATCHED_MSG BIT(0) 88# define LATCHED_IO BIT(1) 89# define LATCHED_CD BIT(2) 90# define LATCHED_BUS_FREE BIT(3) 91# define PHASE_CHANGE_IRQ BIT(4) 92# define RESELECT_IRQ BIT(5) 93# define FIFO_IRQ BIT(6) 94# define SCSI_RESET_IRQ BIT(7) 95 96#define TIMERCOUNT 0x17 97 98#define SCSIBUSCTRL 0x18 99# define SCSI_SEL BIT(0) 100# define SCSI_RST BIT(1) 101# define SCSI_DATAOUT_ENB BIT(2) 102# define SCSI_ATN BIT(3) 103# define SCSI_ACK BIT(4) 104# define SCSI_BSY BIT(5) 105# define AUTODIRECTION BIT(6) 106# define ACKENB BIT(7) 107 108#define SCSIBUSMON 0x19 109 110#define SETARBIT 0x1A 111# define ARBIT_GO BIT(0) 112# define ARBIT_FLAG_CLEAR BIT(1) 113 114#define ARBITSTATUS 0x1A 115/*# define ARBIT_GO BIT(0)*/ 116# define ARBIT_WIN BIT(1) 117# define ARBIT_FAIL BIT(2) 118# define RESELECT_FLAG BIT(3) 119 120#define PARITYCTRL 0x1B /* W */ 121#define PARITYSTATUS 0x1B /* R */ 122 123#define COMMANDCTRL 0x1C /* W */ 124# define CLEAR_COMMAND_POINTER BIT(0) 125# define AUTO_COMMAND_GO BIT(1) 126 127#define RESELECTID 0x1C /* R */ 128#define COMMANDDATA 0x1D 129 130#define POINTERCLR 0x1E /* W */ 131# define POINTER_CLEAR BIT(0) 132# define ACK_COUNTER_CLEAR BIT(1) 133# define REQ_COUNTER_CLEAR BIT(2) 134# define HOST_COUNTER_CLEAR BIT(3) 135# define READ_SOURCE 0x30 136 137#define TRANSFERCOUNT 0x1E /* R */ 138 139#define TRANSFERMODE 0x20 140# define MODE_MEM8 BIT(0) 141# define MODE_MEM32 BIT(1) 142# define MODE_ADR24 BIT(2) 143# define MODE_ADR32 BIT(3) 144# define MODE_IO8 BIT(4) 145# define MODE_IO32 BIT(5) 146# define TRANSFER_GO BIT(6) 147# define BRAIND BIT(7) 148 149#define SYNCREG 0x21 150# define SYNCREG_OFFSET_MASK 0x0f 151# define SYNCREG_PERIOD_MASK 0xf0 152# define SYNCREG_PERIOD_SHIFT 4 153 154#define SCSIDATALATCH 0x22 155#define SCSIDATAIN 0x22 156#define SCSIDATAWITHACK 0x23 157#define SCAMCONTROL 0x24 158#define SCAMSTATUS 0x24 159#define SCAMDATA 0x25 160 161#define OTHERCONTROL 0x26 162# define TPL_ROM_WRITE_EN BIT(0) 163# define TPWR_OUT BIT(1) 164# define TPWR_SENSE BIT(2) 165# define RA8_CONTROL BIT(3) 166 167#define ACKWIDTH 0x27 168#define CLRTESTPNT 0x28 169#define ACKCNTLD 0x29 170#define REQCNTLD 0x2A 171#define HSTCNTLD 0x2B 172#define CHECKSUM 0x2C 173 174/* 175 * Input status bit definitions. 176 */ 177#define S_ATN 0x80 /**/ 178#define S_SELECT 0x40 /**/ 179#define S_REQUEST 0x20 /* Request line from SCSI bus*/ 180#define S_ACK 0x10 /* Acknowlege line from SCSI bus*/ 181#define S_BUSY 0x08 /* Busy line from SCSI bus*/ 182#define S_CD 0x04 /* Command/Data line from SCSI bus*/ 183#define S_IO 0x02 /* Input/Output line from SCSI bus*/ 184#define S_MESSAGE 0x01 /* Message line from SCSI bus*/ 185 186/* 187 * Useful Bus Monitor status combinations. 188 */ 189#define BUSMON_SEL S_SELECT 190#define BUSMON_BSY S_BUSY 191#define BUSMON_REQ S_REQUEST 192#define BUSMON_IO S_IO 193#define BUSMON_ACK S_ACK 194#define BUSMON_BUS_FREE 0 195#define BUSMON_COMMAND ( S_BUSY | S_CD | S_REQUEST ) 196#define BUSMON_MESSAGE_IN ( S_BUSY | S_MESSAGE | S_IO | S_CD | S_REQUEST ) 197#define BUSMON_MESSAGE_OUT ( S_BUSY | S_MESSAGE | S_CD | S_REQUEST ) 198#define BUSMON_DATA_IN ( S_BUSY | S_IO | S_REQUEST ) 199#define BUSMON_DATA_OUT ( S_BUSY | S_REQUEST ) 200#define BUSMON_STATUS ( S_BUSY | S_IO | S_CD | S_REQUEST ) 201#define BUSMON_RESELECT ( S_SELECT | S_IO ) 202#define BUSMON_PHASE_MASK ( S_SELECT | S_CD | S_MESSAGE | S_IO ) 203 204#define BUSPHASE_COMMAND ( BUSMON_COMMAND & BUSMON_PHASE_MASK ) 205#define BUSPHASE_MESSAGE_IN ( BUSMON_MESSAGE_IN & BUSMON_PHASE_MASK ) 206#define BUSPHASE_MESSAGE_OUT ( BUSMON_MESSAGE_OUT & BUSMON_PHASE_MASK ) 207#define BUSPHASE_DATA_IN ( BUSMON_DATA_IN & BUSMON_PHASE_MASK ) 208#define BUSPHASE_DATA_OUT ( BUSMON_DATA_OUT & BUSMON_PHASE_MASK ) 209#define BUSPHASE_STATUS ( BUSMON_STATUS & BUSMON_PHASE_MASK ) 210#define BUSPHASE_SELECT ( S_SELECT | S_IO ) 211 212/* synchronous transfer negotiation data */ 213typedef struct _sync_data { 214 unsigned int SyncNegotiation; 215#define SYNC_NOT_YET 0 216#define SYNC_OK 1 217#define SYNC_NG 2 218 219 unsigned int SyncPeriod; 220 unsigned int SyncOffset; 221 unsigned char SyncRegister; 222 unsigned char AckWidth; 223} sync_data; 224 225typedef struct _nsp_data { 226 unsigned int BaseAddress; 227 unsigned int NumAddress; 228 unsigned int IrqNumber; 229 230 unsigned char ScsiClockDiv; 231 232 unsigned char TransferMode; 233 234 int TimerCount; 235 int SelectionTimeOut; 236 Scsi_Cmnd *CurrentSC; 237 238 int FifoCount; 239#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)) 240 int Residual; 241#define RESID data->Residual 242#else 243#define RESID SCpnt->resid 244#endif 245 246#define MSGBUF_SIZE 20 247 unsigned char MsgBuffer[MSGBUF_SIZE]; 248 int MsgLen; 249 250#define N_TARGET 8 251#define N_LUN 8 252 sync_data Sync[N_TARGET][N_LUN]; 253} nsp_hw_data; 254 255 256static void nsp_cs_release(u_long arg); 257static int nsp_cs_event(event_t event, int priority, event_callback_args_t *args); 258static dev_link_t *nsp_cs_attach(void); 259static void nsp_cs_detach(dev_link_t *); 260 261static unsigned int nsphw_start_selection(Scsi_Cmnd *SCpnt, nsp_hw_data *data); 262static void nsp_start_timer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int time); 263 264static int nsp_detect(Scsi_Host_Template * ); 265static int nsp_release(struct Scsi_Host *shpnt); 266static const char * nsp_info(struct Scsi_Host *shpnt); 267static int nsp_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); 268 269static int nsp_abort(Scsi_Cmnd *); 270static int nsp_reset(Scsi_Cmnd *, unsigned int); 271 272static int nsp_eh_abort(Scsi_Cmnd * SCpnt); 273static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt); 274static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt); 275static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt); 276 277static int nsp_fifo_count(Scsi_Cmnd *SCpnt); 278static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data); 279static int nsp_nexus(Scsi_Cmnd *SCpnt, nsp_hw_data *data); 280 281#ifdef PCMCIA_DEBUG 282static void show_command(Scsi_Cmnd *ptr); 283static void show_phase(Scsi_Cmnd *SCpnt); 284static void show_busphase(unsigned char stat); 285static void show_message(nsp_hw_data *data); 286#else 287# define show_command(ptr) /* */ 288# define show_phase(SCpnt) /* */ 289# define show_busphase(stat) /* */ 290# define show_message(data) /* */ 291#endif 292 293/* 294 * SCSI phase 295 */ 296enum _scsi_phase { 297 PH_UNDETERMINED, 298 PH_ARBSTART, 299 PH_SELSTART, 300 PH_SELECTED, 301 PH_COMMAND, 302 PH_DATA, 303 PH_STATUS, 304 PH_MSG_IN, 305 PH_MSG_OUT, 306 PH_DISCONNECT, 307 PH_RESELECT 308}; 309 310enum _data_in_out { 311 IO_UNKNOWN, 312 IO_IN, 313 IO_OUT 314}; 315 316 317/* SCSI messaage */ 318#define MSG_COMMAND_COMPLETE 0x00 319#define MSG_EXTENDED 0x01 320#define MSG_NO_OPERATION 0x08 321 322#define MSG_EXT_SDTR 0x01 323 324#endif /*__nsp_cs__*/ 325