]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/scsi/isci/port.c
isci: unify can_queue tracking on the tci_pool, uplevel tag assignment
[karo-tx-linux.git] / drivers / scsi / isci / port.c
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
56 #include "isci.h"
57 #include "port.h"
58 #include "request.h"
59
60 #define SCIC_SDS_PORT_HARD_RESET_TIMEOUT  (1000)
61 #define SCU_DUMMY_INDEX    (0xFFFF)
62
63 static void isci_port_change_state(struct isci_port *iport, enum isci_status status)
64 {
65         unsigned long flags;
66
67         dev_dbg(&iport->isci_host->pdev->dev,
68                 "%s: iport = %p, state = 0x%x\n",
69                 __func__, iport, status);
70
71         /* XXX pointless lock */
72         spin_lock_irqsave(&iport->state_lock, flags);
73         iport->status = status;
74         spin_unlock_irqrestore(&iport->state_lock, flags);
75 }
76
77 /*
78  * This function will indicate which protocols are supported by this port.
79  * @sci_port: a handle corresponding to the SAS port for which to return the
80  *    supported protocols.
81  * @protocols: This parameter specifies a pointer to a data structure
82  *    which the core will copy the protocol values for the port from the
83  *    transmit_identification register.
84  */
85 static void
86 scic_sds_port_get_protocols(struct scic_sds_port *sci_port,
87                             struct scic_phy_proto *protocols)
88 {
89         u8 index;
90
91         protocols->all = 0;
92
93         for (index = 0; index < SCI_MAX_PHYS; index++) {
94                 if (sci_port->phy_table[index] != NULL) {
95                         scic_sds_phy_get_protocols(sci_port->phy_table[index],
96                                                    protocols);
97                 }
98         }
99 }
100
101 /**
102  * This method requests a list (mask) of the phys contained in the supplied SAS
103  *    port.
104  * @sci_port: a handle corresponding to the SAS port for which to return the
105  *    phy mask.
106  *
107  * Return a bit mask indicating which phys are a part of this port. Each bit
108  * corresponds to a phy identifier (e.g. bit 0 = phy id 0).
109  */
110 static u32 scic_sds_port_get_phys(struct scic_sds_port *sci_port)
111 {
112         u32 index;
113         u32 mask;
114
115         mask = 0;
116
117         for (index = 0; index < SCI_MAX_PHYS; index++) {
118                 if (sci_port->phy_table[index] != NULL) {
119                         mask |= (1 << index);
120                 }
121         }
122
123         return mask;
124 }
125
126 /**
127  * scic_port_get_properties() - This method simply returns the properties
128  *    regarding the port, such as: physical index, protocols, sas address, etc.
129  * @port: this parameter specifies the port for which to retrieve the physical
130  *    index.
131  * @properties: This parameter specifies the properties structure into which to
132  *    copy the requested information.
133  *
134  * Indicate if the user specified a valid port. SCI_SUCCESS This value is
135  * returned if the specified port was valid. SCI_FAILURE_INVALID_PORT This
136  * value is returned if the specified port is not valid.  When this value is
137  * returned, no data is copied to the properties output parameter.
138  */
139 static enum sci_status scic_port_get_properties(struct scic_sds_port *port,
140                                                 struct scic_port_properties *prop)
141 {
142         if ((port == NULL) ||
143             (port->logical_port_index == SCIC_SDS_DUMMY_PORT))
144                 return SCI_FAILURE_INVALID_PORT;
145
146         prop->index    = port->logical_port_index;
147         prop->phy_mask = scic_sds_port_get_phys(port);
148         scic_sds_port_get_sas_address(port, &prop->local.sas_address);
149         scic_sds_port_get_protocols(port, &prop->local.protocols);
150         scic_sds_port_get_attached_sas_address(port, &prop->remote.sas_address);
151
152         return SCI_SUCCESS;
153 }
154
155 static void scic_port_bcn_enable(struct scic_sds_port *sci_port)
156 {
157         struct scic_sds_phy *sci_phy;
158         u32 val;
159         int i;
160
161         for (i = 0; i < ARRAY_SIZE(sci_port->phy_table); i++) {
162                 sci_phy = sci_port->phy_table[i];
163                 if (!sci_phy)
164                         continue;
165                 val = readl(&sci_phy->link_layer_registers->link_layer_control);
166                 /* clear the bit by writing 1. */
167                 writel(val, &sci_phy->link_layer_registers->link_layer_control);
168         }
169 }
170
171 /* called under scic_lock to stabilize phy:port associations */
172 void isci_port_bcn_enable(struct isci_host *ihost, struct isci_port *iport)
173 {
174         int i;
175
176         clear_bit(IPORT_BCN_BLOCKED, &iport->flags);
177         wake_up(&ihost->eventq);
178
179         if (!test_and_clear_bit(IPORT_BCN_PENDING, &iport->flags))
180                 return;
181
182         for (i = 0; i < ARRAY_SIZE(iport->sci.phy_table); i++) {
183                 struct scic_sds_phy *sci_phy = iport->sci.phy_table[i];
184                 struct isci_phy *iphy = sci_phy_to_iphy(sci_phy);
185
186                 if (!sci_phy)
187                         continue;
188
189                 ihost->sas_ha.notify_port_event(&iphy->sas_phy,
190                                                 PORTE_BROADCAST_RCVD);
191                 break;
192         }
193 }
194
195 void isci_port_bc_change_received(struct isci_host *ihost,
196                                   struct scic_sds_port *sci_port,
197                                   struct scic_sds_phy *sci_phy)
198 {
199         struct isci_phy *iphy = sci_phy_to_iphy(sci_phy);
200         struct isci_port *iport = iphy->isci_port;
201
202         if (iport && test_bit(IPORT_BCN_BLOCKED, &iport->flags)) {
203                 dev_dbg(&ihost->pdev->dev,
204                         "%s: disabled BCN; isci_phy = %p, sas_phy = %p\n",
205                         __func__, iphy, &iphy->sas_phy);
206                 set_bit(IPORT_BCN_PENDING, &iport->flags);
207                 atomic_inc(&iport->event);
208                 wake_up(&ihost->eventq);
209         } else {
210                 dev_dbg(&ihost->pdev->dev,
211                         "%s: isci_phy = %p, sas_phy = %p\n",
212                         __func__, iphy, &iphy->sas_phy);
213
214                 ihost->sas_ha.notify_port_event(&iphy->sas_phy,
215                                                 PORTE_BROADCAST_RCVD);
216         }
217         scic_port_bcn_enable(sci_port);
218 }
219
220 static void isci_port_link_up(struct isci_host *isci_host,
221                               struct scic_sds_port *port,
222                               struct scic_sds_phy *phy)
223 {
224         unsigned long flags;
225         struct scic_port_properties properties;
226         struct isci_phy *isci_phy = sci_phy_to_iphy(phy);
227         struct isci_port *isci_port = sci_port_to_iport(port);
228         unsigned long success = true;
229
230         BUG_ON(isci_phy->isci_port != NULL);
231
232         isci_phy->isci_port = isci_port;
233
234         dev_dbg(&isci_host->pdev->dev,
235                 "%s: isci_port = %p\n",
236                 __func__, isci_port);
237
238         spin_lock_irqsave(&isci_phy->sas_phy.frame_rcvd_lock, flags);
239
240         isci_port_change_state(isci_phy->isci_port, isci_starting);
241
242         scic_port_get_properties(port, &properties);
243
244         if (phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) {
245                 u64 attached_sas_address;
246
247                 isci_phy->sas_phy.oob_mode = SATA_OOB_MODE;
248                 isci_phy->sas_phy.frame_rcvd_size = sizeof(struct dev_to_host_fis);
249
250                 /*
251                  * For direct-attached SATA devices, the SCI core will
252                  * automagically assign a SAS address to the end device
253                  * for the purpose of creating a port. This SAS address
254                  * will not be the same as assigned to the PHY and needs
255                  * to be obtained from struct scic_port_properties properties.
256                  */
257                 attached_sas_address = properties.remote.sas_address.high;
258                 attached_sas_address <<= 32;
259                 attached_sas_address |= properties.remote.sas_address.low;
260                 swab64s(&attached_sas_address);
261
262                 memcpy(&isci_phy->sas_phy.attached_sas_addr,
263                        &attached_sas_address, sizeof(attached_sas_address));
264         } else if (phy->protocol == SCIC_SDS_PHY_PROTOCOL_SAS) {
265                 isci_phy->sas_phy.oob_mode = SAS_OOB_MODE;
266                 isci_phy->sas_phy.frame_rcvd_size = sizeof(struct sas_identify_frame);
267
268                 /* Copy the attached SAS address from the IAF */
269                 memcpy(isci_phy->sas_phy.attached_sas_addr,
270                        isci_phy->frame_rcvd.iaf.sas_addr, SAS_ADDR_SIZE);
271         } else {
272                 dev_err(&isci_host->pdev->dev, "%s: unkown target\n", __func__);
273                 success = false;
274         }
275
276         isci_phy->sas_phy.phy->negotiated_linkrate = sci_phy_linkrate(phy);
277
278         spin_unlock_irqrestore(&isci_phy->sas_phy.frame_rcvd_lock, flags);
279
280         /* Notify libsas that we have an address frame, if indeed
281          * we've found an SSP, SMP, or STP target */
282         if (success)
283                 isci_host->sas_ha.notify_port_event(&isci_phy->sas_phy,
284                                                     PORTE_BYTES_DMAED);
285 }
286
287
288 /**
289  * isci_port_link_down() - This function is called by the sci core when a link
290  *    becomes inactive.
291  * @isci_host: This parameter specifies the isci host object.
292  * @phy: This parameter specifies the isci phy with the active link.
293  * @port: This parameter specifies the isci port with the active link.
294  *
295  */
296 static void isci_port_link_down(struct isci_host *isci_host,
297                                 struct isci_phy *isci_phy,
298                                 struct isci_port *isci_port)
299 {
300         struct isci_remote_device *isci_device;
301
302         dev_dbg(&isci_host->pdev->dev,
303                 "%s: isci_port = %p\n", __func__, isci_port);
304
305         if (isci_port) {
306
307                 /* check to see if this is the last phy on this port. */
308                 if (isci_phy->sas_phy.port &&
309                     isci_phy->sas_phy.port->num_phys == 1) {
310                         atomic_inc(&isci_port->event);
311                         isci_port_bcn_enable(isci_host, isci_port);
312
313                         /* change the state for all devices on this port.  The
314                          * next task sent to this device will be returned as
315                          * SAS_TASK_UNDELIVERED, and the scsi mid layer will
316                          * remove the target
317                          */
318                         list_for_each_entry(isci_device,
319                                             &isci_port->remote_dev_list,
320                                             node) {
321                                 dev_dbg(&isci_host->pdev->dev,
322                                         "%s: isci_device = %p\n",
323                                         __func__, isci_device);
324                                 set_bit(IDEV_GONE, &isci_device->flags);
325                         }
326                 }
327                 isci_port_change_state(isci_port, isci_stopping);
328         }
329
330         /* Notify libsas of the borken link, this will trigger calls to our
331          * isci_port_deformed and isci_dev_gone functions.
332          */
333         sas_phy_disconnected(&isci_phy->sas_phy);
334         isci_host->sas_ha.notify_phy_event(&isci_phy->sas_phy,
335                                            PHYE_LOSS_OF_SIGNAL);
336
337         isci_phy->isci_port = NULL;
338
339         dev_dbg(&isci_host->pdev->dev,
340                 "%s: isci_port = %p - Done\n", __func__, isci_port);
341 }
342
343
344 /**
345  * isci_port_ready() - This function is called by the sci core when a link
346  *    becomes ready.
347  * @isci_host: This parameter specifies the isci host object.
348  * @port: This parameter specifies the sci port with the active link.
349  *
350  */
351 static void isci_port_ready(struct isci_host *isci_host, struct isci_port *isci_port)
352 {
353         dev_dbg(&isci_host->pdev->dev,
354                 "%s: isci_port = %p\n", __func__, isci_port);
355
356         complete_all(&isci_port->start_complete);
357         isci_port_change_state(isci_port, isci_ready);
358         return;
359 }
360
361 /**
362  * isci_port_not_ready() - This function is called by the sci core when a link
363  *    is not ready. All remote devices on this link will be removed if they are
364  *    in the stopping state.
365  * @isci_host: This parameter specifies the isci host object.
366  * @port: This parameter specifies the sci port with the active link.
367  *
368  */
369 static void isci_port_not_ready(struct isci_host *isci_host, struct isci_port *isci_port)
370 {
371         dev_dbg(&isci_host->pdev->dev,
372                 "%s: isci_port = %p\n", __func__, isci_port);
373 }
374
375 static void isci_port_stop_complete(struct scic_sds_controller *scic,
376                                     struct scic_sds_port *sci_port,
377                                     enum sci_status completion_status)
378 {
379         dev_dbg(&scic_to_ihost(scic)->pdev->dev, "Port stop complete\n");
380 }
381
382 /**
383  * isci_port_hard_reset_complete() - This function is called by the sci core
384  *    when the hard reset complete notification has been received.
385  * @port: This parameter specifies the sci port with the active link.
386  * @completion_status: This parameter specifies the core status for the reset
387  *    process.
388  *
389  */
390 static void isci_port_hard_reset_complete(struct isci_port *isci_port,
391                                           enum sci_status completion_status)
392 {
393         dev_dbg(&isci_port->isci_host->pdev->dev,
394                 "%s: isci_port = %p, completion_status=%x\n",
395                      __func__, isci_port, completion_status);
396
397         /* Save the status of the hard reset from the port. */
398         isci_port->hard_reset_status = completion_status;
399
400         complete_all(&isci_port->hard_reset_complete);
401 }
402
403 /* This method will return a true value if the specified phy can be assigned to
404  * this port The following is a list of phys for each port that are allowed: -
405  * Port 0 - 3 2 1 0 - Port 1 -     1 - Port 2 - 3 2 - Port 3 - 3 This method
406  * doesn't preclude all configurations.  It merely ensures that a phy is part
407  * of the allowable set of phy identifiers for that port.  For example, one
408  * could assign phy 3 to port 0 and no other phys.  Please refer to
409  * scic_sds_port_is_phy_mask_valid() for information regarding whether the
410  * phy_mask for a port can be supported. bool true if this is a valid phy
411  * assignment for the port false if this is not a valid phy assignment for the
412  * port
413  */
414 bool scic_sds_port_is_valid_phy_assignment(struct scic_sds_port *sci_port,
415                                            u32 phy_index)
416 {
417         /* Initialize to invalid value. */
418         u32 existing_phy_index = SCI_MAX_PHYS;
419         u32 index;
420
421         if ((sci_port->physical_port_index == 1) && (phy_index != 1)) {
422                 return false;
423         }
424
425         if (sci_port->physical_port_index == 3 && phy_index != 3) {
426                 return false;
427         }
428
429         if (
430                 (sci_port->physical_port_index == 2)
431                 && ((phy_index == 0) || (phy_index == 1))
432                 ) {
433                 return false;
434         }
435
436         for (index = 0; index < SCI_MAX_PHYS; index++) {
437                 if ((sci_port->phy_table[index] != NULL)
438                     && (index != phy_index)) {
439                         existing_phy_index = index;
440                 }
441         }
442
443         /*
444          * Ensure that all of the phys in the port are capable of
445          * operating at the same maximum link rate. */
446         if (
447                 (existing_phy_index < SCI_MAX_PHYS)
448                 && (sci_port->owning_controller->user_parameters.sds1.phys[
449                             phy_index].max_speed_generation !=
450                     sci_port->owning_controller->user_parameters.sds1.phys[
451                             existing_phy_index].max_speed_generation)
452                 )
453                 return false;
454
455         return true;
456 }
457
458 /**
459  *
460  * @sci_port: This is the port object for which to determine if the phy mask
461  *    can be supported.
462  *
463  * This method will return a true value if the port's phy mask can be supported
464  * by the SCU. The following is a list of valid PHY mask configurations for
465  * each port: - Port 0 - [[3  2] 1] 0 - Port 1 -        [1] - Port 2 - [[3] 2]
466  * - Port 3 -  [3] This method returns a boolean indication specifying if the
467  * phy mask can be supported. true if this is a valid phy assignment for the
468  * port false if this is not a valid phy assignment for the port
469  */
470 static bool scic_sds_port_is_phy_mask_valid(
471         struct scic_sds_port *sci_port,
472         u32 phy_mask)
473 {
474         if (sci_port->physical_port_index == 0) {
475                 if (((phy_mask & 0x0F) == 0x0F)
476                     || ((phy_mask & 0x03) == 0x03)
477                     || ((phy_mask & 0x01) == 0x01)
478                     || (phy_mask == 0))
479                         return true;
480         } else if (sci_port->physical_port_index == 1) {
481                 if (((phy_mask & 0x02) == 0x02)
482                     || (phy_mask == 0))
483                         return true;
484         } else if (sci_port->physical_port_index == 2) {
485                 if (((phy_mask & 0x0C) == 0x0C)
486                     || ((phy_mask & 0x04) == 0x04)
487                     || (phy_mask == 0))
488                         return true;
489         } else if (sci_port->physical_port_index == 3) {
490                 if (((phy_mask & 0x08) == 0x08)
491                     || (phy_mask == 0))
492                         return true;
493         }
494
495         return false;
496 }
497
498 /**
499  *
500  * @sci_port: This parameter specifies the port from which to return a
501  *    connected phy.
502  *
503  * This method retrieves a currently active (i.e. connected) phy contained in
504  * the port.  Currently, the lowest order phy that is connected is returned.
505  * This method returns a pointer to a SCIS_SDS_PHY object. NULL This value is
506  * returned if there are no currently active (i.e. connected to a remote end
507  * point) phys contained in the port. All other values specify a struct scic_sds_phy
508  * object that is active in the port.
509  */
510 static struct scic_sds_phy *scic_sds_port_get_a_connected_phy(
511         struct scic_sds_port *sci_port
512         ) {
513         u32 index;
514         struct scic_sds_phy *phy;
515
516         for (index = 0; index < SCI_MAX_PHYS; index++) {
517                 /*
518                  * Ensure that the phy is both part of the port and currently
519                  * connected to the remote end-point. */
520                 phy = sci_port->phy_table[index];
521                 if (
522                         (phy != NULL)
523                         && scic_sds_port_active_phy(sci_port, phy)
524                         ) {
525                         return phy;
526                 }
527         }
528
529         return NULL;
530 }
531
532 /**
533  * scic_sds_port_set_phy() -
534  * @out]: port The port object to which the phy assignement is being made.
535  * @out]: phy The phy which is being assigned to the port.
536  *
537  * This method attempts to make the assignment of the phy to the port. If
538  * successful the phy is assigned to the ports phy table. bool true if the phy
539  * assignment can be made. false if the phy assignement can not be made. This
540  * is a functional test that only fails if the phy is currently assigned to a
541  * different port.
542  */
543 static enum sci_status scic_sds_port_set_phy(
544         struct scic_sds_port *port,
545         struct scic_sds_phy *phy)
546 {
547         /*
548          * Check to see if we can add this phy to a port
549          * that means that the phy is not part of a port and that the port does
550          * not already have a phy assinged to the phy index. */
551         if (
552                 (port->phy_table[phy->phy_index] == NULL)
553                 && (phy_get_non_dummy_port(phy) == NULL)
554                 && scic_sds_port_is_valid_phy_assignment(port, phy->phy_index)
555                 ) {
556                 /*
557                  * Phy is being added in the stopped state so we are in MPC mode
558                  * make logical port index = physical port index */
559                 port->logical_port_index = port->physical_port_index;
560                 port->phy_table[phy->phy_index] = phy;
561                 scic_sds_phy_set_port(phy, port);
562
563                 return SCI_SUCCESS;
564         }
565
566         return SCI_FAILURE;
567 }
568
569 /**
570  * scic_sds_port_clear_phy() -
571  * @out]: port The port from which the phy is being cleared.
572  * @out]: phy The phy being cleared from the port.
573  *
574  * This method will clear the phy assigned to this port.  This method fails if
575  * this phy is not currently assinged to this port. bool true if the phy is
576  * removed from the port. false if this phy is not assined to this port.
577  */
578 static enum sci_status scic_sds_port_clear_phy(
579         struct scic_sds_port *port,
580         struct scic_sds_phy *phy)
581 {
582         /* Make sure that this phy is part of this port */
583         if (port->phy_table[phy->phy_index] == phy &&
584             phy_get_non_dummy_port(phy) == port) {
585                 struct scic_sds_controller *scic = port->owning_controller;
586                 struct isci_host *ihost = scic_to_ihost(scic);
587
588                 /* Yep it is assigned to this port so remove it */
589                 scic_sds_phy_set_port(phy, &ihost->ports[SCI_MAX_PORTS].sci);
590                 port->phy_table[phy->phy_index] = NULL;
591                 return SCI_SUCCESS;
592         }
593
594         return SCI_FAILURE;
595 }
596
597
598 /**
599  * This method requests the SAS address for the supplied SAS port from the SCI
600  *    implementation.
601  * @sci_port: a handle corresponding to the SAS port for which to return the
602  *    SAS address.
603  * @sas_address: This parameter specifies a pointer to a SAS address structure
604  *    into which the core will copy the SAS address for the port.
605  *
606  */
607 void scic_sds_port_get_sas_address(
608         struct scic_sds_port *sci_port,
609         struct sci_sas_address *sas_address)
610 {
611         u32 index;
612
613         sas_address->high = 0;
614         sas_address->low  = 0;
615
616         for (index = 0; index < SCI_MAX_PHYS; index++) {
617                 if (sci_port->phy_table[index] != NULL) {
618                         scic_sds_phy_get_sas_address(sci_port->phy_table[index], sas_address);
619                 }
620         }
621 }
622
623 /*
624  * This function requests the SAS address for the device directly attached to
625  *    this SAS port.
626  * @sci_port: a handle corresponding to the SAS port for which to return the
627  *    SAS address.
628  * @sas_address: This parameter specifies a pointer to a SAS address structure
629  *    into which the core will copy the SAS address for the device directly
630  *    attached to the port.
631  *
632  */
633 void scic_sds_port_get_attached_sas_address(
634         struct scic_sds_port *sci_port,
635         struct sci_sas_address *sas_address)
636 {
637         struct scic_sds_phy *sci_phy;
638
639         /*
640          * Ensure that the phy is both part of the port and currently
641          * connected to the remote end-point.
642          */
643         sci_phy = scic_sds_port_get_a_connected_phy(sci_port);
644         if (sci_phy) {
645                 if (sci_phy->protocol != SCIC_SDS_PHY_PROTOCOL_SATA) {
646                         scic_sds_phy_get_attached_sas_address(sci_phy,
647                                                               sas_address);
648                 } else {
649                         scic_sds_phy_get_sas_address(sci_phy, sas_address);
650                         sas_address->low += sci_phy->phy_index;
651                 }
652         } else {
653                 sas_address->high = 0;
654                 sas_address->low  = 0;
655         }
656 }
657
658 /**
659  * scic_sds_port_construct_dummy_rnc() - create dummy rnc for si workaround
660  *
661  * @sci_port: logical port on which we need to create the remote node context
662  * @rni: remote node index for this remote node context.
663  *
664  * This routine will construct a dummy remote node context data structure
665  * This structure will be posted to the hardware to work around a scheduler
666  * error in the hardware.
667  */
668 static void scic_sds_port_construct_dummy_rnc(struct scic_sds_port *sci_port, u16 rni)
669 {
670         union scu_remote_node_context *rnc;
671
672         rnc = &sci_port->owning_controller->remote_node_context_table[rni];
673
674         memset(rnc, 0, sizeof(union scu_remote_node_context));
675
676         rnc->ssp.remote_sas_address_hi = 0;
677         rnc->ssp.remote_sas_address_lo = 0;
678
679         rnc->ssp.remote_node_index = rni;
680         rnc->ssp.remote_node_port_width = 1;
681         rnc->ssp.logical_port_index = sci_port->physical_port_index;
682
683         rnc->ssp.nexus_loss_timer_enable = false;
684         rnc->ssp.check_bit = false;
685         rnc->ssp.is_valid = true;
686         rnc->ssp.is_remote_node_context = true;
687         rnc->ssp.function_number = 0;
688         rnc->ssp.arbitration_wait_time = 0;
689 }
690
691 /*
692  * construct a dummy task context data structure.  This
693  * structure will be posted to the hardwre to work around a scheduler error
694  * in the hardware.
695  */
696 static void scic_sds_port_construct_dummy_task(struct scic_sds_port *sci_port, u16 tag)
697 {
698         struct scic_sds_controller *scic = sci_port->owning_controller;
699         struct scu_task_context *task_context;
700
701         task_context = &scic->task_context_table[ISCI_TAG_TCI(tag)];
702         memset(task_context, 0, sizeof(struct scu_task_context));
703
704         task_context->initiator_request = 1;
705         task_context->connection_rate = 1;
706         task_context->logical_port_index = sci_port->physical_port_index;
707         task_context->protocol_type = SCU_TASK_CONTEXT_PROTOCOL_SSP;
708         task_context->task_index = ISCI_TAG_TCI(tag);
709         task_context->valid = SCU_TASK_CONTEXT_VALID;
710         task_context->context_type = SCU_TASK_CONTEXT_TYPE;
711         task_context->remote_node_index = sci_port->reserved_rni;
712         task_context->do_not_dma_ssp_good_response = 1;
713         task_context->task_phase = 0x01;
714 }
715
716 static void scic_sds_port_destroy_dummy_resources(struct scic_sds_port *sci_port)
717 {
718         struct scic_sds_controller *scic = sci_port->owning_controller;
719
720         if (sci_port->reserved_tag != SCI_CONTROLLER_INVALID_IO_TAG)
721                 isci_free_tag(scic_to_ihost(scic), sci_port->reserved_tag);
722
723         if (sci_port->reserved_rni != SCU_DUMMY_INDEX)
724                 scic_sds_remote_node_table_release_remote_node_index(&scic->available_remote_nodes,
725                                                                      1, sci_port->reserved_rni);
726
727         sci_port->reserved_rni = SCU_DUMMY_INDEX;
728         sci_port->reserved_tag = SCI_CONTROLLER_INVALID_IO_TAG;
729 }
730
731 /**
732  * This method performs initialization of the supplied port. Initialization
733  *    includes: - state machine initialization - member variable initialization
734  *    - configuring the phy_mask
735  * @sci_port:
736  * @transport_layer_registers:
737  * @port_task_scheduler_registers:
738  * @port_configuration_regsiter:
739  *
740  * enum sci_status SCI_FAILURE_UNSUPPORTED_PORT_CONFIGURATION This value is returned
741  * if the phy being added to the port
742  */
743 enum sci_status scic_sds_port_initialize(
744         struct scic_sds_port *sci_port,
745         void __iomem *port_task_scheduler_registers,
746         void __iomem *port_configuration_regsiter,
747         void __iomem *viit_registers)
748 {
749         sci_port->port_task_scheduler_registers  = port_task_scheduler_registers;
750         sci_port->port_pe_configuration_register = port_configuration_regsiter;
751         sci_port->viit_registers                 = viit_registers;
752
753         return SCI_SUCCESS;
754 }
755
756
757 /**
758  * This method assigns the direct attached device ID for this port.
759  *
760  * @param[in] sci_port The port for which the direct attached device id is to
761  *       be assigned.
762  * @param[in] device_id The direct attached device ID to assign to the port.
763  *       This will be the RNi for the device
764  */
765 void scic_sds_port_setup_transports(
766         struct scic_sds_port *sci_port,
767         u32 device_id)
768 {
769         u8 index;
770
771         for (index = 0; index < SCI_MAX_PHYS; index++) {
772                 if (sci_port->active_phy_mask & (1 << index))
773                         scic_sds_phy_setup_transport(sci_port->phy_table[index], device_id);
774         }
775 }
776
777 /**
778  *
779  * @sci_port: This is the port on which the phy should be enabled.
780  * @sci_phy: This is the specific phy which to enable.
781  * @do_notify_user: This parameter specifies whether to inform the user (via
782  *    scic_cb_port_link_up()) as to the fact that a new phy as become ready.
783  *
784  * This function will activate the phy in the port.
785  * Activation includes: - adding
786  * the phy to the port - enabling the Protocol Engine in the silicon. -
787  * notifying the user that the link is up. none
788  */
789 static void scic_sds_port_activate_phy(struct scic_sds_port *sci_port,
790                                        struct scic_sds_phy *sci_phy,
791                                        bool do_notify_user)
792 {
793         struct scic_sds_controller *scic = sci_port->owning_controller;
794         struct isci_host *ihost = scic_to_ihost(scic);
795
796         if (sci_phy->protocol != SCIC_SDS_PHY_PROTOCOL_SATA)
797                 scic_sds_phy_resume(sci_phy);
798
799         sci_port->active_phy_mask |= 1 << sci_phy->phy_index;
800
801         scic_sds_controller_clear_invalid_phy(scic, sci_phy);
802
803         if (do_notify_user == true)
804                 isci_port_link_up(ihost, sci_port, sci_phy);
805 }
806
807 void scic_sds_port_deactivate_phy(struct scic_sds_port *sci_port,
808                                   struct scic_sds_phy *sci_phy,
809                                   bool do_notify_user)
810 {
811         struct scic_sds_controller *scic = scic_sds_port_get_controller(sci_port);
812         struct isci_port *iport = sci_port_to_iport(sci_port);
813         struct isci_host *ihost = scic_to_ihost(scic);
814         struct isci_phy *iphy = sci_phy_to_iphy(sci_phy);
815
816         sci_port->active_phy_mask &= ~(1 << sci_phy->phy_index);
817
818         sci_phy->max_negotiated_speed = SAS_LINK_RATE_UNKNOWN;
819
820         /* Re-assign the phy back to the LP as if it were a narrow port */
821         writel(sci_phy->phy_index,
822                 &sci_port->port_pe_configuration_register[sci_phy->phy_index]);
823
824         if (do_notify_user == true)
825                 isci_port_link_down(ihost, iphy, iport);
826 }
827
828 /**
829  *
830  * @sci_port: This is the port on which the phy should be disabled.
831  * @sci_phy: This is the specific phy which to disabled.
832  *
833  * This function will disable the phy and report that the phy is not valid for
834  * this port object. None
835  */
836 static void scic_sds_port_invalid_link_up(struct scic_sds_port *sci_port,
837                                           struct scic_sds_phy *sci_phy)
838 {
839         struct scic_sds_controller *scic = sci_port->owning_controller;
840
841         /*
842          * Check to see if we have alreay reported this link as bad and if
843          * not go ahead and tell the SCI_USER that we have discovered an
844          * invalid link.
845          */
846         if ((scic->invalid_phy_mask & (1 << sci_phy->phy_index)) == 0) {
847                 scic_sds_controller_set_invalid_phy(scic, sci_phy);
848                 dev_warn(&scic_to_ihost(scic)->pdev->dev, "Invalid link up!\n");
849         }
850 }
851
852 static bool is_port_ready_state(enum scic_sds_port_states state)
853 {
854         switch (state) {
855         case SCI_PORT_READY:
856         case SCI_PORT_SUB_WAITING:
857         case SCI_PORT_SUB_OPERATIONAL:
858         case SCI_PORT_SUB_CONFIGURING:
859                 return true;
860         default:
861                 return false;
862         }
863 }
864
865 /* flag dummy rnc hanling when exiting a ready state */
866 static void port_state_machine_change(struct scic_sds_port *sci_port,
867                                       enum scic_sds_port_states state)
868 {
869         struct sci_base_state_machine *sm = &sci_port->sm;
870         enum scic_sds_port_states old_state = sm->current_state_id;
871
872         if (is_port_ready_state(old_state) && !is_port_ready_state(state))
873                 sci_port->ready_exit = true;
874
875         sci_change_state(sm, state);
876         sci_port->ready_exit = false;
877 }
878
879 /**
880  * scic_sds_port_general_link_up_handler - phy can be assigned to port?
881  * @sci_port: scic_sds_port object for which has a phy that has gone link up.
882  * @sci_phy: This is the struct scic_sds_phy object that has gone link up.
883  * @do_notify_user: This parameter specifies whether to inform the user (via
884  *    scic_cb_port_link_up()) as to the fact that a new phy as become ready.
885  *
886  * Determine if this phy can be assigned to this
887  * port . If the phy is not a valid PHY for
888  * this port then the function will notify the user. A PHY can only be
889  * part of a port if it's attached SAS ADDRESS is the same as all other PHYs in
890  * the same port. none
891  */
892 static void scic_sds_port_general_link_up_handler(struct scic_sds_port *sci_port,
893                                                   struct scic_sds_phy *sci_phy,
894                                                   bool do_notify_user)
895 {
896         struct sci_sas_address port_sas_address;
897         struct sci_sas_address phy_sas_address;
898
899         scic_sds_port_get_attached_sas_address(sci_port, &port_sas_address);
900         scic_sds_phy_get_attached_sas_address(sci_phy, &phy_sas_address);
901
902         /* If the SAS address of the new phy matches the SAS address of
903          * other phys in the port OR this is the first phy in the port,
904          * then activate the phy and allow it to be used for operations
905          * in this port.
906          */
907         if ((phy_sas_address.high == port_sas_address.high &&
908              phy_sas_address.low  == port_sas_address.low) ||
909             sci_port->active_phy_mask == 0) {
910                 struct sci_base_state_machine *sm = &sci_port->sm;
911
912                 scic_sds_port_activate_phy(sci_port, sci_phy, do_notify_user);
913                 if (sm->current_state_id == SCI_PORT_RESETTING)
914                         port_state_machine_change(sci_port, SCI_PORT_READY);
915         } else
916                 scic_sds_port_invalid_link_up(sci_port, sci_phy);
917 }
918
919
920
921 /**
922  * This method returns false if the port only has a single phy object assigned.
923  *     If there are no phys or more than one phy then the method will return
924  *    true.
925  * @sci_port: The port for which the wide port condition is to be checked.
926  *
927  * bool true Is returned if this is a wide ported port. false Is returned if
928  * this is a narrow port.
929  */
930 static bool scic_sds_port_is_wide(struct scic_sds_port *sci_port)
931 {
932         u32 index;
933         u32 phy_count = 0;
934
935         for (index = 0; index < SCI_MAX_PHYS; index++) {
936                 if (sci_port->phy_table[index] != NULL) {
937                         phy_count++;
938                 }
939         }
940
941         return phy_count != 1;
942 }
943
944 /**
945  * This method is called by the PHY object when the link is detected. if the
946  *    port wants the PHY to continue on to the link up state then the port
947  *    layer must return true.  If the port object returns false the phy object
948  *    must halt its attempt to go link up.
949  * @sci_port: The port associated with the phy object.
950  * @sci_phy: The phy object that is trying to go link up.
951  *
952  * true if the phy object can continue to the link up condition. true Is
953  * returned if this phy can continue to the ready state. false Is returned if
954  * can not continue on to the ready state. This notification is in place for
955  * wide ports and direct attached phys.  Since there are no wide ported SATA
956  * devices this could become an invalid port configuration.
957  */
958 bool scic_sds_port_link_detected(
959         struct scic_sds_port *sci_port,
960         struct scic_sds_phy *sci_phy)
961 {
962         if ((sci_port->logical_port_index != SCIC_SDS_DUMMY_PORT) &&
963             (sci_phy->protocol == SCIC_SDS_PHY_PROTOCOL_SATA) &&
964             scic_sds_port_is_wide(sci_port)) {
965                 scic_sds_port_invalid_link_up(sci_port, sci_phy);
966
967                 return false;
968         }
969
970         return true;
971 }
972
973 static void port_timeout(unsigned long data)
974 {
975         struct sci_timer *tmr = (struct sci_timer *)data;
976         struct scic_sds_port *sci_port = container_of(tmr, typeof(*sci_port), timer);
977         struct isci_host *ihost = scic_to_ihost(sci_port->owning_controller);
978         unsigned long flags;
979         u32 current_state;
980
981         spin_lock_irqsave(&ihost->scic_lock, flags);
982
983         if (tmr->cancel)
984                 goto done;
985
986         current_state = sci_port->sm.current_state_id;
987
988         if (current_state == SCI_PORT_RESETTING) {
989                 /* if the port is still in the resetting state then the timeout
990                  * fired before the reset completed.
991                  */
992                 port_state_machine_change(sci_port, SCI_PORT_FAILED);
993         } else if (current_state == SCI_PORT_STOPPED) {
994                 /* if the port is stopped then the start request failed In this
995                  * case stay in the stopped state.
996                  */
997                 dev_err(sciport_to_dev(sci_port),
998                         "%s: SCIC Port 0x%p failed to stop before tiemout.\n",
999                         __func__,
1000                         sci_port);
1001         } else if (current_state == SCI_PORT_STOPPING) {
1002                 /* if the port is still stopping then the stop has not completed */
1003                 isci_port_stop_complete(sci_port->owning_controller,
1004                                         sci_port,
1005                                         SCI_FAILURE_TIMEOUT);
1006         } else {
1007                 /* The port is in the ready state and we have a timer
1008                  * reporting a timeout this should not happen.
1009                  */
1010                 dev_err(sciport_to_dev(sci_port),
1011                         "%s: SCIC Port 0x%p is processing a timeout operation "
1012                         "in state %d.\n", __func__, sci_port, current_state);
1013         }
1014
1015 done:
1016         spin_unlock_irqrestore(&ihost->scic_lock, flags);
1017 }
1018
1019 /* --------------------------------------------------------------------------- */
1020
1021 /**
1022  * This function updates the hardwares VIIT entry for this port.
1023  *
1024  *
1025  */
1026 static void scic_sds_port_update_viit_entry(struct scic_sds_port *sci_port)
1027 {
1028         struct sci_sas_address sas_address;
1029
1030         scic_sds_port_get_sas_address(sci_port, &sas_address);
1031
1032         writel(sas_address.high,
1033                 &sci_port->viit_registers->initiator_sas_address_hi);
1034         writel(sas_address.low,
1035                 &sci_port->viit_registers->initiator_sas_address_lo);
1036
1037         /* This value get cleared just in case its not already cleared */
1038         writel(0, &sci_port->viit_registers->reserved);
1039
1040         /* We are required to update the status register last */
1041         writel(SCU_VIIT_ENTRY_ID_VIIT |
1042                SCU_VIIT_IPPT_INITIATOR |
1043                ((1 << sci_port->physical_port_index) << SCU_VIIT_ENTRY_LPVIE_SHIFT) |
1044                SCU_VIIT_STATUS_ALL_VALID,
1045                &sci_port->viit_registers->status);
1046 }
1047
1048 /**
1049  * This method returns the maximum allowed speed for data transfers on this
1050  *    port.  This maximum allowed speed evaluates to the maximum speed of the
1051  *    slowest phy in the port.
1052  * @sci_port: This parameter specifies the port for which to retrieve the
1053  *    maximum allowed speed.
1054  *
1055  * This method returns the maximum negotiated speed of the slowest phy in the
1056  * port.
1057  */
1058 enum sas_linkrate scic_sds_port_get_max_allowed_speed(
1059         struct scic_sds_port *sci_port)
1060 {
1061         u16 index;
1062         enum sas_linkrate max_allowed_speed = SAS_LINK_RATE_6_0_GBPS;
1063         struct scic_sds_phy *phy = NULL;
1064
1065         /*
1066          * Loop through all of the phys in this port and find the phy with the
1067          * lowest maximum link rate. */
1068         for (index = 0; index < SCI_MAX_PHYS; index++) {
1069                 phy = sci_port->phy_table[index];
1070                 if (
1071                         (phy != NULL)
1072                         && (scic_sds_port_active_phy(sci_port, phy) == true)
1073                         && (phy->max_negotiated_speed < max_allowed_speed)
1074                         )
1075                         max_allowed_speed = phy->max_negotiated_speed;
1076         }
1077
1078         return max_allowed_speed;
1079 }
1080
1081 /**
1082  *
1083  * @sci_port: This is the struct scic_sds_port object to suspend.
1084  *
1085  * This method will susped the port task scheduler for this port object. none
1086  */
1087 static void
1088 scic_sds_port_suspend_port_task_scheduler(struct scic_sds_port *port)
1089 {
1090         u32 pts_control_value;
1091
1092         pts_control_value = readl(&port->port_task_scheduler_registers->control);
1093         pts_control_value |= SCU_PTSxCR_GEN_BIT(SUSPEND);
1094         writel(pts_control_value, &port->port_task_scheduler_registers->control);
1095 }
1096
1097 /**
1098  * scic_sds_port_post_dummy_request() - post dummy/workaround request
1099  * @sci_port: port to post task
1100  *
1101  * Prevent the hardware scheduler from posting new requests to the front
1102  * of the scheduler queue causing a starvation problem for currently
1103  * ongoing requests.
1104  *
1105  */
1106 static void scic_sds_port_post_dummy_request(struct scic_sds_port *sci_port)
1107 {
1108         struct scic_sds_controller *scic = sci_port->owning_controller;
1109         u16 tag = sci_port->reserved_tag;
1110         struct scu_task_context *tc;
1111         u32 command;
1112
1113         tc = &scic->task_context_table[ISCI_TAG_TCI(tag)];
1114         tc->abort = 0;
1115
1116         command = SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC |
1117                   sci_port->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT |
1118                   ISCI_TAG_TCI(tag);
1119
1120         scic_sds_controller_post_request(scic, command);
1121 }
1122
1123 /**
1124  * This routine will abort the dummy request.  This will alow the hardware to
1125  * power down parts of the silicon to save power.
1126  *
1127  * @sci_port: The port on which the task must be aborted.
1128  *
1129  */
1130 static void scic_sds_port_abort_dummy_request(struct scic_sds_port *sci_port)
1131 {
1132         struct scic_sds_controller *scic = sci_port->owning_controller;
1133         u16 tag = sci_port->reserved_tag;
1134         struct scu_task_context *tc;
1135         u32 command;
1136
1137         tc = &scic->task_context_table[ISCI_TAG_TCI(tag)];
1138         tc->abort = 1;
1139
1140         command = SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT |
1141                   sci_port->physical_port_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT |
1142                   ISCI_TAG_TCI(tag);
1143
1144         scic_sds_controller_post_request(scic, command);
1145 }
1146
1147 /**
1148  *
1149  * @sci_port: This is the struct scic_sds_port object to resume.
1150  *
1151  * This method will resume the port task scheduler for this port object. none
1152  */
1153 static void
1154 scic_sds_port_resume_port_task_scheduler(struct scic_sds_port *port)
1155 {
1156         u32 pts_control_value;
1157
1158         pts_control_value = readl(&port->port_task_scheduler_registers->control);
1159         pts_control_value &= ~SCU_PTSxCR_GEN_BIT(SUSPEND);
1160         writel(pts_control_value, &port->port_task_scheduler_registers->control);
1161 }
1162
1163 static void scic_sds_port_ready_substate_waiting_enter(struct sci_base_state_machine *sm)
1164 {
1165         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1166
1167         scic_sds_port_suspend_port_task_scheduler(sci_port);
1168
1169         sci_port->not_ready_reason = SCIC_PORT_NOT_READY_NO_ACTIVE_PHYS;
1170
1171         if (sci_port->active_phy_mask != 0) {
1172                 /* At least one of the phys on the port is ready */
1173                 port_state_machine_change(sci_port,
1174                                           SCI_PORT_SUB_OPERATIONAL);
1175         }
1176 }
1177
1178 static void scic_sds_port_ready_substate_operational_enter(struct sci_base_state_machine *sm)
1179 {
1180         u32 index;
1181         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1182         struct scic_sds_controller *scic = sci_port->owning_controller;
1183         struct isci_host *ihost = scic_to_ihost(scic);
1184         struct isci_port *iport = sci_port_to_iport(sci_port);
1185
1186         isci_port_ready(ihost, iport);
1187
1188         for (index = 0; index < SCI_MAX_PHYS; index++) {
1189                 if (sci_port->phy_table[index]) {
1190                         writel(sci_port->physical_port_index,
1191                                 &sci_port->port_pe_configuration_register[
1192                                         sci_port->phy_table[index]->phy_index]);
1193                 }
1194         }
1195
1196         scic_sds_port_update_viit_entry(sci_port);
1197
1198         scic_sds_port_resume_port_task_scheduler(sci_port);
1199
1200         /*
1201          * Post the dummy task for the port so the hardware can schedule
1202          * io correctly
1203          */
1204         scic_sds_port_post_dummy_request(sci_port);
1205 }
1206
1207 static void scic_sds_port_invalidate_dummy_remote_node(struct scic_sds_port *sci_port)
1208 {
1209         struct scic_sds_controller *scic = sci_port->owning_controller;
1210         u8 phys_index = sci_port->physical_port_index;
1211         union scu_remote_node_context *rnc;
1212         u16 rni = sci_port->reserved_rni;
1213         u32 command;
1214
1215         rnc = &scic->remote_node_context_table[rni];
1216
1217         rnc->ssp.is_valid = false;
1218
1219         /* ensure the preceding tc abort request has reached the
1220          * controller and give it ample time to act before posting the rnc
1221          * invalidate
1222          */
1223         readl(&scic->smu_registers->interrupt_status); /* flush */
1224         udelay(10);
1225
1226         command = SCU_CONTEXT_COMMAND_POST_RNC_INVALIDATE |
1227                   phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni;
1228
1229         scic_sds_controller_post_request(scic, command);
1230 }
1231
1232 /**
1233  *
1234  * @object: This is the object which is cast to a struct scic_sds_port object.
1235  *
1236  * This method will perform the actions required by the struct scic_sds_port on
1237  * exiting the SCI_PORT_SUB_OPERATIONAL. This function reports
1238  * the port not ready and suspends the port task scheduler. none
1239  */
1240 static void scic_sds_port_ready_substate_operational_exit(struct sci_base_state_machine *sm)
1241 {
1242         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1243         struct scic_sds_controller *scic = sci_port->owning_controller;
1244         struct isci_host *ihost = scic_to_ihost(scic);
1245         struct isci_port *iport = sci_port_to_iport(sci_port);
1246
1247         /*
1248          * Kill the dummy task for this port if it has not yet posted
1249          * the hardware will treat this as a NOP and just return abort
1250          * complete.
1251          */
1252         scic_sds_port_abort_dummy_request(sci_port);
1253
1254         isci_port_not_ready(ihost, iport);
1255
1256         if (sci_port->ready_exit)
1257                 scic_sds_port_invalidate_dummy_remote_node(sci_port);
1258 }
1259
1260 static void scic_sds_port_ready_substate_configuring_enter(struct sci_base_state_machine *sm)
1261 {
1262         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1263         struct scic_sds_controller *scic = sci_port->owning_controller;
1264         struct isci_host *ihost = scic_to_ihost(scic);
1265         struct isci_port *iport = sci_port_to_iport(sci_port);
1266
1267         if (sci_port->active_phy_mask == 0) {
1268                 isci_port_not_ready(ihost, iport);
1269
1270                 port_state_machine_change(sci_port,
1271                                           SCI_PORT_SUB_WAITING);
1272         } else if (sci_port->started_request_count == 0)
1273                 port_state_machine_change(sci_port,
1274                                           SCI_PORT_SUB_OPERATIONAL);
1275 }
1276
1277 static void scic_sds_port_ready_substate_configuring_exit(struct sci_base_state_machine *sm)
1278 {
1279         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1280
1281         scic_sds_port_suspend_port_task_scheduler(sci_port);
1282         if (sci_port->ready_exit)
1283                 scic_sds_port_invalidate_dummy_remote_node(sci_port);
1284 }
1285
1286 enum sci_status scic_sds_port_start(struct scic_sds_port *sci_port)
1287 {
1288         struct scic_sds_controller *scic = sci_port->owning_controller;
1289         enum sci_status status = SCI_SUCCESS;
1290         enum scic_sds_port_states state;
1291         u32 phy_mask;
1292
1293         state = sci_port->sm.current_state_id;
1294         if (state != SCI_PORT_STOPPED) {
1295                 dev_warn(sciport_to_dev(sci_port),
1296                          "%s: in wrong state: %d\n", __func__, state);
1297                 return SCI_FAILURE_INVALID_STATE;
1298         }
1299
1300         if (sci_port->assigned_device_count > 0) {
1301                 /* TODO This is a start failure operation because
1302                  * there are still devices assigned to this port.
1303                  * There must be no devices assigned to a port on a
1304                  * start operation.
1305                  */
1306                 return SCI_FAILURE_UNSUPPORTED_PORT_CONFIGURATION;
1307         }
1308
1309         if (sci_port->reserved_rni == SCU_DUMMY_INDEX) {
1310                 u16 rni = scic_sds_remote_node_table_allocate_remote_node(
1311                                 &scic->available_remote_nodes, 1);
1312
1313                 if (rni != SCU_DUMMY_INDEX)
1314                         scic_sds_port_construct_dummy_rnc(sci_port, rni);
1315                 else
1316                         status = SCI_FAILURE_INSUFFICIENT_RESOURCES;
1317                 sci_port->reserved_rni = rni;
1318         }
1319
1320         if (sci_port->reserved_tag == SCI_CONTROLLER_INVALID_IO_TAG) {
1321                 struct isci_host *ihost = scic_to_ihost(scic);
1322                 u16 tag;
1323
1324                 tag = isci_alloc_tag(ihost);
1325                 if (tag == SCI_CONTROLLER_INVALID_IO_TAG)
1326                         status = SCI_FAILURE_INSUFFICIENT_RESOURCES;
1327                 else
1328                         scic_sds_port_construct_dummy_task(sci_port, tag);
1329                 sci_port->reserved_tag = tag;
1330         }
1331
1332         if (status == SCI_SUCCESS) {
1333                 phy_mask = scic_sds_port_get_phys(sci_port);
1334
1335                 /*
1336                  * There are one or more phys assigned to this port.  Make sure
1337                  * the port's phy mask is in fact legal and supported by the
1338                  * silicon.
1339                  */
1340                 if (scic_sds_port_is_phy_mask_valid(sci_port, phy_mask) == true) {
1341                         port_state_machine_change(sci_port,
1342                                                   SCI_PORT_READY);
1343
1344                         return SCI_SUCCESS;
1345                 }
1346                 status = SCI_FAILURE;
1347         }
1348
1349         if (status != SCI_SUCCESS)
1350                 scic_sds_port_destroy_dummy_resources(sci_port);
1351
1352         return status;
1353 }
1354
1355 enum sci_status scic_sds_port_stop(struct scic_sds_port *sci_port)
1356 {
1357         enum scic_sds_port_states state;
1358
1359         state = sci_port->sm.current_state_id;
1360         switch (state) {
1361         case SCI_PORT_STOPPED:
1362                 return SCI_SUCCESS;
1363         case SCI_PORT_SUB_WAITING:
1364         case SCI_PORT_SUB_OPERATIONAL:
1365         case SCI_PORT_SUB_CONFIGURING:
1366         case SCI_PORT_RESETTING:
1367                 port_state_machine_change(sci_port,
1368                                           SCI_PORT_STOPPING);
1369                 return SCI_SUCCESS;
1370         default:
1371                 dev_warn(sciport_to_dev(sci_port),
1372                          "%s: in wrong state: %d\n", __func__, state);
1373                 return SCI_FAILURE_INVALID_STATE;
1374         }
1375 }
1376
1377 static enum sci_status scic_port_hard_reset(struct scic_sds_port *sci_port, u32 timeout)
1378 {
1379         enum sci_status status = SCI_FAILURE_INVALID_PHY;
1380         struct scic_sds_phy *selected_phy = NULL;
1381         enum scic_sds_port_states state;
1382         u32 phy_index;
1383
1384         state = sci_port->sm.current_state_id;
1385         if (state != SCI_PORT_SUB_OPERATIONAL) {
1386                 dev_warn(sciport_to_dev(sci_port),
1387                          "%s: in wrong state: %d\n", __func__, state);
1388                 return SCI_FAILURE_INVALID_STATE;
1389         }
1390
1391         /* Select a phy on which we can send the hard reset request. */
1392         for (phy_index = 0; phy_index < SCI_MAX_PHYS && !selected_phy; phy_index++) {
1393                 selected_phy = sci_port->phy_table[phy_index];
1394                 if (selected_phy &&
1395                     !scic_sds_port_active_phy(sci_port, selected_phy)) {
1396                         /*
1397                          * We found a phy but it is not ready select
1398                          * different phy
1399                          */
1400                         selected_phy = NULL;
1401                 }
1402         }
1403
1404         /* If we have a phy then go ahead and start the reset procedure */
1405         if (!selected_phy)
1406                 return status;
1407         status = scic_sds_phy_reset(selected_phy);
1408
1409         if (status != SCI_SUCCESS)
1410                 return status;
1411
1412         sci_mod_timer(&sci_port->timer, timeout);
1413         sci_port->not_ready_reason = SCIC_PORT_NOT_READY_HARD_RESET_REQUESTED;
1414
1415         port_state_machine_change(sci_port,
1416                                   SCI_PORT_RESETTING);
1417         return SCI_SUCCESS;
1418 }
1419
1420 /**
1421  * scic_sds_port_add_phy() -
1422  * @sci_port: This parameter specifies the port in which the phy will be added.
1423  * @sci_phy: This parameter is the phy which is to be added to the port.
1424  *
1425  * This method will add a PHY to the selected port. This method returns an
1426  * enum sci_status. SCI_SUCCESS the phy has been added to the port. Any other
1427  * status is a failure to add the phy to the port.
1428  */
1429 enum sci_status scic_sds_port_add_phy(struct scic_sds_port *sci_port,
1430                                       struct scic_sds_phy *sci_phy)
1431 {
1432         enum sci_status status;
1433         enum scic_sds_port_states state;
1434
1435         state = sci_port->sm.current_state_id;
1436         switch (state) {
1437         case SCI_PORT_STOPPED: {
1438                 struct sci_sas_address port_sas_address;
1439
1440                 /* Read the port assigned SAS Address if there is one */
1441                 scic_sds_port_get_sas_address(sci_port, &port_sas_address);
1442
1443                 if (port_sas_address.high != 0 && port_sas_address.low != 0) {
1444                         struct sci_sas_address phy_sas_address;
1445
1446                         /* Make sure that the PHY SAS Address matches the SAS Address
1447                          * for this port
1448                          */
1449                         scic_sds_phy_get_sas_address(sci_phy, &phy_sas_address);
1450
1451                         if (port_sas_address.high != phy_sas_address.high ||
1452                             port_sas_address.low  != phy_sas_address.low)
1453                                 return SCI_FAILURE_UNSUPPORTED_PORT_CONFIGURATION;
1454                 }
1455                 return scic_sds_port_set_phy(sci_port, sci_phy);
1456         }
1457         case SCI_PORT_SUB_WAITING:
1458         case SCI_PORT_SUB_OPERATIONAL:
1459                 status = scic_sds_port_set_phy(sci_port, sci_phy);
1460
1461                 if (status != SCI_SUCCESS)
1462                         return status;
1463
1464                 scic_sds_port_general_link_up_handler(sci_port, sci_phy, true);
1465                 sci_port->not_ready_reason = SCIC_PORT_NOT_READY_RECONFIGURING;
1466                 port_state_machine_change(sci_port, SCI_PORT_SUB_CONFIGURING);
1467
1468                 return status;
1469         case SCI_PORT_SUB_CONFIGURING:
1470                 status = scic_sds_port_set_phy(sci_port, sci_phy);
1471
1472                 if (status != SCI_SUCCESS)
1473                         return status;
1474                 scic_sds_port_general_link_up_handler(sci_port, sci_phy, true);
1475
1476                 /* Re-enter the configuring state since this may be the last phy in
1477                  * the port.
1478                  */
1479                 port_state_machine_change(sci_port,
1480                                           SCI_PORT_SUB_CONFIGURING);
1481                 return SCI_SUCCESS;
1482         default:
1483                 dev_warn(sciport_to_dev(sci_port),
1484                          "%s: in wrong state: %d\n", __func__, state);
1485                 return SCI_FAILURE_INVALID_STATE;
1486         }
1487 }
1488
1489 /**
1490  * scic_sds_port_remove_phy() -
1491  * @sci_port: This parameter specifies the port in which the phy will be added.
1492  * @sci_phy: This parameter is the phy which is to be added to the port.
1493  *
1494  * This method will remove the PHY from the selected PORT. This method returns
1495  * an enum sci_status. SCI_SUCCESS the phy has been removed from the port. Any
1496  * other status is a failure to add the phy to the port.
1497  */
1498 enum sci_status scic_sds_port_remove_phy(struct scic_sds_port *sci_port,
1499                                          struct scic_sds_phy *sci_phy)
1500 {
1501         enum sci_status status;
1502         enum scic_sds_port_states state;
1503
1504         state = sci_port->sm.current_state_id;
1505
1506         switch (state) {
1507         case SCI_PORT_STOPPED:
1508                 return scic_sds_port_clear_phy(sci_port, sci_phy);
1509         case SCI_PORT_SUB_OPERATIONAL:
1510                 status = scic_sds_port_clear_phy(sci_port, sci_phy);
1511                 if (status != SCI_SUCCESS)
1512                         return status;
1513
1514                 scic_sds_port_deactivate_phy(sci_port, sci_phy, true);
1515                 sci_port->not_ready_reason = SCIC_PORT_NOT_READY_RECONFIGURING;
1516                 port_state_machine_change(sci_port,
1517                                           SCI_PORT_SUB_CONFIGURING);
1518                 return SCI_SUCCESS;
1519         case SCI_PORT_SUB_CONFIGURING:
1520                 status = scic_sds_port_clear_phy(sci_port, sci_phy);
1521
1522                 if (status != SCI_SUCCESS)
1523                         return status;
1524                 scic_sds_port_deactivate_phy(sci_port, sci_phy, true);
1525
1526                 /* Re-enter the configuring state since this may be the last phy in
1527                  * the port
1528                  */
1529                 port_state_machine_change(sci_port,
1530                                           SCI_PORT_SUB_CONFIGURING);
1531                 return SCI_SUCCESS;
1532         default:
1533                 dev_warn(sciport_to_dev(sci_port),
1534                          "%s: in wrong state: %d\n", __func__, state);
1535                 return SCI_FAILURE_INVALID_STATE;
1536         }
1537 }
1538
1539 enum sci_status scic_sds_port_link_up(struct scic_sds_port *sci_port,
1540                                       struct scic_sds_phy *sci_phy)
1541 {
1542         enum scic_sds_port_states state;
1543
1544         state = sci_port->sm.current_state_id;
1545         switch (state) {
1546         case SCI_PORT_SUB_WAITING:
1547                 /* Since this is the first phy going link up for the port we
1548                  * can just enable it and continue
1549                  */
1550                 scic_sds_port_activate_phy(sci_port, sci_phy, true);
1551
1552                 port_state_machine_change(sci_port,
1553                                           SCI_PORT_SUB_OPERATIONAL);
1554                 return SCI_SUCCESS;
1555         case SCI_PORT_SUB_OPERATIONAL:
1556                 scic_sds_port_general_link_up_handler(sci_port, sci_phy, true);
1557                 return SCI_SUCCESS;
1558         case SCI_PORT_RESETTING:
1559                 /* TODO We should  make  sure  that  the phy  that  has gone
1560                  * link up is the same one on which we sent the reset.  It is
1561                  * possible that the phy on which we sent  the reset is not the
1562                  * one that has  gone  link up  and we  want to make sure that
1563                  * phy being reset  comes  back.  Consider the case where a
1564                  * reset is sent but before the hardware processes the reset it
1565                  * get a link up on  the  port because of a hot plug event.
1566                  * because  of  the reset request this phy will go link down
1567                  * almost immediately.
1568                  */
1569
1570                 /* In the resetting state we don't notify the user regarding
1571                  * link up and link down notifications.
1572                  */
1573                 scic_sds_port_general_link_up_handler(sci_port, sci_phy, false);
1574                 return SCI_SUCCESS;
1575         default:
1576                 dev_warn(sciport_to_dev(sci_port),
1577                          "%s: in wrong state: %d\n", __func__, state);
1578                 return SCI_FAILURE_INVALID_STATE;
1579         }
1580 }
1581
1582 enum sci_status scic_sds_port_link_down(struct scic_sds_port *sci_port,
1583                                         struct scic_sds_phy *sci_phy)
1584 {
1585         enum scic_sds_port_states state;
1586
1587         state = sci_port->sm.current_state_id;
1588         switch (state) {
1589         case SCI_PORT_SUB_OPERATIONAL:
1590                 scic_sds_port_deactivate_phy(sci_port, sci_phy, true);
1591
1592                 /* If there are no active phys left in the port, then
1593                  * transition the port to the WAITING state until such time
1594                  * as a phy goes link up
1595                  */
1596                 if (sci_port->active_phy_mask == 0)
1597                         port_state_machine_change(sci_port,
1598                                                   SCI_PORT_SUB_WAITING);
1599                 return SCI_SUCCESS;
1600         case SCI_PORT_RESETTING:
1601                 /* In the resetting state we don't notify the user regarding
1602                  * link up and link down notifications. */
1603                 scic_sds_port_deactivate_phy(sci_port, sci_phy, false);
1604                 return SCI_SUCCESS;
1605         default:
1606                 dev_warn(sciport_to_dev(sci_port),
1607                          "%s: in wrong state: %d\n", __func__, state);
1608                 return SCI_FAILURE_INVALID_STATE;
1609         }
1610 }
1611
1612 enum sci_status scic_sds_port_start_io(struct scic_sds_port *sci_port,
1613                                        struct scic_sds_remote_device *sci_dev,
1614                                        struct scic_sds_request *sci_req)
1615 {
1616         enum scic_sds_port_states state;
1617
1618         state = sci_port->sm.current_state_id;
1619         switch (state) {
1620         case SCI_PORT_SUB_WAITING:
1621                 return SCI_FAILURE_INVALID_STATE;
1622         case SCI_PORT_SUB_OPERATIONAL:
1623                 sci_port->started_request_count++;
1624                 return SCI_SUCCESS;
1625         default:
1626                 dev_warn(sciport_to_dev(sci_port),
1627                          "%s: in wrong state: %d\n", __func__, state);
1628                 return SCI_FAILURE_INVALID_STATE;
1629         }
1630 }
1631
1632 enum sci_status scic_sds_port_complete_io(struct scic_sds_port *sci_port,
1633                                           struct scic_sds_remote_device *sci_dev,
1634                                           struct scic_sds_request *sci_req)
1635 {
1636         enum scic_sds_port_states state;
1637
1638         state = sci_port->sm.current_state_id;
1639         switch (state) {
1640         case SCI_PORT_STOPPED:
1641                 dev_warn(sciport_to_dev(sci_port),
1642                          "%s: in wrong state: %d\n", __func__, state);
1643                 return SCI_FAILURE_INVALID_STATE;
1644         case SCI_PORT_STOPPING:
1645                 scic_sds_port_decrement_request_count(sci_port);
1646
1647                 if (sci_port->started_request_count == 0)
1648                         port_state_machine_change(sci_port,
1649                                                   SCI_PORT_STOPPED);
1650                 break;
1651         case SCI_PORT_READY:
1652         case SCI_PORT_RESETTING:
1653         case SCI_PORT_FAILED:
1654         case SCI_PORT_SUB_WAITING:
1655         case SCI_PORT_SUB_OPERATIONAL:
1656                 scic_sds_port_decrement_request_count(sci_port);
1657                 break;
1658         case SCI_PORT_SUB_CONFIGURING:
1659                 scic_sds_port_decrement_request_count(sci_port);
1660                 if (sci_port->started_request_count == 0) {
1661                         port_state_machine_change(sci_port,
1662                                                   SCI_PORT_SUB_OPERATIONAL);
1663                 }
1664                 break;
1665         }
1666         return SCI_SUCCESS;
1667 }
1668
1669 /**
1670  *
1671  * @sci_port: This is the port object which to suspend.
1672  *
1673  * This method will enable the SCU Port Task Scheduler for this port object but
1674  * will leave the port task scheduler in a suspended state. none
1675  */
1676 static void
1677 scic_sds_port_enable_port_task_scheduler(struct scic_sds_port *port)
1678 {
1679         u32 pts_control_value;
1680
1681         pts_control_value = readl(&port->port_task_scheduler_registers->control);
1682         pts_control_value |= SCU_PTSxCR_GEN_BIT(ENABLE) | SCU_PTSxCR_GEN_BIT(SUSPEND);
1683         writel(pts_control_value, &port->port_task_scheduler_registers->control);
1684 }
1685
1686 /**
1687  *
1688  * @sci_port: This is the port object which to resume.
1689  *
1690  * This method will disable the SCU port task scheduler for this port object.
1691  * none
1692  */
1693 static void
1694 scic_sds_port_disable_port_task_scheduler(struct scic_sds_port *port)
1695 {
1696         u32 pts_control_value;
1697
1698         pts_control_value = readl(&port->port_task_scheduler_registers->control);
1699         pts_control_value &=
1700                 ~(SCU_PTSxCR_GEN_BIT(ENABLE) | SCU_PTSxCR_GEN_BIT(SUSPEND));
1701         writel(pts_control_value, &port->port_task_scheduler_registers->control);
1702 }
1703
1704 static void scic_sds_port_post_dummy_remote_node(struct scic_sds_port *sci_port)
1705 {
1706         struct scic_sds_controller *scic = sci_port->owning_controller;
1707         u8 phys_index = sci_port->physical_port_index;
1708         union scu_remote_node_context *rnc;
1709         u16 rni = sci_port->reserved_rni;
1710         u32 command;
1711
1712         rnc = &scic->remote_node_context_table[rni];
1713         rnc->ssp.is_valid = true;
1714
1715         command = SCU_CONTEXT_COMMAND_POST_RNC_32 |
1716                   phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni;
1717
1718         scic_sds_controller_post_request(scic, command);
1719
1720         /* ensure hardware has seen the post rnc command and give it
1721          * ample time to act before sending the suspend
1722          */
1723         readl(&scic->smu_registers->interrupt_status); /* flush */
1724         udelay(10);
1725
1726         command = SCU_CONTEXT_COMMAND_POST_RNC_SUSPEND_TX_RX |
1727                   phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni;
1728
1729         scic_sds_controller_post_request(scic, command);
1730 }
1731
1732 static void scic_sds_port_stopped_state_enter(struct sci_base_state_machine *sm)
1733 {
1734         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1735
1736         if (sci_port->sm.previous_state_id == SCI_PORT_STOPPING) {
1737                 /*
1738                  * If we enter this state becasuse of a request to stop
1739                  * the port then we want to disable the hardwares port
1740                  * task scheduler. */
1741                 scic_sds_port_disable_port_task_scheduler(sci_port);
1742         }
1743 }
1744
1745 static void scic_sds_port_stopped_state_exit(struct sci_base_state_machine *sm)
1746 {
1747         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1748
1749         /* Enable and suspend the port task scheduler */
1750         scic_sds_port_enable_port_task_scheduler(sci_port);
1751 }
1752
1753 static void scic_sds_port_ready_state_enter(struct sci_base_state_machine *sm)
1754 {
1755         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1756         struct scic_sds_controller *scic = sci_port->owning_controller;
1757         struct isci_host *ihost = scic_to_ihost(scic);
1758         struct isci_port *iport = sci_port_to_iport(sci_port);
1759         u32 prev_state;
1760
1761         prev_state = sci_port->sm.previous_state_id;
1762         if (prev_state  == SCI_PORT_RESETTING)
1763                 isci_port_hard_reset_complete(iport, SCI_SUCCESS);
1764         else
1765                 isci_port_not_ready(ihost, iport);
1766
1767         /* Post and suspend the dummy remote node context for this port. */
1768         scic_sds_port_post_dummy_remote_node(sci_port);
1769
1770         /* Start the ready substate machine */
1771         port_state_machine_change(sci_port,
1772                                   SCI_PORT_SUB_WAITING);
1773 }
1774
1775 static void scic_sds_port_resetting_state_exit(struct sci_base_state_machine *sm)
1776 {
1777         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1778
1779         sci_del_timer(&sci_port->timer);
1780 }
1781
1782 static void scic_sds_port_stopping_state_exit(struct sci_base_state_machine *sm)
1783 {
1784         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1785
1786         sci_del_timer(&sci_port->timer);
1787
1788         scic_sds_port_destroy_dummy_resources(sci_port);
1789 }
1790
1791 static void scic_sds_port_failed_state_enter(struct sci_base_state_machine *sm)
1792 {
1793         struct scic_sds_port *sci_port = container_of(sm, typeof(*sci_port), sm);
1794         struct isci_port *iport = sci_port_to_iport(sci_port);
1795
1796         isci_port_hard_reset_complete(iport, SCI_FAILURE_TIMEOUT);
1797 }
1798
1799 /* --------------------------------------------------------------------------- */
1800
1801 static const struct sci_base_state scic_sds_port_state_table[] = {
1802         [SCI_PORT_STOPPED] = {
1803                 .enter_state = scic_sds_port_stopped_state_enter,
1804                 .exit_state  = scic_sds_port_stopped_state_exit
1805         },
1806         [SCI_PORT_STOPPING] = {
1807                 .exit_state  = scic_sds_port_stopping_state_exit
1808         },
1809         [SCI_PORT_READY] = {
1810                 .enter_state = scic_sds_port_ready_state_enter,
1811         },
1812         [SCI_PORT_SUB_WAITING] = {
1813                 .enter_state = scic_sds_port_ready_substate_waiting_enter,
1814         },
1815         [SCI_PORT_SUB_OPERATIONAL] = {
1816                 .enter_state = scic_sds_port_ready_substate_operational_enter,
1817                 .exit_state  = scic_sds_port_ready_substate_operational_exit
1818         },
1819         [SCI_PORT_SUB_CONFIGURING] = {
1820                 .enter_state = scic_sds_port_ready_substate_configuring_enter,
1821                 .exit_state  = scic_sds_port_ready_substate_configuring_exit
1822         },
1823         [SCI_PORT_RESETTING] = {
1824                 .exit_state  = scic_sds_port_resetting_state_exit
1825         },
1826         [SCI_PORT_FAILED] = {
1827                 .enter_state = scic_sds_port_failed_state_enter,
1828         }
1829 };
1830
1831 void scic_sds_port_construct(struct scic_sds_port *sci_port, u8 index,
1832                              struct scic_sds_controller *scic)
1833 {
1834         sci_init_sm(&sci_port->sm, scic_sds_port_state_table, SCI_PORT_STOPPED);
1835
1836         sci_port->logical_port_index  = SCIC_SDS_DUMMY_PORT;
1837         sci_port->physical_port_index = index;
1838         sci_port->active_phy_mask     = 0;
1839         sci_port->ready_exit          = false;
1840
1841         sci_port->owning_controller = scic;
1842
1843         sci_port->started_request_count = 0;
1844         sci_port->assigned_device_count = 0;
1845
1846         sci_port->reserved_rni = SCU_DUMMY_INDEX;
1847         sci_port->reserved_tag = SCI_CONTROLLER_INVALID_IO_TAG;
1848
1849         sci_init_timer(&sci_port->timer, port_timeout);
1850
1851         sci_port->port_task_scheduler_registers = NULL;
1852
1853         for (index = 0; index < SCI_MAX_PHYS; index++)
1854                 sci_port->phy_table[index] = NULL;
1855 }
1856
1857 void isci_port_init(struct isci_port *iport, struct isci_host *ihost, int index)
1858 {
1859         INIT_LIST_HEAD(&iport->remote_dev_list);
1860         INIT_LIST_HEAD(&iport->domain_dev_list);
1861         spin_lock_init(&iport->state_lock);
1862         init_completion(&iport->start_complete);
1863         iport->isci_host = ihost;
1864         isci_port_change_state(iport, isci_freed);
1865         atomic_set(&iport->event, 0);
1866 }
1867
1868 /**
1869  * isci_port_get_state() - This function gets the status of the port object.
1870  * @isci_port: This parameter points to the isci_port object
1871  *
1872  * status of the object as a isci_status enum.
1873  */
1874 enum isci_status isci_port_get_state(
1875         struct isci_port *isci_port)
1876 {
1877         return isci_port->status;
1878 }
1879
1880 void scic_sds_port_broadcast_change_received(
1881         struct scic_sds_port *sci_port,
1882         struct scic_sds_phy *sci_phy)
1883 {
1884         struct scic_sds_controller *scic = sci_port->owning_controller;
1885         struct isci_host *ihost = scic_to_ihost(scic);
1886
1887         /* notify the user. */
1888         isci_port_bc_change_received(ihost, sci_port, sci_phy);
1889 }
1890
1891 int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *iport,
1892                                  struct isci_phy *iphy)
1893 {
1894         unsigned long flags;
1895         enum sci_status status;
1896         int idx, ret = TMF_RESP_FUNC_COMPLETE;
1897
1898         dev_dbg(&ihost->pdev->dev, "%s: iport = %p\n",
1899                 __func__, iport);
1900
1901         init_completion(&iport->hard_reset_complete);
1902
1903         spin_lock_irqsave(&ihost->scic_lock, flags);
1904
1905         #define ISCI_PORT_RESET_TIMEOUT SCIC_SDS_SIGNATURE_FIS_TIMEOUT
1906         status = scic_port_hard_reset(&iport->sci, ISCI_PORT_RESET_TIMEOUT);
1907
1908         spin_unlock_irqrestore(&ihost->scic_lock, flags);
1909
1910         if (status == SCI_SUCCESS) {
1911                 wait_for_completion(&iport->hard_reset_complete);
1912
1913                 dev_dbg(&ihost->pdev->dev,
1914                         "%s: iport = %p; hard reset completion\n",
1915                         __func__, iport);
1916
1917                 if (iport->hard_reset_status != SCI_SUCCESS)
1918                         ret = TMF_RESP_FUNC_FAILED;
1919         } else {
1920                 ret = TMF_RESP_FUNC_FAILED;
1921
1922                 dev_err(&ihost->pdev->dev,
1923                         "%s: iport = %p; scic_port_hard_reset call"
1924                         " failed 0x%x\n",
1925                         __func__, iport, status);
1926
1927         }
1928
1929         /* If the hard reset for the port has failed, consider this
1930          * the same as link failures on all phys in the port.
1931          */
1932         if (ret != TMF_RESP_FUNC_COMPLETE) {
1933
1934                 dev_err(&ihost->pdev->dev,
1935                         "%s: iport = %p; hard reset failed "
1936                         "(0x%x) - driving explicit link fail for all phys\n",
1937                         __func__, iport, iport->hard_reset_status);
1938
1939                 /* Down all phys in the port. */
1940                 spin_lock_irqsave(&ihost->scic_lock, flags);
1941                 for (idx = 0; idx < SCI_MAX_PHYS; ++idx) {
1942
1943                         if (iport->sci.phy_table[idx] != NULL) {
1944
1945                                 scic_sds_phy_stop(
1946                                         iport->sci.phy_table[idx]);
1947                                 scic_sds_phy_start(
1948                                         iport->sci.phy_table[idx]);
1949                         }
1950                 }
1951                 spin_unlock_irqrestore(&ihost->scic_lock, flags);
1952         }
1953         return ret;
1954 }
1955
1956 /**
1957  * isci_port_deformed() - This function is called by libsas when a port becomes
1958  *    inactive.
1959  * @phy: This parameter specifies the libsas phy with the inactive port.
1960  *
1961  */
1962 void isci_port_deformed(struct asd_sas_phy *phy)
1963 {
1964         pr_debug("%s: sas_phy = %p\n", __func__, phy);
1965 }
1966
1967 /**
1968  * isci_port_formed() - This function is called by libsas when a port becomes
1969  *    active.
1970  * @phy: This parameter specifies the libsas phy with the active port.
1971  *
1972  */
1973 void isci_port_formed(struct asd_sas_phy *phy)
1974 {
1975         pr_debug("%s: sas_phy = %p, sas_port = %p\n", __func__, phy, phy->port);
1976 }