isci: unify constants
[pandora-kernel.git] / drivers / scsi / isci / host.h
1 /*
2  * This file is provided under a dual BSD/GPLv2 license.  When using or
3  * redistributing this file, you may do so under either license.
4  *
5  * GPL LICENSE SUMMARY
6  *
7  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of version 2 of the GNU General Public License as
11  * published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
21  * The full GNU General Public License is included in this distribution
22  * in the file called LICENSE.GPL.
23  *
24  * BSD LICENSE
25  *
26  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
27  * All rights reserved.
28  *
29  * Redistribution and use in source and binary forms, with or without
30  * modification, are permitted provided that the following conditions
31  * are met:
32  *
33  *   * Redistributions of source code must retain the above copyright
34  *     notice, this list of conditions and the following disclaimer.
35  *   * Redistributions in binary form must reproduce the above copyright
36  *     notice, this list of conditions and the following disclaimer in
37  *     the documentation and/or other materials provided with the
38  *     distribution.
39  *   * Neither the name of Intel Corporation nor the names of its
40  *     contributors may be used to endorse or promote products derived
41  *     from this software without specific prior written permission.
42  *
43  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
44  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
45  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
46  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
47  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
48  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
49  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
50  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
51  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
52  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
53  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
54  */
55
56 #ifndef _SCI_HOST_H_
57 #define _SCI_HOST_H_
58
59 #include "scic_sds_controller.h"
60 #include "remote_device.h"
61 #include "phy.h"
62
63 struct isci_host {
64         struct scic_sds_controller sci;
65         union scic_oem_parameters oem_parameters;
66
67         int id; /* unique within a given pci device */
68         struct list_head timers;
69         void *core_ctrl_memory;
70         struct dma_pool *dma_pool;
71         struct isci_phy phys[SCI_MAX_PHYS];
72         struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */
73         struct sas_ha_struct sas_ha;
74
75         int can_queue;
76         spinlock_t queue_lock;
77         spinlock_t state_lock;
78
79         struct pci_dev *pdev;
80
81         enum isci_status status;
82         #define IHOST_START_PENDING 0
83         #define IHOST_STOP_PENDING 1
84         unsigned long flags;
85         wait_queue_head_t eventq;
86         struct Scsi_Host *shost;
87         struct tasklet_struct completion_tasklet;
88         struct list_head requests_to_complete;
89         struct list_head requests_to_errorback;
90         spinlock_t scic_lock;
91
92         struct isci_remote_device devices[SCI_MAX_REMOTE_DEVICES];
93 };
94
95 /**
96  * struct isci_pci_info - This class represents the pci function containing the
97  *    controllers. Depending on PCI SKU, there could be up to 2 controllers in
98  *    the PCI function.
99  */
100 #define SCI_MAX_MSIX_INT (SCI_NUM_MSI_X_INT*SCI_MAX_CONTROLLERS)
101
102 struct isci_pci_info {
103         struct msix_entry msix_entries[SCI_MAX_MSIX_INT];
104         struct isci_host *hosts[SCI_MAX_CONTROLLERS];
105         struct isci_orom *orom;
106 };
107
108 static inline struct isci_pci_info *to_pci_info(struct pci_dev *pdev)
109 {
110         return pci_get_drvdata(pdev);
111 }
112
113 #define for_each_isci_host(id, ihost, pdev) \
114         for (id = 0, ihost = to_pci_info(pdev)->hosts[id]; \
115              id < ARRAY_SIZE(to_pci_info(pdev)->hosts) && ihost; \
116              ihost = to_pci_info(pdev)->hosts[++id])
117
118 static inline
119 enum isci_status isci_host_get_state(
120         struct isci_host *isci_host)
121 {
122         return isci_host->status;
123 }
124
125
126 static inline void isci_host_change_state(
127         struct isci_host *isci_host,
128         enum isci_status status)
129 {
130         unsigned long flags;
131
132         dev_dbg(&isci_host->pdev->dev,
133                 "%s: isci_host = %p, state = 0x%x",
134                 __func__,
135                 isci_host,
136                 status);
137         spin_lock_irqsave(&isci_host->state_lock, flags);
138         isci_host->status = status;
139         spin_unlock_irqrestore(&isci_host->state_lock, flags);
140
141 }
142
143 static inline int isci_host_can_queue(
144         struct isci_host *isci_host,
145         int num)
146 {
147         int ret = 0;
148         unsigned long flags;
149
150         spin_lock_irqsave(&isci_host->queue_lock, flags);
151         if ((isci_host->can_queue - num) < 0) {
152                 dev_dbg(&isci_host->pdev->dev,
153                         "%s: isci_host->can_queue = %d\n",
154                         __func__,
155                         isci_host->can_queue);
156                 ret = -SAS_QUEUE_FULL;
157
158         } else
159                 isci_host->can_queue -= num;
160
161         spin_unlock_irqrestore(&isci_host->queue_lock, flags);
162
163         return ret;
164 }
165
166 static inline void isci_host_can_dequeue(
167         struct isci_host *isci_host,
168         int num)
169 {
170         unsigned long flags;
171
172         spin_lock_irqsave(&isci_host->queue_lock, flags);
173         isci_host->can_queue += num;
174         spin_unlock_irqrestore(&isci_host->queue_lock, flags);
175 }
176
177 static inline void wait_for_start(struct isci_host *ihost)
178 {
179         wait_event(ihost->eventq, !test_bit(IHOST_START_PENDING, &ihost->flags));
180 }
181
182 static inline void wait_for_stop(struct isci_host *ihost)
183 {
184         wait_event(ihost->eventq, !test_bit(IHOST_STOP_PENDING, &ihost->flags));
185 }
186
187 static inline void wait_for_device_start(struct isci_host *ihost, struct isci_remote_device *idev)
188 {
189         wait_event(ihost->eventq, !test_bit(IDEV_START_PENDING, &idev->flags));
190 }
191
192 static inline void wait_for_device_stop(struct isci_host *ihost, struct isci_remote_device *idev)
193 {
194         wait_event(ihost->eventq, !test_bit(IDEV_STOP_PENDING, &idev->flags));
195 }
196
197 static inline struct isci_host *dev_to_ihost(struct domain_device *dev)
198 {
199         return dev->port->ha->lldd_ha;
200 }
201
202 static inline struct isci_host *scic_to_ihost(struct scic_sds_controller *scic)
203 {
204         /* XXX delete after merging scic_sds_contoller and isci_host */
205         struct isci_host *ihost = container_of(scic, typeof(*ihost), sci);
206
207         return ihost;
208 }
209
210 /**
211  * isci_host_scan_finished() -
212  *
213  * This function is one of the SCSI Host Template functions. The SCSI midlayer
214  * calls this function during a target scan, approx. once every 10 millisecs.
215  */
216 int isci_host_scan_finished(
217         struct Scsi_Host *,
218         unsigned long);
219
220
221 /**
222  * isci_host_scan_start() -
223  *
224  * This function is one of the SCSI Host Template function, called by the SCSI
225  * mid layer berfore a target scan begins. The core library controller start
226  * routine is called from here.
227  */
228 void isci_host_scan_start(
229         struct Scsi_Host *);
230
231 /**
232  * isci_host_start_complete() -
233  *
234  * This function is called by the core library, through the ISCI Module, to
235  * indicate controller start status.
236  */
237 void isci_host_start_complete(
238         struct isci_host *,
239         enum sci_status);
240
241 void isci_host_stop_complete(
242         struct isci_host *isci_host,
243         enum sci_status completion_status);
244
245 int isci_host_init(struct isci_host *);
246
247 void isci_host_init_controller_names(
248         struct isci_host *isci_host,
249         unsigned int controller_idx);
250
251 void isci_host_deinit(
252         struct isci_host *);
253
254 void isci_host_port_link_up(
255         struct isci_host *,
256         struct scic_sds_port *,
257         struct scic_sds_phy *);
258 int isci_host_dev_found(struct domain_device *);
259
260 void isci_host_remote_device_start_complete(
261         struct isci_host *,
262         struct isci_remote_device *,
263         enum sci_status);
264
265 #endif /* !defined(_SCI_HOST_H_) */