aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/isci/host.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/isci/host.h')
-rw-r--r--drivers/scsi/isci/host.h210
1 files changed, 46 insertions, 164 deletions
diff --git a/drivers/scsi/isci/host.h b/drivers/scsi/isci/host.h
index ca2e3b0ee0dd..013f672a8fd7 100644
--- a/drivers/scsi/isci/host.h
+++ b/drivers/scsi/isci/host.h
@@ -106,7 +106,7 @@ struct scic_power_control {
106}; 106};
107 107
108struct scic_sds_port_configuration_agent; 108struct scic_sds_port_configuration_agent;
109typedef void (*port_config_fn)(struct scic_sds_controller *, 109typedef void (*port_config_fn)(struct isci_host *,
110 struct scic_sds_port_configuration_agent *, 110 struct scic_sds_port_configuration_agent *,
111 struct isci_port *, struct isci_phy *); 111 struct isci_port *, struct isci_phy *);
112 112
@@ -124,171 +124,66 @@ struct scic_sds_port_configuration_agent {
124}; 124};
125 125
126/** 126/**
127 * struct scic_sds_controller - 127 * isci_host - primary host/controller object
128 * 128 * @timer: timeout start/stop operations
129 * This structure represents the SCU controller object. 129 * @device_table: rni (hw remote node index) to remote device lookup table
130 * @available_remote_nodes: rni allocator
131 * @power_control: manage device spin up
132 * @io_request_sequence: generation number for tci's (task contexts)
133 * @task_context_table: hw task context table
134 * @remote_node_context_table: hw remote node context table
135 * @completion_queue: hw-producer driver-consumer communication ring
136 * @completion_queue_get: tracks the driver 'head' of the ring to notify hw
137 * @logical_port_entries: min({driver|silicon}-supported-port-count)
138 * @remote_node_entries: min({driver|silicon}-supported-node-count)
139 * @task_context_entries: min({driver|silicon}-supported-task-count)
140 * @phy_timer: phy startup timer
141 * @invalid_phy_mask: if an invalid_link_up notification is reported a bit for
142 * the phy index is set so further notifications are not
143 * made. Once the phy reports link up and is made part of a
144 * port then this bit is cleared.
145
130 */ 146 */
131struct scic_sds_controller { 147struct isci_host {
132 /**
133 * This field contains the information for the base controller state
134 * machine.
135 */
136 struct sci_base_state_machine sm; 148 struct sci_base_state_machine sm;
137 149 /* XXX can we time this externally */
138 /**
139 * Timer for controller start/stop operations.
140 */
141 struct sci_timer timer; 150 struct sci_timer timer;
142 151 /* XXX drop reference module params directly */
143 /**
144 * This field contains the user parameters to be utilized for this
145 * core controller object.
146 */
147 union scic_user_parameters user_parameters; 152 union scic_user_parameters user_parameters;
148 153 /* XXX no need to be a union */
149 /**
150 * This field contains the OEM parameters to be utilized for this
151 * core controller object.
152 */
153 union scic_oem_parameters oem_parameters; 154 union scic_oem_parameters oem_parameters;
154
155 /**
156 * This field contains the port configuration agent for this controller.
157 */
158 struct scic_sds_port_configuration_agent port_agent; 155 struct scic_sds_port_configuration_agent port_agent;
159
160 /**
161 * This field is the array of device objects that are currently constructed
162 * for this controller object. This table is used as a fast lookup of device
163 * objects that need to handle device completion notifications from the
164 * hardware. The table is RNi based.
165 */
166 struct isci_remote_device *device_table[SCI_MAX_REMOTE_DEVICES]; 156 struct isci_remote_device *device_table[SCI_MAX_REMOTE_DEVICES];
167
168 /**
169 * This field is the free RNi data structure
170 */
171 struct scic_remote_node_table available_remote_nodes; 157 struct scic_remote_node_table available_remote_nodes;
172
173 /**
174 * This filed is the struct scic_power_control data used to controll when direct
175 * attached devices can consume power.
176 */
177 struct scic_power_control power_control; 158 struct scic_power_control power_control;
178
179 /* sequence number per tci */
180 u8 io_request_sequence[SCI_MAX_IO_REQUESTS]; 159 u8 io_request_sequence[SCI_MAX_IO_REQUESTS];
181
182 /**
183 * This field is a pointer to the memory allocated by the driver for the task
184 * context table. This data is shared between the hardware and software.
185 */
186 struct scu_task_context *task_context_table; 160 struct scu_task_context *task_context_table;
187 dma_addr_t task_context_dma; 161 dma_addr_t task_context_dma;
188
189 /**
190 * This field is a pointer to the memory allocated by the driver for the
191 * remote node context table. This table is shared between the hardware and
192 * software.
193 */
194 union scu_remote_node_context *remote_node_context_table; 162 union scu_remote_node_context *remote_node_context_table;
195
196 /**
197 * This field is a pointer to the completion queue. This memory is
198 * written to by the hardware and read by the software.
199 */
200 u32 *completion_queue; 163 u32 *completion_queue;
201
202 /**
203 * This field is the software copy of the completion queue get pointer. The
204 * controller object writes this value to the hardware after processing the
205 * completion entries.
206 */
207 u32 completion_queue_get; 164 u32 completion_queue_get;
208
209 /**
210 * This field is the minimum of the number of hardware supported port entries
211 * and the software requested port entries.
212 */
213 u32 logical_port_entries; 165 u32 logical_port_entries;
214
215 /**
216 * This field is the minimum number of devices supported by the hardware and
217 * the number of devices requested by the software.
218 */
219 u32 remote_node_entries; 166 u32 remote_node_entries;
220
221 /**
222 * This field is the minimum number of IO requests supported by the hardware
223 * and the number of IO requests requested by the software.
224 */
225 u32 task_context_entries; 167 u32 task_context_entries;
226
227 /**
228 * This object contains all of the unsolicited frame specific
229 * data utilized by the core controller.
230 */
231 struct scic_sds_unsolicited_frame_control uf_control; 168 struct scic_sds_unsolicited_frame_control uf_control;
232 169
233 /* Phy Startup Data */ 170 /* phy startup */
234 /**
235 * Timer for controller phy request startup. On controller start the
236 * controller will start each PHY individually in order of phy index.
237 */
238 struct sci_timer phy_timer; 171 struct sci_timer phy_timer;
239 172 /* XXX kill */
240 /**
241 * This field is set when the phy_timer is running and is cleared when
242 * the phy_timer is stopped.
243 */
244 bool phy_startup_timer_pending; 173 bool phy_startup_timer_pending;
245
246 /**
247 * This field is the index of the next phy start. It is initialized to 0 and
248 * increments for each phy index that is started.
249 */
250 u32 next_phy_to_start; 174 u32 next_phy_to_start;
251
252 /**
253 * This field controlls the invalid link up notifications to the SCI_USER. If
254 * an invalid_link_up notification is reported a bit for the PHY index is set
255 * so further notifications are not made. Once the PHY object reports link up
256 * and is made part of a port then this bit for the PHY index is cleared.
257 */
258 u8 invalid_phy_mask; 175 u8 invalid_phy_mask;
259 176
260 /* 177 /* TODO attempt dynamic interrupt coalescing scheme */
261 * This field saves the current interrupt coalescing number of the controller.
262 */
263 u16 interrupt_coalesce_number; 178 u16 interrupt_coalesce_number;
264
265 /*
266 * This field saves the current interrupt coalescing timeout value in microseconds.
267 */
268 u32 interrupt_coalesce_timeout; 179 u32 interrupt_coalesce_timeout;
269
270 /**
271 * This field is a pointer to the memory mapped register space for the
272 * struct smu_registers.
273 */
274 struct smu_registers __iomem *smu_registers; 180 struct smu_registers __iomem *smu_registers;
275
276 /**
277 * This field is a pointer to the memory mapped register space for the
278 * struct scu_registers.
279 */
280 struct scu_registers __iomem *scu_registers; 181 struct scu_registers __iomem *scu_registers;
281 182
282};
283
284struct isci_host {
285 struct scic_sds_controller sci;
286 u16 tci_head; 183 u16 tci_head;
287 u16 tci_tail; 184 u16 tci_tail;
288 u16 tci_pool[SCI_MAX_IO_REQUESTS]; 185 u16 tci_pool[SCI_MAX_IO_REQUESTS];
289 186
290 union scic_oem_parameters oem_parameters;
291
292 int id; /* unique within a given pci device */ 187 int id; /* unique within a given pci device */
293 struct isci_phy phys[SCI_MAX_PHYS]; 188 struct isci_phy phys[SCI_MAX_PHYS];
294 struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */ 189 struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */
@@ -464,14 +359,6 @@ static inline struct isci_host *dev_to_ihost(struct domain_device *dev)
464 return dev->port->ha->lldd_ha; 359 return dev->port->ha->lldd_ha;
465} 360}
466 361
467static inline struct isci_host *scic_to_ihost(struct scic_sds_controller *scic)
468{
469 /* XXX delete after merging scic_sds_contoller and isci_host */
470 struct isci_host *ihost = container_of(scic, typeof(*ihost), sci);
471
472 return ihost;
473}
474
475/** 362/**
476 * scic_sds_controller_get_protocol_engine_group() - 363 * scic_sds_controller_get_protocol_engine_group() -
477 * 364 *
@@ -518,11 +405,6 @@ static inline int scic_sds_remote_device_node_count(struct isci_remote_device *i
518#define scic_sds_controller_clear_invalid_phy(controller, phy) \ 405#define scic_sds_controller_clear_invalid_phy(controller, phy) \
519 ((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index)) 406 ((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index))
520 407
521static inline struct device *scic_to_dev(struct scic_sds_controller *scic)
522{
523 return &scic_to_ihost(scic)->pdev->dev;
524}
525
526static inline struct device *sciphy_to_dev(struct isci_phy *iphy) 408static inline struct device *sciphy_to_dev(struct isci_phy *iphy)
527{ 409{
528 410
@@ -578,54 +460,54 @@ static inline bool is_c0(void)
578 return isci_si_rev > ISCI_SI_REVB0; 460 return isci_si_rev > ISCI_SI_REVB0;
579} 461}
580 462
581void scic_sds_controller_post_request(struct scic_sds_controller *scic, 463void scic_sds_controller_post_request(struct isci_host *ihost,
582 u32 request); 464 u32 request);
583void scic_sds_controller_release_frame(struct scic_sds_controller *scic, 465void scic_sds_controller_release_frame(struct isci_host *ihost,
584 u32 frame_index); 466 u32 frame_index);
585void scic_sds_controller_copy_sata_response(void *response_buffer, 467void scic_sds_controller_copy_sata_response(void *response_buffer,
586 void *frame_header, 468 void *frame_header,
587 void *frame_buffer); 469 void *frame_buffer);
588enum sci_status scic_sds_controller_allocate_remote_node_context(struct scic_sds_controller *scic, 470enum sci_status scic_sds_controller_allocate_remote_node_context(struct isci_host *ihost,
589 struct isci_remote_device *idev, 471 struct isci_remote_device *idev,
590 u16 *node_id); 472 u16 *node_id);
591void scic_sds_controller_free_remote_node_context( 473void scic_sds_controller_free_remote_node_context(
592 struct scic_sds_controller *scic, 474 struct isci_host *ihost,
593 struct isci_remote_device *idev, 475 struct isci_remote_device *idev,
594 u16 node_id); 476 u16 node_id);
595union scu_remote_node_context *scic_sds_controller_get_remote_node_context_buffer( 477union scu_remote_node_context *scic_sds_controller_get_remote_node_context_buffer(
596 struct scic_sds_controller *scic, 478 struct isci_host *ihost,
597 u16 node_id); 479 u16 node_id);
598 480
599struct isci_request *scic_request_by_tag(struct scic_sds_controller *scic, 481struct isci_request *scic_request_by_tag(struct isci_host *ihost,
600 u16 io_tag); 482 u16 io_tag);
601 483
602void scic_sds_controller_power_control_queue_insert( 484void scic_sds_controller_power_control_queue_insert(
603 struct scic_sds_controller *scic, 485 struct isci_host *ihost,
604 struct isci_phy *iphy); 486 struct isci_phy *iphy);
605 487
606void scic_sds_controller_power_control_queue_remove( 488void scic_sds_controller_power_control_queue_remove(
607 struct scic_sds_controller *scic, 489 struct isci_host *ihost,
608 struct isci_phy *iphy); 490 struct isci_phy *iphy);
609 491
610void scic_sds_controller_link_up( 492void scic_sds_controller_link_up(
611 struct scic_sds_controller *scic, 493 struct isci_host *ihost,
612 struct isci_port *iport, 494 struct isci_port *iport,
613 struct isci_phy *iphy); 495 struct isci_phy *iphy);
614 496
615void scic_sds_controller_link_down( 497void scic_sds_controller_link_down(
616 struct scic_sds_controller *scic, 498 struct isci_host *ihost,
617 struct isci_port *iport, 499 struct isci_port *iport,
618 struct isci_phy *iphy); 500 struct isci_phy *iphy);
619 501
620void scic_sds_controller_remote_device_stopped( 502void scic_sds_controller_remote_device_stopped(
621 struct scic_sds_controller *scic, 503 struct isci_host *ihost,
622 struct isci_remote_device *idev); 504 struct isci_remote_device *idev);
623 505
624void scic_sds_controller_copy_task_context( 506void scic_sds_controller_copy_task_context(
625 struct scic_sds_controller *scic, 507 struct isci_host *ihost,
626 struct isci_request *ireq); 508 struct isci_request *ireq);
627 509
628void scic_sds_controller_register_setup(struct scic_sds_controller *scic); 510void scic_sds_controller_register_setup(struct isci_host *ihost);
629 511
630enum sci_status scic_controller_continue_io(struct isci_request *ireq); 512enum sci_status scic_controller_continue_io(struct isci_request *ireq);
631int isci_host_scan_finished(struct Scsi_Host *, unsigned long); 513int isci_host_scan_finished(struct Scsi_Host *, unsigned long);
@@ -655,25 +537,25 @@ void isci_host_remote_device_start_complete(
655 enum sci_status); 537 enum sci_status);
656 538
657void scic_controller_disable_interrupts( 539void scic_controller_disable_interrupts(
658 struct scic_sds_controller *scic); 540 struct isci_host *ihost);
659 541
660enum sci_status scic_controller_start_io( 542enum sci_status scic_controller_start_io(
661 struct scic_sds_controller *scic, 543 struct isci_host *ihost,
662 struct isci_remote_device *idev, 544 struct isci_remote_device *idev,
663 struct isci_request *ireq); 545 struct isci_request *ireq);
664 546
665enum sci_task_status scic_controller_start_task( 547enum sci_task_status scic_controller_start_task(
666 struct scic_sds_controller *scic, 548 struct isci_host *ihost,
667 struct isci_remote_device *idev, 549 struct isci_remote_device *idev,
668 struct isci_request *ireq); 550 struct isci_request *ireq);
669 551
670enum sci_status scic_controller_terminate_request( 552enum sci_status scic_controller_terminate_request(
671 struct scic_sds_controller *scic, 553 struct isci_host *ihost,
672 struct isci_remote_device *idev, 554 struct isci_remote_device *idev,
673 struct isci_request *ireq); 555 struct isci_request *ireq);
674 556
675enum sci_status scic_controller_complete_io( 557enum sci_status scic_controller_complete_io(
676 struct scic_sds_controller *scic, 558 struct isci_host *ihost,
677 struct isci_remote_device *idev, 559 struct isci_remote_device *idev,
678 struct isci_request *ireq); 560 struct isci_request *ireq);
679 561
@@ -681,6 +563,6 @@ void scic_sds_port_configuration_agent_construct(
681 struct scic_sds_port_configuration_agent *port_agent); 563 struct scic_sds_port_configuration_agent *port_agent);
682 564
683enum sci_status scic_sds_port_configuration_agent_initialize( 565enum sci_status scic_sds_port_configuration_agent_initialize(
684 struct scic_sds_controller *controller, 566 struct isci_host *ihost,
685 struct scic_sds_port_configuration_agent *port_agent); 567 struct scic_sds_port_configuration_agent *port_agent);
686#endif 568#endif