1230557Sjimharris/*-
2230557Sjimharris * This file is provided under a dual BSD/GPLv2 license.  When using or
3230557Sjimharris * redistributing this file, you may do so under either license.
4230557Sjimharris *
5230557Sjimharris * GPL LICENSE SUMMARY
6230557Sjimharris *
7230557Sjimharris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8230557Sjimharris *
9230557Sjimharris * This program is free software; you can redistribute it and/or modify
10230557Sjimharris * it under the terms of version 2 of the GNU General Public License as
11230557Sjimharris * published by the Free Software Foundation.
12230557Sjimharris *
13230557Sjimharris * This program is distributed in the hope that it will be useful, but
14230557Sjimharris * WITHOUT ANY WARRANTY; without even the implied warranty of
15230557Sjimharris * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16230557Sjimharris * General Public License for more details.
17230557Sjimharris *
18230557Sjimharris * You should have received a copy of the GNU General Public License
19230557Sjimharris * along with this program; if not, write to the Free Software
20230557Sjimharris * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21230557Sjimharris * The full GNU General Public License is included in this distribution
22230557Sjimharris * in the file called LICENSE.GPL.
23230557Sjimharris *
24230557Sjimharris * BSD LICENSE
25230557Sjimharris *
26230557Sjimharris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27230557Sjimharris * All rights reserved.
28230557Sjimharris *
29230557Sjimharris * Redistribution and use in source and binary forms, with or without
30230557Sjimharris * modification, are permitted provided that the following conditions
31230557Sjimharris * are met:
32230557Sjimharris *
33230557Sjimharris *   * Redistributions of source code must retain the above copyright
34230557Sjimharris *     notice, this list of conditions and the following disclaimer.
35230557Sjimharris *   * Redistributions in binary form must reproduce the above copyright
36230557Sjimharris *     notice, this list of conditions and the following disclaimer in
37230557Sjimharris *     the documentation and/or other materials provided with the
38230557Sjimharris *     distribution.
39230557Sjimharris *
40230557Sjimharris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
41230557Sjimharris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
42230557Sjimharris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
43230557Sjimharris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
44230557Sjimharris * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45230557Sjimharris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
46230557Sjimharris * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
47230557Sjimharris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
48230557Sjimharris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
49230557Sjimharris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
50230557Sjimharris * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51230557Sjimharris */
52230557Sjimharris
53230557Sjimharris#include <sys/cdefs.h>
54230557Sjimharris__FBSDID("$FreeBSD$");
55230557Sjimharris
56230557Sjimharris/**
57230557Sjimharris * @file
58230557Sjimharris * @brief This file contains the method implementations required to
59230557Sjimharris *        translate the SCSI mode sense 6-byte commands.
60230557Sjimharris */
61230557Sjimharris
62230557Sjimharris#if !defined(DISABLE_SATI_MODE_SENSE)
63230557Sjimharris
64230557Sjimharris#include <dev/isci/scil/sati_mode_sense.h>
65230557Sjimharris#include <dev/isci/scil/sati_mode_sense_6.h>
66230557Sjimharris#include <dev/isci/scil/sati_mode_pages.h>
67230557Sjimharris#include <dev/isci/scil/sati_callbacks.h>
68230557Sjimharris#include <dev/isci/scil/sati_util.h>
69230557Sjimharris#include <dev/isci/scil/intel_scsi.h>
70230557Sjimharris#include <dev/isci/scil/intel_ata.h>
71230557Sjimharris
72230557Sjimharris//******************************************************************************
73230557Sjimharris//* P R I V A T E   M E T H O D S
74230557Sjimharris//******************************************************************************
75230557Sjimharris
76230557Sjimharris/**
77230557Sjimharris * @brief This method builds the mode parameter header for a 6-byte SCSI
78230557Sjimharris *        mode sense data response.  The parameter header is 4 bytes in
79230557Sjimharris *        size.
80230557Sjimharris *        For more information on the parameters passed to this method,
81230557Sjimharris *        please reference sati_translate_command().
82230557Sjimharris *
83230557Sjimharris * @param[in] identify This parameter specifies the ATA remote device's
84230557Sjimharris *            received IDENTIFY DEVICE data.
85230557Sjimharris * @param[in] mode_data_length This parameter specifies the amount of data
86230557Sjimharris *            to be returned as part of this mode sense request.
87230557Sjimharris *
88230557Sjimharris * @return This method returns the number of bytes written into the
89230557Sjimharris *         data buffer.
90230557Sjimharris */
91230557Sjimharrisstatic
92230557SjimharrisU32 sati_mode_sense_6_build_header(
93230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
94230557Sjimharris   void                       * scsi_io,
95230557Sjimharris   ATA_IDENTIFY_DEVICE_DATA_T * identify,
96230557Sjimharris   U8                           mode_data_length
97230557Sjimharris)
98230557Sjimharris{
99230557Sjimharris   U8 * cdb = sati_cb_get_cdb_address(scsi_io);
100230557Sjimharris
101230557Sjimharris   // Fill in the length of the mode parameter data returned (do not include
102230557Sjimharris   // the size of the mode data length field in the total).
103230557Sjimharris   sati_set_data_byte(sequence, scsi_io, 0, (U8)mode_data_length-1);
104230557Sjimharris
105230557Sjimharris   // Medium Type is 0 for SBC devices
106230557Sjimharris   sati_set_data_byte(sequence, scsi_io, 1, SCSI_MODE_HEADER_MEDIUM_TYPE_SBC);
107230557Sjimharris
108230557Sjimharris   // Write Protect (WP), Rsvd, DPOFUA, Rsvd
109230557Sjimharris   if (sequence->device->capabilities & SATI_DEVICE_CAP_DMA_FUA_ENABLE)
110230557Sjimharris      sati_set_data_byte(sequence,scsi_io,2,SCSI_MODE_SENSE_HEADER_FUA_ENABLE);
111230557Sjimharris   else
112230557Sjimharris      sati_set_data_byte(sequence, scsi_io, 2, 0);
113230557Sjimharris
114230557Sjimharris   // Set the block descriptor length if block descriptors are utilized.
115230557Sjimharris   if (sati_get_cdb_byte(cdb, 1) & SCSI_MODE_SENSE_DBD_ENABLE)
116230557Sjimharris      sati_set_data_byte(sequence, scsi_io, 3, 0);
117230557Sjimharris   else
118230557Sjimharris      sati_set_data_byte(
119230557Sjimharris         sequence, scsi_io, 3, SCSI_MODE_SENSE_STD_BLOCK_DESCRIPTOR_LENGTH
120230557Sjimharris      );
121230557Sjimharris
122230557Sjimharris   return SCSI_MODE_SENSE_6_HEADER_LENGTH;
123230557Sjimharris}
124230557Sjimharris
125230557Sjimharris/**
126230557Sjimharris * @brief This method perform the data translation common to all SCSI MODE
127230557Sjimharris *        SENSE 6 byte commands.  This includes building the mode page
128230557Sjimharris *        header and block descriptor (if requested).
129230557Sjimharris *        For more information on the parameters passed to this method,
130230557Sjimharris *        please reference sati_translate_command().
131230557Sjimharris *
132230557Sjimharris * @param[in] identify This parameter specifies the remote device's IDENTIFY
133230557Sjimharris *            DEVICE data to be used during translation.
134230557Sjimharris * @param[in] transfer_length This parameter specifies the size of the
135230557Sjimharris *            mode page (including header & block descriptor).
136230557Sjimharris *
137230557Sjimharris * @return This method returns the number of bytes written into the user's
138230557Sjimharris *         mode page data buffer.
139230557Sjimharris */
140230557Sjimharrisstatic
141230557SjimharrisU32 sati_mode_sense_6_translate_data(
142230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
143230557Sjimharris   ATA_IDENTIFY_DEVICE_DATA_T * identify,
144230557Sjimharris   void                       * scsi_io,
145230557Sjimharris   U8                           transfer_length
146230557Sjimharris)
147230557Sjimharris{
148230557Sjimharris   U8  * cdb = sati_cb_get_cdb_address(scsi_io);
149230557Sjimharris   U32   offset;
150230557Sjimharris
151230557Sjimharris   offset = sati_mode_sense_6_build_header(
152230557Sjimharris               sequence, scsi_io, identify, transfer_length
153230557Sjimharris            );
154230557Sjimharris
155230557Sjimharris   // Determine if the caller disabled block descriptors (DBD).  If not,
156230557Sjimharris   // then generate a block descriptor.
157230557Sjimharris   if ((sati_get_cdb_byte(cdb, 1) & SCSI_MODE_SENSE_DBD_ENABLE) == 0)
158230557Sjimharris      offset += sati_mode_sense_build_std_block_descriptor(
159230557Sjimharris                   sequence, scsi_io, identify, offset
160230557Sjimharris                );
161230557Sjimharris
162230557Sjimharris   return offset;
163230557Sjimharris}
164230557Sjimharris
165230557Sjimharris//******************************************************************************
166230557Sjimharris//* P R O T E C T E D   M E T H O D S
167230557Sjimharris//******************************************************************************
168230557Sjimharris
169230557Sjimharris/**
170230557Sjimharris * @brief This method will translate the SCSI mode sense 6 byte command
171230557Sjimharris *        into corresponding ATA commands.  If the command is well-formed,
172230557Sjimharris *        then the translation will result in an ATA IDENTIFY DEVICE
173230557Sjimharris *        command.
174230557Sjimharris *        For more information on the parameters passed to this method,
175230557Sjimharris *        please reference sati_translate_command().
176230557Sjimharris *
177230557Sjimharris * @return Indicate if the command translation succeeded.
178230557Sjimharris * @retval SCI_SUCCESS This is returned if the command translation was
179230557Sjimharris *         successful.
180230557Sjimharris * @retval SATI_FAILURE_CHECK_RESPONSE_DATA This value is returned if
181230557Sjimharris *         sense data has been created as a result of something specified
182230557Sjimharris *         in the CDB.
183230557Sjimharris */
184230557SjimharrisSATI_STATUS sati_mode_sense_6_translate_command(
185230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
186230557Sjimharris   void                       * scsi_io,
187230557Sjimharris   void                       * ata_io
188230557Sjimharris)
189230557Sjimharris{
190230557Sjimharris   U8 * cdb = sati_cb_get_cdb_address(scsi_io);
191230557Sjimharris
192230557Sjimharris   // Set the data length based on the allocation length field in the CDB.
193230557Sjimharris   sequence->allocation_length = sati_get_cdb_byte(cdb, 4);
194230557Sjimharris
195230557Sjimharris   return sati_mode_sense_translate_command(sequence, scsi_io, ata_io, 6);
196230557Sjimharris}
197230557Sjimharris
198230557Sjimharris/**
199230557Sjimharris * @brief This method will perform data translation from the supplied ATA
200230557Sjimharris *        input data (i.e. an ATA IDENTIFY DEVICE block) into a CACHING
201230557Sjimharris *        mode page format.  The data will be written into the user's mode
202230557Sjimharris *        page data buffer.  This function operates specifically for MODE
203230557Sjimharris *        SENSE 6 commands.
204230557Sjimharris *        For more information on the parameters passed to this method,
205230557Sjimharris *        please reference sati_translate_data().
206230557Sjimharris *
207230557Sjimharris * @return none.
208230557Sjimharris */
209230557Sjimharrisvoid sati_mode_sense_6_caching_translate_data(
210230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
211230557Sjimharris   void                       * ata_input_data,
212230557Sjimharris   void                       * scsi_io
213230557Sjimharris)
214230557Sjimharris{
215230557Sjimharris   ATA_IDENTIFY_DEVICE_DATA_T * identify = (ATA_IDENTIFY_DEVICE_DATA_T*)
216230557Sjimharris                                           ata_input_data;
217230557Sjimharris   U8   data_length = (U8) sati_mode_sense_calculate_page_header(scsi_io, 6)
218230557Sjimharris                           + SCSI_MODE_PAGE_08_LENGTH;
219230557Sjimharris   U32  page_offset = sati_mode_sense_6_translate_data(
220230557Sjimharris                         sequence, identify, scsi_io, data_length
221230557Sjimharris                      );
222230557Sjimharris
223230557Sjimharris   sati_mode_sense_caching_translate_data(
224230557Sjimharris      sequence, scsi_io, identify, page_offset
225230557Sjimharris   );
226230557Sjimharris}
227230557Sjimharris
228230557Sjimharris/**
229230557Sjimharris * @brief This method will perform data translation from the supplied ATA
230230557Sjimharris *        input data (i.e. an ATA IDENTIFY DEVICE block) into a INFORMATIONAL
231230557Sjimharris *        EXCEPTIONS CONTROL mode page format.  The data will be written
232230557Sjimharris *        into the user's mode page data buffer.  This function operates
233230557Sjimharris *        specifically for MODE SENSE 6 commands.
234230557Sjimharris *        For more information on the parameters passed to this method,
235230557Sjimharris *        please reference sati_translate_data().
236230557Sjimharris *
237230557Sjimharris * @return none.
238230557Sjimharris */
239230557Sjimharrisvoid sati_mode_sense_6_informational_excp_control_translate_data(
240230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
241230557Sjimharris   void                       * ata_input_data,
242230557Sjimharris   void                       * scsi_io
243230557Sjimharris)
244230557Sjimharris{
245230557Sjimharris   ATA_IDENTIFY_DEVICE_DATA_T * identify = (ATA_IDENTIFY_DEVICE_DATA_T*)
246230557Sjimharris                                           ata_input_data;
247230557Sjimharris   U8   data_length = (U8) sati_mode_sense_calculate_page_header(scsi_io, 6)
248230557Sjimharris                           + SCSI_MODE_PAGE_1C_LENGTH;
249230557Sjimharris   U32  page_offset = sati_mode_sense_6_translate_data(
250230557Sjimharris                         sequence, identify, scsi_io, data_length
251230557Sjimharris                      );
252230557Sjimharris
253230557Sjimharris   sati_mode_sense_informational_excp_control_translate_data(
254230557Sjimharris      sequence, scsi_io, identify, page_offset
255230557Sjimharris   );
256230557Sjimharris}
257230557Sjimharris
258230557Sjimharris/**
259230557Sjimharris* @brief This method will perform data translation from the supplied ATA
260230557Sjimharris*        input data (i.e. an ATA IDENTIFY DEVICE block) into a DISCONNECT
261230557Sjimharris*        RECONNECT mode page format.  The data will be written
262230557Sjimharris*        into the user's mode page data buffer.  This function operates
263230557Sjimharris*        specifically for MODE SENSE 6 commands.
264230557Sjimharris*        For more information on the parameters passed to this method,
265230557Sjimharris*        please reference sati_translate_data().
266230557Sjimharris*
267230557Sjimharris* @return none.
268230557Sjimharris*/
269230557Sjimharrisvoid sati_mode_sense_6_disconnect_reconnect_translate_data(
270230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
271230557Sjimharris   void                       * ata_input_data,
272230557Sjimharris   void                       * scsi_io
273230557Sjimharris)
274230557Sjimharris{
275230557Sjimharris   ATA_IDENTIFY_DEVICE_DATA_T * identify = (ATA_IDENTIFY_DEVICE_DATA_T*)
276230557Sjimharris      ata_input_data;
277230557Sjimharris
278230557Sjimharris   U8   data_length = (U8) sati_mode_sense_calculate_page_header(scsi_io, 6)
279230557Sjimharris      + SCSI_MODE_PAGE_02_LENGTH ;
280230557Sjimharris
281230557Sjimharris   U32  page_offset = sati_mode_sense_6_translate_data(
282230557Sjimharris                         sequence, identify, scsi_io, data_length
283230557Sjimharris                      );
284230557Sjimharris
285230557Sjimharris   sati_mode_sense_disconnect_reconnect_translate_data(
286230557Sjimharris      sequence, scsi_io, identify, page_offset
287230557Sjimharris   );
288230557Sjimharris}
289230557Sjimharris
290230557Sjimharris/**
291230557Sjimharris* @brief This method will perform data translation from the supplied ATA
292230557Sjimharris*        input data (i.e. an ATA IDENTIFY DEVICE block) into a READ WRITE ERROR
293230557Sjimharris*        mode page format.  The data will be written
294230557Sjimharris*        into the user's mode page data buffer.  This function operates
295230557Sjimharris*        specifically for MODE SENSE 6 commands.
296230557Sjimharris*        For more information on the parameters passed to this method,
297230557Sjimharris*        please reference sati_translate_data().
298230557Sjimharris*
299230557Sjimharris* @return none.
300230557Sjimharris*/
301230557Sjimharrisvoid sati_mode_sense_6_read_write_error_translate_data(
302230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
303230557Sjimharris   void                       * ata_input_data,
304230557Sjimharris   void                       * scsi_io
305230557Sjimharris)
306230557Sjimharris{
307230557Sjimharris   ATA_IDENTIFY_DEVICE_DATA_T * identify = (ATA_IDENTIFY_DEVICE_DATA_T*)
308230557Sjimharris      ata_input_data;
309230557Sjimharris
310230557Sjimharris   U8   data_length = (U8) sati_mode_sense_calculate_page_header(scsi_io, 6)
311230557Sjimharris      + SCSI_MODE_PAGE_01_LENGTH;
312230557Sjimharris
313230557Sjimharris   U32  page_offset = sati_mode_sense_6_translate_data(
314230557Sjimharris                         sequence, identify, scsi_io, data_length
315230557Sjimharris                      );
316230557Sjimharris
317230557Sjimharris   sati_mode_sense_read_write_error_translate_data(
318230557Sjimharris      sequence, scsi_io, identify, page_offset
319230557Sjimharris   );
320230557Sjimharris}
321230557Sjimharris
322230557Sjimharris/**
323230557Sjimharris* @brief This method will perform data translation from the supplied ATA
324230557Sjimharris*        input data (i.e. an ATA IDENTIFY DEVICE block) into a CONTROL
325230557Sjimharris*        mode page format.  The data will be written
326230557Sjimharris*        into the user's mode page data buffer.  This function operates
327230557Sjimharris*        specifically for MODE SENSE 6 commands.
328230557Sjimharris*        For more information on the parameters passed to this method,
329230557Sjimharris*        please reference sati_translate_data().
330230557Sjimharris*
331230557Sjimharris* @return none.
332230557Sjimharris*/
333230557Sjimharrisvoid sati_mode_sense_6_control_translate_data(
334230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
335230557Sjimharris   void                       * ata_input_data,
336230557Sjimharris   void                       * scsi_io
337230557Sjimharris)
338230557Sjimharris{
339230557Sjimharris   ATA_IDENTIFY_DEVICE_DATA_T * identify = (ATA_IDENTIFY_DEVICE_DATA_T*)
340230557Sjimharris      ata_input_data;
341230557Sjimharris
342230557Sjimharris   U8   data_length = (U8) sati_mode_sense_calculate_page_header(scsi_io, 6)
343230557Sjimharris      + SCSI_MODE_PAGE_0A_LENGTH;
344230557Sjimharris
345230557Sjimharris   U32  page_offset = sati_mode_sense_6_translate_data(
346230557Sjimharris                         sequence, identify, scsi_io, data_length
347230557Sjimharris                      );
348230557Sjimharris
349230557Sjimharris   sati_mode_sense_control_translate_data(
350230557Sjimharris      sequence, scsi_io, identify, page_offset
351230557Sjimharris   );
352230557Sjimharris}
353230557Sjimharris
354230557Sjimharris/**
355230557Sjimharris* @brief This method will perform data translation from the supplied ATA
356230557Sjimharris*        input data (i.e. an ATA IDENTIFY DEVICE block) into a Power
357230557Sjimharris*        Condition mode page format.  The data will be written
358230557Sjimharris*        into the user's mode page data buffer.  This function operates
359230557Sjimharris*        specifically for MODE SENSE 6 commands.
360230557Sjimharris*        For more information on the parameters passed to this method,
361230557Sjimharris*        please reference sati_translate_data().
362230557Sjimharris*
363230557Sjimharris* @return none.
364230557Sjimharris*/
365230557Sjimharrisvoid sati_mode_sense_6_power_condition_translate_data(
366230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
367230557Sjimharris   void                       * ata_input_data,
368230557Sjimharris   void                       * scsi_io
369230557Sjimharris)
370230557Sjimharris{
371230557Sjimharris   ATA_IDENTIFY_DEVICE_DATA_T * identify = (ATA_IDENTIFY_DEVICE_DATA_T*)
372230557Sjimharris      ata_input_data;
373230557Sjimharris
374230557Sjimharris   U8 data_length;
375230557Sjimharris   U32  page_offset;
376230557Sjimharris
377230557Sjimharris   data_length = (U8) sati_mode_sense_calculate_page_header(scsi_io, 6)
378230557Sjimharris         + SCSI_MODE_PAGE_1A_LENGTH;
379230557Sjimharris
380230557Sjimharris   page_offset = sati_mode_sense_6_translate_data(
381230557Sjimharris         sequence, identify, scsi_io, data_length
382230557Sjimharris   );
383230557Sjimharris
384230557Sjimharris   sati_mode_sense_power_condition_translate_data(
385230557Sjimharris      sequence, scsi_io, identify, page_offset
386230557Sjimharris   );
387230557Sjimharris}
388230557Sjimharris
389230557Sjimharris
390230557Sjimharris
391230557Sjimharris/**
392230557Sjimharris * @brief This method will perform data translation from the supplied ATA
393230557Sjimharris *        input data (i.e. an ATA IDENTIFY DEVICE block) into an ALL
394230557Sjimharris *        PAGES mode page format.  The ALL PAGES mode page is basically a
395230557Sjimharris *        conglomeration of all mode pages and sub-pages into a single
396230557Sjimharris *        page.  The data will be written into the user's mode page
397230557Sjimharris *        data buffer.  This function operates specifically for MODE
398230557Sjimharris *        SENSE 6 commands.
399230557Sjimharris *        For more information on the parameters passed to this method,
400230557Sjimharris *        please reference sati_translate_data().
401230557Sjimharris *
402230557Sjimharris * @return none.
403230557Sjimharris */
404230557Sjimharrisvoid sati_mode_sense_6_all_pages_translate_data(
405230557Sjimharris   SATI_TRANSLATOR_SEQUENCE_T * sequence,
406230557Sjimharris   void                       * ata_input_data,
407230557Sjimharris   void                       * scsi_io
408230557Sjimharris)
409230557Sjimharris{
410230557Sjimharris   ATA_IDENTIFY_DEVICE_DATA_T * identify = (ATA_IDENTIFY_DEVICE_DATA_T*)
411230557Sjimharris                                           ata_input_data;
412230557Sjimharris   U8   data_length = (U8) sati_mode_sense_calculate_page_header(scsi_io, 6)
413230557Sjimharris                           + SCSI_MODE_PAGE_01_LENGTH
414230557Sjimharris                           + SCSI_MODE_PAGE_02_LENGTH
415230557Sjimharris                           + SCSI_MODE_PAGE_08_LENGTH
416230557Sjimharris                           + SCSI_MODE_PAGE_0A_LENGTH
417230557Sjimharris                           + SCSI_MODE_PAGE_1C_LENGTH;
418230557Sjimharris
419230557Sjimharris   U32  page_offset = sati_mode_sense_6_translate_data(
420230557Sjimharris                         sequence, identify, scsi_io, data_length
421230557Sjimharris                      );
422230557Sjimharris
423230557Sjimharris   sati_mode_sense_all_pages_translate_data(
424230557Sjimharris      sequence, scsi_io, identify, page_offset
425230557Sjimharris   );
426230557Sjimharris}
427230557Sjimharris
428230557Sjimharris#endif // !defined(DISABLE_SATI_MODE_SENSE)
429230557Sjimharris
430