162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * mac53c94.h: definitions for the driver for the 53c94 SCSI bus adaptor
462306a36Sopenharmony_ci * found on Power Macintosh computers, controlling the external SCSI chain.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 1996 Paul Mackerras.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef _MAC53C94_H
962306a36Sopenharmony_ci#define _MAC53C94_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/*
1262306a36Sopenharmony_ci * Registers in the 53C94 controller.
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct mac53c94_regs {
1662306a36Sopenharmony_ci	unsigned char	count_lo;
1762306a36Sopenharmony_ci	char pad0[15];
1862306a36Sopenharmony_ci	unsigned char	count_mid;
1962306a36Sopenharmony_ci	char pad1[15];
2062306a36Sopenharmony_ci	unsigned char	fifo;
2162306a36Sopenharmony_ci	char pad2[15];
2262306a36Sopenharmony_ci	unsigned char	command;
2362306a36Sopenharmony_ci	char pad3[15];
2462306a36Sopenharmony_ci	unsigned char	status;
2562306a36Sopenharmony_ci	char pad4[15];
2662306a36Sopenharmony_ci	unsigned char	interrupt;
2762306a36Sopenharmony_ci	char pad5[15];
2862306a36Sopenharmony_ci	unsigned char	seqstep;
2962306a36Sopenharmony_ci	char pad6[15];
3062306a36Sopenharmony_ci	unsigned char	flags;
3162306a36Sopenharmony_ci	char pad7[15];
3262306a36Sopenharmony_ci	unsigned char	config1;
3362306a36Sopenharmony_ci	char pad8[15];
3462306a36Sopenharmony_ci	unsigned char	clk_factor;
3562306a36Sopenharmony_ci	char pad9[15];
3662306a36Sopenharmony_ci	unsigned char	test;
3762306a36Sopenharmony_ci	char pad10[15];
3862306a36Sopenharmony_ci	unsigned char	config2;
3962306a36Sopenharmony_ci	char pad11[15];
4062306a36Sopenharmony_ci	unsigned char	config3;
4162306a36Sopenharmony_ci	char pad12[15];
4262306a36Sopenharmony_ci	unsigned char	config4;
4362306a36Sopenharmony_ci	char pad13[15];
4462306a36Sopenharmony_ci	unsigned char	count_hi;
4562306a36Sopenharmony_ci	char pad14[15];
4662306a36Sopenharmony_ci	unsigned char	fifo_res;
4762306a36Sopenharmony_ci	char pad15[15];
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci/*
5162306a36Sopenharmony_ci * Alternate functions for some registers.
5262306a36Sopenharmony_ci */
5362306a36Sopenharmony_ci#define dest_id		status
5462306a36Sopenharmony_ci#define sel_timeout	interrupt
5562306a36Sopenharmony_ci#define sync_period	seqstep
5662306a36Sopenharmony_ci#define sync_offset	flags
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/*
5962306a36Sopenharmony_ci * Bits in command register.
6062306a36Sopenharmony_ci */
6162306a36Sopenharmony_ci#define CMD_DMA_MODE	0x80
6262306a36Sopenharmony_ci#define CMD_MODE_MASK	0x70
6362306a36Sopenharmony_ci#define CMD_MODE_INIT	0x10
6462306a36Sopenharmony_ci#define CMD_MODE_TARG	0x20
6562306a36Sopenharmony_ci#define CMD_MODE_DISC	0x40
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define CMD_NOP		0
6862306a36Sopenharmony_ci#define CMD_FLUSH	1
6962306a36Sopenharmony_ci#define CMD_RESET	2
7062306a36Sopenharmony_ci#define CMD_SCSI_RESET	3
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define CMD_XFER_DATA	0x10
7362306a36Sopenharmony_ci#define CMD_I_COMPLETE	0x11
7462306a36Sopenharmony_ci#define CMD_ACCEPT_MSG	0x12
7562306a36Sopenharmony_ci#define CMD_XFER_PAD	0x18
7662306a36Sopenharmony_ci#define CMD_SET_ATN	0x1a
7762306a36Sopenharmony_ci#define CMD_CLR_ATN	0x1b
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci#define CMD_SEND_MSG	0x20
8062306a36Sopenharmony_ci#define CMD_SEND_STATUS	0x21
8162306a36Sopenharmony_ci#define CMD_SEND_DATA	0x22
8262306a36Sopenharmony_ci#define CMD_DISC_SEQ	0x23
8362306a36Sopenharmony_ci#define CMD_TERMINATE	0x24
8462306a36Sopenharmony_ci#define CMD_T_COMPLETE	0x25
8562306a36Sopenharmony_ci#define CMD_DISCONNECT	0x27
8662306a36Sopenharmony_ci#define CMD_RECV_MSG	0x28
8762306a36Sopenharmony_ci#define CMD_RECV_CDB	0x29
8862306a36Sopenharmony_ci#define CMD_RECV_DATA	0x2a
8962306a36Sopenharmony_ci#define CMD_RECV_CMD	0x2b
9062306a36Sopenharmony_ci#define CMD_ABORT_DMA	0x04
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci#define CMD_RESELECT	0x40
9362306a36Sopenharmony_ci#define CMD_SELECT	0x41
9462306a36Sopenharmony_ci#define CMD_SELECT_ATN	0x42
9562306a36Sopenharmony_ci#define CMD_SELATN_STOP	0x43
9662306a36Sopenharmony_ci#define CMD_ENABLE_SEL	0x44
9762306a36Sopenharmony_ci#define CMD_DISABLE_SEL	0x45
9862306a36Sopenharmony_ci#define CMD_SEL_ATN3	0x46
9962306a36Sopenharmony_ci#define CMD_RESEL_ATN3	0x47
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci/*
10262306a36Sopenharmony_ci * Bits in status register.
10362306a36Sopenharmony_ci */
10462306a36Sopenharmony_ci#define STAT_IRQ	0x80
10562306a36Sopenharmony_ci#define STAT_ERROR	0x40
10662306a36Sopenharmony_ci#define STAT_PARITY	0x20
10762306a36Sopenharmony_ci#define STAT_TC_ZERO	0x10
10862306a36Sopenharmony_ci#define STAT_DONE	0x08
10962306a36Sopenharmony_ci#define STAT_PHASE	0x07
11062306a36Sopenharmony_ci#define STAT_MSG	0x04
11162306a36Sopenharmony_ci#define STAT_CD		0x02
11262306a36Sopenharmony_ci#define STAT_IO		0x01
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci/*
11562306a36Sopenharmony_ci * Bits in interrupt register.
11662306a36Sopenharmony_ci */
11762306a36Sopenharmony_ci#define INTR_RESET	0x80	/* SCSI bus was reset */
11862306a36Sopenharmony_ci#define INTR_ILL_CMD	0x40	/* illegal command */
11962306a36Sopenharmony_ci#define INTR_DISCONNECT	0x20	/* we got disconnected */
12062306a36Sopenharmony_ci#define INTR_BUS_SERV	0x10	/* bus service requested */
12162306a36Sopenharmony_ci#define INTR_DONE	0x08	/* function completed */
12262306a36Sopenharmony_ci#define INTR_RESELECTED	0x04	/* we were reselected */
12362306a36Sopenharmony_ci#define INTR_SEL_ATN	0x02	/* we were selected, ATN asserted */
12462306a36Sopenharmony_ci#define INTR_SELECT	0x01	/* we were selected, ATN negated */
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci/*
12762306a36Sopenharmony_ci * Encoding for the select timeout.
12862306a36Sopenharmony_ci */
12962306a36Sopenharmony_ci#define TIMO_VAL(x)	((x) * 5000 / 7682)
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci/*
13262306a36Sopenharmony_ci * Bits in sequence step register.
13362306a36Sopenharmony_ci */
13462306a36Sopenharmony_ci#define SS_MASK		7
13562306a36Sopenharmony_ci#define SS_ARB_SEL	0	/* Selection & arbitration complete */
13662306a36Sopenharmony_ci#define SS_MSG_SENT	1	/* One message byte sent */
13762306a36Sopenharmony_ci#define SS_NOT_CMD	2	/* Not in command phase */
13862306a36Sopenharmony_ci#define SS_PHASE_CHG	3	/* Early phase change, cmd bytes lost */
13962306a36Sopenharmony_ci#define SS_DONE		4	/* Command was sent OK */
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci/*
14262306a36Sopenharmony_ci * Encoding for sync transfer period.
14362306a36Sopenharmony_ci */
14462306a36Sopenharmony_ci#define SYNCP_MASK	0x1f
14562306a36Sopenharmony_ci#define SYNCP_MIN	4
14662306a36Sopenharmony_ci#define SYNCP_MAX	31
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci/*
14962306a36Sopenharmony_ci * Bits in flags register.
15062306a36Sopenharmony_ci */
15162306a36Sopenharmony_ci#define FLAGS_FIFO_LEV	0x1f
15262306a36Sopenharmony_ci#define FLAGS_SEQ_STEP	0xe0
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci/*
15562306a36Sopenharmony_ci * Encoding for sync offset.
15662306a36Sopenharmony_ci */
15762306a36Sopenharmony_ci#define SYNCO_MASK	0x0f
15862306a36Sopenharmony_ci#define SYNCO_ASS_CTRL	0x30	/* REQ/ACK assertion control */
15962306a36Sopenharmony_ci#define SYNCO_NEG_CTRL	0xc0	/* REQ/ACK negation control */
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci/*
16262306a36Sopenharmony_ci * Bits in config1 register.
16362306a36Sopenharmony_ci */
16462306a36Sopenharmony_ci#define CF1_SLOW_CABLE	0x80	/* Slow cable mode */
16562306a36Sopenharmony_ci#define CF1_NO_RES_REP	0x40	/* Disable SCSI reset reports */
16662306a36Sopenharmony_ci#define CF1_PAR_TEST	0x20	/* Parity test mode enable */
16762306a36Sopenharmony_ci#define CF1_PAR_ENABLE	0x10	/* Enable parity checks */
16862306a36Sopenharmony_ci#define CF1_TEST	0x08	/* Chip tests */
16962306a36Sopenharmony_ci#define CF1_MY_ID	0x07	/* Controller's address on bus */
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci/*
17262306a36Sopenharmony_ci * Encoding for clk_factor register.
17362306a36Sopenharmony_ci */
17462306a36Sopenharmony_ci#define CLKF_MASK	7
17562306a36Sopenharmony_ci#define CLKF_VAL(freq)	((((freq) + 4999999) / 5000000) & CLKF_MASK)
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci/*
17862306a36Sopenharmony_ci * Bits in test mode register.
17962306a36Sopenharmony_ci */
18062306a36Sopenharmony_ci#define TEST_TARGET	1	/* target test mode */
18162306a36Sopenharmony_ci#define TEST_INITIATOR	2	/* initiator test mode */
18262306a36Sopenharmony_ci#define TEST_TRISTATE	4	/* tristate (hi-z) test mode */
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci/*
18562306a36Sopenharmony_ci * Bits in config2 register.
18662306a36Sopenharmony_ci */
18762306a36Sopenharmony_ci#define CF2_RFB		0x80
18862306a36Sopenharmony_ci#define CF2_FEATURE_EN	0x40	/* enable features / phase latch */
18962306a36Sopenharmony_ci#define CF2_BYTECTRL	0x20
19062306a36Sopenharmony_ci#define CF2_DREQ_HIZ	0x10
19162306a36Sopenharmony_ci#define CF2_SCSI2	0x08
19262306a36Sopenharmony_ci#define CF2_PAR_ABORT	0x04	/* bad parity target abort */
19362306a36Sopenharmony_ci#define CF2_REG_PARERR	0x02	/* register parity error */
19462306a36Sopenharmony_ci#define CF2_DMA_PARERR	0x01	/* DMA parity error */
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci/*
19762306a36Sopenharmony_ci * Bits in the config3 register.
19862306a36Sopenharmony_ci */
19962306a36Sopenharmony_ci#define CF3_ID_MSG_CHK	0x80
20062306a36Sopenharmony_ci#define CF3_3B_MSGS	0x40
20162306a36Sopenharmony_ci#define CF3_CDB10	0x20
20262306a36Sopenharmony_ci#define CF3_FASTSCSI	0x10	/* enable fast SCSI support */
20362306a36Sopenharmony_ci#define CF3_FASTCLOCK	0x08
20462306a36Sopenharmony_ci#define CF3_SAVERESID	0x04
20562306a36Sopenharmony_ci#define CF3_ALT_DMA	0x02
20662306a36Sopenharmony_ci#define CF3_THRESH_8	0x01
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci/*
20962306a36Sopenharmony_ci * Bits in the config4 register.
21062306a36Sopenharmony_ci */
21162306a36Sopenharmony_ci#define CF4_EAN		0x04
21262306a36Sopenharmony_ci#define CF4_TEST	0x02
21362306a36Sopenharmony_ci#define CF4_BBTE	0x01
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_cistruct mac53c94_cmd_priv {
21662306a36Sopenharmony_ci	int this_residual;
21762306a36Sopenharmony_ci	int status;
21862306a36Sopenharmony_ci	int message;
21962306a36Sopenharmony_ci};
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_cistatic inline struct mac53c94_cmd_priv *mac53c94_priv(struct scsi_cmnd *cmd)
22262306a36Sopenharmony_ci{
22362306a36Sopenharmony_ci	return scsi_cmd_priv(cmd);
22462306a36Sopenharmony_ci}
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci#endif /* _MAC53C94_H */
227