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.
7
* Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
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.
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.
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.
26
* Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27
* All rights reserved.
29
* Redistribution and use in source and binary forms, with or without
30
* modification, are permitted provided that the following conditions
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
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.
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.
59
#include <scsi/libsas.h>
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.
69
#define SCIC_SDS_SIGNATURE_FIS_TIMEOUT 25000
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
77
#define SCIC_SDS_SATA_LINK_TRAINING_TIMEOUT 250
79
enum sci_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
87
* isci_phy - hba local phy infrastructure
89
* @protocol: attached device protocol
90
* @phy_index: physical index relative to the controller (0-3)
91
* @bcn_received_while_port_unassigned: bcn to report after port association
92
* @sata_timer: timeout SATA signature FIS arrival
95
struct sci_base_state_machine sm;
96
struct isci_port *owning_port;
97
enum sas_linkrate max_negotiated_speed;
98
enum sci_phy_protocol protocol;
100
bool bcn_received_while_port_unassigned;
101
bool is_in_link_training;
102
struct sci_timer sata_timer;
103
struct scu_transport_layer_registers __iomem *transport_layer_registers;
104
struct scu_link_layer_registers __iomem *link_layer_registers;
105
struct asd_sas_phy sas_phy;
106
struct isci_port *isci_port;
107
u8 sas_addr[SAS_ADDR_SIZE];
109
struct sas_identify_frame iaf;
110
struct dev_to_host_fis fis;
114
static inline struct isci_phy *to_iphy(struct asd_sas_phy *sas_phy)
116
struct isci_phy *iphy = container_of(sas_phy, typeof(*iphy), sas_phy);
125
* The SAS specification indicates the start bit shall
127
* 1. This implementation will have the start bit set
128
* to 0 if the PHY CAPABILITIES were either not
129
* received or speed negotiation failed.
134
u8 req_logical_linkrate:4;
149
/* this data structure reflects the link layer transmit identification reg */
150
struct sci_phy_proto {
170
* struct sci_phy_properties - This structure defines the properties common to
171
* all phys that can be retrieved.
175
struct sci_phy_properties {
177
* This field specifies the port that currently contains the
178
* supplied phy. This field may be set to NULL
179
* if the phy is not currently contained in a port.
181
struct isci_port *iport;
184
* This field specifies the link rate at which the phy is
185
* currently operating.
187
enum sas_linkrate negotiated_link_rate;
190
* This field specifies the index of the phy in relation to other
191
* phys within the controller. This index is zero relative.
197
* struct sci_sas_phy_properties - This structure defines the properties,
198
* specific to a SAS phy, that can be retrieved.
202
struct sci_sas_phy_properties {
204
* This field delineates the Identify Address Frame received
205
* from the remote end point.
207
struct sas_identify_frame rcvd_iaf;
210
* This field delineates the Phy capabilities structure received
211
* from the remote end point.
213
struct sci_phy_cap rcvd_cap;
218
* struct sci_sata_phy_properties - This structure defines the properties,
219
* specific to a SATA phy, that can be retrieved.
223
struct sci_sata_phy_properties {
225
* This field delineates the signature FIS received from the
228
struct dev_to_host_fis signature_fis;
231
* This field specifies to the user if a port selector is connected
232
* on the specified phy.
234
bool is_port_selector_present;
239
* enum sci_phy_counter_id - This enumeration depicts the various pieces of
240
* optional information that can be retrieved for a specific phy.
244
enum sci_phy_counter_id {
246
* This PHY information field tracks the number of frames received.
248
SCIC_PHY_COUNTER_RECEIVED_FRAME,
251
* This PHY information field tracks the number of frames transmitted.
253
SCIC_PHY_COUNTER_TRANSMITTED_FRAME,
256
* This PHY information field tracks the number of DWORDs received.
258
SCIC_PHY_COUNTER_RECEIVED_FRAME_WORD,
261
* This PHY information field tracks the number of DWORDs transmitted.
263
SCIC_PHY_COUNTER_TRANSMITTED_FRAME_DWORD,
266
* This PHY information field tracks the number of times DWORD
267
* synchronization was lost.
269
SCIC_PHY_COUNTER_LOSS_OF_SYNC_ERROR,
272
* This PHY information field tracks the number of received DWORDs with
273
* running disparity errors.
275
SCIC_PHY_COUNTER_RECEIVED_DISPARITY_ERROR,
278
* This PHY information field tracks the number of received frames with a
279
* CRC error (not including short or truncated frames).
281
SCIC_PHY_COUNTER_RECEIVED_FRAME_CRC_ERROR,
284
* This PHY information field tracks the number of DONE (ACK/NAK TIMEOUT)
285
* primitives received.
287
SCIC_PHY_COUNTER_RECEIVED_DONE_ACK_NAK_TIMEOUT,
290
* This PHY information field tracks the number of DONE (ACK/NAK TIMEOUT)
291
* primitives transmitted.
293
SCIC_PHY_COUNTER_TRANSMITTED_DONE_ACK_NAK_TIMEOUT,
296
* This PHY information field tracks the number of times the inactivity
297
* timer for connections on the phy has been utilized.
299
SCIC_PHY_COUNTER_INACTIVITY_TIMER_EXPIRED,
302
* This PHY information field tracks the number of DONE (CREDIT TIMEOUT)
303
* primitives received.
305
SCIC_PHY_COUNTER_RECEIVED_DONE_CREDIT_TIMEOUT,
308
* This PHY information field tracks the number of DONE (CREDIT TIMEOUT)
309
* primitives transmitted.
311
SCIC_PHY_COUNTER_TRANSMITTED_DONE_CREDIT_TIMEOUT,
314
* This PHY information field tracks the number of CREDIT BLOCKED
315
* primitives received.
316
* @note Depending on remote device implementation, credit blocks
317
* may occur regularly.
319
SCIC_PHY_COUNTER_RECEIVED_CREDIT_BLOCKED,
322
* This PHY information field contains the number of short frames
323
* received. A short frame is simply a frame smaller then what is
324
* allowed by either the SAS or SATA specification.
326
SCIC_PHY_COUNTER_RECEIVED_SHORT_FRAME,
329
* This PHY information field contains the number of frames received after
330
* credit has been exhausted.
332
SCIC_PHY_COUNTER_RECEIVED_FRAME_WITHOUT_CREDIT,
335
* This PHY information field contains the number of frames received after
336
* a DONE has been received.
338
SCIC_PHY_COUNTER_RECEIVED_FRAME_AFTER_DONE,
341
* This PHY information field contains the number of times the phy
342
* failed to achieve DWORD synchronization during speed negotiation.
344
SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR
347
enum sci_phy_states {
349
* Simply the initial state for the base domain state machine.
354
* This state indicates that the phy has successfully been stopped.
355
* In this state no new IO operations are permitted on this phy.
356
* This state is entered from the INITIAL state.
357
* This state is entered from the STARTING state.
358
* This state is entered from the READY state.
359
* This state is entered from the RESETTING state.
364
* This state indicates that the phy is in the process of becomming
365
* ready. In this state no new IO operations are permitted on this phy.
366
* This state is entered from the STOPPED state.
367
* This state is entered from the READY state.
368
* This state is entered from the RESETTING state.
378
* Wait state for the hardware OSSP event type notification
380
SCI_PHY_SUB_AWAIT_OSSP_EN,
383
* Wait state for the PHY speed notification
385
SCI_PHY_SUB_AWAIT_SAS_SPEED_EN,
388
* Wait state for the IAF Unsolicited frame notification
390
SCI_PHY_SUB_AWAIT_IAF_UF,
393
* Wait state for the request to consume power
395
SCI_PHY_SUB_AWAIT_SAS_POWER,
398
* Wait state for request to consume power
400
SCI_PHY_SUB_AWAIT_SATA_POWER,
403
* Wait state for the SATA PHY notification
405
SCI_PHY_SUB_AWAIT_SATA_PHY_EN,
408
* Wait for the SATA PHY speed notification
410
SCI_PHY_SUB_AWAIT_SATA_SPEED_EN,
413
* Wait state for the SIGNATURE FIS unsolicited frame notification
415
SCI_PHY_SUB_AWAIT_SIG_FIS_UF,
418
* Exit state for this state machine
423
* This state indicates the the phy is now ready. Thus, the user
424
* is able to perform IO operations utilizing this phy as long as it
425
* is currently part of a valid port.
426
* This state is entered from the STARTING state.
431
* This state indicates that the phy is in the process of being reset.
432
* In this state no new IO operations are permitted on this phy.
433
* This state is entered from the READY state.
438
* Simply the final state for the base phy state machine.
443
void sci_phy_construct(
444
struct isci_phy *iphy,
445
struct isci_port *iport,
448
struct isci_port *phy_get_non_dummy_port(struct isci_phy *iphy);
450
void sci_phy_set_port(
451
struct isci_phy *iphy,
452
struct isci_port *iport);
454
enum sci_status sci_phy_initialize(
455
struct isci_phy *iphy,
456
struct scu_transport_layer_registers __iomem *transport_layer_registers,
457
struct scu_link_layer_registers __iomem *link_layer_registers);
459
enum sci_status sci_phy_start(
460
struct isci_phy *iphy);
462
enum sci_status sci_phy_stop(
463
struct isci_phy *iphy);
465
enum sci_status sci_phy_reset(
466
struct isci_phy *iphy);
469
struct isci_phy *iphy);
471
void sci_phy_setup_transport(
472
struct isci_phy *iphy,
475
enum sci_status sci_phy_event_handler(
476
struct isci_phy *iphy,
479
enum sci_status sci_phy_frame_handler(
480
struct isci_phy *iphy,
483
enum sci_status sci_phy_consume_power_handler(
484
struct isci_phy *iphy);
486
void sci_phy_get_sas_address(
487
struct isci_phy *iphy,
488
struct sci_sas_address *sas_address);
490
void sci_phy_get_attached_sas_address(
491
struct isci_phy *iphy,
492
struct sci_sas_address *sas_address);
494
struct sci_phy_proto;
495
void sci_phy_get_protocols(
496
struct isci_phy *iphy,
497
struct sci_phy_proto *protocols);
498
enum sas_linkrate sci_phy_linkrate(struct isci_phy *iphy);
501
void isci_phy_init(struct isci_phy *iphy, struct isci_host *ihost, int index);
502
int isci_phy_control(struct asd_sas_phy *phy, enum phy_func func, void *buf);
504
#endif /* !defined(_ISCI_PHY_H_) */