sati_write_and_verify.c revision 330897
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3 *
4 * This file is provided under a dual BSD/GPLv2 license.  When using or
5 * redistributing this file, you may do so under either license.
6*
7* GPL LICENSE SUMMARY
8*
9* Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10*
11* This program is free software; you can redistribute it and/or modify
12* it under the terms of version 2 of the GNU General Public License as
13* published by the Free Software Foundation.
14*
15* This program is distributed in the hope that it will be useful, but
16* WITHOUT ANY WARRANTY; without even the implied warranty of
17* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18* General Public License for more details.
19*
20* You should have received a copy of the GNU General Public License
21* along with this program; if not, write to the Free Software
22* Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23* The full GNU General Public License is included in this distribution
24* in the file called LICENSE.GPL.
25*
26* BSD LICENSE
27*
28* Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29* All rights reserved.
30*
31* Redistribution and use in source and binary forms, with or without
32* modification, are permitted provided that the following conditions
33* are met:
34*
35*   * Redistributions of source code must retain the above copyright
36*     notice, this list of conditions and the following disclaimer.
37*   * Redistributions in binary form must reproduce the above copyright
38*     notice, this list of conditions and the following disclaimer in
39*     the documentation and/or other materials provided with the
40*     distribution.
41*
42* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53 */
54
55#include <sys/cdefs.h>
56__FBSDID("$FreeBSD: stable/11/sys/dev/isci/scil/sati_write_and_verify.c 330897 2018-03-14 03:19:51Z eadler $");
57
58/**
59* @file
60* @brief This file contains the method implementations to translate
61*        SCSI Write and Verify command based of the SAT spec.
62*/
63
64#if !defined(DISABLE_SATI_WRITE_AND_VERIFY)
65
66#include <dev/isci/scil/sati_write_and_verify.h>
67#include <dev/isci/scil/sati_write.h>
68#include <dev/isci/scil/sati_verify.h>
69#include <dev/isci/scil/sati_callbacks.h>
70#include <dev/isci/scil/sati_util.h>
71
72#include <dev/isci/scil/intel_ata.h>
73#include <dev/isci/scil/intel_scsi.h>
74
75/**
76* @brief This function translates a SCSI Write and Verify 10 command
77*        into both ATA write and ATA read verify commands. This
78*        happens by passing the SCSI IO, ATA IO, and Sequence pointers
79*        to both the sati_write_10_translate_command and the
80*        sati_verify_10_translate_command.
81*
82* @return Indicate if the command translation succeeded.
83* @retval SCI_SUCCESS This is returned if the command translation was
84*         successful.
85* @retval SATI_FAILURE_CHECK_RESPONSE_DATA is returned if there was
86*         a problem with the translation of write long.
87* @retval SATI_FAILURE is returned if there the sequence is out of
88*         state for a sati_write_and_verify_10 translation.
89*
90*/
91SATI_STATUS sati_write_and_verify_10_translate_command(
92   SATI_TRANSLATOR_SEQUENCE_T * sequence,
93   void                       * scsi_io,
94   void                       * ata_io
95)
96{
97   SATI_STATUS status;
98
99   if(sequence->state == SATI_SEQUENCE_STATE_INITIAL)
100   {
101      status = sati_write_10_translate_command(sequence, scsi_io, ata_io);
102      sequence->state = SATI_SEQUENCE_STATE_INCOMPLETE;
103      sequence->is_translate_response_required = TRUE;
104   }
105   else if(sequence->state == SATI_SEQUENCE_STATE_INCOMPLETE)
106   {
107      status = sati_verify_10_translate_command(sequence, scsi_io, ata_io);
108      sequence->state = SATI_SEQUENCE_STATE_AWAIT_RESPONSE;
109   }
110   else
111   {
112      //SATI sequence is in the wrong state
113      return SATI_FAILURE;
114   }
115
116   sequence->type = SATI_SEQUENCE_WRITE_AND_VERIFY;
117   return status;
118}
119
120/**
121* @brief This function translates a SCSI Write and Verify 12 command
122*        into both ATA write and ATA read verify commands. This
123*        happens by passing the SCSI IO, ATA IO, and Sequence pointers
124*        to both the sati_write_12_translate_command and the
125*        sati_verify_12_translate_command.
126*
127* @return Indicate if the command translation succeeded.
128* @retval SCI_SUCCESS This is returned if the command translation was
129*         successful.
130* @retval SATI_FAILURE_CHECK_RESPONSE_DATA is returned if there was
131*         a problem with the translation of write long.
132* @retval SATI_FAILURE is returned if there the sequence is out of
133*         state for a sati_write_and_verify_12 translation.
134*
135*/
136SATI_STATUS sati_write_and_verify_12_translate_command(
137   SATI_TRANSLATOR_SEQUENCE_T * sequence,
138   void                       * scsi_io,
139   void                       * ata_io
140)
141{
142   SATI_STATUS status;
143
144   if(sequence->state == SATI_SEQUENCE_STATE_INITIAL)
145   {
146      status = sati_write_12_translate_command(sequence, scsi_io, ata_io);
147      sequence->state = SATI_SEQUENCE_STATE_INCOMPLETE;
148      sequence->is_translate_response_required = TRUE;
149   }
150   else if(sequence->state == SATI_SEQUENCE_STATE_INCOMPLETE)
151   {
152      status = sati_verify_12_translate_command(sequence, scsi_io, ata_io);
153      sequence->state = SATI_SEQUENCE_STATE_AWAIT_RESPONSE;
154   }
155   else
156   {
157      //SATI sequence is in the wrong state
158      return SATI_FAILURE;
159   }
160
161   sequence->type = SATI_SEQUENCE_WRITE_AND_VERIFY;
162   return status;
163}
164
165/**
166* @brief This function translates a SCSI Write and Verify 16 command
167*        into both ATA write and ATA read verify commands. This
168*        happens by passing the SCSI IO, ATA IO, and Sequence pointers
169*        to both the sati_write_16_translate_command and the
170*        sati_verify_16_translate_command.
171*
172* @return Indicate if the command translation succeeded.
173* @retval SCI_SUCCESS This is returned if the command translation was
174*         successful.
175* @retval SATI_FAILURE_CHECK_RESPONSE_DATA is returned if there was
176*         a problem with the translation of write long.
177* @retval SATI_FAILURE is returned if there the sequence is out of
178*         state for a sati_write_and_verify_16 translation.
179*
180*/
181SATI_STATUS sati_write_and_verify_16_translate_command(
182   SATI_TRANSLATOR_SEQUENCE_T * sequence,
183   void                       * scsi_io,
184   void                       * ata_io
185)
186{
187   SATI_STATUS status;
188
189   if(sequence->state == SATI_SEQUENCE_STATE_INITIAL)
190   {
191      status = sati_write_16_translate_command(sequence, scsi_io, ata_io);
192      sequence->state = SATI_SEQUENCE_STATE_INCOMPLETE;
193      sequence->is_translate_response_required = TRUE;
194   }
195   else if(sequence->state == SATI_SEQUENCE_STATE_INCOMPLETE)
196   {
197      status = sati_verify_16_translate_command(sequence, scsi_io, ata_io);
198      sequence->state = SATI_SEQUENCE_STATE_AWAIT_RESPONSE;
199   }
200   else
201   {
202      //SATI sequence is in the wrong state
203      return SATI_FAILURE;
204   }
205
206   sequence->type = SATI_SEQUENCE_WRITE_AND_VERIFY;
207   return status;
208}
209
210/**
211* @brief This function is the response to a sati_write_and_verify
212         translation. Since no response translation is required
213         this function will only check the sequence state and return
214         status.
215*
216* @return Indicate if the command response translation succeeded.
217* @retval SCI_COMPLETE This is returned if the command translation
218          is successful and requires no more work.
219* @retval SATI_SEQUENCE_INCOMPLETE This is returned if the command
220          translation has finished sending the ATA Write command but
221          still needs to complete the Verify portion.
222* @retval SATI_FAILURE is returned if there the sequence is out of
223*         state for a sati_write_and_verify translation.
224*
225*/
226SATI_STATUS sati_write_and_verify_translate_response(
227   SATI_TRANSLATOR_SEQUENCE_T * sequence,
228   void                       * scsi_io,
229   void                       * ata_io
230)
231{
232   if(sequence->state == SATI_SEQUENCE_STATE_INCOMPLETE)
233   {
234      return SATI_SEQUENCE_INCOMPLETE;
235   }
236   else if(sequence->state == SATI_SEQUENCE_STATE_AWAIT_RESPONSE)
237   {
238      sequence->state = SATI_SEQUENCE_STATE_FINAL;
239      return SATI_COMPLETE;
240   }
241
242   return SATI_FAILURE;
243}
244
245#endif //!defined(DISABLE_SATI_WRITE_AND_VERIFY)
246