1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45#ifndef MPT2SAS_BASE_H_INCLUDED
46#define MPT2SAS_BASE_H_INCLUDED
47
48#include "mpi/mpi2_type.h"
49#include "mpi/mpi2.h"
50#include "mpi/mpi2_ioc.h"
51#include "mpi/mpi2_cnfg.h"
52#include "mpi/mpi2_init.h"
53#include "mpi/mpi2_raid.h"
54#include "mpi/mpi2_tool.h"
55#include "mpi/mpi2_sas.h"
56
57#include <scsi/scsi.h>
58#include <scsi/scsi_cmnd.h>
59#include <scsi/scsi_device.h>
60#include <scsi/scsi_host.h>
61#include <scsi/scsi_tcq.h>
62#include <scsi/scsi_transport_sas.h>
63#include <scsi/scsi_dbg.h>
64#include <scsi/scsi_eh.h>
65
66#include "mpt2sas_debug.h"
67
68
69#define MPT2SAS_DRIVER_NAME "mpt2sas"
70#define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>"
71#define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver"
72#define MPT2SAS_DRIVER_VERSION "02.100.03.00"
73#define MPT2SAS_MAJOR_VERSION 02
74#define MPT2SAS_MINOR_VERSION 100
75#define MPT2SAS_BUILD_VERSION 03
76#define MPT2SAS_RELEASE_VERSION 00
77
78
79
80
81#ifdef CONFIG_SCSI_MPT2SAS_MAX_SGE
82#if CONFIG_SCSI_MPT2SAS_MAX_SGE < 16
83#define MPT2SAS_SG_DEPTH 16
84#elif CONFIG_SCSI_MPT2SAS_MAX_SGE > 128
85#define MPT2SAS_SG_DEPTH 128
86#else
87#define MPT2SAS_SG_DEPTH CONFIG_SCSI_MPT2SAS_MAX_SGE
88#endif
89#else
90#define MPT2SAS_SG_DEPTH 128
91#endif
92
93
94
95
96
97#define MPT2SAS_SATA_QUEUE_DEPTH 32
98#define MPT2SAS_SAS_QUEUE_DEPTH 254
99#define MPT2SAS_RAID_QUEUE_DEPTH 128
100
101#define MPT_NAME_LENGTH 32
102#define MPT_STRING_LENGTH 64
103
104#define MPT_MAX_CALLBACKS 16
105
106#define CAN_SLEEP 1
107#define NO_SLEEP 0
108
109#define INTERNAL_CMDS_COUNT 10
110
111#define MPI2_HIM_MASK 0xFFFFFFFF
112
113#define MPT2SAS_INVALID_DEVICE_HANDLE 0xFFFF
114
115
116
117
118
119#define MPT2_IOC_PRE_RESET 1
120#define MPT2_IOC_AFTER_RESET 2
121#define MPT2_IOC_DONE_RESET 3
122#define MPT2_IOC_RUNNING 4
123
124
125
126
127#define MPT2SAS_FMT "%s: "
128#define MPT2SAS_DEBUG_FMT KERN_DEBUG MPT2SAS_FMT
129#define MPT2SAS_INFO_FMT KERN_INFO MPT2SAS_FMT
130#define MPT2SAS_NOTE_FMT KERN_NOTICE MPT2SAS_FMT
131#define MPT2SAS_WARN_FMT KERN_WARNING MPT2SAS_FMT
132#define MPT2SAS_ERR_FMT KERN_ERR MPT2SAS_FMT
133
134
135
136
137#define MPT2SAS_DELL_BRANDING_SIZE 32
138
139#define MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING "Dell 6Gbps SAS HBA"
140#define MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING "Dell PERC H200 Adapter"
141#define MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING "Dell PERC H200 Integrated"
142#define MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING "Dell PERC H200 Modular"
143#define MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING "Dell PERC H200 Embedded"
144#define MPT2SAS_DELL_PERC_H200_BRANDING "Dell PERC H200"
145#define MPT2SAS_DELL_6GBPS_SAS_BRANDING "Dell 6Gbps SAS"
146
147
148
149
150#define MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID 0x1F1C
151#define MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID 0x1F1D
152#define MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID 0x1F1E
153#define MPT2SAS_DELL_PERC_H200_MODULAR_SSDID 0x1F1F
154#define MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID 0x1F20
155#define MPT2SAS_DELL_PERC_H200_SSDID 0x1F21
156#define MPT2SAS_DELL_6GBPS_SAS_SSDID 0x1F22
157
158
159
160
161#define MPT_TARGET_FLAGS_RAID_COMPONENT 0x01
162#define MPT_TARGET_FLAGS_VOLUME 0x02
163#define MPT_TARGET_FLAGS_DELETED 0x04
164
165
166
167
168
169
170
171
172
173
174
175struct MPT2SAS_TARGET {
176 struct scsi_target *starget;
177 u64 sas_address;
178 u16 handle;
179 int num_luns;
180 u32 flags;
181 u8 deleted;
182 u8 tm_busy;
183};
184
185
186
187
188#define MPT_DEVICE_FLAGS_INIT 0x01
189#define MPT_DEVICE_TLR_ON 0x02
190
191
192
193
194
195
196
197
198
199
200
201
202#define MFG10_OEM_ID_INVALID (0x00000000)
203#define MFG10_OEM_ID_DELL (0x00000001)
204#define MFG10_OEM_ID_FSC (0x00000002)
205#define MFG10_OEM_ID_SUN (0x00000003)
206#define MFG10_OEM_ID_IBM (0x00000004)
207
208
209#define MFG10_GF0_OCE_DISABLED (0x00000001)
210#define MFG10_GF0_R1E_DRIVE_COUNT (0x00000002)
211#define MFG10_GF0_R10_DISPLAY (0x00000004)
212#define MFG10_GF0_SSD_DATA_SCRUB_DISABLE (0x00000008)
213#define MFG10_GF0_SINGLE_DRIVE_R0 (0x00000010)
214
215
216typedef struct _MPI2_CONFIG_PAGE_MAN_10 {
217 MPI2_CONFIG_PAGE_HEADER Header;
218 U8 OEMIdentifier;
219 U8 Reserved1;
220 U16 Reserved2;
221 U32 Reserved3;
222 U32 GenericFlags0;
223 U32 GenericFlags1;
224 U32 Reserved4;
225 U32 OEMSpecificFlags0;
226 U32 OEMSpecificFlags1;
227 U32 Reserved5[18];
228} MPI2_CONFIG_PAGE_MAN_10,
229 MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_10,
230 Mpi2ManufacturingPage10_t, MPI2_POINTER pMpi2ManufacturingPage10_t;
231
232struct MPT2SAS_DEVICE {
233 struct MPT2SAS_TARGET *sas_target;
234 unsigned int lun;
235 u32 flags;
236 u8 configured_lun;
237 u8 block;
238 u8 tlr_snoop_check;
239};
240
241#define MPT2_CMD_NOT_USED 0x8000
242#define MPT2_CMD_COMPLETE 0x0001
243#define MPT2_CMD_PENDING 0x0002
244#define MPT2_CMD_REPLY_VALID 0x0004
245#define MPT2_CMD_RESET 0x0008
246
247
248
249
250
251
252
253
254
255struct _internal_cmd {
256 struct mutex mutex;
257 struct completion done;
258 void *reply;
259 u16 status;
260 u16 smid;
261};
262
263
264
265
266
267#define MPTSAS_STATE_TR_SEND 0x0001
268#define MPTSAS_STATE_TR_COMPLETE 0x0002
269#define MPTSAS_STATE_CNTRL_SEND 0x0004
270#define MPTSAS_STATE_CNTRL_COMPLETE 0x0008
271
272#define MPT2SAS_REQ_SAS_CNTRL 0x0010
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293struct _sas_device {
294 struct list_head list;
295 struct scsi_target *starget;
296 u64 sas_address;
297 u64 device_name;
298 u16 handle;
299 u16 parent_handle;
300 u16 enclosure_handle;
301 u64 enclosure_logical_id;
302 u16 volume_handle;
303 u64 volume_wwid;
304 u32 device_info;
305 int id;
306 int channel;
307 u16 slot;
308 u8 hidden_raid_component;
309 u8 responding;
310 u16 state;
311};
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327struct _raid_device {
328 struct list_head list;
329 struct scsi_target *starget;
330 struct scsi_device *sdev;
331 u64 wwid;
332 u16 handle;
333 int id;
334 int channel;
335 u8 volume_type;
336 u32 device_info;
337 u8 num_pds;
338 u8 responding;
339};
340
341
342
343
344
345
346
347struct _boot_device {
348 u8 is_raid;
349 void *device;
350};
351
352
353
354
355
356
357
358
359
360
361
362
363struct _sas_port {
364 struct list_head port_list;
365 u16 handle;
366 u64 sas_address;
367 u8 num_phys;
368 struct sas_identify remote_identify;
369 struct sas_rphy *rphy;
370 struct sas_port *port;
371 struct list_head phy_list;
372};
373
374
375
376
377
378
379
380
381
382
383
384struct _sas_phy {
385 struct list_head port_siblings;
386 struct sas_identify identify;
387 struct sas_identify remote_identify;
388 struct sas_phy *phy;
389 u8 phy_id;
390 u16 handle;
391 u16 attached_handle;
392};
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408struct _sas_node {
409 struct list_head list;
410 struct device *parent_dev;
411 u8 num_phys;
412 u64 sas_address;
413 u16 handle;
414 u16 parent_handle;
415 u16 enclosure_handle;
416 u64 enclosure_logical_id;
417 u8 responding;
418 struct _sas_phy *phy;
419 struct list_head sas_port_list;
420};
421
422
423
424
425
426
427enum reset_type {
428 FORCE_BIG_HAMMER,
429 SOFT_RESET,
430};
431
432
433
434
435
436
437
438
439
440struct request_tracker {
441 u16 smid;
442 struct scsi_cmnd *scmd;
443 u8 cb_idx;
444 struct list_head tracker_list;
445};
446
447
448
449
450
451
452struct _tr_list {
453 struct list_head list;
454 u16 handle;
455 u16 state;
456};
457
458typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr);
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582struct MPT2SAS_ADAPTER {
583 struct list_head list;
584 struct Scsi_Host *shost;
585 u8 id;
586 u32 pci_irq;
587 char name[MPT_NAME_LENGTH];
588 char tmp_string[MPT_STRING_LENGTH];
589 struct pci_dev *pdev;
590 Mpi2SystemInterfaceRegs_t __iomem *chip;
591 unsigned long chip_phys;
592 unsigned long pio_chip;
593 int logging_level;
594 u8 ir_firmware;
595 int bars;
596 u8 mask_interrupts;
597
598
599 char fault_reset_work_q_name[20];
600 struct workqueue_struct *fault_reset_work_q;
601 struct delayed_work fault_reset_work;
602
603
604 char firmware_event_name[20];
605 struct workqueue_struct *firmware_event_thread;
606 u8 fw_events_off;
607 spinlock_t fw_event_lock;
608 struct list_head fw_event_list;
609
610
611 int aen_event_read_flag;
612 u8 broadcast_aen_busy;
613 u8 shost_recovery;
614 spinlock_t ioc_reset_in_progress_lock;
615 u8 ioc_link_reset_in_progress;
616 u8 ignore_loginfos;
617 u8 remove_host;
618 u8 wait_for_port_enable_to_complete;
619
620 u8 msix_enable;
621 u16 msix_vector_count;
622 u32 *msix_table;
623 u32 *msix_table_backup;
624
625
626 u8 scsi_io_cb_idx;
627 u8 tm_cb_idx;
628 u8 transport_cb_idx;
629 u8 ctl_cb_idx;
630 u8 base_cb_idx;
631 u8 config_cb_idx;
632 u8 tm_tr_cb_idx;
633 u8 tm_sas_control_cb_idx;
634 struct _internal_cmd base_cmds;
635 struct _internal_cmd transport_cmds;
636 struct _internal_cmd tm_cmds;
637 struct _internal_cmd ctl_cmds;
638 struct _internal_cmd config_cmds;
639
640 MPT_ADD_SGE base_add_sg_single;
641
642
643 u32 event_type[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
644 u32 event_context;
645 void *event_log;
646 u32 event_masks[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
647
648
649 Mpi2IOCFactsReply_t facts;
650 Mpi2PortFactsReply_t *pfacts;
651 Mpi2ManufacturingPage0_t manu_pg0;
652 Mpi2BiosPage2_t bios_pg2;
653 Mpi2BiosPage3_t bios_pg3;
654 Mpi2IOCPage8_t ioc_pg8;
655 Mpi2IOUnitPage0_t iounit_pg0;
656 Mpi2IOUnitPage1_t iounit_pg1;
657
658 struct _boot_device req_boot_device;
659 struct _boot_device req_alt_boot_device;
660 struct _boot_device current_boot_device;
661
662
663 struct _sas_node sas_hba;
664 struct list_head sas_expander_list;
665 spinlock_t sas_node_lock;
666 struct list_head sas_device_list;
667 struct list_head sas_device_init_list;
668 spinlock_t sas_device_lock;
669 struct list_head raid_device_list;
670 spinlock_t raid_device_lock;
671 u8 io_missing_delay;
672 u16 device_missing_delay;
673 int sas_id;
674
675
676 u16 config_page_sz;
677 void *config_page;
678 dma_addr_t config_page_dma;
679
680
681 u16 hba_queue_depth;
682 u16 sge_size;
683 u16 scsiio_depth;
684 u16 request_sz;
685 u8 *request;
686 dma_addr_t request_dma;
687 u32 request_dma_sz;
688 struct request_tracker *scsi_lookup;
689 spinlock_t scsi_lookup_lock;
690 struct list_head free_list;
691 int pending_io_count;
692 wait_queue_head_t reset_wq;
693
694
695 u8 *chain;
696 dma_addr_t chain_dma;
697 u16 max_sges_in_main_message;
698 u16 max_sges_in_chain_message;
699 u16 chains_needed_per_io;
700 u16 chain_offset_value_for_main_message;
701 u16 chain_depth;
702
703
704 u16 hi_priority_smid;
705 u8 *hi_priority;
706 dma_addr_t hi_priority_dma;
707 u16 hi_priority_depth;
708 struct request_tracker *hpr_lookup;
709 struct list_head hpr_free_list;
710
711
712 u16 internal_smid;
713 u8 *internal;
714 dma_addr_t internal_dma;
715 u16 internal_depth;
716 struct request_tracker *internal_lookup;
717 struct list_head internal_free_list;
718
719
720 u8 *sense;
721 dma_addr_t sense_dma;
722 struct dma_pool *sense_dma_pool;
723
724
725 u16 reply_sz;
726 u8 *reply;
727 dma_addr_t reply_dma;
728 struct dma_pool *reply_dma_pool;
729
730
731 u16 reply_free_queue_depth;
732 u32 *reply_free;
733 dma_addr_t reply_free_dma;
734 struct dma_pool *reply_free_dma_pool;
735 u32 reply_free_host_index;
736
737
738 u16 reply_post_queue_depth;
739 Mpi2ReplyDescriptorsUnion_t *reply_post_free;
740 dma_addr_t reply_post_free_dma;
741 struct dma_pool *reply_post_free_dma_pool;
742 u32 reply_post_host_index;
743
744 struct list_head delayed_tr_list;
745
746
747 u8 *diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT];
748 u32 diag_buffer_sz[MPI2_DIAG_BUF_TYPE_COUNT];
749 dma_addr_t diag_buffer_dma[MPI2_DIAG_BUF_TYPE_COUNT];
750 u8 diag_buffer_status[MPI2_DIAG_BUF_TYPE_COUNT];
751 u32 unique_id[MPI2_DIAG_BUF_TYPE_COUNT];
752 Mpi2ManufacturingPage10_t manu_pg10;
753 u32 product_specific[MPI2_DIAG_BUF_TYPE_COUNT][23];
754 u32 diagnostic_flags[MPI2_DIAG_BUF_TYPE_COUNT];
755};
756
757typedef u8 (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
758 u32 reply);
759
760
761
762extern struct list_head mpt2sas_ioc_list;
763void mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc);
764void mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc);
765
766int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc);
767void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc);
768int mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc);
769void mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc);
770int mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag,
771 enum reset_type type);
772
773void *mpt2sas_base_get_msg_frame(struct MPT2SAS_ADAPTER *ioc, u16 smid);
774void *mpt2sas_base_get_sense_buffer(struct MPT2SAS_ADAPTER *ioc, u16 smid);
775void mpt2sas_base_build_zero_len_sge(struct MPT2SAS_ADAPTER *ioc, void *paddr);
776dma_addr_t mpt2sas_base_get_sense_buffer_dma(struct MPT2SAS_ADAPTER *ioc,
777 u16 smid);
778
779
780u16 mpt2sas_base_get_smid_hpr(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx);
781u16 mpt2sas_base_get_smid_scsiio(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx,
782 struct scsi_cmnd *scmd);
783
784u16 mpt2sas_base_get_smid(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx);
785void mpt2sas_base_free_smid(struct MPT2SAS_ADAPTER *ioc, u16 smid);
786void mpt2sas_base_put_smid_scsi_io(struct MPT2SAS_ADAPTER *ioc, u16 smid,
787 u16 handle);
788void mpt2sas_base_put_smid_hi_priority(struct MPT2SAS_ADAPTER *ioc, u16 smid);
789void mpt2sas_base_put_smid_target_assist(struct MPT2SAS_ADAPTER *ioc, u16 smid,
790 u16 io_index);
791void mpt2sas_base_put_smid_default(struct MPT2SAS_ADAPTER *ioc, u16 smid);
792void mpt2sas_base_initialize_callback_handler(void);
793u8 mpt2sas_base_register_callback_handler(MPT_CALLBACK cb_func);
794void mpt2sas_base_release_callback_handler(u8 cb_idx);
795
796u8 mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
797 u32 reply);
798void *mpt2sas_base_get_reply_virt_addr(struct MPT2SAS_ADAPTER *ioc, u32 phys_addr);
799
800u32 mpt2sas_base_get_iocstate(struct MPT2SAS_ADAPTER *ioc, int cooked);
801
802void mpt2sas_base_fault_info(struct MPT2SAS_ADAPTER *ioc , u16 fault_code);
803int mpt2sas_base_sas_iounit_control(struct MPT2SAS_ADAPTER *ioc,
804 Mpi2SasIoUnitControlReply_t *mpi_reply, Mpi2SasIoUnitControlRequest_t
805 *mpi_request);
806int mpt2sas_base_scsi_enclosure_processor(struct MPT2SAS_ADAPTER *ioc,
807 Mpi2SepReply_t *mpi_reply, Mpi2SepRequest_t *mpi_request);
808void mpt2sas_base_validate_event_type(struct MPT2SAS_ADAPTER *ioc, u32 *event_type);
809
810
811u8 mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
812 u32 reply);
813void mpt2sas_scsih_issue_tm(struct MPT2SAS_ADAPTER *ioc, u16 handle, uint lun,
814 u8 type, u16 smid_task, ulong timeout);
815void mpt2sas_scsih_set_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle);
816void mpt2sas_scsih_clear_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle);
817struct _sas_node *mpt2sas_scsih_expander_find_by_handle(struct MPT2SAS_ADAPTER *ioc,
818 u16 handle);
819struct _sas_node *mpt2sas_scsih_expander_find_by_sas_address(struct MPT2SAS_ADAPTER
820 *ioc, u64 sas_address);
821struct _sas_device *mpt2sas_scsih_sas_device_find_by_sas_address(
822 struct MPT2SAS_ADAPTER *ioc, u64 sas_address);
823
824void mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase);
825
826
827u8 mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
828 u32 reply);
829int mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys);
830int mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
831 Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage0_t *config_page);
832int mpt2sas_config_get_manufacturing_pg10(struct MPT2SAS_ADAPTER *ioc,
833 Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage10_t *config_page);
834int mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
835 *mpi_reply, Mpi2BiosPage2_t *config_page);
836int mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
837 *mpi_reply, Mpi2BiosPage3_t *config_page);
838int mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
839 *mpi_reply, Mpi2IOUnitPage0_t *config_page);
840int mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
841 *mpi_reply, Mpi2SasDevicePage0_t *config_page, u32 form, u32 handle);
842int mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
843 *mpi_reply, Mpi2SasDevicePage1_t *config_page, u32 form, u32 handle);
844int mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
845 *mpi_reply, Mpi2SasIOUnitPage0_t *config_page, u16 sz);
846int mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
847 *mpi_reply, Mpi2IOUnitPage1_t *config_page);
848int mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
849 *mpi_reply, Mpi2IOUnitPage1_t *config_page);
850int mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
851 *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz);
852int mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
853 *mpi_reply, Mpi2IOCPage8_t *config_page);
854int mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
855 *mpi_reply, Mpi2ExpanderPage0_t *config_page, u32 form, u32 handle);
856int mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
857 *mpi_reply, Mpi2ExpanderPage1_t *config_page, u32 phy_number, u16 handle);
858int mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
859 *mpi_reply, Mpi2SasEnclosurePage0_t *config_page, u32 form, u32 handle);
860int mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
861 *mpi_reply, Mpi2SasPhyPage0_t *config_page, u32 phy_number);
862int mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
863 *mpi_reply, Mpi2SasPhyPage1_t *config_page, u32 phy_number);
864int mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
865 *mpi_reply, Mpi2RaidVolPage1_t *config_page, u32 form, u32 handle);
866int mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle, u8 *num_pds);
867int mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
868 *mpi_reply, Mpi2RaidVolPage0_t *config_page, u32 form, u32 handle, u16 sz);
869int mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
870 *mpi_reply, Mpi2RaidPhysDiskPage0_t *config_page, u32 form,
871 u32 form_specific);
872int mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
873 u16 *volume_handle);
874int mpt2sas_config_get_volume_wwid(struct MPT2SAS_ADAPTER *ioc, u16 volume_handle,
875 u64 *wwid);
876
877extern struct device_attribute *mpt2sas_host_attrs[];
878extern struct device_attribute *mpt2sas_dev_attrs[];
879void mpt2sas_ctl_init(void);
880void mpt2sas_ctl_exit(void);
881u8 mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
882 u32 reply);
883void mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase);
884u8 mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
885 u32 reply);
886void mpt2sas_ctl_add_to_event_log(struct MPT2SAS_ADAPTER *ioc,
887 Mpi2EventNotificationReply_t *mpi_reply);
888
889
890u8 mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
891 u32 reply);
892struct _sas_port *mpt2sas_transport_port_add(struct MPT2SAS_ADAPTER *ioc,
893 u16 handle, u16 parent_handle);
894void mpt2sas_transport_port_remove(struct MPT2SAS_ADAPTER *ioc, u64 sas_address,
895 u16 parent_handle);
896int mpt2sas_transport_add_host_phy(struct MPT2SAS_ADAPTER *ioc, struct _sas_phy
897 *mpt2sas_phy, Mpi2SasPhyPage0_t phy_pg0, struct device *parent_dev);
898int mpt2sas_transport_add_expander_phy(struct MPT2SAS_ADAPTER *ioc, struct _sas_phy
899 *mpt2sas_phy, Mpi2ExpanderPage1_t expander_pg1, struct device *parent_dev);
900void mpt2sas_transport_update_links(struct MPT2SAS_ADAPTER *ioc, u16 handle,
901 u16 attached_handle, u8 phy_number, u8 link_rate);
902extern struct sas_function_template mpt2sas_transport_functions;
903extern struct scsi_transport_template *mpt2sas_transport_template;
904extern int scsi_internal_device_block(struct scsi_device *sdev);
905extern u8 mpt2sas_stm_zero_smid_handler(struct MPT2SAS_ADAPTER *ioc,
906 u8 msix_index, u32 reply);
907extern int scsi_internal_device_unblock(struct scsi_device *sdev);
908
909#endif
910