1/*-
2 * This file is provided under a dual BSD/GPLv2 license.  When using or
3 * redistributing this file, you may do so under either license.
4 *
5 * GPL LICENSE SUMMARY
6 *
7 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of version 2 of the GNU General Public License as
11 * published by the Free Software Foundation.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21 * The full GNU General Public License is included in this distribution
22 * in the file called LICENSE.GPL.
23 *
24 * BSD LICENSE
25 *
26 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27 * All rights reserved.
28 *
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
31 * are met:
32 *
33 *   * Redistributions of source code must retain the above copyright
34 *     notice, this list of conditions and the following disclaimer.
35 *   * Redistributions in binary form must reproduce the above copyright
36 *     notice, this list of conditions and the following disclaimer in
37 *     the documentation and/or other materials provided with the
38 *     distribution.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 */
52
53#include <sys/cdefs.h>
54__FBSDID("$FreeBSD$");
55
56/**
57 * @file
58 * @brief This file contains the mode page constants and data for the mode
59 *        pages supported by this translation implementation.
60 */
61
62// DO NOT MOVE THIS INCLUDE STATEMENT! This include must occur before
63// the below check for ENABLE_SATI_MODE_PAGES.
64#include <dev/isci/scil/sati_types.h>
65
66#if defined(ENABLE_SATI_MODE_PAGES)
67
68#include <dev/isci/scil/sati_mode_pages.h>
69#include <dev/isci/scil/intel_scsi.h>
70
71//******************************************************************************
72//* C O N S T A N T S
73//******************************************************************************
74
75#define SCSI_MODE_PAGE19_SAS_ID         0x6
76#define SCSI_MODE_PAGE19_SUB1_PAGE_NUM  0x1
77#define SCSI_MODE_PAGE19_SUB1_PC        0x59
78
79//******************************************************************************
80//* M O D E   P A G E S
81//******************************************************************************
82
83U8 sat_default_mode_page_01[] =
84{
85   SCSI_MODE_PAGE_READ_WRITE_ERROR, // Byte 0 - Page Code, SPF(0), PS(0)
86   SCSI_MODE_PAGE_01_LENGTH-2,      // Byte 1 - Page Length
87   0x80, // Byte 2 - AWRE, ARRE, TB, RC, EER, PER, DTE, DCR
88   0x00, // Byte 3 - Read Retry Count
89
90   0x00, // Byte 4 - Obsolete
91   0x00, // Byte 5 - Obsolete
92   0x00, // Byte 6 - Obsolete
93   0x00, // Byte 7 - Restricted for MMC-4
94
95   0x00, // Byte 8 - Write Retry Count
96   0x00, // Byte 9 - Reserved
97   0x00, // Byte 10 - Recovery Time Limit
98   0x00, // Byte 11
99};
100
101U8 sat_changeable_mode_page_01[] =
102{
103   SCSI_MODE_PAGE_READ_WRITE_ERROR,
104   SCSI_MODE_PAGE_01_LENGTH-2,
105   0x00,
106   0x00,
107
108   0x00,
109   0x00,
110   0x00,
111   0x00,
112
113   0x00,
114   0x00,
115   0x00,
116   0x00,
117};
118
119U8 sat_default_mode_page_02[] =
120{
121   SCSI_MODE_PAGE_DISCONNECT_RECONNECT, // Byte 0 - Page Code, SPF(0), PS(0)
122   SCSI_MODE_PAGE_02_LENGTH-2,          // Byte 1 - Page Length
123   0x00, // Byte 2 - Buffer Full Ratio
124   0x00, // Byte 3 - Buffer Empty Ratio
125
126   0x00, // Byte 4 - Bus Inactivity Limit
127   0x00, // Byte 5
128   0x00, // Byte 6 - Disconnect Time Limit
129   0x00, // Byte 7
130
131   0x00, // Byte 8 - Connect Time Limit
132   0x00, // Byte 9
133   0x00, // Byte 10 - Maximum Burst Size
134   0x00, // Byte 11
135
136   0x00, // Byte 12 - EMDP, FAIR_ARB, DIMM, DTDC
137   0x00, // Byte 13
138   0x00, // Byte 14 - First Burst Size
139   0x00, // Byte 15
140};
141
142U8 sat_changeable_mode_page_02[] =
143{
144   SCSI_MODE_PAGE_DISCONNECT_RECONNECT,
145   SCSI_MODE_PAGE_02_LENGTH-2,
146   0x00,
147   0x00,
148
149   0x00,
150   0x00,
151   0x00,
152   0x00,
153
154   0x00,
155   0x00,
156   0x00,
157   0x00,
158
159   0x00,
160   0x00,
161   0x00,
162   0x00,
163};
164
165U8 sat_default_mode_page_08[] =
166{
167   SCSI_MODE_PAGE_CACHING,     // Byte 0 - Page Code, SPF(0), PS(0)
168   SCSI_MODE_PAGE_08_LENGTH-2, // Byte 1 - Page Length
169   0x00, // Byte 2 - IC, ABPF, CAP, DISC, SIZE, WCE(1), MF, RCD
170   0x00, // Byte 3 - Demand Read Retention Priority, Write Retention Priority
171
172   0x00, // Byte 4 - Disable Pre-Fetch Transfer Length
173   0x00, // Byte 5
174   0x00, // Byte 6 - Minimum Pre-Fetch
175   0x00, // Byte 7
176
177   0x00, // Byte 8 - Maximum Pre-Fetch
178   0x00, // Byte 9
179   0x00, // Byte 10 - Maximum Pre-Fetch Ceiling
180   0x00, // Byte 11
181
182   0x00, // Byte 12 - FSW, LBCSS, DRA(0), Vendor Specific, NV_DIS
183   0x00, // Byte 13 - Number of Cache Segments
184   0x00, // Byte 14 - Cache Segment Size
185   0x00, // Byte 15
186
187   0x00, // Byte 16 - Reserved
188   0x00, // Byte 17 - Non-Cache Segment Size
189   0x00, // Byte 18
190   0x00, // PAD
191};
192
193U8 sat_changeable_mode_page_08[] =
194{
195   SCSI_MODE_PAGE_CACHING,
196   SCSI_MODE_PAGE_08_LENGTH-2,
197   SCSI_MODE_PAGE_CACHE_PAGE_WCE_BIT,
198   0x00,
199
200   0x00,
201   0x00,
202   0x00,
203   0x00,
204
205   0x00,
206   0x00,
207   0x00,
208   0x00,
209
210   SCSI_MODE_PAGE_CACHE_PAGE_DRA_BIT,
211   0x00,
212   0x00,
213   0x00,
214
215   0x00,
216   0x00,
217   0x00,
218   0x00, // PAD
219};
220
221U8 sat_default_mode_page_0A[] =
222{
223   SCSI_MODE_PAGE_CONTROL,     // Byte 0 - Page Code, SPF(0), PS(0)
224   SCSI_MODE_PAGE_0A_LENGTH-2, // Byte 1 - Page Length
225   0x00, // Byte 2 - TST(0), TMF_ONLY(0), D_SENSE(0), GLTSD(0), RLEC(0)
226   0x10, // Byte 3 - Queue Algorithm(0), QErr(0)
227
228   0x00, // Byte 4 - TAS(0), RAC(0), UA_(0), SWP(0)
229   0x00, // Byte 5 - ATO(0), AUTOLOAD(0)
230   0x00, // Byte 6
231   0x00, // Byte 7
232
233   0xFF, // Byte 8 - Unlimited Busy timeout
234   0xFF, // Byte 9
235   0x00, // Byte 10 - do not support self time compl time xlation
236   0x00, // Byte 11
237};
238
239U8 sat_changeable_mode_page_0A[] =
240{
241   SCSI_MODE_PAGE_CONTROL,
242   SCSI_MODE_PAGE_0A_LENGTH-2,
243   0x00,
244   0x00,
245
246   0x00,
247   0x00,
248   0x00,
249   0x00,
250
251   0x00,
252   0x00,
253   0x00,
254   0x00,
255};
256
257U8 sat_default_mode_page_19[] =
258{
259   SCSI_MODE_PAGE_PROTOCOL_SPECIFIC_PORT, // Byte 0 - PS, SPF, Page Code
260   SCSI_MODE_PAGE_19_LENGTH-2,  // Byte 1 - Page Length
261   SCSI_MODE_PAGE19_SAS_ID,     // Byte 2 - Rsvd, READY_LED,  ProtoID
262   0x00, // PAD
263
264   0xFF, // Byte 4 - IT NLT MSB, 0xFF retry forever
265   0xFF, // Byte 5 - IT NLT LSB, 0xFF retry forever
266   0x00, // Byte 6 - IRT MSB, 0x0 disable init resp timer
267   0x00, // Byte 7 - IRT LSB, 0x0 disable init resp timer
268};
269
270U8 sat_changeable_mode_page_19[] =
271{
272   SCSI_MODE_PAGE_PROTOCOL_SPECIFIC_PORT,
273   SCSI_MODE_PAGE_19_LENGTH-2,
274   0x00,
275   0x00,
276
277   0x00,
278   0x00,
279   0x00,
280   0x00,
281};
282
283U8 sat_default_mode_page_1C[] =
284{
285   SCSI_MODE_PAGE_INFORMATIONAL_EXCP_CONTROL, // Byte 0 - Page Code,
286                                              // SPF(0), PS(0)
287   SCSI_MODE_PAGE_1C_LENGTH-2,   // Byte 1 - Page Length
288   SCSI_MODE_PAGE_DEXCPT_ENABLE, // Byte 2 - Perf, EBF, EWasc,
289                                 // DExcpt(1), Test, LogErr
290   0x06, // Byte 3 -- MRIE (6 == values only available upon request)
291
292   0x00, // Byte 4 -- Interval Timer
293   0x00, // Byte 5
294   0x00, // Byte 6
295   0x00, // Byte 7
296
297   0x00, // Byte 8 -- Report Count
298   0x00, // Byte 9
299   0x00, // Byte 10
300   0x00, // Byte 11
301};
302
303U8 sat_changeable_mode_page_1C[] =
304{
305   SCSI_MODE_PAGE_INFORMATIONAL_EXCP_CONTROL,
306   SCSI_MODE_PAGE_1C_LENGTH-2,
307   SCSI_MODE_PAGE_DEXCPT_ENABLE,
308   0x00,
309
310   0x00,
311   0x00,
312   0x00,
313   0x00,
314
315   0x00,
316   0x00,
317   0x00,
318   0x00,
319};
320
321U8 sat_supported_mode_pages[] =
322{
323   SCSI_MODE_PAGE_READ_WRITE_ERROR,
324   SCSI_MODE_PAGE_DISCONNECT_RECONNECT,
325   SCSI_MODE_PAGE_CACHING,
326   SCSI_MODE_PAGE_CONTROL,
327   SCSI_MODE_PAGE_INFORMATIONAL_EXCP_CONTROL
328};
329
330U8 *sat_changeable_mode_pages[] =
331{
332   sat_changeable_mode_page_01,
333   sat_changeable_mode_page_02,
334   sat_changeable_mode_page_08,
335   sat_changeable_mode_page_0A,
336   sat_changeable_mode_page_1C
337};
338
339U8 *sat_default_mode_pages[] =
340{
341   sat_default_mode_page_01,
342   sat_default_mode_page_02,
343   sat_default_mode_page_08,
344   sat_default_mode_page_0A,
345   sat_default_mode_page_1C
346};
347
348U16 sat_mode_page_sizes[] =
349{
350   sizeof(sat_default_mode_page_01),
351   sizeof(sat_default_mode_page_02),
352   sizeof(sat_default_mode_page_08),
353   sizeof(sat_default_mode_page_0A),
354   sizeof(sat_default_mode_page_1C)
355};
356
357U16 sati_mode_page_get_page_index(
358   U8  page_code
359)
360{
361   U16 index;
362   for (index = 0; index < SAT_SUPPORTED_MODE_PAGES_LENGTH; index++)
363   {
364      if (sat_supported_mode_pages[index] == page_code)
365         return index;
366   }
367
368   return SATI_MODE_PAGE_UNSUPPORTED_INDEX;
369}
370
371#endif // defined(ENABLE_SATI_MODE_PAGES)
372
373