host.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803
  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 "scic_config_parameters.h"
  58. #include "remote_device.h"
  59. #include "phy.h"
  60. #include "pool.h"
  61. #include "state_machine.h"
  62. #include "remote_node_table.h"
  63. #include "registers.h"
  64. #include "scu_unsolicited_frame.h"
  65. #include "unsolicited_frame_control.h"
  66. #include "scic_sds_port_configuration_agent.h"
  67. struct scic_sds_request;
  68. struct scu_task_context;
  69. /**
  70. * struct scic_power_control -
  71. *
  72. * This structure defines the fields for managing power control for direct
  73. * attached disk devices.
  74. */
  75. struct scic_power_control {
  76. /**
  77. * This field is set when the power control timer is running and cleared when
  78. * it is not.
  79. */
  80. bool timer_started;
  81. /**
  82. * This field is the handle to the driver timer object. This timer is used to
  83. * control when the directed attached disks can consume power.
  84. */
  85. void *timer;
  86. /**
  87. * This field is used to keep track of how many phys are put into the
  88. * requesters field.
  89. */
  90. u8 phys_waiting;
  91. /**
  92. * This field is used to keep track of how many phys have been granted to consume power
  93. */
  94. u8 phys_granted_power;
  95. /**
  96. * This field is an array of phys that we are waiting on. The phys are direct
  97. * mapped into requesters via struct scic_sds_phy.phy_index
  98. */
  99. struct scic_sds_phy *requesters[SCI_MAX_PHYS];
  100. };
  101. /**
  102. * struct scic_sds_controller -
  103. *
  104. * This structure represents the SCU controller object.
  105. */
  106. struct scic_sds_controller {
  107. /**
  108. * This field contains the information for the base controller state
  109. * machine.
  110. */
  111. struct sci_base_state_machine state_machine;
  112. /**
  113. * This field is the driver timer object handler used to time the controller
  114. * object start and stop requests.
  115. */
  116. void *timeout_timer;
  117. /**
  118. * This field contains the user parameters to be utilized for this
  119. * core controller object.
  120. */
  121. union scic_user_parameters user_parameters;
  122. /**
  123. * This field contains the OEM parameters to be utilized for this
  124. * core controller object.
  125. */
  126. union scic_oem_parameters oem_parameters;
  127. /**
  128. * This field contains the port configuration agent for this controller.
  129. */
  130. struct scic_sds_port_configuration_agent port_agent;
  131. /**
  132. * This field is the array of device objects that are currently constructed
  133. * for this controller object. This table is used as a fast lookup of device
  134. * objects that need to handle device completion notifications from the
  135. * hardware. The table is RNi based.
  136. */
  137. struct scic_sds_remote_device *device_table[SCI_MAX_REMOTE_DEVICES];
  138. /**
  139. * This field is the array of IO request objects that are currently active for
  140. * this controller object. This table is used as a fast lookup of the io
  141. * request object that need to handle completion queue notifications. The
  142. * table is TCi based.
  143. */
  144. struct scic_sds_request *io_request_table[SCI_MAX_IO_REQUESTS];
  145. /**
  146. * This field is the free RNi data structure
  147. */
  148. struct scic_remote_node_table available_remote_nodes;
  149. /**
  150. * This field is the TCi pool used to manage the task context index.
  151. */
  152. SCI_POOL_CREATE(tci_pool, u16, SCI_MAX_IO_REQUESTS);
  153. /**
  154. * This filed is the struct scic_power_control data used to controll when direct
  155. * attached devices can consume power.
  156. */
  157. struct scic_power_control power_control;
  158. /**
  159. * This field is the array of sequence values for the IO Tag fields. Even
  160. * though only 4 bits of the field is used for the sequence the sequence is 16
  161. * bits in size so the sequence can be bitwise or'd with the TCi to build the
  162. * IO Tag value.
  163. */
  164. u16 io_request_sequence[SCI_MAX_IO_REQUESTS];
  165. /**
  166. * This field in the array of sequence values for the RNi. These are used
  167. * to control io request build to io request start operations. The sequence
  168. * value is recorded into an io request when it is built and is checked on
  169. * the io request start operation to make sure that there was not a device
  170. * hot plug between the build and start operation.
  171. */
  172. u8 remote_device_sequence[SCI_MAX_REMOTE_DEVICES];
  173. /**
  174. * This field is a pointer to the memory allocated by the driver for the task
  175. * context table. This data is shared between the hardware and software.
  176. */
  177. struct scu_task_context *task_context_table;
  178. /**
  179. * This field is a pointer to the memory allocated by the driver for the
  180. * remote node context table. This table is shared between the hardware and
  181. * software.
  182. */
  183. union scu_remote_node_context *remote_node_context_table;
  184. /**
  185. * This field is a pointer to the completion queue. This memory is
  186. * written to by the hardware and read by the software.
  187. */
  188. u32 *completion_queue;
  189. /**
  190. * This field is the software copy of the completion queue get pointer. The
  191. * controller object writes this value to the hardware after processing the
  192. * completion entries.
  193. */
  194. u32 completion_queue_get;
  195. /**
  196. * This field is the minimum of the number of hardware supported port entries
  197. * and the software requested port entries.
  198. */
  199. u32 logical_port_entries;
  200. /**
  201. * This field is the minimum number of hardware supported completion queue
  202. * entries and the software requested completion queue entries.
  203. */
  204. u32 completion_queue_entries;
  205. /**
  206. * This field is the minimum number of hardware supported event entries and
  207. * the software requested event entries.
  208. */
  209. u32 completion_event_entries;
  210. /**
  211. * This field is the minimum number of devices supported by the hardware and
  212. * the number of devices requested by the software.
  213. */
  214. u32 remote_node_entries;
  215. /**
  216. * This field is the minimum number of IO requests supported by the hardware
  217. * and the number of IO requests requested by the software.
  218. */
  219. u32 task_context_entries;
  220. /**
  221. * This object contains all of the unsolicited frame specific
  222. * data utilized by the core controller.
  223. */
  224. struct scic_sds_unsolicited_frame_control uf_control;
  225. /* Phy Startup Data */
  226. /**
  227. * This field is the driver timer handle for controller phy request startup.
  228. * On controller start the controller will start each PHY individually in
  229. * order of phy index.
  230. */
  231. void *phy_startup_timer;
  232. /**
  233. * This field is set when the phy_startup_timer is running and is cleared when
  234. * the phy_startup_timer is stopped.
  235. */
  236. bool phy_startup_timer_pending;
  237. /**
  238. * This field is the index of the next phy start. It is initialized to 0 and
  239. * increments for each phy index that is started.
  240. */
  241. u32 next_phy_to_start;
  242. /**
  243. * This field controlls the invalid link up notifications to the SCI_USER. If
  244. * an invalid_link_up notification is reported a bit for the PHY index is set
  245. * so further notifications are not made. Once the PHY object reports link up
  246. * and is made part of a port then this bit for the PHY index is cleared.
  247. */
  248. u8 invalid_phy_mask;
  249. /*
  250. * This field saves the current interrupt coalescing number of the controller.
  251. */
  252. u16 interrupt_coalesce_number;
  253. /*
  254. * This field saves the current interrupt coalescing timeout value in microseconds.
  255. */
  256. u32 interrupt_coalesce_timeout;
  257. /**
  258. * This field is a pointer to the memory mapped register space for the
  259. * struct smu_registers.
  260. */
  261. struct smu_registers __iomem *smu_registers;
  262. /**
  263. * This field is a pointer to the memory mapped register space for the
  264. * struct scu_registers.
  265. */
  266. struct scu_registers __iomem *scu_registers;
  267. };
  268. struct isci_host {
  269. struct scic_sds_controller sci;
  270. union scic_oem_parameters oem_parameters;
  271. int id; /* unique within a given pci device */
  272. struct list_head timers;
  273. void *core_ctrl_memory;
  274. struct dma_pool *dma_pool;
  275. struct isci_phy phys[SCI_MAX_PHYS];
  276. struct isci_port ports[SCI_MAX_PORTS + 1]; /* includes dummy port */
  277. struct sas_ha_struct sas_ha;
  278. int can_queue;
  279. spinlock_t queue_lock;
  280. spinlock_t state_lock;
  281. struct pci_dev *pdev;
  282. enum isci_status status;
  283. #define IHOST_START_PENDING 0
  284. #define IHOST_STOP_PENDING 1
  285. unsigned long flags;
  286. wait_queue_head_t eventq;
  287. struct Scsi_Host *shost;
  288. struct tasklet_struct completion_tasklet;
  289. struct list_head requests_to_complete;
  290. struct list_head requests_to_errorback;
  291. spinlock_t scic_lock;
  292. struct isci_remote_device devices[SCI_MAX_REMOTE_DEVICES];
  293. };
  294. /**
  295. * enum scic_sds_controller_states - This enumeration depicts all the states
  296. * for the common controller state machine.
  297. */
  298. enum scic_sds_controller_states {
  299. /**
  300. * Simply the initial state for the base controller state machine.
  301. */
  302. SCI_BASE_CONTROLLER_STATE_INITIAL = 0,
  303. /**
  304. * This state indicates that the controller is reset. The memory for
  305. * the controller is in it's initial state, but the controller requires
  306. * initialization.
  307. * This state is entered from the INITIAL state.
  308. * This state is entered from the RESETTING state.
  309. */
  310. SCI_BASE_CONTROLLER_STATE_RESET,
  311. /**
  312. * This state is typically an action state that indicates the controller
  313. * is in the process of initialization. In this state no new IO operations
  314. * are permitted.
  315. * This state is entered from the RESET state.
  316. */
  317. SCI_BASE_CONTROLLER_STATE_INITIALIZING,
  318. /**
  319. * This state indicates that the controller has been successfully
  320. * initialized. In this state no new IO operations are permitted.
  321. * This state is entered from the INITIALIZING state.
  322. */
  323. SCI_BASE_CONTROLLER_STATE_INITIALIZED,
  324. /**
  325. * This state indicates the the controller is in the process of becoming
  326. * ready (i.e. starting). In this state no new IO operations are permitted.
  327. * This state is entered from the INITIALIZED state.
  328. */
  329. SCI_BASE_CONTROLLER_STATE_STARTING,
  330. /**
  331. * This state indicates the controller is now ready. Thus, the user
  332. * is able to perform IO operations on the controller.
  333. * This state is entered from the STARTING state.
  334. */
  335. SCI_BASE_CONTROLLER_STATE_READY,
  336. /**
  337. * This state is typically an action state that indicates the controller
  338. * is in the process of resetting. Thus, the user is unable to perform
  339. * IO operations on the controller. A reset is considered destructive in
  340. * most cases.
  341. * This state is entered from the READY state.
  342. * This state is entered from the FAILED state.
  343. * This state is entered from the STOPPED state.
  344. */
  345. SCI_BASE_CONTROLLER_STATE_RESETTING,
  346. /**
  347. * This state indicates that the controller is in the process of stopping.
  348. * In this state no new IO operations are permitted, but existing IO
  349. * operations are allowed to complete.
  350. * This state is entered from the READY state.
  351. */
  352. SCI_BASE_CONTROLLER_STATE_STOPPING,
  353. /**
  354. * This state indicates that the controller has successfully been stopped.
  355. * In this state no new IO operations are permitted.
  356. * This state is entered from the STOPPING state.
  357. */
  358. SCI_BASE_CONTROLLER_STATE_STOPPED,
  359. /**
  360. * This state indicates that the controller could not successfully be
  361. * initialized. In this state no new IO operations are permitted.
  362. * This state is entered from the INITIALIZING state.
  363. * This state is entered from the STARTING state.
  364. * This state is entered from the STOPPING state.
  365. * This state is entered from the RESETTING state.
  366. */
  367. SCI_BASE_CONTROLLER_STATE_FAILED,
  368. SCI_BASE_CONTROLLER_MAX_STATES
  369. };
  370. /**
  371. * struct isci_pci_info - This class represents the pci function containing the
  372. * controllers. Depending on PCI SKU, there could be up to 2 controllers in
  373. * the PCI function.
  374. */
  375. #define SCI_MAX_MSIX_INT (SCI_NUM_MSI_X_INT*SCI_MAX_CONTROLLERS)
  376. struct isci_pci_info {
  377. struct msix_entry msix_entries[SCI_MAX_MSIX_INT];
  378. struct isci_host *hosts[SCI_MAX_CONTROLLERS];
  379. struct isci_orom *orom;
  380. };
  381. static inline struct isci_pci_info *to_pci_info(struct pci_dev *pdev)
  382. {
  383. return pci_get_drvdata(pdev);
  384. }
  385. #define for_each_isci_host(id, ihost, pdev) \
  386. for (id = 0, ihost = to_pci_info(pdev)->hosts[id]; \
  387. id < ARRAY_SIZE(to_pci_info(pdev)->hosts) && ihost; \
  388. ihost = to_pci_info(pdev)->hosts[++id])
  389. static inline enum isci_status isci_host_get_state(struct isci_host *isci_host)
  390. {
  391. return isci_host->status;
  392. }
  393. static inline void isci_host_change_state(struct isci_host *isci_host,
  394. enum isci_status status)
  395. {
  396. unsigned long flags;
  397. dev_dbg(&isci_host->pdev->dev,
  398. "%s: isci_host = %p, state = 0x%x",
  399. __func__,
  400. isci_host,
  401. status);
  402. spin_lock_irqsave(&isci_host->state_lock, flags);
  403. isci_host->status = status;
  404. spin_unlock_irqrestore(&isci_host->state_lock, flags);
  405. }
  406. static inline int isci_host_can_queue(struct isci_host *isci_host, int num)
  407. {
  408. int ret = 0;
  409. unsigned long flags;
  410. spin_lock_irqsave(&isci_host->queue_lock, flags);
  411. if ((isci_host->can_queue - num) < 0) {
  412. dev_dbg(&isci_host->pdev->dev,
  413. "%s: isci_host->can_queue = %d\n",
  414. __func__,
  415. isci_host->can_queue);
  416. ret = -SAS_QUEUE_FULL;
  417. } else
  418. isci_host->can_queue -= num;
  419. spin_unlock_irqrestore(&isci_host->queue_lock, flags);
  420. return ret;
  421. }
  422. static inline void isci_host_can_dequeue(struct isci_host *isci_host, int num)
  423. {
  424. unsigned long flags;
  425. spin_lock_irqsave(&isci_host->queue_lock, flags);
  426. isci_host->can_queue += num;
  427. spin_unlock_irqrestore(&isci_host->queue_lock, flags);
  428. }
  429. static inline void wait_for_start(struct isci_host *ihost)
  430. {
  431. wait_event(ihost->eventq, !test_bit(IHOST_START_PENDING, &ihost->flags));
  432. }
  433. static inline void wait_for_stop(struct isci_host *ihost)
  434. {
  435. wait_event(ihost->eventq, !test_bit(IHOST_STOP_PENDING, &ihost->flags));
  436. }
  437. static inline void wait_for_device_start(struct isci_host *ihost, struct isci_remote_device *idev)
  438. {
  439. wait_event(ihost->eventq, !test_bit(IDEV_START_PENDING, &idev->flags));
  440. }
  441. static inline void wait_for_device_stop(struct isci_host *ihost, struct isci_remote_device *idev)
  442. {
  443. wait_event(ihost->eventq, !test_bit(IDEV_STOP_PENDING, &idev->flags));
  444. }
  445. static inline struct isci_host *dev_to_ihost(struct domain_device *dev)
  446. {
  447. return dev->port->ha->lldd_ha;
  448. }
  449. static inline struct isci_host *scic_to_ihost(struct scic_sds_controller *scic)
  450. {
  451. /* XXX delete after merging scic_sds_contoller and isci_host */
  452. struct isci_host *ihost = container_of(scic, typeof(*ihost), sci);
  453. return ihost;
  454. }
  455. /**
  456. * INCREMENT_QUEUE_GET() -
  457. *
  458. * This macro will increment the specified index to and if the index wraps to 0
  459. * it will toggel the cycle bit.
  460. */
  461. #define INCREMENT_QUEUE_GET(index, cycle, entry_count, bit_toggle) \
  462. { \
  463. if ((index) + 1 == entry_count) { \
  464. (index) = 0; \
  465. (cycle) = (cycle) ^ (bit_toggle); \
  466. } else { \
  467. index = index + 1; \
  468. } \
  469. }
  470. /**
  471. * scic_sds_controller_get_port_configuration_agent() -
  472. *
  473. * This is a helper macro to get the port configuration agent from the
  474. * controller object.
  475. */
  476. #define scic_sds_controller_get_port_configuration_agent(controller) \
  477. (&(controller)->port_agent)
  478. /**
  479. * scic_sds_controller_get_protocol_engine_group() -
  480. *
  481. * This macro returns the protocol engine group for this controller object.
  482. * Presently we only support protocol engine group 0 so just return that
  483. */
  484. #define scic_sds_controller_get_protocol_engine_group(controller) 0
  485. /**
  486. * scic_sds_io_tag_construct() -
  487. *
  488. * This macro constructs an IO tag from the sequence and index values.
  489. */
  490. #define scic_sds_io_tag_construct(sequence, task_index) \
  491. ((sequence) << 12 | (task_index))
  492. /**
  493. * scic_sds_io_tag_get_sequence() -
  494. *
  495. * This macro returns the IO sequence from the IO tag value.
  496. */
  497. #define scic_sds_io_tag_get_sequence(io_tag) \
  498. (((io_tag) & 0xF000) >> 12)
  499. /**
  500. * scic_sds_io_tag_get_index() -
  501. *
  502. * This macro returns the TCi from the io tag value
  503. */
  504. #define scic_sds_io_tag_get_index(io_tag) \
  505. ((io_tag) & 0x0FFF)
  506. /**
  507. * scic_sds_io_sequence_increment() -
  508. *
  509. * This is a helper macro to increment the io sequence count. We may find in
  510. * the future that it will be faster to store the sequence count in such a way
  511. * as we dont perform the shift operation to build io tag values so therefore
  512. * need a way to incrment them correctly
  513. */
  514. #define scic_sds_io_sequence_increment(value) \
  515. ((value) = (((value) + 1) & 0x000F))
  516. /* expander attached sata devices require 3 rnc slots */
  517. static inline int scic_sds_remote_device_node_count(struct scic_sds_remote_device *sci_dev)
  518. {
  519. struct domain_device *dev = sci_dev_to_domain(sci_dev);
  520. if ((dev->dev_type == SATA_DEV || (dev->tproto & SAS_PROTOCOL_STP)) &&
  521. !sci_dev->is_direct_attached)
  522. return SCU_STP_REMOTE_NODE_COUNT;
  523. return SCU_SSP_REMOTE_NODE_COUNT;
  524. }
  525. /**
  526. * scic_sds_controller_set_invalid_phy() -
  527. *
  528. * This macro will set the bit in the invalid phy mask for this controller
  529. * object. This is used to control messages reported for invalid link up
  530. * notifications.
  531. */
  532. #define scic_sds_controller_set_invalid_phy(controller, phy) \
  533. ((controller)->invalid_phy_mask |= (1 << (phy)->phy_index))
  534. /**
  535. * scic_sds_controller_clear_invalid_phy() -
  536. *
  537. * This macro will clear the bit in the invalid phy mask for this controller
  538. * object. This is used to control messages reported for invalid link up
  539. * notifications.
  540. */
  541. #define scic_sds_controller_clear_invalid_phy(controller, phy) \
  542. ((controller)->invalid_phy_mask &= ~(1 << (phy)->phy_index))
  543. static inline struct device *scic_to_dev(struct scic_sds_controller *scic)
  544. {
  545. return &scic_to_ihost(scic)->pdev->dev;
  546. }
  547. static inline struct device *sciphy_to_dev(struct scic_sds_phy *sci_phy)
  548. {
  549. struct isci_phy *iphy = sci_phy_to_iphy(sci_phy);
  550. if (!iphy || !iphy->isci_port || !iphy->isci_port->isci_host)
  551. return NULL;
  552. return &iphy->isci_port->isci_host->pdev->dev;
  553. }
  554. static inline struct device *sciport_to_dev(struct scic_sds_port *sci_port)
  555. {
  556. struct isci_port *iport = sci_port_to_iport(sci_port);
  557. if (!iport || !iport->isci_host)
  558. return NULL;
  559. return &iport->isci_host->pdev->dev;
  560. }
  561. static inline struct device *scirdev_to_dev(struct scic_sds_remote_device *sci_dev)
  562. {
  563. struct isci_remote_device *idev =
  564. container_of(sci_dev, typeof(*idev), sci);
  565. if (!idev || !idev->isci_port || !idev->isci_port->isci_host)
  566. return NULL;
  567. return &idev->isci_port->isci_host->pdev->dev;
  568. }
  569. enum {
  570. ISCI_SI_REVA0,
  571. ISCI_SI_REVA2,
  572. ISCI_SI_REVB0,
  573. };
  574. extern int isci_si_rev;
  575. static inline bool is_a0(void)
  576. {
  577. return isci_si_rev == ISCI_SI_REVA0;
  578. }
  579. static inline bool is_a2(void)
  580. {
  581. return isci_si_rev == ISCI_SI_REVA2;
  582. }
  583. static inline bool is_b0(void)
  584. {
  585. return isci_si_rev > ISCI_SI_REVA2;
  586. }
  587. void scic_sds_controller_post_request(struct scic_sds_controller *scic,
  588. u32 request);
  589. void scic_sds_controller_release_frame(struct scic_sds_controller *scic,
  590. u32 frame_index);
  591. void scic_sds_controller_copy_sata_response(void *response_buffer,
  592. void *frame_header,
  593. void *frame_buffer);
  594. enum sci_status scic_sds_controller_allocate_remote_node_context(struct scic_sds_controller *scic,
  595. struct scic_sds_remote_device *sci_dev,
  596. u16 *node_id);
  597. void scic_sds_controller_free_remote_node_context(
  598. struct scic_sds_controller *scic,
  599. struct scic_sds_remote_device *sci_dev,
  600. u16 node_id);
  601. union scu_remote_node_context *scic_sds_controller_get_remote_node_context_buffer(
  602. struct scic_sds_controller *scic,
  603. u16 node_id);
  604. struct scic_sds_request *scic_request_by_tag(struct scic_sds_controller *scic,
  605. u16 io_tag);
  606. struct scu_task_context *scic_sds_controller_get_task_context_buffer(
  607. struct scic_sds_controller *scic,
  608. u16 io_tag);
  609. void scic_sds_controller_power_control_queue_insert(
  610. struct scic_sds_controller *scic,
  611. struct scic_sds_phy *sci_phy);
  612. void scic_sds_controller_power_control_queue_remove(
  613. struct scic_sds_controller *scic,
  614. struct scic_sds_phy *sci_phy);
  615. void scic_sds_controller_link_up(
  616. struct scic_sds_controller *scic,
  617. struct scic_sds_port *sci_port,
  618. struct scic_sds_phy *sci_phy);
  619. void scic_sds_controller_link_down(
  620. struct scic_sds_controller *scic,
  621. struct scic_sds_port *sci_port,
  622. struct scic_sds_phy *sci_phy);
  623. void scic_sds_controller_remote_device_stopped(
  624. struct scic_sds_controller *scic,
  625. struct scic_sds_remote_device *sci_dev);
  626. void scic_sds_controller_copy_task_context(
  627. struct scic_sds_controller *scic,
  628. struct scic_sds_request *this_request);
  629. void scic_sds_controller_register_setup(struct scic_sds_controller *scic);
  630. enum sci_status scic_controller_continue_io(struct scic_sds_request *sci_req);
  631. int isci_host_scan_finished(struct Scsi_Host *, unsigned long);
  632. void isci_host_scan_start(struct Scsi_Host *);
  633. int isci_host_init(struct isci_host *);
  634. void isci_host_init_controller_names(
  635. struct isci_host *isci_host,
  636. unsigned int controller_idx);
  637. void isci_host_deinit(
  638. struct isci_host *);
  639. void isci_host_port_link_up(
  640. struct isci_host *,
  641. struct scic_sds_port *,
  642. struct scic_sds_phy *);
  643. int isci_host_dev_found(struct domain_device *);
  644. void isci_host_remote_device_start_complete(
  645. struct isci_host *,
  646. struct isci_remote_device *,
  647. enum sci_status);
  648. void scic_controller_disable_interrupts(
  649. struct scic_sds_controller *scic);
  650. enum sci_status scic_controller_start_io(
  651. struct scic_sds_controller *scic,
  652. struct scic_sds_remote_device *remote_device,
  653. struct scic_sds_request *io_request,
  654. u16 io_tag);
  655. enum sci_task_status scic_controller_start_task(
  656. struct scic_sds_controller *scic,
  657. struct scic_sds_remote_device *remote_device,
  658. struct scic_sds_request *task_request,
  659. u16 io_tag);
  660. enum sci_status scic_controller_terminate_request(
  661. struct scic_sds_controller *scic,
  662. struct scic_sds_remote_device *remote_device,
  663. struct scic_sds_request *request);
  664. enum sci_status scic_controller_complete_io(
  665. struct scic_sds_controller *scic,
  666. struct scic_sds_remote_device *remote_device,
  667. struct scic_sds_request *io_request);
  668. u16 scic_controller_allocate_io_tag(
  669. struct scic_sds_controller *scic);
  670. enum sci_status scic_controller_free_io_tag(
  671. struct scic_sds_controller *scic,
  672. u16 io_tag);
  673. #endif