18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* esp_scsi.h: Defines and structures for the ESP driver.
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef _ESP_SCSI_H
88c2ecf20Sopenharmony_ci#define _ESP_SCSI_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci					/* Access    Description      Offset */
118c2ecf20Sopenharmony_ci#define ESP_TCLOW	0x00UL		/* rw  Low bits transfer count 0x00  */
128c2ecf20Sopenharmony_ci#define ESP_TCMED	0x01UL		/* rw  Mid bits transfer count 0x04  */
138c2ecf20Sopenharmony_ci#define ESP_FDATA	0x02UL		/* rw  FIFO data bits          0x08  */
148c2ecf20Sopenharmony_ci#define ESP_CMD		0x03UL		/* rw  SCSI command bits       0x0c  */
158c2ecf20Sopenharmony_ci#define ESP_STATUS	0x04UL		/* ro  ESP status register     0x10  */
168c2ecf20Sopenharmony_ci#define ESP_BUSID	ESP_STATUS	/* wo  BusID for sel/resel     0x10  */
178c2ecf20Sopenharmony_ci#define ESP_INTRPT	0x05UL		/* ro  Kind of interrupt       0x14  */
188c2ecf20Sopenharmony_ci#define ESP_TIMEO	ESP_INTRPT	/* wo  Timeout for sel/resel   0x14  */
198c2ecf20Sopenharmony_ci#define ESP_SSTEP	0x06UL		/* ro  Sequence step register  0x18  */
208c2ecf20Sopenharmony_ci#define ESP_STP		ESP_SSTEP	/* wo  Transfer period/sync    0x18  */
218c2ecf20Sopenharmony_ci#define ESP_FFLAGS	0x07UL		/* ro  Bits current FIFO info  0x1c  */
228c2ecf20Sopenharmony_ci#define ESP_SOFF	ESP_FFLAGS	/* wo  Sync offset             0x1c  */
238c2ecf20Sopenharmony_ci#define ESP_CFG1	0x08UL		/* rw  First cfg register      0x20  */
248c2ecf20Sopenharmony_ci#define ESP_CFACT	0x09UL		/* wo  Clock conv factor       0x24  */
258c2ecf20Sopenharmony_ci#define ESP_STATUS2	ESP_CFACT	/* ro  HME status2 register    0x24  */
268c2ecf20Sopenharmony_ci#define ESP_CTEST	0x0aUL		/* wo  Chip test register      0x28  */
278c2ecf20Sopenharmony_ci#define ESP_CFG2	0x0bUL		/* rw  Second cfg register     0x2c  */
288c2ecf20Sopenharmony_ci#define ESP_CFG3	0x0cUL		/* rw  Third cfg register      0x30  */
298c2ecf20Sopenharmony_ci#define ESP_CFG4	0x0dUL		/* rw  Fourth cfg register     0x34  */
308c2ecf20Sopenharmony_ci#define ESP_TCHI	0x0eUL		/* rw  High bits transf count  0x38  */
318c2ecf20Sopenharmony_ci#define ESP_UID		ESP_TCHI	/* ro  Unique ID code          0x38  */
328c2ecf20Sopenharmony_ci#define FAS_RLO		ESP_TCHI	/* rw  HME extended counter    0x38  */
338c2ecf20Sopenharmony_ci#define ESP_FGRND	0x0fUL		/* rw  Data base for fifo      0x3c  */
348c2ecf20Sopenharmony_ci#define FAS_RHI		ESP_FGRND	/* rw  HME extended counter    0x3c  */
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#define SBUS_ESP_REG_SIZE	0x40UL
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci/* Bitfield meanings for the above registers. */
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci/* ESP config reg 1, read-write, found on all ESP chips */
418c2ecf20Sopenharmony_ci#define ESP_CONFIG1_ID        0x07      /* My BUS ID bits */
428c2ecf20Sopenharmony_ci#define ESP_CONFIG1_CHTEST    0x08      /* Enable ESP chip tests */
438c2ecf20Sopenharmony_ci#define ESP_CONFIG1_PENABLE   0x10      /* Enable parity checks */
448c2ecf20Sopenharmony_ci#define ESP_CONFIG1_PARTEST   0x20      /* Parity test mode enabled? */
458c2ecf20Sopenharmony_ci#define ESP_CONFIG1_SRRDISAB  0x40      /* Disable SCSI reset reports */
468c2ecf20Sopenharmony_ci#define ESP_CONFIG1_SLCABLE   0x80      /* Enable slow cable mode */
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci/* ESP config reg 2, read-write, found only on esp100a+esp200+esp236 chips */
498c2ecf20Sopenharmony_ci#define ESP_CONFIG2_DMAPARITY 0x01      /* enable DMA Parity (200,236) */
508c2ecf20Sopenharmony_ci#define ESP_CONFIG2_REGPARITY 0x02      /* enable reg Parity (200,236) */
518c2ecf20Sopenharmony_ci#define ESP_CONFIG2_BADPARITY 0x04      /* Bad parity target abort  */
528c2ecf20Sopenharmony_ci#define ESP_CONFIG2_SCSI2ENAB 0x08      /* Enable SCSI-2 features (tgtmode) */
538c2ecf20Sopenharmony_ci#define ESP_CONFIG2_HI        0x10      /* High Impedance DREQ ???  */
548c2ecf20Sopenharmony_ci#define ESP_CONFIG2_HMEFENAB  0x10      /* HME features enable */
558c2ecf20Sopenharmony_ci#define ESP_CONFIG2_BCM       0x20      /* Enable byte-ctrl (236)   */
568c2ecf20Sopenharmony_ci#define ESP_CONFIG2_DISPINT   0x20      /* Disable pause irq (hme) */
578c2ecf20Sopenharmony_ci#define ESP_CONFIG2_FENAB     0x40      /* Enable features (fas100,216) */
588c2ecf20Sopenharmony_ci#define ESP_CONFIG2_SPL       0x40      /* Enable status-phase latch (236) */
598c2ecf20Sopenharmony_ci#define ESP_CONFIG2_MKDONE    0x40      /* HME magic feature */
608c2ecf20Sopenharmony_ci#define ESP_CONFIG2_HME32     0x80      /* HME 32 extended */
618c2ecf20Sopenharmony_ci#define ESP_CONFIG2_MAGIC     0xe0      /* Invalid bits... */
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci/* ESP config register 3 read-write, found only esp236+fas236+fas100a+hme chips */
648c2ecf20Sopenharmony_ci#define ESP_CONFIG3_FCLOCK    0x01     /* FAST SCSI clock rate (esp100a/hme) */
658c2ecf20Sopenharmony_ci#define ESP_CONFIG3_TEM       0x01     /* Enable thresh-8 mode (esp/fas236)  */
668c2ecf20Sopenharmony_ci#define ESP_CONFIG3_FAST      0x02     /* Enable FAST SCSI     (esp100a/hme) */
678c2ecf20Sopenharmony_ci#define ESP_CONFIG3_ADMA      0x02     /* Enable alternate-dma (esp/fas236)  */
688c2ecf20Sopenharmony_ci#define ESP_CONFIG3_TENB      0x04     /* group2 SCSI2 support (esp100a/hme) */
698c2ecf20Sopenharmony_ci#define ESP_CONFIG3_SRB       0x04     /* Save residual byte   (esp/fas236)  */
708c2ecf20Sopenharmony_ci#define ESP_CONFIG3_TMS       0x08     /* Three-byte msg's ok  (esp100a/hme) */
718c2ecf20Sopenharmony_ci#define ESP_CONFIG3_FCLK      0x08     /* Fast SCSI clock rate (esp/fas236)  */
728c2ecf20Sopenharmony_ci#define ESP_CONFIG3_IDMSG     0x10     /* ID message checking  (esp100a/hme) */
738c2ecf20Sopenharmony_ci#define ESP_CONFIG3_FSCSI     0x10     /* Enable FAST SCSI     (esp/fas236)  */
748c2ecf20Sopenharmony_ci#define ESP_CONFIG3_GTM       0x20     /* group2 SCSI2 support (esp/fas236)  */
758c2ecf20Sopenharmony_ci#define ESP_CONFIG3_IDBIT3    0x20     /* Bit 3 of HME SCSI-ID (hme)         */
768c2ecf20Sopenharmony_ci#define ESP_CONFIG3_TBMS      0x40     /* Three-byte msg's ok  (esp/fas236)  */
778c2ecf20Sopenharmony_ci#define ESP_CONFIG3_EWIDE     0x40     /* Enable Wide-SCSI     (hme)         */
788c2ecf20Sopenharmony_ci#define ESP_CONFIG3_IMS       0x80     /* ID msg chk'ng        (esp/fas236)  */
798c2ecf20Sopenharmony_ci#define ESP_CONFIG3_OBPUSH    0x80     /* Push odd-byte to dma (hme)         */
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci/* ESP config register 4 read-write */
828c2ecf20Sopenharmony_ci#define ESP_CONFIG4_BBTE      0x01     /* Back-to-back transfers     (fsc)   */
838c2ecf20Sopenharmony_ci#define ESP_CONGIG4_TEST      0x02     /* Transfer counter test mode (fsc)   */
848c2ecf20Sopenharmony_ci#define ESP_CONFIG4_RADE      0x04     /* Active negation   (am53c974/fsc)   */
858c2ecf20Sopenharmony_ci#define ESP_CONFIG4_RAE       0x08     /* Act. negation REQ/ACK (am53c974)   */
868c2ecf20Sopenharmony_ci#define ESP_CONFIG4_PWD       0x20     /* Reduced power feature (am53c974)   */
878c2ecf20Sopenharmony_ci#define ESP_CONFIG4_GE0       0x40     /* Glitch eater bit 0    (am53c974)   */
888c2ecf20Sopenharmony_ci#define ESP_CONFIG4_GE1       0x80     /* Glitch eater bit 1    (am53c974)   */
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ci#define ESP_CONFIG_GE_12NS    (0)
918c2ecf20Sopenharmony_ci#define ESP_CONFIG_GE_25NS    (ESP_CONFIG_GE1)
928c2ecf20Sopenharmony_ci#define ESP_CONFIG_GE_35NS    (ESP_CONFIG_GE0)
938c2ecf20Sopenharmony_ci#define ESP_CONFIG_GE_0NS     (ESP_CONFIG_GE0 | ESP_CONFIG_GE1)
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci/* ESP command register read-write */
968c2ecf20Sopenharmony_ci/* Group 1 commands:  These may be sent at any point in time to the ESP
978c2ecf20Sopenharmony_ci *                    chip.  None of them can generate interrupts 'cept
988c2ecf20Sopenharmony_ci *                    the "SCSI bus reset" command if you have not disabled
998c2ecf20Sopenharmony_ci *                    SCSI reset interrupts in the config1 ESP register.
1008c2ecf20Sopenharmony_ci */
1018c2ecf20Sopenharmony_ci#define ESP_CMD_NULL          0x00     /* Null command, ie. a nop */
1028c2ecf20Sopenharmony_ci#define ESP_CMD_FLUSH         0x01     /* FIFO Flush */
1038c2ecf20Sopenharmony_ci#define ESP_CMD_RC            0x02     /* Chip reset */
1048c2ecf20Sopenharmony_ci#define ESP_CMD_RS            0x03     /* SCSI bus reset */
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci/* Group 2 commands:  ESP must be an initiator and connected to a target
1078c2ecf20Sopenharmony_ci *                    for these commands to work.
1088c2ecf20Sopenharmony_ci */
1098c2ecf20Sopenharmony_ci#define ESP_CMD_TI            0x10     /* Transfer Information */
1108c2ecf20Sopenharmony_ci#define ESP_CMD_ICCSEQ        0x11     /* Initiator cmd complete sequence */
1118c2ecf20Sopenharmony_ci#define ESP_CMD_MOK           0x12     /* Message okie-dokie */
1128c2ecf20Sopenharmony_ci#define ESP_CMD_TPAD          0x18     /* Transfer Pad */
1138c2ecf20Sopenharmony_ci#define ESP_CMD_SATN          0x1a     /* Set ATN */
1148c2ecf20Sopenharmony_ci#define ESP_CMD_RATN          0x1b     /* De-assert ATN */
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci/* Group 3 commands:  ESP must be in the MSGOUT or MSGIN state and be connected
1178c2ecf20Sopenharmony_ci *                    to a target as the initiator for these commands to work.
1188c2ecf20Sopenharmony_ci */
1198c2ecf20Sopenharmony_ci#define ESP_CMD_SMSG          0x20     /* Send message */
1208c2ecf20Sopenharmony_ci#define ESP_CMD_SSTAT         0x21     /* Send status */
1218c2ecf20Sopenharmony_ci#define ESP_CMD_SDATA         0x22     /* Send data */
1228c2ecf20Sopenharmony_ci#define ESP_CMD_DSEQ          0x23     /* Discontinue Sequence */
1238c2ecf20Sopenharmony_ci#define ESP_CMD_TSEQ          0x24     /* Terminate Sequence */
1248c2ecf20Sopenharmony_ci#define ESP_CMD_TCCSEQ        0x25     /* Target cmd cmplt sequence */
1258c2ecf20Sopenharmony_ci#define ESP_CMD_DCNCT         0x27     /* Disconnect */
1268c2ecf20Sopenharmony_ci#define ESP_CMD_RMSG          0x28     /* Receive Message */
1278c2ecf20Sopenharmony_ci#define ESP_CMD_RCMD          0x29     /* Receive Command */
1288c2ecf20Sopenharmony_ci#define ESP_CMD_RDATA         0x2a     /* Receive Data */
1298c2ecf20Sopenharmony_ci#define ESP_CMD_RCSEQ         0x2b     /* Receive cmd sequence */
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci/* Group 4 commands:  The ESP must be in the disconnected state and must
1328c2ecf20Sopenharmony_ci *                    not be connected to any targets as initiator for
1338c2ecf20Sopenharmony_ci *                    these commands to work.
1348c2ecf20Sopenharmony_ci */
1358c2ecf20Sopenharmony_ci#define ESP_CMD_RSEL          0x40     /* Reselect */
1368c2ecf20Sopenharmony_ci#define ESP_CMD_SEL           0x41     /* Select w/o ATN */
1378c2ecf20Sopenharmony_ci#define ESP_CMD_SELA          0x42     /* Select w/ATN */
1388c2ecf20Sopenharmony_ci#define ESP_CMD_SELAS         0x43     /* Select w/ATN & STOP */
1398c2ecf20Sopenharmony_ci#define ESP_CMD_ESEL          0x44     /* Enable selection */
1408c2ecf20Sopenharmony_ci#define ESP_CMD_DSEL          0x45     /* Disable selections */
1418c2ecf20Sopenharmony_ci#define ESP_CMD_SA3           0x46     /* Select w/ATN3 */
1428c2ecf20Sopenharmony_ci#define ESP_CMD_RSEL3         0x47     /* Reselect3 */
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci/* This bit enables the ESP's DMA on the SBus */
1458c2ecf20Sopenharmony_ci#define ESP_CMD_DMA           0x80     /* Do DMA? */
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci/* ESP status register read-only */
1488c2ecf20Sopenharmony_ci#define ESP_STAT_PIO          0x01     /* IO phase bit */
1498c2ecf20Sopenharmony_ci#define ESP_STAT_PCD          0x02     /* CD phase bit */
1508c2ecf20Sopenharmony_ci#define ESP_STAT_PMSG         0x04     /* MSG phase bit */
1518c2ecf20Sopenharmony_ci#define ESP_STAT_PMASK        0x07     /* Mask of phase bits */
1528c2ecf20Sopenharmony_ci#define ESP_STAT_TDONE        0x08     /* Transfer Completed */
1538c2ecf20Sopenharmony_ci#define ESP_STAT_TCNT         0x10     /* Transfer Counter Is Zero */
1548c2ecf20Sopenharmony_ci#define ESP_STAT_PERR         0x20     /* Parity error */
1558c2ecf20Sopenharmony_ci#define ESP_STAT_SPAM         0x40     /* Real bad error */
1568c2ecf20Sopenharmony_ci/* This indicates the 'interrupt pending' condition on esp236, it is a reserved
1578c2ecf20Sopenharmony_ci * bit on other revs of the ESP.
1588c2ecf20Sopenharmony_ci */
1598c2ecf20Sopenharmony_ci#define ESP_STAT_INTR         0x80             /* Interrupt */
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci/* The status register can be masked with ESP_STAT_PMASK and compared
1628c2ecf20Sopenharmony_ci * with the following values to determine the current phase the ESP
1638c2ecf20Sopenharmony_ci * (at least thinks it) is in.  For our purposes we also add our own
1648c2ecf20Sopenharmony_ci * software 'done' bit for our phase management engine.
1658c2ecf20Sopenharmony_ci */
1668c2ecf20Sopenharmony_ci#define ESP_DOP   (0)                                       /* Data Out  */
1678c2ecf20Sopenharmony_ci#define ESP_DIP   (ESP_STAT_PIO)                            /* Data In   */
1688c2ecf20Sopenharmony_ci#define ESP_CMDP  (ESP_STAT_PCD)                            /* Command   */
1698c2ecf20Sopenharmony_ci#define ESP_STATP (ESP_STAT_PCD|ESP_STAT_PIO)               /* Status    */
1708c2ecf20Sopenharmony_ci#define ESP_MOP   (ESP_STAT_PMSG|ESP_STAT_PCD)              /* Message Out */
1718c2ecf20Sopenharmony_ci#define ESP_MIP   (ESP_STAT_PMSG|ESP_STAT_PCD|ESP_STAT_PIO) /* Message In */
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci/* HME only: status 2 register */
1748c2ecf20Sopenharmony_ci#define ESP_STAT2_SCHBIT      0x01 /* Upper bits 3-7 of sstep enabled */
1758c2ecf20Sopenharmony_ci#define ESP_STAT2_FFLAGS      0x02 /* The fifo flags are now latched */
1768c2ecf20Sopenharmony_ci#define ESP_STAT2_XCNT        0x04 /* The transfer counter is latched */
1778c2ecf20Sopenharmony_ci#define ESP_STAT2_CREGA       0x08 /* The command reg is active now */
1788c2ecf20Sopenharmony_ci#define ESP_STAT2_WIDE        0x10 /* Interface on this adapter is wide */
1798c2ecf20Sopenharmony_ci#define ESP_STAT2_F1BYTE      0x20 /* There is one byte at top of fifo */
1808c2ecf20Sopenharmony_ci#define ESP_STAT2_FMSB        0x40 /* Next byte in fifo is most significant */
1818c2ecf20Sopenharmony_ci#define ESP_STAT2_FEMPTY      0x80 /* FIFO is empty */
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_ci/* ESP interrupt register read-only */
1848c2ecf20Sopenharmony_ci#define ESP_INTR_S            0x01     /* Select w/o ATN */
1858c2ecf20Sopenharmony_ci#define ESP_INTR_SATN         0x02     /* Select w/ATN */
1868c2ecf20Sopenharmony_ci#define ESP_INTR_RSEL         0x04     /* Reselected */
1878c2ecf20Sopenharmony_ci#define ESP_INTR_FDONE        0x08     /* Function done */
1888c2ecf20Sopenharmony_ci#define ESP_INTR_BSERV        0x10     /* Bus service */
1898c2ecf20Sopenharmony_ci#define ESP_INTR_DC           0x20     /* Disconnect */
1908c2ecf20Sopenharmony_ci#define ESP_INTR_IC           0x40     /* Illegal command given */
1918c2ecf20Sopenharmony_ci#define ESP_INTR_SR           0x80     /* SCSI bus reset detected */
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci/* ESP sequence step register read-only */
1948c2ecf20Sopenharmony_ci#define ESP_STEP_VBITS        0x07     /* Valid bits */
1958c2ecf20Sopenharmony_ci#define ESP_STEP_ASEL         0x00     /* Selection&Arbitrate cmplt */
1968c2ecf20Sopenharmony_ci#define ESP_STEP_SID          0x01     /* One msg byte sent */
1978c2ecf20Sopenharmony_ci#define ESP_STEP_NCMD         0x02     /* Was not in command phase */
1988c2ecf20Sopenharmony_ci#define ESP_STEP_PPC          0x03     /* Early phase chg caused cmnd
1998c2ecf20Sopenharmony_ci                                        * bytes to be lost
2008c2ecf20Sopenharmony_ci                                        */
2018c2ecf20Sopenharmony_ci#define ESP_STEP_FINI4        0x04     /* Command was sent ok */
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci/* Ho hum, some ESP's set the step register to this as well... */
2048c2ecf20Sopenharmony_ci#define ESP_STEP_FINI5        0x05
2058c2ecf20Sopenharmony_ci#define ESP_STEP_FINI6        0x06
2068c2ecf20Sopenharmony_ci#define ESP_STEP_FINI7        0x07
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci/* ESP chip-test register read-write */
2098c2ecf20Sopenharmony_ci#define ESP_TEST_TARG         0x01     /* Target test mode */
2108c2ecf20Sopenharmony_ci#define ESP_TEST_INI          0x02     /* Initiator test mode */
2118c2ecf20Sopenharmony_ci#define ESP_TEST_TS           0x04     /* Tristate test mode */
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci/* ESP unique ID register read-only, found on fas236+fas100a only */
2148c2ecf20Sopenharmony_ci#define ESP_UID_FAM           0xf8     /* ESP family bitmask */
2158c2ecf20Sopenharmony_ci
2168c2ecf20Sopenharmony_ci#define ESP_FAMILY(uid) (((uid) & ESP_UID_FAM) >> 3)
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci/* Values for the ESP family bits */
2198c2ecf20Sopenharmony_ci#define ESP_UID_F100A         0x00     /* ESP FAS100A  */
2208c2ecf20Sopenharmony_ci#define ESP_UID_F236          0x02     /* ESP FAS236   */
2218c2ecf20Sopenharmony_ci#define ESP_UID_HME           0x0a     /* FAS HME      */
2228c2ecf20Sopenharmony_ci#define ESP_UID_FSC           0x14     /* NCR/Symbios Logic 53CF9x-2 */
2238c2ecf20Sopenharmony_ci
2248c2ecf20Sopenharmony_ci/* ESP fifo flags register read-only */
2258c2ecf20Sopenharmony_ci/* Note that the following implies a 16 byte FIFO on the ESP. */
2268c2ecf20Sopenharmony_ci#define ESP_FF_FBYTES         0x1f     /* Num bytes in FIFO */
2278c2ecf20Sopenharmony_ci#define ESP_FF_ONOTZERO       0x20     /* offset ctr not zero (esp100) */
2288c2ecf20Sopenharmony_ci#define ESP_FF_SSTEP          0xe0     /* Sequence step */
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ci/* ESP clock conversion factor register write-only */
2318c2ecf20Sopenharmony_ci#define ESP_CCF_F0            0x00     /* 35.01MHz - 40MHz */
2328c2ecf20Sopenharmony_ci#define ESP_CCF_NEVER         0x01     /* Set it to this and die */
2338c2ecf20Sopenharmony_ci#define ESP_CCF_F2            0x02     /* 10MHz */
2348c2ecf20Sopenharmony_ci#define ESP_CCF_F3            0x03     /* 10.01MHz - 15MHz */
2358c2ecf20Sopenharmony_ci#define ESP_CCF_F4            0x04     /* 15.01MHz - 20MHz */
2368c2ecf20Sopenharmony_ci#define ESP_CCF_F5            0x05     /* 20.01MHz - 25MHz */
2378c2ecf20Sopenharmony_ci#define ESP_CCF_F6            0x06     /* 25.01MHz - 30MHz */
2388c2ecf20Sopenharmony_ci#define ESP_CCF_F7            0x07     /* 30.01MHz - 35MHz */
2398c2ecf20Sopenharmony_ci
2408c2ecf20Sopenharmony_ci/* HME only... */
2418c2ecf20Sopenharmony_ci#define ESP_BUSID_RESELID     0x10
2428c2ecf20Sopenharmony_ci#define ESP_BUSID_CTR32BIT    0x40
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci#define ESP_BUS_TIMEOUT        250     /* In milli-seconds */
2458c2ecf20Sopenharmony_ci#define ESP_TIMEO_CONST       8192
2468c2ecf20Sopenharmony_ci#define ESP_NEG_DEFP(mhz, cfact) \
2478c2ecf20Sopenharmony_ci        ((ESP_BUS_TIMEOUT * ((mhz) / 1000)) / (8192 * (cfact)))
2488c2ecf20Sopenharmony_ci#define ESP_HZ_TO_CYCLE(hertz)  ((1000000000) / ((hertz) / 1000))
2498c2ecf20Sopenharmony_ci#define ESP_TICK(ccf, cycle)  ((7682 * (ccf) * (cycle) / 1000))
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ci/* For slow to medium speed input clock rates we shoot for 5mb/s, but for high
2528c2ecf20Sopenharmony_ci * input clock rates we try to do 10mb/s although I don't think a transfer can
2538c2ecf20Sopenharmony_ci * even run that fast with an ESP even with DMA2 scatter gather pipelining.
2548c2ecf20Sopenharmony_ci */
2558c2ecf20Sopenharmony_ci#define SYNC_DEFP_SLOW            0x32   /* 5mb/s  */
2568c2ecf20Sopenharmony_ci#define SYNC_DEFP_FAST            0x19   /* 10mb/s */
2578c2ecf20Sopenharmony_ci
2588c2ecf20Sopenharmony_cistruct esp_cmd_priv {
2598c2ecf20Sopenharmony_ci	int			num_sg;
2608c2ecf20Sopenharmony_ci	int			cur_residue;
2618c2ecf20Sopenharmony_ci	struct scatterlist	*prv_sg;
2628c2ecf20Sopenharmony_ci	struct scatterlist	*cur_sg;
2638c2ecf20Sopenharmony_ci	int			tot_residue;
2648c2ecf20Sopenharmony_ci};
2658c2ecf20Sopenharmony_ci#define ESP_CMD_PRIV(CMD)	((struct esp_cmd_priv *)(&(CMD)->SCp))
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci/* NOTE: this enum is ordered based on chip features! */
2688c2ecf20Sopenharmony_cienum esp_rev {
2698c2ecf20Sopenharmony_ci	ESP100,  /* NCR53C90 - very broken */
2708c2ecf20Sopenharmony_ci	ESP100A, /* NCR53C90A */
2718c2ecf20Sopenharmony_ci	ESP236,
2728c2ecf20Sopenharmony_ci	FAS236,
2738c2ecf20Sopenharmony_ci	PCSCSI,  /* AM53c974 */
2748c2ecf20Sopenharmony_ci	FSC,     /* NCR/Symbios Logic 53CF9x-2 */
2758c2ecf20Sopenharmony_ci	FAS100A,
2768c2ecf20Sopenharmony_ci	FAST,
2778c2ecf20Sopenharmony_ci	FASHME,
2788c2ecf20Sopenharmony_ci};
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_cistruct esp_cmd_entry {
2818c2ecf20Sopenharmony_ci	struct list_head	list;
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_ci	struct scsi_cmnd	*cmd;
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ci	unsigned int		saved_cur_residue;
2868c2ecf20Sopenharmony_ci	struct scatterlist	*saved_prv_sg;
2878c2ecf20Sopenharmony_ci	struct scatterlist	*saved_cur_sg;
2888c2ecf20Sopenharmony_ci	unsigned int		saved_tot_residue;
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci	u8			flags;
2918c2ecf20Sopenharmony_ci#define ESP_CMD_FLAG_WRITE	0x01 /* DMA is a write */
2928c2ecf20Sopenharmony_ci#define ESP_CMD_FLAG_AUTOSENSE	0x04 /* Doing automatic REQUEST_SENSE */
2938c2ecf20Sopenharmony_ci#define ESP_CMD_FLAG_RESIDUAL	0x08 /* AM53c974 BLAST residual */
2948c2ecf20Sopenharmony_ci
2958c2ecf20Sopenharmony_ci	u8			tag[2];
2968c2ecf20Sopenharmony_ci	u8			orig_tag[2];
2978c2ecf20Sopenharmony_ci
2988c2ecf20Sopenharmony_ci	u8			status;
2998c2ecf20Sopenharmony_ci	u8			message;
3008c2ecf20Sopenharmony_ci
3018c2ecf20Sopenharmony_ci	unsigned char		*sense_ptr;
3028c2ecf20Sopenharmony_ci	unsigned char		*saved_sense_ptr;
3038c2ecf20Sopenharmony_ci	dma_addr_t		sense_dma;
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_ci	struct completion	*eh_done;
3068c2ecf20Sopenharmony_ci};
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ci#define ESP_DEFAULT_TAGS	16
3098c2ecf20Sopenharmony_ci
3108c2ecf20Sopenharmony_ci#define ESP_MAX_TARGET		16
3118c2ecf20Sopenharmony_ci#define ESP_MAX_LUN		8
3128c2ecf20Sopenharmony_ci#define ESP_MAX_TAG		256
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_cistruct esp_lun_data {
3158c2ecf20Sopenharmony_ci	struct esp_cmd_entry	*non_tagged_cmd;
3168c2ecf20Sopenharmony_ci	int			num_tagged;
3178c2ecf20Sopenharmony_ci	int			hold;
3188c2ecf20Sopenharmony_ci	struct esp_cmd_entry	*tagged_cmds[ESP_MAX_TAG];
3198c2ecf20Sopenharmony_ci};
3208c2ecf20Sopenharmony_ci
3218c2ecf20Sopenharmony_cistruct esp_target_data {
3228c2ecf20Sopenharmony_ci	/* These are the ESP_STP, ESP_SOFF, and ESP_CFG3 register values which
3238c2ecf20Sopenharmony_ci	 * match the currently negotiated settings for this target.  The SCSI
3248c2ecf20Sopenharmony_ci	 * protocol values are maintained in spi_{offset,period,wide}(starget).
3258c2ecf20Sopenharmony_ci	 */
3268c2ecf20Sopenharmony_ci	u8			esp_period;
3278c2ecf20Sopenharmony_ci	u8			esp_offset;
3288c2ecf20Sopenharmony_ci	u8			esp_config3;
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci	u8			flags;
3318c2ecf20Sopenharmony_ci#define ESP_TGT_WIDE		0x01
3328c2ecf20Sopenharmony_ci#define ESP_TGT_DISCONNECT	0x02
3338c2ecf20Sopenharmony_ci#define ESP_TGT_NEGO_WIDE	0x04
3348c2ecf20Sopenharmony_ci#define ESP_TGT_NEGO_SYNC	0x08
3358c2ecf20Sopenharmony_ci#define ESP_TGT_CHECK_NEGO	0x40
3368c2ecf20Sopenharmony_ci#define ESP_TGT_BROKEN		0x80
3378c2ecf20Sopenharmony_ci
3388c2ecf20Sopenharmony_ci	/* When ESP_TGT_CHECK_NEGO is set, on the next scsi command to this
3398c2ecf20Sopenharmony_ci	 * device we will try to negotiate the following parameters.
3408c2ecf20Sopenharmony_ci	 */
3418c2ecf20Sopenharmony_ci	u8			nego_goal_period;
3428c2ecf20Sopenharmony_ci	u8			nego_goal_offset;
3438c2ecf20Sopenharmony_ci	u8			nego_goal_width;
3448c2ecf20Sopenharmony_ci	u8			nego_goal_tags;
3458c2ecf20Sopenharmony_ci
3468c2ecf20Sopenharmony_ci	struct scsi_target	*starget;
3478c2ecf20Sopenharmony_ci};
3488c2ecf20Sopenharmony_ci
3498c2ecf20Sopenharmony_cistruct esp_event_ent {
3508c2ecf20Sopenharmony_ci	u8			type;
3518c2ecf20Sopenharmony_ci#define ESP_EVENT_TYPE_EVENT	0x01
3528c2ecf20Sopenharmony_ci#define ESP_EVENT_TYPE_CMD	0x02
3538c2ecf20Sopenharmony_ci	u8			val;
3548c2ecf20Sopenharmony_ci
3558c2ecf20Sopenharmony_ci	u8			sreg;
3568c2ecf20Sopenharmony_ci	u8			seqreg;
3578c2ecf20Sopenharmony_ci	u8			sreg2;
3588c2ecf20Sopenharmony_ci	u8			ireg;
3598c2ecf20Sopenharmony_ci	u8			select_state;
3608c2ecf20Sopenharmony_ci	u8			event;
3618c2ecf20Sopenharmony_ci	u8			__pad;
3628c2ecf20Sopenharmony_ci};
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_cistruct esp;
3658c2ecf20Sopenharmony_cistruct esp_driver_ops {
3668c2ecf20Sopenharmony_ci	/* Read and write the ESP 8-bit registers.  On some
3678c2ecf20Sopenharmony_ci	 * applications of the ESP chip the registers are at 4-byte
3688c2ecf20Sopenharmony_ci	 * instead of 1-byte intervals.
3698c2ecf20Sopenharmony_ci	 */
3708c2ecf20Sopenharmony_ci	void (*esp_write8)(struct esp *esp, u8 val, unsigned long reg);
3718c2ecf20Sopenharmony_ci	u8 (*esp_read8)(struct esp *esp, unsigned long reg);
3728c2ecf20Sopenharmony_ci
3738c2ecf20Sopenharmony_ci	/* Return non-zero if there is an IRQ pending.  Usually this
3748c2ecf20Sopenharmony_ci	 * status bit lives in the DMA controller sitting in front of
3758c2ecf20Sopenharmony_ci	 * the ESP.  This has to be accurate or else the ESP interrupt
3768c2ecf20Sopenharmony_ci	 * handler will not run.
3778c2ecf20Sopenharmony_ci	 */
3788c2ecf20Sopenharmony_ci	int (*irq_pending)(struct esp *esp);
3798c2ecf20Sopenharmony_ci
3808c2ecf20Sopenharmony_ci	/* Return the maximum allowable size of a DMA transfer for a
3818c2ecf20Sopenharmony_ci	 * given buffer.
3828c2ecf20Sopenharmony_ci	 */
3838c2ecf20Sopenharmony_ci	u32 (*dma_length_limit)(struct esp *esp, u32 dma_addr,
3848c2ecf20Sopenharmony_ci				u32 dma_len);
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ci	/* Reset the DMA engine entirely.  On return, ESP interrupts
3878c2ecf20Sopenharmony_ci	 * should be enabled.  Often the interrupt enabling is
3888c2ecf20Sopenharmony_ci	 * controlled in the DMA engine.
3898c2ecf20Sopenharmony_ci	 */
3908c2ecf20Sopenharmony_ci	void (*reset_dma)(struct esp *esp);
3918c2ecf20Sopenharmony_ci
3928c2ecf20Sopenharmony_ci	/* Drain any pending DMA in the DMA engine after a transfer.
3938c2ecf20Sopenharmony_ci	 * This is for writes to memory.
3948c2ecf20Sopenharmony_ci	 */
3958c2ecf20Sopenharmony_ci	void (*dma_drain)(struct esp *esp);
3968c2ecf20Sopenharmony_ci
3978c2ecf20Sopenharmony_ci	/* Invalidate the DMA engine after a DMA transfer.  */
3988c2ecf20Sopenharmony_ci	void (*dma_invalidate)(struct esp *esp);
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci	/* Setup an ESP command that will use a DMA transfer.
4018c2ecf20Sopenharmony_ci	 * The 'esp_count' specifies what transfer length should be
4028c2ecf20Sopenharmony_ci	 * programmed into the ESP transfer counter registers, whereas
4038c2ecf20Sopenharmony_ci	 * the 'dma_count' is the length that should be programmed into
4048c2ecf20Sopenharmony_ci	 * the DMA controller.  Usually they are the same.  If 'write'
4058c2ecf20Sopenharmony_ci	 * is non-zero, this transfer is a write into memory.  'cmd'
4068c2ecf20Sopenharmony_ci	 * holds the ESP command that should be issued by calling
4078c2ecf20Sopenharmony_ci	 * scsi_esp_cmd() at the appropriate time while programming
4088c2ecf20Sopenharmony_ci	 * the DMA hardware.
4098c2ecf20Sopenharmony_ci	 */
4108c2ecf20Sopenharmony_ci	void (*send_dma_cmd)(struct esp *esp, u32 dma_addr, u32 esp_count,
4118c2ecf20Sopenharmony_ci			     u32 dma_count, int write, u8 cmd);
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci	/* Return non-zero if the DMA engine is reporting an error
4148c2ecf20Sopenharmony_ci	 * currently.
4158c2ecf20Sopenharmony_ci	 */
4168c2ecf20Sopenharmony_ci	int (*dma_error)(struct esp *esp);
4178c2ecf20Sopenharmony_ci};
4188c2ecf20Sopenharmony_ci
4198c2ecf20Sopenharmony_ci#define ESP_MAX_MSG_SZ		8
4208c2ecf20Sopenharmony_ci#define ESP_EVENT_LOG_SZ	32
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_ci#define ESP_QUICKIRQ_LIMIT	100
4238c2ecf20Sopenharmony_ci#define ESP_RESELECT_TAG_LIMIT	2500
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_cistruct esp {
4268c2ecf20Sopenharmony_ci	void __iomem		*regs;
4278c2ecf20Sopenharmony_ci	void __iomem		*dma_regs;
4288c2ecf20Sopenharmony_ci
4298c2ecf20Sopenharmony_ci	const struct esp_driver_ops *ops;
4308c2ecf20Sopenharmony_ci
4318c2ecf20Sopenharmony_ci	struct Scsi_Host	*host;
4328c2ecf20Sopenharmony_ci	struct device		*dev;
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci	struct esp_cmd_entry	*active_cmd;
4358c2ecf20Sopenharmony_ci
4368c2ecf20Sopenharmony_ci	struct list_head	queued_cmds;
4378c2ecf20Sopenharmony_ci	struct list_head	active_cmds;
4388c2ecf20Sopenharmony_ci
4398c2ecf20Sopenharmony_ci	u8			*command_block;
4408c2ecf20Sopenharmony_ci	dma_addr_t		command_block_dma;
4418c2ecf20Sopenharmony_ci
4428c2ecf20Sopenharmony_ci	unsigned int		data_dma_len;
4438c2ecf20Sopenharmony_ci
4448c2ecf20Sopenharmony_ci	/* The following are used to determine the cause of an IRQ. Upon every
4458c2ecf20Sopenharmony_ci	 * IRQ entry we synchronize these with the hardware registers.
4468c2ecf20Sopenharmony_ci	 */
4478c2ecf20Sopenharmony_ci	u8			sreg;
4488c2ecf20Sopenharmony_ci	u8			seqreg;
4498c2ecf20Sopenharmony_ci	u8			sreg2;
4508c2ecf20Sopenharmony_ci	u8			ireg;
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci	u32			prev_hme_dmacsr;
4538c2ecf20Sopenharmony_ci	u8			prev_soff;
4548c2ecf20Sopenharmony_ci	u8			prev_stp;
4558c2ecf20Sopenharmony_ci	u8			prev_cfg3;
4568c2ecf20Sopenharmony_ci	u8			num_tags;
4578c2ecf20Sopenharmony_ci
4588c2ecf20Sopenharmony_ci	struct list_head	esp_cmd_pool;
4598c2ecf20Sopenharmony_ci
4608c2ecf20Sopenharmony_ci	struct esp_target_data	target[ESP_MAX_TARGET];
4618c2ecf20Sopenharmony_ci
4628c2ecf20Sopenharmony_ci	int			fifo_cnt;
4638c2ecf20Sopenharmony_ci	u8			fifo[16];
4648c2ecf20Sopenharmony_ci
4658c2ecf20Sopenharmony_ci	struct esp_event_ent	esp_event_log[ESP_EVENT_LOG_SZ];
4668c2ecf20Sopenharmony_ci	int			esp_event_cur;
4678c2ecf20Sopenharmony_ci
4688c2ecf20Sopenharmony_ci	u8			msg_out[ESP_MAX_MSG_SZ];
4698c2ecf20Sopenharmony_ci	int			msg_out_len;
4708c2ecf20Sopenharmony_ci
4718c2ecf20Sopenharmony_ci	u8			msg_in[ESP_MAX_MSG_SZ];
4728c2ecf20Sopenharmony_ci	int			msg_in_len;
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_ci	u8			bursts;
4758c2ecf20Sopenharmony_ci	u8			config1;
4768c2ecf20Sopenharmony_ci	u8			config2;
4778c2ecf20Sopenharmony_ci	u8			config4;
4788c2ecf20Sopenharmony_ci
4798c2ecf20Sopenharmony_ci	u8			scsi_id;
4808c2ecf20Sopenharmony_ci	u32			scsi_id_mask;
4818c2ecf20Sopenharmony_ci
4828c2ecf20Sopenharmony_ci	enum esp_rev		rev;
4838c2ecf20Sopenharmony_ci
4848c2ecf20Sopenharmony_ci	u32			flags;
4858c2ecf20Sopenharmony_ci#define ESP_FLAG_DIFFERENTIAL	0x00000001
4868c2ecf20Sopenharmony_ci#define ESP_FLAG_RESETTING	0x00000002
4878c2ecf20Sopenharmony_ci#define ESP_FLAG_WIDE_CAPABLE	0x00000008
4888c2ecf20Sopenharmony_ci#define ESP_FLAG_QUICKIRQ_CHECK	0x00000010
4898c2ecf20Sopenharmony_ci#define ESP_FLAG_DISABLE_SYNC	0x00000020
4908c2ecf20Sopenharmony_ci#define ESP_FLAG_USE_FIFO	0x00000040
4918c2ecf20Sopenharmony_ci#define ESP_FLAG_NO_DMA_MAP	0x00000080
4928c2ecf20Sopenharmony_ci
4938c2ecf20Sopenharmony_ci	u8			select_state;
4948c2ecf20Sopenharmony_ci#define ESP_SELECT_NONE		0x00 /* Not selecting */
4958c2ecf20Sopenharmony_ci#define ESP_SELECT_BASIC	0x01 /* Select w/o MSGOUT phase */
4968c2ecf20Sopenharmony_ci#define ESP_SELECT_MSGOUT	0x02 /* Select with MSGOUT */
4978c2ecf20Sopenharmony_ci
4988c2ecf20Sopenharmony_ci	/* When we are not selecting, we are expecting an event.  */
4998c2ecf20Sopenharmony_ci	u8			event;
5008c2ecf20Sopenharmony_ci#define ESP_EVENT_NONE		0x00
5018c2ecf20Sopenharmony_ci#define ESP_EVENT_CMD_START	0x01
5028c2ecf20Sopenharmony_ci#define ESP_EVENT_CMD_DONE	0x02
5038c2ecf20Sopenharmony_ci#define ESP_EVENT_DATA_IN	0x03
5048c2ecf20Sopenharmony_ci#define ESP_EVENT_DATA_OUT	0x04
5058c2ecf20Sopenharmony_ci#define ESP_EVENT_DATA_DONE	0x05
5068c2ecf20Sopenharmony_ci#define ESP_EVENT_MSGIN		0x06
5078c2ecf20Sopenharmony_ci#define ESP_EVENT_MSGIN_MORE	0x07
5088c2ecf20Sopenharmony_ci#define ESP_EVENT_MSGIN_DONE	0x08
5098c2ecf20Sopenharmony_ci#define ESP_EVENT_MSGOUT	0x09
5108c2ecf20Sopenharmony_ci#define ESP_EVENT_MSGOUT_DONE	0x0a
5118c2ecf20Sopenharmony_ci#define ESP_EVENT_STATUS	0x0b
5128c2ecf20Sopenharmony_ci#define ESP_EVENT_FREE_BUS	0x0c
5138c2ecf20Sopenharmony_ci#define ESP_EVENT_CHECK_PHASE	0x0d
5148c2ecf20Sopenharmony_ci#define ESP_EVENT_RESET		0x10
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_ci	/* Probed in esp_get_clock_params() */
5178c2ecf20Sopenharmony_ci	u32			cfact;
5188c2ecf20Sopenharmony_ci	u32			cfreq;
5198c2ecf20Sopenharmony_ci	u32			ccycle;
5208c2ecf20Sopenharmony_ci	u32			ctick;
5218c2ecf20Sopenharmony_ci	u32			neg_defp;
5228c2ecf20Sopenharmony_ci	u32			sync_defp;
5238c2ecf20Sopenharmony_ci
5248c2ecf20Sopenharmony_ci	/* Computed in esp_reset_esp() */
5258c2ecf20Sopenharmony_ci	u32			max_period;
5268c2ecf20Sopenharmony_ci	u32			min_period;
5278c2ecf20Sopenharmony_ci	u32			radelay;
5288c2ecf20Sopenharmony_ci
5298c2ecf20Sopenharmony_ci	/* ESP_CMD_SELAS command state */
5308c2ecf20Sopenharmony_ci	u8			*cmd_bytes_ptr;
5318c2ecf20Sopenharmony_ci	int			cmd_bytes_left;
5328c2ecf20Sopenharmony_ci
5338c2ecf20Sopenharmony_ci	struct completion	*eh_reset;
5348c2ecf20Sopenharmony_ci
5358c2ecf20Sopenharmony_ci	void			*dma;
5368c2ecf20Sopenharmony_ci	int			dmarev;
5378c2ecf20Sopenharmony_ci
5388c2ecf20Sopenharmony_ci	/* These are used by esp_send_pio_cmd() */
5398c2ecf20Sopenharmony_ci	u8 __iomem		*fifo_reg;
5408c2ecf20Sopenharmony_ci	int			send_cmd_error;
5418c2ecf20Sopenharmony_ci	u32			send_cmd_residual;
5428c2ecf20Sopenharmony_ci};
5438c2ecf20Sopenharmony_ci
5448c2ecf20Sopenharmony_ci/* A front-end driver for the ESP chip should do the following in
5458c2ecf20Sopenharmony_ci * it's device probe routine:
5468c2ecf20Sopenharmony_ci * 1) Allocate the host and private area using scsi_host_alloc()
5478c2ecf20Sopenharmony_ci *    with size 'sizeof(struct esp)'.  The first argument to
5488c2ecf20Sopenharmony_ci *    scsi_host_alloc() should be &scsi_esp_template.
5498c2ecf20Sopenharmony_ci * 2) Set host->max_id as appropriate.
5508c2ecf20Sopenharmony_ci * 3) Set esp->host to the scsi_host itself, and esp->dev
5518c2ecf20Sopenharmony_ci *    to the device object pointer.
5528c2ecf20Sopenharmony_ci * 4) Hook up esp->ops to the front-end implementation.
5538c2ecf20Sopenharmony_ci * 5) If the ESP chip supports wide transfers, set ESP_FLAG_WIDE_CAPABLE
5548c2ecf20Sopenharmony_ci *    in esp->flags.
5558c2ecf20Sopenharmony_ci * 6) Map the DMA and ESP chip registers.
5568c2ecf20Sopenharmony_ci * 7) DMA map the ESP command block, store the DMA address
5578c2ecf20Sopenharmony_ci *    in esp->command_block_dma.
5588c2ecf20Sopenharmony_ci * 8) Register the scsi_esp_intr() interrupt handler.
5598c2ecf20Sopenharmony_ci * 9) Probe for and provide the following chip properties:
5608c2ecf20Sopenharmony_ci *    esp->scsi_id (assign to esp->host->this_id too)
5618c2ecf20Sopenharmony_ci *    esp->scsi_id_mask
5628c2ecf20Sopenharmony_ci *    If ESP bus is differential, set ESP_FLAG_DIFFERENTIAL
5638c2ecf20Sopenharmony_ci *    esp->cfreq
5648c2ecf20Sopenharmony_ci *    DMA burst bit mask in esp->bursts, if necessary
5658c2ecf20Sopenharmony_ci * 10) Perform any actions necessary before the ESP device can
5668c2ecf20Sopenharmony_ci *     be programmed for the first time.  On some configs, for
5678c2ecf20Sopenharmony_ci *     example, the DMA engine has to be reset before ESP can
5688c2ecf20Sopenharmony_ci *     be programmed.
5698c2ecf20Sopenharmony_ci * 11) If necessary, call dev_set_drvdata() as needed.
5708c2ecf20Sopenharmony_ci * 12) Call scsi_esp_register() with prepared 'esp' structure.
5718c2ecf20Sopenharmony_ci * 13) Check scsi_esp_register() return value, release all resources
5728c2ecf20Sopenharmony_ci *     if an error was returned.
5738c2ecf20Sopenharmony_ci */
5748c2ecf20Sopenharmony_ciextern struct scsi_host_template scsi_esp_template;
5758c2ecf20Sopenharmony_ciextern int scsi_esp_register(struct esp *);
5768c2ecf20Sopenharmony_ci
5778c2ecf20Sopenharmony_ciextern void scsi_esp_unregister(struct esp *);
5788c2ecf20Sopenharmony_ciextern irqreturn_t scsi_esp_intr(int, void *);
5798c2ecf20Sopenharmony_ciextern void scsi_esp_cmd(struct esp *, u8);
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_ciextern void esp_send_pio_cmd(struct esp *esp, u32 dma_addr, u32 esp_count,
5828c2ecf20Sopenharmony_ci			     u32 dma_count, int write, u8 cmd);
5838c2ecf20Sopenharmony_ci
5848c2ecf20Sopenharmony_ci#endif /* !(_ESP_SCSI_H) */
585