1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
/* $OpenBSD: twereg.h,v 1.1 2000/09/15 16:56:13 mickey Exp $ */
/*
* Copyright (c) 2000 Michael Shalayeff
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Michael Shalayeff.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* most of the meaning for registers were taken from
* freebsd driver, which in turn got 'em from linux.
* it seems those got 'em from windows driver, in it's turn.
*/
/* general parameters */
#define TWE_MAX_UNITS 16
#define TWE_MAXOFFSETS 62
#define TWE_MAXCMDS 255
#define TWE_SECTOR_SIZE 512
/* XXX freebsd aligns at 64, but it does not work */
#define TWE_ALIGN 512
#define TWE_MAXFER (TWE_MAXOFFSETS * PAGE_SIZE)
/* registers */
#define TWE_CONTROL 0x00
#define TWE_CTRL_CHOSTI 0x00080000 /* clear host int */
#define TWE_CTRL_CATTNI 0x00040000 /* clear attention int */
#define TWE_CTRL_MCMDI 0x00020000 /* mask cmd int */
#define TWE_CTRL_MRDYI 0x00010000 /* mask ready int */
#define TWE_CTRL_ECMDI 0x00008000 /* enable cmd int */
#define TWE_CTRL_ERDYI 0x00004000 /* enable ready int */
#define TWE_CTRL_CERR 0x00000200 /* clear error status */
#define TWE_CTRL_SRST 0x00000100 /* soft reset */
#define TWE_CTRL_EINT 0x00000080 /* enable ints */
#define TWE_CTRL_MINT 0x00000040 /* mask ints */
#define TWE_CTRL_HOSTI 0x00000020 /* generate host int */
#define TWE_STATUS 0x04
#define TWE_STAT_MAJV 0xf0000000
#define TWE_MAJV(st) (((st) >> 28) & 0xf)
#define TWE_STAT_MINV 0x0f000000
#define TWE_MINV(st) (((st) >> 24) & 0xf)
#define TWE_STAT_PCIPAR 0x00800000
#define TWE_STAT_QUEUEE 0x00400000
#define TWE_STAT_CPUERR 0x00200000
#define TWE_STAT_PCIABR 0x00100000
#define TWE_STAT_HOSTI 0x00080000
#define TWE_STAT_ATTNI 0x00040000
#define TWE_STAT_CMDI 0x00020000
#define TWE_STAT_RDYI 0x00010000
#define TWE_STAT_CQF 0x00008000 /* cmd queue full */
#define TWE_STAT_RQE 0x00004000 /* ready queue empty */
#define TWE_STAT_CPURDY 0x00002000 /* cpu ready */
#define TWE_STAT_CQR 0x00001000 /* cmd queue ready */
#define TWE_STAT_FLAGS 0x00fff000 /* mask out other stuff */
#define TWE_STAT_BITS "\020\015cqr\016cpurdy\017rqe\20cqf" \
"\021rdyi\022cmdi\023attni\024hosti\025pciabr\026cpuerr\027queuee\030pcipar"
#define TWE_COMMANDQUEUE 0x08
/*
* the segs offset is encoded into upper 3 bits of the opcode.
* i bet other bits mean something too
* upper 8 bits is the command size in 32bit words.
*/
#define TWE_CMD_NOP 0x0200
#define TWE_CMD_INIT 0x0301
#define TWE_CMD_READ 0x0362
#define TWE_CMD_WRITE 0x0363
#define TWE_CMD_VERIFY 0x0364
#define TWE_CMD_GPARAM 0x0252
#define TWE_CMD_SPARAM 0x0253
#define TWE_CMD_SECINF 0x021a
#define TWE_CMD_AEN 0x021c
#define TWE_READYQUEUE 0x0c
#define TWE_READYID(u) (((u) >> 4) & 0xff)
/* get/set param table ids */
#define TWE_PARAM_UC 0x003 /* unit config */
#define TWE_PARAM_UI 0x300 /* + 16 -- unit information */
#define TWE_PARAM_AEN 0x401
#define TWE_AEN_QEMPTY 0x0000
#define TWE_AEN_SRST 0x0001
#define TWE_AEN_DMIRROR 0x0002 /* degraded mirror */
#define TWE_AEN_CERROR 0x0003 /* controller error */
#define TWE_AEN_RBFAIL 0x0004 /* rebuild failed */
#define TWE_AEN_RBDONE 0x0005
#define TWE_AEN_QFULL 0x00ff
#define TWE_AEN_TUN 0x0015 /* table undefined */
/* struct definitions */
struct twe_param {
u_int16_t table_id;
u_int8_t param_id;
u_int8_t param_size;
u_int8_t data[1];
} __attribute__ ((packed));
struct twe_segs {
u_int32_t twes_addr;
u_int32_t twes_len;
};
struct twe_cmd {
u_int16_t cmd_op;
u_int8_t cmd_index;
u_int8_t cmd_unit_host;
#define TWE_UNITHOST(u, h) (((u) & 0xf) | ((h) << 4))
u_int8_t cmd_status;
u_int8_t cmd_flags;
u_int16_t cmd_count;
union {
struct {
u_int32_t lba;
struct twe_segs segs[TWE_MAXOFFSETS];
u_int32_t pad;
} _cmd_io;
#define cmd_io _._cmd_io
struct {
struct twe_segs segs[TWE_MAXOFFSETS];
} _cmd_param;
#define cmd_param _._cmd_param
struct {
u_int32_t rdy_q_ptr;
} _cmd_init;
#define cmd_init _._cmd_init
} _;
} __attribute__ ((packed)); /* 512 bytes */
|