isci: unify phy start handlers
[pandora-kernel.git] / drivers / scsi / isci / phy.h
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  *   * Neither the name of Intel Corporation nor the names of its
40  *     contributors may be used to endorse or promote products derived
41  *     from this software without specific prior written permission.
42  *
43  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
44  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
45  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
46  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
47  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
48  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
49  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
50  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
51  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
52  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
53  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54  */
55 #ifndef _ISCI_PHY_H_
56 #define _ISCI_PHY_H_
57
58 #include <scsi/sas.h>
59 #include <scsi/libsas.h>
60 #include "state_machine.h"
61 #include "sas.h"
62
63 /* This is the timeout value for the SATA phy to wait for a SIGNATURE FIS
64  * before restarting the starting state machine.  Technically, the old parallel
65  * ATA specification required up to 30 seconds for a device to issue its
66  * signature FIS as a result of a soft reset.  Now we see that devices respond
67  * generally within 15 seconds, but we'll use 25 for now.
68  */
69 #define SCIC_SDS_SIGNATURE_FIS_TIMEOUT    25000
70
71 /* This is the timeout for the SATA OOB/SN because the hardware does not
72  * recognize a hot plug after OOB signal but before the SN signals.  We need to
73  * make sure after a hotplug timeout if we have not received the speed event
74  * notification from the hardware that we restart the hardware OOB state
75  * machine.
76  */
77 #define SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT  250
78
79 enum scic_sds_phy_protocol {
80         SCIC_SDS_PHY_PROTOCOL_UNKNOWN,
81         SCIC_SDS_PHY_PROTOCOL_SAS,
82         SCIC_SDS_PHY_PROTOCOL_SATA,
83         SCIC_SDS_MAX_PHY_PROTOCOLS
84 };
85
86 /**
87  * struct scic_sds_phy - This structure  contains or references all of the data
88  *    necessary to represent the core phy object and SCU harware protocol
89  *    engine.
90  *
91  *
92  */
93 struct scic_sds_phy {
94         /**
95          * This field contains the information for the base phy state machine.
96          */
97         struct sci_base_state_machine state_machine;
98
99         /**
100          * This field specifies the port object that owns/contains this phy.
101          */
102         struct scic_sds_port *owning_port;
103
104         /**
105          * This field indicates whether the phy supports 1.5 Gb/s, 3.0 Gb/s,
106          * or 6.0 Gb/s operation.
107          */
108         enum sas_linkrate max_negotiated_speed;
109
110         /**
111          * This member specifies the protocol being utilized on this phy.  This
112          * field contains a legitamite value once the PHY has link trained with
113          * a remote phy.
114          */
115         enum scic_sds_phy_protocol protocol;
116
117         /**
118          * This field specifies the index with which this phy is associated (0-3).
119          */
120         u8 phy_index;
121
122         /**
123          * This member indicates if this particular PHY has received a BCN while
124          * it had no port assignement.  This BCN will be reported once the phy is
125          * assigned to a port.
126          */
127         bool bcn_received_while_port_unassigned;
128
129         /**
130          * This field indicates if this PHY is currently in the process of
131          * link training (i.e. it has started OOB, but has yet to perform
132          * IAF exchange/Signature FIS reception).
133          */
134         bool is_in_link_training;
135
136         /**
137          * This field contains a reference to the timer utilized in detecting
138          * when a signature FIS timeout has occurred.  The signature FIS is the
139          * first FIS sent by an attached SATA device after OOB/SN.
140          */
141         void *sata_timeout_timer;
142
143         const struct scic_sds_phy_state_handler *state_handlers;
144
145         /**
146          * This field is the pointer to the transport layer register for the SCU
147          * hardware.
148          */
149         struct scu_transport_layer_registers __iomem *transport_layer_registers;
150
151         /**
152          * This field points to the link layer register set within the SCU.
153          */
154         struct scu_link_layer_registers __iomem *link_layer_registers;
155
156 };
157
158
159 struct isci_phy {
160         struct scic_sds_phy sci;
161         struct asd_sas_phy sas_phy;
162         struct isci_port *isci_port;
163         u8 sas_addr[SAS_ADDR_SIZE];
164
165         union {
166                 struct sas_identify_frame iaf;
167                 struct dev_to_host_fis fis;
168         } frame_rcvd;
169 };
170
171 static inline struct isci_phy *to_isci_phy(struct asd_sas_phy *sas_phy)
172 {
173         struct isci_phy *iphy = container_of(sas_phy, typeof(*iphy), sas_phy);
174
175         return iphy;
176 }
177
178 static inline struct isci_phy *sci_phy_to_iphy(struct scic_sds_phy *sci_phy)
179 {
180         struct isci_phy *iphy = container_of(sci_phy, typeof(*iphy), sci);
181
182         return iphy;
183 }
184
185 struct scic_phy_cap {
186         union {
187                 struct {
188                         /*
189                          * The SAS specification indicates the start bit shall
190                          * always be set to
191                          * 1.  This implementation will have the start bit set
192                          * to 0 if the PHY CAPABILITIES were either not
193                          * received or speed negotiation failed.
194                          */
195                         u8 start:1;
196                         u8 tx_ssc_type:1;
197                         u8 res1:2;
198                         u8 req_logical_linkrate:4;
199
200                         u32 gen1_no_ssc:1;
201                         u32 gen1_ssc:1;
202                         u32 gen2_no_ssc:1;
203                         u32 gen2_ssc:1;
204                         u32 gen3_no_ssc:1;
205                         u32 gen3_ssc:1;
206                         u32 res2:17;
207                         u32 parity:1;
208                 };
209                 u32 all;
210         };
211 }  __packed;
212
213 /* this data structure reflects the link layer transmit identification reg */
214 struct scic_phy_proto {
215         union {
216                 struct {
217                         u16 _r_a:1;
218                         u16 smp_iport:1;
219                         u16 stp_iport:1;
220                         u16 ssp_iport:1;
221                         u16 _r_b:4;
222                         u16 _r_c:1;
223                         u16 smp_tport:1;
224                         u16 stp_tport:1;
225                         u16 ssp_tport:1;
226                         u16 _r_d:4;
227                 };
228                 u16 all;
229         };
230 } __packed;
231
232
233 /**
234  * struct scic_phy_properties - This structure defines the properties common to
235  *    all phys that can be retrieved.
236  *
237  *
238  */
239 struct scic_phy_properties {
240         /**
241          * This field specifies the port that currently contains the
242          * supplied phy.  This field may be set to NULL
243          * if the phy is not currently contained in a port.
244          */
245         struct scic_sds_port *owning_port;
246
247         /**
248          * This field specifies the link rate at which the phy is
249          * currently operating.
250          */
251         enum sas_linkrate negotiated_link_rate;
252
253         /**
254          * This field specifies the index of the phy in relation to other
255          * phys within the controller.  This index is zero relative.
256          */
257         u8 index;
258 };
259
260 /**
261  * struct scic_sas_phy_properties - This structure defines the properties,
262  *    specific to a SAS phy, that can be retrieved.
263  *
264  *
265  */
266 struct scic_sas_phy_properties {
267         /**
268          * This field delineates the Identify Address Frame received
269          * from the remote end point.
270          */
271         struct sas_identify_frame rcvd_iaf;
272
273         /**
274          * This field delineates the Phy capabilities structure received
275          * from the remote end point.
276          */
277         struct scic_phy_cap rcvd_cap;
278
279 };
280
281 /**
282  * struct scic_sata_phy_properties - This structure defines the properties,
283  *    specific to a SATA phy, that can be retrieved.
284  *
285  *
286  */
287 struct scic_sata_phy_properties {
288         /**
289          * This field delineates the signature FIS received from the
290          * attached target.
291          */
292         struct dev_to_host_fis signature_fis;
293
294         /**
295          * This field specifies to the user if a port selector is connected
296          * on the specified phy.
297          */
298         bool is_port_selector_present;
299
300 };
301
302 /**
303  * enum scic_phy_counter_id - This enumeration depicts the various pieces of
304  *    optional information that can be retrieved for a specific phy.
305  *
306  *
307  */
308 enum scic_phy_counter_id {
309         /**
310          * This PHY information field tracks the number of frames received.
311          */
312         SCIC_PHY_COUNTER_RECEIVED_FRAME,
313
314         /**
315          * This PHY information field tracks the number of frames transmitted.
316          */
317         SCIC_PHY_COUNTER_TRANSMITTED_FRAME,
318
319         /**
320          * This PHY information field tracks the number of DWORDs received.
321          */
322         SCIC_PHY_COUNTER_RECEIVED_FRAME_WORD,
323
324         /**
325          * This PHY information field tracks the number of DWORDs transmitted.
326          */
327         SCIC_PHY_COUNTER_TRANSMITTED_FRAME_DWORD,
328
329         /**
330          * This PHY information field tracks the number of times DWORD
331          * synchronization was lost.
332          */
333         SCIC_PHY_COUNTER_LOSS_OF_SYNC_ERROR,
334
335         /**
336          * This PHY information field tracks the number of received DWORDs with
337          * running disparity errors.
338          */
339         SCIC_PHY_COUNTER_RECEIVED_DISPARITY_ERROR,
340
341         /**
342          * This PHY information field tracks the number of received frames with a
343          * CRC error (not including short or truncated frames).
344          */
345         SCIC_PHY_COUNTER_RECEIVED_FRAME_CRC_ERROR,
346
347         /**
348          * This PHY information field tracks the number of DONE (ACK/NAK TIMEOUT)
349          * primitives received.
350          */
351         SCIC_PHY_COUNTER_RECEIVED_DONE_ACK_NAK_TIMEOUT,
352
353         /**
354          * This PHY information field tracks the number of DONE (ACK/NAK TIMEOUT)
355          * primitives transmitted.
356          */
357         SCIC_PHY_COUNTER_TRANSMITTED_DONE_ACK_NAK_TIMEOUT,
358
359         /**
360          * This PHY information field tracks the number of times the inactivity
361          * timer for connections on the phy has been utilized.
362          */
363         SCIC_PHY_COUNTER_INACTIVITY_TIMER_EXPIRED,
364
365         /**
366          * This PHY information field tracks the number of DONE (CREDIT TIMEOUT)
367          * primitives received.
368          */
369         SCIC_PHY_COUNTER_RECEIVED_DONE_CREDIT_TIMEOUT,
370
371         /**
372          * This PHY information field tracks the number of DONE (CREDIT TIMEOUT)
373          * primitives transmitted.
374          */
375         SCIC_PHY_COUNTER_TRANSMITTED_DONE_CREDIT_TIMEOUT,
376
377         /**
378          * This PHY information field tracks the number of CREDIT BLOCKED
379          * primitives received.
380          * @note Depending on remote device implementation, credit blocks
381          *       may occur regularly.
382          */
383         SCIC_PHY_COUNTER_RECEIVED_CREDIT_BLOCKED,
384
385         /**
386          * This PHY information field contains the number of short frames
387          * received.  A short frame is simply a frame smaller then what is
388          * allowed by either the SAS or SATA specification.
389          */
390         SCIC_PHY_COUNTER_RECEIVED_SHORT_FRAME,
391
392         /**
393          * This PHY information field contains the number of frames received after
394          * credit has been exhausted.
395          */
396         SCIC_PHY_COUNTER_RECEIVED_FRAME_WITHOUT_CREDIT,
397
398         /**
399          * This PHY information field contains the number of frames received after
400          * a DONE has been received.
401          */
402         SCIC_PHY_COUNTER_RECEIVED_FRAME_AFTER_DONE,
403
404         /**
405          * This PHY information field contains the number of times the phy
406          * failed to achieve DWORD synchronization during speed negotiation.
407          */
408         SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR
409 };
410
411 enum scic_sds_phy_states {
412         /**
413          * Simply the initial state for the base domain state machine.
414          */
415         SCI_BASE_PHY_STATE_INITIAL,
416
417         /**
418          * This state indicates that the phy has successfully been stopped.
419          * In this state no new IO operations are permitted on this phy.
420          * This state is entered from the INITIAL state.
421          * This state is entered from the STARTING state.
422          * This state is entered from the READY state.
423          * This state is entered from the RESETTING state.
424          */
425         SCI_BASE_PHY_STATE_STOPPED,
426
427         /**
428          * This state indicates that the phy is in the process of becomming
429          * ready.  In this state no new IO operations are permitted on this phy.
430          * This state is entered from the STOPPED state.
431          * This state is entered from the READY state.
432          * This state is entered from the RESETTING state.
433          */
434         SCI_BASE_PHY_STATE_STARTING,
435
436         /**
437          * Initial state
438          */
439         SCIC_SDS_PHY_STARTING_SUBSTATE_INITIAL,
440
441         /**
442          * Wait state for the hardware OSSP event type notification
443          */
444         SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_OSSP_EN,
445
446         /**
447          * Wait state for the PHY speed notification
448          */
449         SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_SPEED_EN,
450
451         /**
452          * Wait state for the IAF Unsolicited frame notification
453          */
454         SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_IAF_UF,
455
456         /**
457          * Wait state for the request to consume power
458          */
459         SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SAS_POWER,
460
461         /**
462          * Wait state for request to consume power
463          */
464         SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_POWER,
465
466         /**
467          * Wait state for the SATA PHY notification
468          */
469         SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_PHY_EN,
470
471         /**
472          * Wait for the SATA PHY speed notification
473          */
474         SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SATA_SPEED_EN,
475
476         /**
477          * Wait state for the SIGNATURE FIS unsolicited frame notification
478          */
479         SCIC_SDS_PHY_STARTING_SUBSTATE_AWAIT_SIG_FIS_UF,
480
481         /**
482          * Exit state for this state machine
483          */
484         SCIC_SDS_PHY_STARTING_SUBSTATE_FINAL,
485
486         /**
487          * This state indicates the the phy is now ready.  Thus, the user
488          * is able to perform IO operations utilizing this phy as long as it
489          * is currently part of a valid port.
490          * This state is entered from the STARTING state.
491          */
492         SCI_BASE_PHY_STATE_READY,
493
494         /**
495          * This state indicates that the phy is in the process of being reset.
496          * In this state no new IO operations are permitted on this phy.
497          * This state is entered from the READY state.
498          */
499         SCI_BASE_PHY_STATE_RESETTING,
500
501         /**
502          * Simply the final state for the base phy state machine.
503          */
504         SCI_BASE_PHY_STATE_FINAL,
505 };
506
507
508 typedef enum sci_status (*scic_sds_phy_handler_t)(struct scic_sds_phy *);
509 typedef enum sci_status (*scic_sds_phy_event_handler_t)(struct scic_sds_phy *, u32);
510 typedef enum sci_status (*scic_sds_phy_frame_handler_t)(struct scic_sds_phy *, u32);
511 typedef enum sci_status (*scic_sds_phy_power_handler_t)(struct scic_sds_phy *);
512
513 struct scic_sds_phy_state_handler {
514         /**
515          * The stop_handler specifies the method invoked when there is an
516          * attempt to stop a phy.
517          */
518         scic_sds_phy_handler_t stop_handler;
519
520         /**
521          * The reset_handler specifies the method invoked when there is an
522          * attempt to reset a phy.
523          */
524         scic_sds_phy_handler_t reset_handler;
525
526         /**
527          * The destruct_handler specifies the method invoked when attempting to
528          * destruct a phy.
529          */
530         scic_sds_phy_handler_t destruct_handler;
531
532         /**
533          * The state handler for unsolicited frames received from the SCU hardware.
534          */
535         scic_sds_phy_frame_handler_t frame_handler;
536
537         /**
538          * The state handler for events received from the SCU hardware.
539          */
540         scic_sds_phy_event_handler_t event_handler;
541
542         /**
543          * The state handler for staggered spinup.
544          */
545         scic_sds_phy_power_handler_t consume_power_handler;
546
547 };
548
549 /**
550  * scic_sds_phy_get_index() -
551  *
552  * This macro returns the phy index for the specified phy
553  */
554 #define scic_sds_phy_get_index(phy) \
555         ((phy)->phy_index)
556
557 /**
558  * scic_sds_phy_get_controller() - This macro returns the controller for this
559  *    phy
560  *
561  *
562  */
563 #define scic_sds_phy_get_controller(phy) \
564         (scic_sds_port_get_controller((phy)->owning_port))
565
566 /**
567  * scic_sds_phy_set_state_handlers() - This macro sets the state handlers for
568  *    this phy object
569  *
570  *
571  */
572 #define scic_sds_phy_set_state_handlers(phy, handlers) \
573         ((phy)->state_handlers = (handlers))
574
575 /**
576  * scic_sds_phy_set_base_state_handlers() -
577  *
578  * This macro set the base state handlers for the phy object.
579  */
580 #define scic_sds_phy_set_base_state_handlers(phy, state_id) \
581         scic_sds_phy_set_state_handlers(\
582                 (phy), \
583                 &scic_sds_phy_state_handler_table[(state_id)] \
584                 )
585
586 void scic_sds_phy_construct(
587         struct scic_sds_phy *this_phy,
588         struct scic_sds_port *owning_port,
589         u8 phy_index);
590
591 struct scic_sds_port *scic_sds_phy_get_port(
592         struct scic_sds_phy *this_phy);
593
594 void scic_sds_phy_set_port(
595         struct scic_sds_phy *this_phy,
596         struct scic_sds_port *owning_port);
597
598 enum sci_status scic_sds_phy_initialize(
599         struct scic_sds_phy *this_phy,
600         struct scu_transport_layer_registers __iomem *transport_layer_registers,
601         struct scu_link_layer_registers __iomem *link_layer_registers);
602
603 enum sci_status scic_sds_phy_start(
604         struct scic_sds_phy *this_phy);
605
606 enum sci_status scic_sds_phy_stop(
607         struct scic_sds_phy *this_phy);
608
609 enum sci_status scic_sds_phy_reset(
610         struct scic_sds_phy *this_phy);
611
612 void scic_sds_phy_resume(
613         struct scic_sds_phy *this_phy);
614
615 void scic_sds_phy_setup_transport(
616         struct scic_sds_phy *this_phy,
617         u32 device_id);
618
619 enum sci_status scic_sds_phy_event_handler(
620         struct scic_sds_phy *this_phy,
621         u32 event_code);
622
623 enum sci_status scic_sds_phy_frame_handler(
624         struct scic_sds_phy *this_phy,
625         u32 frame_index);
626
627 enum sci_status scic_sds_phy_consume_power_handler(
628         struct scic_sds_phy *this_phy);
629
630 void scic_sds_phy_get_sas_address(
631         struct scic_sds_phy *this_phy,
632         struct sci_sas_address *sas_address);
633
634 void scic_sds_phy_get_attached_sas_address(
635         struct scic_sds_phy *this_phy,
636         struct sci_sas_address *sas_address);
637
638 struct scic_phy_proto;
639 void scic_sds_phy_get_protocols(
640         struct scic_sds_phy *sci_phy,
641         struct scic_phy_proto *protocols);
642 enum sas_linkrate sci_phy_linkrate(struct scic_sds_phy *sci_phy);
643
644 struct isci_host;
645 void isci_phy_init(struct isci_phy *iphy, struct isci_host *ihost, int index);
646 int isci_phy_control(struct asd_sas_phy *phy, enum phy_func func, void *buf);
647
648 #endif /* !defined(_ISCI_PHY_H_) */