162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * mesh.h: definitions for the driver for the MESH SCSI bus adaptor 462306a36Sopenharmony_ci * (Macintosh Enhanced SCSI Hardware) found on Power Macintosh computers. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 1996 Paul Mackerras. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#ifndef _MESH_H 962306a36Sopenharmony_ci#define _MESH_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cistruct mesh_cmd_priv { 1262306a36Sopenharmony_ci int this_residual; 1362306a36Sopenharmony_ci int message; 1462306a36Sopenharmony_ci int status; 1562306a36Sopenharmony_ci}; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic inline struct mesh_cmd_priv *mesh_priv(struct scsi_cmnd *cmd) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci return scsi_cmd_priv(cmd); 2062306a36Sopenharmony_ci} 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/* 2362306a36Sopenharmony_ci * Registers in the MESH controller. 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct mesh_regs { 2762306a36Sopenharmony_ci unsigned char count_lo; 2862306a36Sopenharmony_ci char pad0[15]; 2962306a36Sopenharmony_ci unsigned char count_hi; 3062306a36Sopenharmony_ci char pad1[15]; 3162306a36Sopenharmony_ci unsigned char fifo; 3262306a36Sopenharmony_ci char pad2[15]; 3362306a36Sopenharmony_ci unsigned char sequence; 3462306a36Sopenharmony_ci char pad3[15]; 3562306a36Sopenharmony_ci unsigned char bus_status0; 3662306a36Sopenharmony_ci char pad4[15]; 3762306a36Sopenharmony_ci unsigned char bus_status1; 3862306a36Sopenharmony_ci char pad5[15]; 3962306a36Sopenharmony_ci unsigned char fifo_count; 4062306a36Sopenharmony_ci char pad6[15]; 4162306a36Sopenharmony_ci unsigned char exception; 4262306a36Sopenharmony_ci char pad7[15]; 4362306a36Sopenharmony_ci unsigned char error; 4462306a36Sopenharmony_ci char pad8[15]; 4562306a36Sopenharmony_ci unsigned char intr_mask; 4662306a36Sopenharmony_ci char pad9[15]; 4762306a36Sopenharmony_ci unsigned char interrupt; 4862306a36Sopenharmony_ci char pad10[15]; 4962306a36Sopenharmony_ci unsigned char source_id; 5062306a36Sopenharmony_ci char pad11[15]; 5162306a36Sopenharmony_ci unsigned char dest_id; 5262306a36Sopenharmony_ci char pad12[15]; 5362306a36Sopenharmony_ci unsigned char sync_params; 5462306a36Sopenharmony_ci char pad13[15]; 5562306a36Sopenharmony_ci unsigned char mesh_id; 5662306a36Sopenharmony_ci char pad14[15]; 5762306a36Sopenharmony_ci unsigned char sel_timeout; 5862306a36Sopenharmony_ci char pad15[15]; 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci/* Bits in the sequence register. */ 6262306a36Sopenharmony_ci#define SEQ_DMA_MODE 0x80 /* use DMA for data transfer */ 6362306a36Sopenharmony_ci#define SEQ_TARGET 0x40 /* put the controller into target mode */ 6462306a36Sopenharmony_ci#define SEQ_ATN 0x20 /* assert ATN signal */ 6562306a36Sopenharmony_ci#define SEQ_ACTIVE_NEG 0x10 /* use active negation on REQ/ACK */ 6662306a36Sopenharmony_ci#define SEQ_CMD 0x0f /* command bits: */ 6762306a36Sopenharmony_ci#define SEQ_ARBITRATE 1 /* get the bus */ 6862306a36Sopenharmony_ci#define SEQ_SELECT 2 /* select a target */ 6962306a36Sopenharmony_ci#define SEQ_COMMAND 3 /* send a command */ 7062306a36Sopenharmony_ci#define SEQ_STATUS 4 /* receive status */ 7162306a36Sopenharmony_ci#define SEQ_DATAOUT 5 /* send data */ 7262306a36Sopenharmony_ci#define SEQ_DATAIN 6 /* receive data */ 7362306a36Sopenharmony_ci#define SEQ_MSGOUT 7 /* send a message */ 7462306a36Sopenharmony_ci#define SEQ_MSGIN 8 /* receive a message */ 7562306a36Sopenharmony_ci#define SEQ_BUSFREE 9 /* look for bus free */ 7662306a36Sopenharmony_ci#define SEQ_ENBPARITY 0x0a /* enable parity checking */ 7762306a36Sopenharmony_ci#define SEQ_DISPARITY 0x0b /* disable parity checking */ 7862306a36Sopenharmony_ci#define SEQ_ENBRESEL 0x0c /* enable reselection */ 7962306a36Sopenharmony_ci#define SEQ_DISRESEL 0x0d /* disable reselection */ 8062306a36Sopenharmony_ci#define SEQ_RESETMESH 0x0e /* reset the controller */ 8162306a36Sopenharmony_ci#define SEQ_FLUSHFIFO 0x0f /* clear out the FIFO */ 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* Bits in the bus_status0 and bus_status1 registers: 8462306a36Sopenharmony_ci these correspond directly to the SCSI bus control signals. */ 8562306a36Sopenharmony_ci#define BS0_REQ 0x20 8662306a36Sopenharmony_ci#define BS0_ACK 0x10 8762306a36Sopenharmony_ci#define BS0_ATN 0x08 8862306a36Sopenharmony_ci#define BS0_MSG 0x04 8962306a36Sopenharmony_ci#define BS0_CD 0x02 9062306a36Sopenharmony_ci#define BS0_IO 0x01 9162306a36Sopenharmony_ci#define BS1_RST 0x80 9262306a36Sopenharmony_ci#define BS1_BSY 0x40 9362306a36Sopenharmony_ci#define BS1_SEL 0x20 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci/* Bus phases defined by the bits in bus_status0 */ 9662306a36Sopenharmony_ci#define BS0_PHASE (BS0_MSG+BS0_CD+BS0_IO) 9762306a36Sopenharmony_ci#define BP_DATAOUT 0 9862306a36Sopenharmony_ci#define BP_DATAIN BS0_IO 9962306a36Sopenharmony_ci#define BP_COMMAND BS0_CD 10062306a36Sopenharmony_ci#define BP_STATUS (BS0_CD+BS0_IO) 10162306a36Sopenharmony_ci#define BP_MSGOUT (BS0_MSG+BS0_CD) 10262306a36Sopenharmony_ci#define BP_MSGIN (BS0_MSG+BS0_CD+BS0_IO) 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci/* Bits in the exception register. */ 10562306a36Sopenharmony_ci#define EXC_SELWATN 0x20 /* (as target) we were selected with ATN */ 10662306a36Sopenharmony_ci#define EXC_SELECTED 0x10 /* (as target) we were selected w/o ATN */ 10762306a36Sopenharmony_ci#define EXC_RESELECTED 0x08 /* (as initiator) we were reselected */ 10862306a36Sopenharmony_ci#define EXC_ARBLOST 0x04 /* we lost arbitration */ 10962306a36Sopenharmony_ci#define EXC_PHASEMM 0x02 /* SCSI phase mismatch */ 11062306a36Sopenharmony_ci#define EXC_SELTO 0x01 /* selection timeout */ 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci/* Bits in the error register */ 11362306a36Sopenharmony_ci#define ERR_UNEXPDISC 0x40 /* target unexpectedly disconnected */ 11462306a36Sopenharmony_ci#define ERR_SCSIRESET 0x20 /* SCSI bus got reset on us */ 11562306a36Sopenharmony_ci#define ERR_SEQERR 0x10 /* we did something the chip didn't like */ 11662306a36Sopenharmony_ci#define ERR_PARITY 0x01 /* parity error was detected */ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/* Bits in the interrupt and intr_mask registers */ 11962306a36Sopenharmony_ci#define INT_ERROR 0x04 /* error interrupt */ 12062306a36Sopenharmony_ci#define INT_EXCEPTION 0x02 /* exception interrupt */ 12162306a36Sopenharmony_ci#define INT_CMDDONE 0x01 /* command done interrupt */ 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci/* Fields in the sync_params register */ 12462306a36Sopenharmony_ci#define SYNC_OFF(x) ((x) >> 4) /* offset field */ 12562306a36Sopenharmony_ci#define SYNC_PER(x) ((x) & 0xf) /* period field */ 12662306a36Sopenharmony_ci#define SYNC_PARAMS(o, p) (((o) << 4) | (p)) 12762306a36Sopenharmony_ci#define ASYNC_PARAMS 2 /* sync_params value for async xfers */ 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci/* 13062306a36Sopenharmony_ci * Assuming a clock frequency of 50MHz: 13162306a36Sopenharmony_ci * 13262306a36Sopenharmony_ci * The transfer period with SYNC_PER(sync_params) == x 13362306a36Sopenharmony_ci * is (x + 2) * 40ns, except that x == 0 gives 100ns. 13462306a36Sopenharmony_ci * 13562306a36Sopenharmony_ci * The units of the sel_timeout register are 10ms. 13662306a36Sopenharmony_ci */ 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci#endif /* _MESH_H */ 140