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
153
154
155
156
157
158
159
160
161
162
163
164
|
/* $NetBSD: sdvar.h,v 1.1 2010/10/14 06:58:22 kiyohara Exp $ */
/*
* Copyright (c) 2010 KIYOHARA Takashi
* 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.
*
* 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 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 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.
*/
#ifndef _STAND_SDVAR_H
#define _STAND_SDVAR_H
#include <dev/ic/siopreg.h>
#include <dev/pci/pcireg.h>
#include <dev/scsipi/scsipiconf.h>
#include <dev/scsipi/scsipi_all.h>
#include <dev/scsipi/scsipi_disk.h>
#include <dev/scsipi/scsi_all.h>
#include <dev/scsipi/scsi_disk.h>
#include <dev/scsipi/scsi_message.h>
#include <dev/scsipi/scsi_spc.h>
#include <sys/disklabel.h>
#include <sys/bootblock.h>
/* tables used by SCRIPT */
typedef struct scr_table {
uint32_t count;
uint32_t addr;
} __packed scr_table_t;
/* Number of scatter/gather entries */
#define SIOP_NSG (0x10000/0x1000 + 1) /* XXX PAGE_SIZE */
/*
* This structure interfaces the SCRIPT with the driver; it describes a full
* transfer.
* If you change something here, don't forget to update offsets in {s,es}iop.ss
*/
struct siop_common_xfer {
uint8_t msg_out[16]; /* 0 */
uint8_t msg_in[16]; /* 16 */
uint32_t status; /* 32 */
uint32_t pad1; /* 36 */
uint32_t id; /* 40 */
uint32_t pad2; /* 44 */
scr_table_t t_msgin; /* 48 */
scr_table_t t_extmsgin; /* 56 */
scr_table_t t_extmsgdata; /* 64 */
scr_table_t t_msgout; /* 72 */
scr_table_t cmd; /* 80 */
scr_table_t t_status; /* 88 */
scr_table_t data[SIOP_NSG]; /* 96 */
} __packed;
/* status can hold the SCSI_* status values, and 2 additional values: */
#define SCSI_SIOP_NOCHECK 0xfe /* don't check the scsi status */
#define SCSI_SIOP_NOSTATUS 0xff /* device didn't report status */
/*
* xfer description of the script: tables and reselect script
* In struct siop_common_cmd siop_xfer will point to this.
*/
struct siop_xfer {
struct siop_common_xfer siop_tables;
/* uint32_t resel[sizeof(load_dsa) / sizeof(load_dsa[0])]; */
uint32_t resel[25];
} __packed;
#define SIOP_SCRIPT_SIZE 4096
#define SIOP_TABLE_SIZE 4096
#define SIOP_SCSI_COMMAND_SIZE 4096
#define SIOP_SCSI_DATA_SIZE 4096
struct scsi_xfer {
int target;
int lun;
struct scsipi_generic *cmd;
int cmdlen;
u_char *data;
int datalen;
int resid;
scsipi_xfer_result_t error;
uint8_t status; /* SCSI status */
int xs_status;
};
struct sd_softc;
struct siop_adapter {
int id;
u_long addr; /* register map address */
int clock_div;
uint32_t *script; /* script addr */
struct siop_xfer *xfer; /* xfer addr */
struct scsipi_generic *cmd; /* SCSI command buffer */
struct scsi_request_sense *sense; /* SCSI sense buffer */
u_char *data; /* SCSI data buffer */
struct scsi_xfer *xs;
int currschedslot; /* current scheduler slot */
int sel_t; /* selected target */
struct sd_softc *sd;
};
struct sd_softc {
int sc_part;
int sc_lun;
int sc_target;
int sc_bus;
int sc_type;
int sc_cap;
int sc_flags;
#define FLAGS_MEDIA_LOADED (1 << 0)
#define FLAGS_REMOVABLE (1 << 1)
struct disk_parms {
u_long heads; /* number of heads */
u_long cyls; /* number of cylinders */
u_long sectors; /* number of sectors/track */
u_long blksize; /* number of bytes/sector */
u_long rot_rate; /* rotational rate, in RPM */
u_int64_t disksize; /* total number sectors */
u_int64_t disksize512; /* total number sectors */
} sc_params;
struct disklabel sc_label;
};
int siop_init(int, int, int);
int scsi_inquire(struct sd_softc *, int, void *);
int scsi_mode_sense(struct sd_softc *, int, int,
struct scsi_mode_parameter_header_6 *, int);
int scsi_command(struct sd_softc *, void *, int, void *, int);
#define SDGP_RESULT_OK 0 /* parameters obtained */
#define SDGP_RESULT_OFFLINE 1 /* no media, or otherwise losing */
#define SDGP_RESULT_UNFORMATTED 2 /* unformatted media (max params) */
#define ERESTART -1
#endif /* _STAND_SDVAR_H */
|