host.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. /*
  2. * This file is provided under a dual BSD/GPLv2 license. When using or
  3. * redistributing this file, you may do so under either license.
  4. *
  5. * GPL LICENSE SUMMARY
  6. *
  7. * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of version 2 of the GNU General Public License as
  11. * published by the Free Software Foundation.
  12. *
  13. * This program is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  21. * The full GNU General Public License is included in this distribution
  22. * in the file called LICENSE.GPL.
  23. *
  24. * BSD LICENSE
  25. *
  26. * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
  27. * All rights reserved.
  28. *
  29. * Redistribution and use in source and binary forms, with or without
  30. * modification, are permitted provided that the following conditions
  31. * are met:
  32. *
  33. * * Redistributions of source code must retain the above copyright
  34. * notice, this list of conditions and the following disclaimer.
  35. * * Redistributions in binary form must reproduce the above copyright
  36. * notice, this list of conditions and the following disclaimer in
  37. * the documentation and/or other materials provided with the
  38. * distribution.
  39. * * Neither the name of Intel Corporation nor the names of its
  40. * contributors may be used to endorse or promote products derived
  41. * from this software without specific prior written permission.
  42. *
  43. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  44. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  45. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  46. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  47. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  48. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  49. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  50. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  51. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  52. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  53. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  54. */
  55. #ifndef _SCI_HOST_H_
  56. #define _SCI_HOST_H_
  57. #include "remote_device.h"
  58. #include "phy.h"
  59. #include "isci.h"
  60. #include "remote_node_table.h"
  61. #include "registers.h"
  62. #include "scu_unsolicited_frame.h"
  63. #include "unsolicited_frame_control.h"
  64. #include "probe_roms.h"
  65. struct isci_request;
  66. struct scu_task_context;
  67. /**
  68. * struct scic_power_control -
  69. *
  70. * This structure defines the fields for managing power control for direct
  71. * attached disk devices.
  72. */
  73. struct scic_power_control {
  74. /**
  75. * This field is set when the power control timer is running and cleared when
  76. * it is not.
  77. */
  78. bool timer_started;
  79. /**
  80. * Timer to control when the directed attached disks can consume power.
  81. */
  82. struct sci_timer timer;
  83. /**
  84. * This field is used to keep track of how many phys are put into the
  85. * requesters field.
  86. */
  87. u8 phys_waiting;
  88. /**
  89. * This field is used to keep track of how many phys have been granted to consume power
  90. */
  91. u8 phys_granted_power;
  92. /**
  93. * This field is an array of phys that we are waiting on. The phys are direct
  94. * mapped into requesters via struct scic_sds_phy.phy_index
  95. */
  96. struct isci_phy *requesters[SCI_MAX_PHYS];
  97. };
  98. struct scic_sds_port_configuration_agent;
  99. typedef void (*port_config_fn)(struct scic_sds_controller *,
  100. struct scic_sds_port_configuration_agent *,
  101. struct scic_sds_port *, struct isci_phy *);
  102. struct scic_sds_port_configuration_agent {
  103. u16 phy_configured_mask;
  104. u16 phy_ready_mask;
  105. struct {
  106. u8 min_index;
  107. u8 max_index;
  108. } phy_valid_port_range[SCI_MAX_PHYS];
  109. bool timer_pending;
  110. port_config_fn link_up_handler;
  111. port_config_fn link_down_handler;
  112. struct sci_timer timer;
  113. };
  114. /**
  115. * struct scic_sds_controller -
  116. *
  117. * This structure represents the SCU controller object.
  118. */
  119. struct scic_sds_controller {
  120. /**
  121. * This field contains the information for the base controller state
  122. * machine.
  123. */
  124. struct sci_base_state_machine sm;
  125. /**
  126. * Timer for controller start/stop operations.
  127. */
  128. struct sci_timer timer;
  129. /**
  130. * This field contains the user parameters to be utilized for this
  131. * core controller object.
  132. */
  133. union scic_user_parameters user_parameters;
  134. /**
  135. * This field contains the OEM parameters to be utilized for this
  136. * core controller object.
  137. */
  138. union scic_oem_parameters oem_parameters;
  139. /**
  140. * This field contains the port configuration agent for this controller.
  141. */
  142. struct scic_sds_port_configuration_agent port_agent;
  143. /**
  144. * This field is the array of device objects that are currently constructed
  145. * for this controller object. This table is used as a fast lookup of device
  146. * objects that need to handle device completion notifications from the
  147. * hardware. The table is RNi based.
  148. */
  149. struct scic_sds_remote_device *device_table[SCI_MAX_REMOTE_DEVICES];
  150. /**
  151. * This field is the free RNi data structure
  152. */
  153. struct scic_remote_node_table available_remote_nodes;
  154. /**
  155. * This filed is the struct scic_power_control data used to controll when direct
  156. * attached devices can consume power.
  157. */
  158. struct scic_power_control power_control;
  159. /* sequence number per tci */
  160. u8 io_request_sequence[SCI_MAX_IO_REQUESTS];
  161. /**
  162. * This field is a pointer to the memory allocated by the driver for the task
  163. * context table. This data is shared between the hardware and software.
  164. */
  165. struct scu_task_context *task_context_table;
  166. dma_addr_t task_context_dma;
  167. /**
  168. * This field is a pointer to the memory allocated by the driver for the
  169. * remote node context table. This table is shared between the hardware and
  170. * software.
  171. */
  172. union scu_remote_node_context *remote_node_context_table;
  173. /**
  174. * This field is a pointer to the completion queue. This memory is
  175. * written to by the hardware and read by the software.
  176. */
  177. u32 *completion_queue;
  178. /**
  179. * This field is the software copy of the completion queue get pointer. The
  180. * controller object writes this value to the hardware after processing the
  181. * completion entries.
  182. */
  183. u32 completion_queue_get;
  184. /**
  185. * This field is the minimum of the number of hardware supported port entries
  186. * and the software requested port entries.
  187. */
  188. u32 logical_port_entries;
  189. /**
  190. * This field is the minimum number of devices supported by the hardware and
  191. * the number of devices requested by the software.
  192. */
  193. u32 remote_node_entries;
  194. /**
  195. * This field is the minimum number of IO requests supported by the hardware
  196. * and the number of IO requests requested by the software.
  197. */
  198. u32 task_context_entries;
  199. /**
  200. * This object contains all of the unsolicited frame specific
  201. * data utilized by the core controller.
  202. */
  203. struct scic_sds_unsolicited_frame_control uf_control;
  204. /* Phy Startup Data */
  205. /**
  206. * Timer for controller phy request startup. On controller start the
  207. * controller will start each PHY individually in order of phy index.
  208. */
  209. struct sci_timer phy_timer;
  210. /**
  211. * This field is set when the phy_timer is running and is cleared when
  212. * the phy_timer is stopped.
  213. */
  214. bool phy_startup_timer_pending;
  215. /**
  216. * This field is the index of the next phy start. It is initialized to 0 and
  217. * increments for each phy index that is started.
  218. */
  219. u32 next_phy_to_start;
  220. /**
  221. * This field controlls the invalid link up notifications to the SCI_USER. If
  222. * an invalid_link_up notification is reported a bit for the PHY index is set
  223. * so further notifications are not made. Once the PHY object reports link up
  224. * and is made part of a port then this bit for the PHY index is cleared.
  225. */
  226. u8 invalid_phy_mask;
  227. /*
  228. * This field saves the current interrupt coalescing number of the controller.
  229. */
  230. u16 interrupt_coalesce_number;
  231. /*
  232. * This field saves the current interrupt coalescing timeout value in microseconds.
  233. */
  234. u32 interrupt_coalesce_timeout;
  235. /**
  236. * This field is a pointer to the memory mapped register space for the
  237. * struct smu_registers.
  238. */
  239. struct smu_registers __iomem *smu_registers;
  240. /**
  241. * This field is a pointer to the memory mapped register space for the
  242. * struct scu_registers.
  243. */
  244. struct scu_registers __iomem *scu_registers;
  245. };
  246. struct isci_host {
  247. struct scic_sds_controller sci;
  248. u16 tci_head;
  249. u16 tci_tail;
  250. u16 tci_pool[SCI_MAX_IO_REQUESTS];
  251. union scic_oem_parameters oem_parameters;
  252. int id; /* unique within a given pci device */
  253. struct isci_phy phys[SCI_MAX_PHYS];
  254. struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */
  255. struct sas_ha_struct sas_ha;
  256. spinlock_t state_lock;
  257. struct pci_dev *pdev;
  258. enum isci_status status;
  259. #define IHOST_START_PENDING 0
  260. #define IHOST_STOP_PENDING 1
  261. unsigned long flags;
  262. wait_queue_head_t eventq;
  263. struct Scsi_Host *shost;
  264. struct tasklet_struct completion_tasklet;
  265. struct list_head requests_to_complete;
  266. struct list_head requests_to_errorback;
  267. spinlock_t scic_lock;
  268. struct isci_request *reqs[SCI_MAX_IO_REQUESTS];
  269. struct isci_remote_device devices[SCI_MAX_REMOTE_DEVICES];
  270. };
  271. /**
  272. * enum scic_sds_controller_states - This enumeration depicts all the states
  273. * for the common controller state machine.
  274. */
  275. enum scic_sds_controller_states {
  276. /**
  277. * Simply the initial state for the base controller state machine.
  278. */
  279. SCIC_INITIAL = 0,
  280. /**
  281. * This state indicates that the controller is reset. The memory for
  282. * the controller is in it's initial state, but the controller requires
  283. * initialization.
  284. * This state is entered from the INITIAL state.
  285. * This state is entered from the RESETTING state.
  286. */
  287. SCIC_RESET,
  288. /**
  289. * This state is typically an action state that indicates the controller
  290. * is in the process of initialization. In this state no new IO operations
  291. * are permitted.
  292. * This state is entered from the RESET state.
  293. */
  294. SCIC_INITIALIZING,
  295. /**
  296. * This state indicates that the controller has been successfully
  297. * initialized. In this state no new IO operations are permitted.
  298. * This state is entered from the INITIALIZING state.
  299. */
  300. SCIC_INITIALIZED,
  301. /**
  302. * This state indicates the the controller is in the process of becoming
  303. * ready (i.e. starting). In this state no new IO operations are permitted.
  304. * This state is entered from the INITIALIZED state.
  305. */
  306. SCIC_STARTING,
  307. /**
  308. * This state indicates the controller is now ready. Thus, the user
  309. * is able to perform IO operations on the controller.
  310. * This state is entered from the STARTING state.
  311. */
  312. SCIC_READY,
  313. /**
  314. * This state is typically an action state that indicates the controller
  315. * is in the process of resetting. Thus, the user is unable to perform
  316. * IO operations on the controller. A reset is considered destructive in
  317. * most cases.
  318. * This state is entered from the READY state.
  319. * This state is entered from the FAILED state.
  320. * This state is entered from the STOPPED state.
  321. */
  322. SCIC_RESETTING,
  323. /**
  324. * This state indicates that the controller is in the process of stopping.
  325. * In this state no new IO operations are permitted, but existing IO
  326. * operations are allowed to complete.
  327. * This state is entered from the READY state.
  328. */
  329. SCIC_STOPPING,
  330. /**
  331. * This state indicates that the controller has successfully been stopped.
  332. * In this state no new IO operations are permitted.
  333. * This state is entered from the STOPPING state.
  334. */
  335. SCIC_STOPPED,
  336. /**
  337. * This state indicates that the controller could not successfully be
  338. * initialized. In this state no new IO operations are permitted.
  339. * This state is entered from the INITIALIZING state.
  340. * This state is entered from the STARTING state.
  341. * This state is entered from the STOPPING state.
  342. * This state is entered from the RESETTING state.
  343. */
  344. SCIC_FAILED,
  345. };
  346. /**
  347. * struct isci_pci_info - This class represents the pci function containing the
  348. * controllers. Depending on PCI SKU, there could be up to 2 controllers in
  349. * the PCI function.
  350. */
  351. #define SCI_MAX_MSIX_INT (SCI_NUM_MSI_X_INT*SCI_MAX_CONTROLLERS)
  352. struct isci_pci_info {
  353. struct msix_entry msix_entries[SCI_MAX_MSIX_INT];
  354. struct isci_host *hosts[SCI_MAX_CONTROLLERS];
  355. struct isci_orom *orom;
  356. };
  357. static inline struct isci_pci_info *to_pci_info(struct pci_dev *pdev)
  358. {
  359. return pci_get_drvdata(pdev);
  360. }
  361. #define for_each_isci_host(id, ihost, pdev) \
  362. for (id = 0, ihost = to_pci_info(pdev)->hosts[id]; \
  363. id < ARRAY_SIZE(to_pci_info(pdev)->hosts) && ihost; \
  364. ihost = to_pci_info(pdev)->hosts[++id])
  365. static inline enum isci_status isci_host_get_state(struct isci_host *isci_host)
  366. {
  367. return isci_host->status;
  368. }
  369. static inline void isci_host_change_state(struct isci_host *isci_host,
  370. enum isci_status status)
  371. {
  372. unsigned long flags;
  373. dev_dbg(&isci_host->pdev->dev,
  374. "%s: isci_host = %p, state = 0x%x",
  375. __func__,
  376. isci_host,
  377. status);
  378. spin_lock_irqsave(&isci_host->state_lock, flags);
  379. isci_host->status = status;
  380. spin_unlock_irqrestore(&isci_host->state_lock, flags);
  381. }
  382. static inline void wait_for_start(struct isci_host *ihost)
  383. {
  384. wait_event(ihost->eventq, !test_bit(IHOST_START_PENDING, &ihost->flags));
  385. }
  386. static inline void wait_for_stop(struct isci_host *ihost)
  387. {
  388. wait_event(ihost->eventq, !test_bit(IHOST_STOP_PENDING, &ihost->flags));
  389. }
  390. static inline void wait_for_device_start(struct isci_host *ihost, struct isci_remote_device *idev)
  391. {
  392. wait_event(ihost->eventq, !test_bit(IDEV_START_PENDING, &idev->flags));
  393. }
  394. static inline void wait_for_device_stop(struct isci_host *ihost, struct isci_remote_device *idev)
  395. {
  396. wait_event(ihost->eventq, !test_bit(IDEV_STOP_PENDING, &idev->flags));
  397. }
  398. static inline struct isci_host *dev_to_ihost(struct domain_device *dev)
  399. {
  400. return dev->port->ha->lldd_ha;
  401. }
  402. static inline struct isci_host *scic_to_ihost(struct scic_sds_controller *scic)
  403. {
  404. /* XXX delete after merging scic_sds_contoller and isci_host */
  405. struct isci_host *ihost = container_of(scic, typeof(*ihost), sci);
  406. return ihost;
  407. }
  408. /**
  409. * scic_sds_controller_get_protocol_engine_group() -
  410. *
  411. * This macro returns the protocol engine group for this controller object.
  412. * Presently we only support protocol engine group 0 so just return that
  413. */
  414. #define scic_sds_controller_get_protocol_engine_group(controller) 0
  415. /* see scic_controller_io_tag_allocate|free for how seq and tci are built */
  416. #define ISCI_TAG(seq, tci) (((u16) (seq)) << 12 | tci)
  417. /* these are returned by the hardware, so sanitize them */
  418. #define ISCI_TAG_SEQ(tag) (((tag) >> 12) & (SCI_MAX_SEQ-1))
  419. #define ISCI_TAG_TCI(tag) ((tag) & (SCI_MAX_IO_REQUESTS-1))
  420. /* expander attached sata devices require 3 rnc slots */
  421. static inline int scic_sds_remote_device_node_count(struct scic_sds_remote_device *sci_dev)
  422. {
  423. struct domain_device *dev = sci_dev_to_domain(sci_dev);
  424. if ((dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) &&
  425. !sci_dev->is_direct_attached)
  426. return SCU_STP_REMOTE_NODE_COUNT;
  427. return SCU_SSP_REMOTE_NODE_COUNT;
  428. }
  429. /**
  430. * scic_sds_controller_set_invalid_phy() -
  431. *
  432. * This macro will set the bit in the invalid phy mask for this controller
  433. * object. This is used to control messages reported for invalid link up
  434. * notifications.
  435. */
  436. #define scic_sds_controller_set_invalid_phy(controller, phy) \
  437. ((controller)->invalid_phy_mask |= (1 << (phy)->phy_index))
  438. /**
  439. * scic_sds_controller_clear_invalid_phy() -
  440. *
  441. * This macro will clear the bit in the invalid phy mask for this controller
  442. * object. This is used to control messages reported for invalid link up
  443. * notifications.
  444. */
  445. #define scic_sds_controller_clear_invalid_phy(controller, phy) \
  446. ((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index))
  447. static inline struct device *scic_to_dev(struct scic_sds_controller *scic)
  448. {
  449. return &scic_to_ihost(scic)->pdev->dev;
  450. }
  451. static inline struct device *sciphy_to_dev(struct isci_phy *iphy)
  452. {
  453. if (!iphy || !iphy->isci_port || !iphy->isci_port->isci_host)
  454. return NULL;
  455. return &iphy->isci_port->isci_host->pdev->dev;
  456. }
  457. static inline struct device *sciport_to_dev(struct scic_sds_port *sci_port)
  458. {
  459. struct isci_port *iport = sci_port_to_iport(sci_port);
  460. if (!iport || !iport->isci_host)
  461. return NULL;
  462. return &iport->isci_host->pdev->dev;
  463. }
  464. static inline struct device *scirdev_to_dev(struct scic_sds_remote_device *sci_dev)
  465. {
  466. struct isci_remote_device *idev =
  467. container_of(sci_dev, typeof(*idev), sci);
  468. if (!idev || !idev->isci_port || !idev->isci_port->isci_host)
  469. return NULL;
  470. return &idev->isci_port->isci_host->pdev->dev;
  471. }
  472. enum {
  473. ISCI_SI_REVA0,
  474. ISCI_SI_REVA2,
  475. ISCI_SI_REVB0,
  476. ISCI_SI_REVC0
  477. };
  478. extern int isci_si_rev;
  479. static inline bool is_a0(void)
  480. {
  481. return isci_si_rev == ISCI_SI_REVA0;
  482. }
  483. static inline bool is_a2(void)
  484. {
  485. return isci_si_rev == ISCI_SI_REVA2;
  486. }
  487. static inline bool is_b0(void)
  488. {
  489. return isci_si_rev == ISCI_SI_REVB0;
  490. }
  491. static inline bool is_c0(void)
  492. {
  493. return isci_si_rev > ISCI_SI_REVB0;
  494. }
  495. void scic_sds_controller_post_request(struct scic_sds_controller *scic,
  496. u32 request);
  497. void scic_sds_controller_release_frame(struct scic_sds_controller *scic,
  498. u32 frame_index);
  499. void scic_sds_controller_copy_sata_response(void *response_buffer,
  500. void *frame_header,
  501. void *frame_buffer);
  502. enum sci_status scic_sds_controller_allocate_remote_node_context(struct scic_sds_controller *scic,
  503. struct scic_sds_remote_device *sci_dev,
  504. u16 *node_id);
  505. void scic_sds_controller_free_remote_node_context(
  506. struct scic_sds_controller *scic,
  507. struct scic_sds_remote_device *sci_dev,
  508. u16 node_id);
  509. union scu_remote_node_context *scic_sds_controller_get_remote_node_context_buffer(
  510. struct scic_sds_controller *scic,
  511. u16 node_id);
  512. struct isci_request *scic_request_by_tag(struct scic_sds_controller *scic,
  513. u16 io_tag);
  514. void scic_sds_controller_power_control_queue_insert(
  515. struct scic_sds_controller *scic,
  516. struct isci_phy *iphy);
  517. void scic_sds_controller_power_control_queue_remove(
  518. struct scic_sds_controller *scic,
  519. struct isci_phy *iphy);
  520. void scic_sds_controller_link_up(
  521. struct scic_sds_controller *scic,
  522. struct scic_sds_port *sci_port,
  523. struct isci_phy *iphy);
  524. void scic_sds_controller_link_down(
  525. struct scic_sds_controller *scic,
  526. struct scic_sds_port *sci_port,
  527. struct isci_phy *iphy);
  528. void scic_sds_controller_remote_device_stopped(
  529. struct scic_sds_controller *scic,
  530. struct scic_sds_remote_device *sci_dev);
  531. void scic_sds_controller_copy_task_context(
  532. struct scic_sds_controller *scic,
  533. struct isci_request *ireq);
  534. void scic_sds_controller_register_setup(struct scic_sds_controller *scic);
  535. enum sci_status scic_controller_continue_io(struct isci_request *ireq);
  536. int isci_host_scan_finished(struct Scsi_Host *, unsigned long);
  537. void isci_host_scan_start(struct Scsi_Host *);
  538. u16 isci_alloc_tag(struct isci_host *ihost);
  539. enum sci_status isci_free_tag(struct isci_host *ihost, u16 io_tag);
  540. void isci_tci_free(struct isci_host *ihost, u16 tci);
  541. int isci_host_init(struct isci_host *);
  542. void isci_host_init_controller_names(
  543. struct isci_host *isci_host,
  544. unsigned int controller_idx);
  545. void isci_host_deinit(
  546. struct isci_host *);
  547. void isci_host_port_link_up(
  548. struct isci_host *,
  549. struct scic_sds_port *,
  550. struct isci_phy *);
  551. int isci_host_dev_found(struct domain_device *);
  552. void isci_host_remote_device_start_complete(
  553. struct isci_host *,
  554. struct isci_remote_device *,
  555. enum sci_status);
  556. void scic_controller_disable_interrupts(
  557. struct scic_sds_controller *scic);
  558. enum sci_status scic_controller_start_io(
  559. struct scic_sds_controller *scic,
  560. struct scic_sds_remote_device *remote_device,
  561. struct isci_request *ireq);
  562. enum sci_task_status scic_controller_start_task(
  563. struct scic_sds_controller *scic,
  564. struct scic_sds_remote_device *remote_device,
  565. struct isci_request *ireq);
  566. enum sci_status scic_controller_terminate_request(
  567. struct scic_sds_controller *scic,
  568. struct scic_sds_remote_device *remote_device,
  569. struct isci_request *ireq);
  570. enum sci_status scic_controller_complete_io(
  571. struct scic_sds_controller *scic,
  572. struct scic_sds_remote_device *remote_device,
  573. struct isci_request *ireq);
  574. void scic_sds_port_configuration_agent_construct(
  575. struct scic_sds_port_configuration_agent *port_agent);
  576. enum sci_status scic_sds_port_configuration_agent_initialize(
  577. struct scic_sds_controller *controller,
  578. struct scic_sds_port_configuration_agent *port_agent);
  579. #endif