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 "12.100.00.00"
73#define MPT2SAS_MAJOR_VERSION 12
74#define MPT2SAS_MINOR_VERSION 100
75#define MPT2SAS_BUILD_VERSION 00
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
107#define CAN_SLEEP 1
108#define NO_SLEEP 0
109
110#define INTERNAL_CMDS_COUNT 10
111
112#define MPI2_HIM_MASK 0xFFFFFFFF
113
114#define MPT2SAS_INVALID_DEVICE_HANDLE 0xFFFF
115
116
117
118
119
120#define MPT2_IOC_PRE_RESET 1
121#define MPT2_IOC_AFTER_RESET 2
122#define MPT2_IOC_DONE_RESET 3
123
124
125
126
127#define MPT2SAS_FMT "%s: "
128#define MPT2SAS_INFO_FMT KERN_INFO MPT2SAS_FMT
129#define MPT2SAS_NOTE_FMT KERN_NOTICE MPT2SAS_FMT
130#define MPT2SAS_WARN_FMT KERN_WARNING MPT2SAS_FMT
131#define MPT2SAS_ERR_FMT KERN_ERR MPT2SAS_FMT
132
133
134
135
136#define MPT2SAS_DELL_BRANDING_SIZE 32
137
138#define MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING "Dell 6Gbps SAS HBA"
139#define MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING "Dell PERC H200 Adapter"
140#define MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING "Dell PERC H200 Integrated"
141#define MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING "Dell PERC H200 Modular"
142#define MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING "Dell PERC H200 Embedded"
143#define MPT2SAS_DELL_PERC_H200_BRANDING "Dell PERC H200"
144#define MPT2SAS_DELL_6GBPS_SAS_BRANDING "Dell 6Gbps SAS"
145
146
147
148
149#define MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID 0x1F1C
150#define MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID 0x1F1D
151#define MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID 0x1F1E
152#define MPT2SAS_DELL_PERC_H200_MODULAR_SSDID 0x1F1F
153#define MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID 0x1F20
154#define MPT2SAS_DELL_PERC_H200_SSDID 0x1F21
155#define MPT2SAS_DELL_6GBPS_SAS_SSDID 0x1F22
156
157
158
159
160#define MPT2SAS_INTEL_RMS25JB080_BRANDING \
161 "Intel(R) Integrated RAID Module RMS25JB080"
162#define MPT2SAS_INTEL_RMS25JB040_BRANDING \
163 "Intel(R) Integrated RAID Module RMS25JB040"
164#define MPT2SAS_INTEL_RMS25KB080_BRANDING \
165 "Intel(R) Integrated RAID Module RMS25KB080"
166#define MPT2SAS_INTEL_RMS25KB040_BRANDING \
167 "Intel(R) Integrated RAID Module RMS25KB040"
168#define MPT2SAS_INTEL_RMS2LL080_BRANDING \
169 "Intel Integrated RAID Module RMS2LL080"
170#define MPT2SAS_INTEL_RMS2LL040_BRANDING \
171 "Intel Integrated RAID Module RMS2LL040"
172#define MPT2SAS_INTEL_RS25GB008_BRANDING \
173 "Intel(R) RAID Controller RS25GB008"
174#define MPT2SAS_INTEL_RAMSDALE_BRANDING \
175 "Intel 720 Series SSD"
176
177
178
179#define MPT2SAS_INTEL_RMS25JB080_SSDID 0x3516
180#define MPT2SAS_INTEL_RMS25JB040_SSDID 0x3517
181#define MPT2SAS_INTEL_RMS25KB080_SSDID 0x3518
182#define MPT2SAS_INTEL_RMS25KB040_SSDID 0x3519
183#define MPT2SAS_INTEL_RMS2LL080_SSDID 0x350E
184#define MPT2SAS_INTEL_RMS2LL040_SSDID 0x350F
185#define MPT2SAS_INTEL_RS25GB008_SSDID 0x3000
186#define MPT2SAS_INTEL_RAMSDALE_SSDID 0x3700
187
188
189
190
191#define MPT2SAS_HP_3PAR_SSVID 0x1590
192#define MPT2SAS_HP_2_4_INTERNAL_BRANDING "HP H220 Host Bus Adapter"
193#define MPT2SAS_HP_2_4_EXTERNAL_BRANDING "HP H221 Host Bus Adapter"
194#define MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_BRANDING "HP H222 Host Bus Adapter"
195#define MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_BRANDING "HP H220i Host Bus Adapter"
196#define MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_BRANDING "HP H210i Host Bus Adapter"
197
198
199
200
201#define MPT2SAS_HP_2_4_INTERNAL_SSDID 0x0041
202#define MPT2SAS_HP_2_4_EXTERNAL_SSDID 0x0042
203#define MPT2SAS_HP_1_4_INTERNAL_1_4_EXTERNAL_SSDID 0x0043
204#define MPT2SAS_HP_EMBEDDED_2_4_INTERNAL_SSDID 0x0044
205#define MPT2SAS_HP_DAUGHTER_2_4_INTERNAL_SSDID 0x0046
206
207
208
209
210
211#define MPT2_WARPDRIVE_LOGENTRY (0x8002)
212#define MPT2_WARPDRIVE_LC_SSDT (0x41)
213#define MPT2_WARPDRIVE_LC_SSDLW (0x43)
214#define MPT2_WARPDRIVE_LC_SSDLF (0x44)
215#define MPT2_WARPDRIVE_LC_BRMF (0x4D)
216
217
218
219
220#define MPT_TARGET_FLAGS_RAID_COMPONENT 0x01
221#define MPT_TARGET_FLAGS_VOLUME 0x02
222#define MPT_TARGET_FLAGS_DELETED 0x04
223
224
225
226
227
228
229
230
231
232
233
234
235struct MPT2SAS_TARGET {
236 struct scsi_target *starget;
237 u64 sas_address;
238 struct _raid_device *raid_device;
239 u16 handle;
240 int num_luns;
241 u32 flags;
242 u8 deleted;
243 u8 tm_busy;
244};
245
246
247
248
249
250#define MPT_DEVICE_FLAGS_INIT 0x01
251#define MPT_DEVICE_TLR_ON 0x02
252
253
254
255
256
257
258
259
260
261
262
263
264#define MFG10_OEM_ID_INVALID (0x00000000)
265#define MFG10_OEM_ID_DELL (0x00000001)
266#define MFG10_OEM_ID_FSC (0x00000002)
267#define MFG10_OEM_ID_SUN (0x00000003)
268#define MFG10_OEM_ID_IBM (0x00000004)
269
270
271#define MFG10_GF0_OCE_DISABLED (0x00000001)
272#define MFG10_GF0_R1E_DRIVE_COUNT (0x00000002)
273#define MFG10_GF0_R10_DISPLAY (0x00000004)
274#define MFG10_GF0_SSD_DATA_SCRUB_DISABLE (0x00000008)
275#define MFG10_GF0_SINGLE_DRIVE_R0 (0x00000010)
276
277
278typedef struct _MPI2_CONFIG_PAGE_MAN_10 {
279 MPI2_CONFIG_PAGE_HEADER Header;
280 U8 OEMIdentifier;
281 U8 Reserved1;
282 U16 Reserved2;
283 U32 Reserved3;
284 U32 GenericFlags0;
285 U32 GenericFlags1;
286 U32 Reserved4;
287 U32 OEMSpecificFlags0;
288 U32 OEMSpecificFlags1;
289 U32 Reserved5[18];
290} MPI2_CONFIG_PAGE_MAN_10,
291 MPI2_POINTER PTR_MPI2_CONFIG_PAGE_MAN_10,
292 Mpi2ManufacturingPage10_t, MPI2_POINTER pMpi2ManufacturingPage10_t;
293
294#define MFG_PAGE10_HIDE_SSDS_MASK (0x00000003)
295#define MFG_PAGE10_HIDE_ALL_DISKS (0x00)
296#define MFG_PAGE10_EXPOSE_ALL_DISKS (0x01)
297#define MFG_PAGE10_HIDE_IF_VOL_PRESENT (0x02)
298
299
300struct MPT2SAS_DEVICE {
301 struct MPT2SAS_TARGET *sas_target;
302 unsigned int lun;
303 u32 flags;
304 u8 configured_lun;
305 u8 block;
306 u8 tlr_snoop_check;
307};
308
309#define MPT2_CMD_NOT_USED 0x8000
310#define MPT2_CMD_COMPLETE 0x0001
311#define MPT2_CMD_PENDING 0x0002
312#define MPT2_CMD_REPLY_VALID 0x0004
313#define MPT2_CMD_RESET 0x0008
314
315
316
317
318
319
320
321
322
323
324struct _internal_cmd {
325 struct mutex mutex;
326 struct completion done;
327 void *reply;
328 void *sense;
329 u16 status;
330 u16 smid;
331};
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353struct _sas_device {
354 struct list_head list;
355 struct scsi_target *starget;
356 u64 sas_address;
357 u64 device_name;
358 u16 handle;
359 u64 sas_address_parent;
360 u16 enclosure_handle;
361 u64 enclosure_logical_id;
362 u16 volume_handle;
363 u64 volume_wwid;
364 u32 device_info;
365 int id;
366 int channel;
367 u16 slot;
368 u8 phy;
369 u8 responding;
370};
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395#define MPT_MAX_WARPDRIVE_PDS 8
396struct _raid_device {
397 struct list_head list;
398 struct scsi_target *starget;
399 struct scsi_device *sdev;
400 u64 wwid;
401 u16 handle;
402 u16 block_sz;
403 int id;
404 int channel;
405 u8 volume_type;
406 u8 num_pds;
407 u8 responding;
408 u8 percent_complete;
409 u8 direct_io_enabled;
410 u8 stripe_exponent;
411 u8 block_exponent;
412 u64 max_lba;
413 u32 stripe_sz;
414 u32 device_info;
415 u16 pd_handle[MPT_MAX_WARPDRIVE_PDS];
416};
417
418
419
420
421
422
423
424struct _boot_device {
425 u8 is_raid;
426 void *device;
427};
428
429
430
431
432
433
434
435
436
437
438struct _sas_port {
439 struct list_head port_list;
440 u8 num_phys;
441 struct sas_identify remote_identify;
442 struct sas_rphy *rphy;
443 struct sas_port *port;
444 struct list_head phy_list;
445};
446
447
448
449
450
451
452
453
454
455
456
457
458struct _sas_phy {
459 struct list_head port_siblings;
460 struct sas_identify identify;
461 struct sas_identify remote_identify;
462 struct sas_phy *phy;
463 u8 phy_id;
464 u16 handle;
465 u16 attached_handle;
466 u8 phy_belongs_to_port;
467};
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483struct _sas_node {
484 struct list_head list;
485 struct device *parent_dev;
486 u8 num_phys;
487 u64 sas_address;
488 u16 handle;
489 u64 sas_address_parent;
490 u16 enclosure_handle;
491 u64 enclosure_logical_id;
492 u8 responding;
493 struct _sas_phy *phy;
494 struct list_head sas_port_list;
495};
496
497
498
499
500
501
502enum reset_type {
503 FORCE_BIG_HAMMER,
504 SOFT_RESET,
505};
506
507
508
509
510
511
512
513struct chain_tracker {
514 void *chain_buffer;
515 dma_addr_t chain_buffer_dma;
516 struct list_head tracker_list;
517};
518
519
520
521
522
523
524
525
526
527
528struct scsiio_tracker {
529 u16 smid;
530 struct scsi_cmnd *scmd;
531 u8 cb_idx;
532 u8 direct_io;
533 struct list_head chain_list;
534 struct list_head tracker_list;
535};
536
537
538
539
540
541
542
543struct request_tracker {
544 u16 smid;
545 u8 cb_idx;
546 struct list_head tracker_list;
547};
548
549
550
551
552
553
554struct _tr_list {
555 struct list_head list;
556 u16 handle;
557 u16 state;
558};
559
560typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr);
561
562
563
564
565
566
567
568
569
570
571
572
573struct adapter_reply_queue {
574 struct MPT2SAS_ADAPTER *ioc;
575 u8 msix_index;
576 unsigned int vector;
577 u32 reply_post_host_index;
578 Mpi2ReplyDescriptorsUnion_t *reply_post_free;
579 char name[MPT_NAME_LENGTH];
580 atomic_t busy;
581 struct list_head list;
582};
583
584
585union mpi2_version_union {
586 MPI2_VERSION_STRUCT Struct;
587 u32 Word;
588};
589
590struct mpt2sas_facts {
591 u16 MsgVersion;
592 u16 HeaderVersion;
593 u8 IOCNumber;
594 u8 VP_ID;
595 u8 VF_ID;
596 u16 IOCExceptions;
597 u16 IOCStatus;
598 u32 IOCLogInfo;
599 u8 MaxChainDepth;
600 u8 WhoInit;
601 u8 NumberOfPorts;
602 u8 MaxMSIxVectors;
603 u16 RequestCredit;
604 u16 ProductID;
605 u32 IOCCapabilities;
606 union mpi2_version_union FWVersion;
607 u16 IOCRequestFrameSize;
608 u16 Reserved3;
609 u16 MaxInitiators;
610 u16 MaxTargets;
611 u16 MaxSasExpanders;
612 u16 MaxEnclosures;
613 u16 ProtocolFlags;
614 u16 HighPriorityCredit;
615 u16 MaxReplyDescriptorPostQueueDepth;
616 u8 ReplyFrameSize;
617 u8 MaxVolumes;
618 u16 MaxDevHandle;
619 u16 MaxPersistentEntries;
620 u16 MinDevHandle;
621};
622
623struct mpt2sas_port_facts {
624 u8 PortNumber;
625 u8 VP_ID;
626 u8 VF_ID;
627 u8 PortType;
628 u16 MaxPostedCmdBuffers;
629};
630
631
632
633
634
635
636enum mutex_type {
637 TM_MUTEX_OFF = 0,
638 TM_MUTEX_ON = 1,
639};
640
641typedef void (*MPT2SAS_FLUSH_RUNNING_CMDS)(struct MPT2SAS_ADAPTER *ioc);
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781struct MPT2SAS_ADAPTER {
782 struct list_head list;
783 struct Scsi_Host *shost;
784 u8 id;
785 int cpu_count;
786 char name[MPT_NAME_LENGTH];
787 char tmp_string[MPT_STRING_LENGTH];
788 struct pci_dev *pdev;
789 Mpi2SystemInterfaceRegs_t __iomem *chip;
790 resource_size_t chip_phys;
791 int logging_level;
792 int fwfault_debug;
793 u8 ir_firmware;
794 int bars;
795 u8 mask_interrupts;
796
797
798 char fault_reset_work_q_name[20];
799 struct workqueue_struct *fault_reset_work_q;
800 struct delayed_work fault_reset_work;
801
802
803 char firmware_event_name[20];
804 struct workqueue_struct *firmware_event_thread;
805 spinlock_t fw_event_lock;
806 struct list_head fw_event_list;
807
808
809 int aen_event_read_flag;
810 u8 broadcast_aen_busy;
811 u16 broadcast_aen_pending;
812 u8 shost_recovery;
813
814 struct mutex reset_in_progress_mutex;
815 spinlock_t ioc_reset_in_progress_lock;
816 u8 ioc_link_reset_in_progress;
817 u8 ioc_reset_in_progress_status;
818
819 u8 ignore_loginfos;
820 u8 remove_host;
821 u8 pci_error_recovery;
822 u8 wait_for_discovery_to_complete;
823 struct completion port_enable_done;
824 u8 is_driver_loading;
825 u8 port_enable_failed;
826
827 u8 start_scan;
828 u16 start_scan_failed;
829
830 u8 msix_enable;
831 u16 msix_vector_count;
832 u8 *cpu_msix_table;
833 resource_size_t **reply_post_host_index;
834 u16 cpu_msix_table_sz;
835 u32 ioc_reset_count;
836 MPT2SAS_FLUSH_RUNNING_CMDS schedule_dead_ioc_flush_running_cmds;
837
838
839 u8 scsi_io_cb_idx;
840 u8 tm_cb_idx;
841 u8 transport_cb_idx;
842 u8 scsih_cb_idx;
843 u8 ctl_cb_idx;
844 u8 base_cb_idx;
845 u8 port_enable_cb_idx;
846 u8 config_cb_idx;
847 u8 tm_tr_cb_idx;
848 u8 tm_tr_volume_cb_idx;
849 u8 tm_sas_control_cb_idx;
850 struct _internal_cmd base_cmds;
851 struct _internal_cmd port_enable_cmds;
852 struct _internal_cmd transport_cmds;
853 struct _internal_cmd scsih_cmds;
854 struct _internal_cmd tm_cmds;
855 struct _internal_cmd ctl_cmds;
856 struct _internal_cmd config_cmds;
857
858 MPT_ADD_SGE base_add_sg_single;
859
860
861 u32 event_type[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
862 u32 event_context;
863 void *event_log;
864 u32 event_masks[MPI2_EVENT_NOTIFY_EVENTMASK_WORDS];
865
866
867 struct mpt2sas_facts facts;
868 struct mpt2sas_port_facts *pfacts;
869 Mpi2ManufacturingPage0_t manu_pg0;
870 Mpi2BiosPage2_t bios_pg2;
871 Mpi2BiosPage3_t bios_pg3;
872 Mpi2IOCPage8_t ioc_pg8;
873 Mpi2IOUnitPage0_t iounit_pg0;
874 Mpi2IOUnitPage1_t iounit_pg1;
875
876 struct _boot_device req_boot_device;
877 struct _boot_device req_alt_boot_device;
878 struct _boot_device current_boot_device;
879
880
881 struct _sas_node sas_hba;
882 struct list_head sas_expander_list;
883 spinlock_t sas_node_lock;
884 struct list_head sas_device_list;
885 struct list_head sas_device_init_list;
886 spinlock_t sas_device_lock;
887 struct list_head raid_device_list;
888 spinlock_t raid_device_lock;
889 u8 io_missing_delay;
890 u16 device_missing_delay;
891 int sas_id;
892
893 void *pd_handles;
894 u16 pd_handles_sz;
895
896
897 u16 config_page_sz;
898 void *config_page;
899 dma_addr_t config_page_dma;
900
901
902 u16 hba_queue_depth;
903 u16 sge_size;
904 u16 scsiio_depth;
905 u16 request_sz;
906 u8 *request;
907 dma_addr_t request_dma;
908 u32 request_dma_sz;
909 struct scsiio_tracker *scsi_lookup;
910 ulong scsi_lookup_pages;
911 spinlock_t scsi_lookup_lock;
912 struct list_head free_list;
913 int pending_io_count;
914 wait_queue_head_t reset_wq;
915
916
917 struct chain_tracker *chain_lookup;
918 struct list_head free_chain_list;
919 struct dma_pool *chain_dma_pool;
920 ulong chain_pages;
921 u16 max_sges_in_main_message;
922 u16 max_sges_in_chain_message;
923 u16 chains_needed_per_io;
924 u16 chain_offset_value_for_main_message;
925 u32 chain_depth;
926
927
928 u16 hi_priority_smid;
929 u8 *hi_priority;
930 dma_addr_t hi_priority_dma;
931 u16 hi_priority_depth;
932 struct request_tracker *hpr_lookup;
933 struct list_head hpr_free_list;
934
935
936 u16 internal_smid;
937 u8 *internal;
938 dma_addr_t internal_dma;
939 u16 internal_depth;
940 struct request_tracker *internal_lookup;
941 struct list_head internal_free_list;
942
943
944 u8 *sense;
945 dma_addr_t sense_dma;
946 struct dma_pool *sense_dma_pool;
947
948
949 u16 reply_sz;
950 u8 *reply;
951 dma_addr_t reply_dma;
952 u32 reply_dma_max_address;
953 u32 reply_dma_min_address;
954 struct dma_pool *reply_dma_pool;
955
956
957 u16 reply_free_queue_depth;
958 __le32 *reply_free;
959 dma_addr_t reply_free_dma;
960 struct dma_pool *reply_free_dma_pool;
961 u32 reply_free_host_index;
962
963
964 u16 reply_post_queue_depth;
965 Mpi2ReplyDescriptorsUnion_t *reply_post_free;
966 dma_addr_t reply_post_free_dma;
967 struct dma_pool *reply_post_free_dma_pool;
968 u8 reply_queue_count;
969 struct list_head reply_queue_list;
970
971 struct list_head delayed_tr_list;
972 struct list_head delayed_tr_volume_list;
973
974
975 u8 *diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT];
976 u32 diag_buffer_sz[MPI2_DIAG_BUF_TYPE_COUNT];
977 dma_addr_t diag_buffer_dma[MPI2_DIAG_BUF_TYPE_COUNT];
978 u8 diag_buffer_status[MPI2_DIAG_BUF_TYPE_COUNT];
979 u32 unique_id[MPI2_DIAG_BUF_TYPE_COUNT];
980 Mpi2ManufacturingPage10_t manu_pg10;
981 u32 product_specific[MPI2_DIAG_BUF_TYPE_COUNT][23];
982 u32 diagnostic_flags[MPI2_DIAG_BUF_TYPE_COUNT];
983 u32 ring_buffer_offset;
984 u32 ring_buffer_sz;
985 u8 is_warpdrive;
986 u8 hide_ir_msg;
987 u8 mfg_pg10_hide_flag;
988 u8 hide_drives;
989
990};
991
992typedef u8 (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
993 u32 reply);
994
995
996
997extern struct list_head mpt2sas_ioc_list;
998void mpt2sas_base_start_watchdog(struct MPT2SAS_ADAPTER *ioc);
999void mpt2sas_base_stop_watchdog(struct MPT2SAS_ADAPTER *ioc);
1000
1001int mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc);
1002void mpt2sas_base_detach(struct MPT2SAS_ADAPTER *ioc);
1003int mpt2sas_base_map_resources(struct MPT2SAS_ADAPTER *ioc);
1004void mpt2sas_base_free_resources(struct MPT2SAS_ADAPTER *ioc);
1005int mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag,
1006 enum reset_type type);
1007
1008void *mpt2sas_base_get_msg_frame(struct MPT2SAS_ADAPTER *ioc, u16 smid);
1009void *mpt2sas_base_get_sense_buffer(struct MPT2SAS_ADAPTER *ioc, u16 smid);
1010void mpt2sas_base_build_zero_len_sge(struct MPT2SAS_ADAPTER *ioc, void *paddr);
1011__le32 mpt2sas_base_get_sense_buffer_dma(struct MPT2SAS_ADAPTER *ioc,
1012 u16 smid);
1013void mpt2sas_base_flush_reply_queues(struct MPT2SAS_ADAPTER *ioc);
1014
1015
1016u16 mpt2sas_base_get_smid_hpr(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx);
1017u16 mpt2sas_base_get_smid_scsiio(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx,
1018 struct scsi_cmnd *scmd);
1019
1020u16 mpt2sas_base_get_smid(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx);
1021void mpt2sas_base_free_smid(struct MPT2SAS_ADAPTER *ioc, u16 smid);
1022void mpt2sas_base_put_smid_scsi_io(struct MPT2SAS_ADAPTER *ioc, u16 smid,
1023 u16 handle);
1024void mpt2sas_base_put_smid_hi_priority(struct MPT2SAS_ADAPTER *ioc, u16 smid);
1025void mpt2sas_base_put_smid_target_assist(struct MPT2SAS_ADAPTER *ioc, u16 smid,
1026 u16 io_index);
1027void mpt2sas_base_put_smid_default(struct MPT2SAS_ADAPTER *ioc, u16 smid);
1028void mpt2sas_base_initialize_callback_handler(void);
1029u8 mpt2sas_base_register_callback_handler(MPT_CALLBACK cb_func);
1030void mpt2sas_base_release_callback_handler(u8 cb_idx);
1031
1032u8 mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
1033 u32 reply);
1034u8 mpt2sas_port_enable_done(struct MPT2SAS_ADAPTER *ioc, u16 smid,
1035 u8 msix_index, u32 reply);
1036void *mpt2sas_base_get_reply_virt_addr(struct MPT2SAS_ADAPTER *ioc, u32 phys_addr);
1037
1038u32 mpt2sas_base_get_iocstate(struct MPT2SAS_ADAPTER *ioc, int cooked);
1039
1040void mpt2sas_base_fault_info(struct MPT2SAS_ADAPTER *ioc , u16 fault_code);
1041int mpt2sas_base_sas_iounit_control(struct MPT2SAS_ADAPTER *ioc,
1042 Mpi2SasIoUnitControlReply_t *mpi_reply, Mpi2SasIoUnitControlRequest_t
1043 *mpi_request);
1044int mpt2sas_base_scsi_enclosure_processor(struct MPT2SAS_ADAPTER *ioc,
1045 Mpi2SepReply_t *mpi_reply, Mpi2SepRequest_t *mpi_request);
1046void mpt2sas_base_validate_event_type(struct MPT2SAS_ADAPTER *ioc, u32 *event_type);
1047
1048void mpt2sas_halt_firmware(struct MPT2SAS_ADAPTER *ioc);
1049
1050int mpt2sas_port_enable(struct MPT2SAS_ADAPTER *ioc);
1051
1052
1053u8 mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
1054 u32 reply);
1055int mpt2sas_scsih_issue_tm(struct MPT2SAS_ADAPTER *ioc, u16 handle,
1056 uint channel, uint id, uint lun, u8 type, u16 smid_task,
1057 ulong timeout, unsigned long serial_number, enum mutex_type m_type);
1058void mpt2sas_scsih_set_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle);
1059void mpt2sas_scsih_clear_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle);
1060void mpt2sas_expander_remove(struct MPT2SAS_ADAPTER *ioc, u64 sas_address);
1061void mpt2sas_device_remove(struct MPT2SAS_ADAPTER *ioc, u64 sas_address);
1062struct _sas_node *mpt2sas_scsih_expander_find_by_handle(struct MPT2SAS_ADAPTER *ioc,
1063 u16 handle);
1064struct _sas_node *mpt2sas_scsih_expander_find_by_sas_address(struct MPT2SAS_ADAPTER
1065 *ioc, u64 sas_address);
1066struct _sas_device *mpt2sas_scsih_sas_device_find_by_sas_address(
1067 struct MPT2SAS_ADAPTER *ioc, u64 sas_address);
1068
1069void mpt2sas_port_enable_complete(struct MPT2SAS_ADAPTER *ioc);
1070
1071void mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase);
1072
1073
1074u8 mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
1075 u32 reply);
1076int mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys);
1077int mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
1078 Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage0_t *config_page);
1079int mpt2sas_config_get_manufacturing_pg10(struct MPT2SAS_ADAPTER *ioc,
1080 Mpi2ConfigReply_t *mpi_reply, Mpi2ManufacturingPage10_t *config_page);
1081int mpt2sas_config_get_bios_pg2(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1082 *mpi_reply, Mpi2BiosPage2_t *config_page);
1083int mpt2sas_config_get_bios_pg3(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1084 *mpi_reply, Mpi2BiosPage3_t *config_page);
1085int mpt2sas_config_get_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1086 *mpi_reply, Mpi2IOUnitPage0_t *config_page);
1087int mpt2sas_config_get_sas_device_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1088 *mpi_reply, Mpi2SasDevicePage0_t *config_page, u32 form, u32 handle);
1089int mpt2sas_config_get_sas_device_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1090 *mpi_reply, Mpi2SasDevicePage1_t *config_page, u32 form, u32 handle);
1091int mpt2sas_config_get_sas_iounit_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1092 *mpi_reply, Mpi2SasIOUnitPage0_t *config_page, u16 sz);
1093int mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1094 *mpi_reply, Mpi2IOUnitPage1_t *config_page);
1095int mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1096 *mpi_reply, Mpi2IOUnitPage1_t *config_page);
1097int mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1098 *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz);
1099int mpt2sas_config_set_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc,
1100 Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, u16 sz);
1101int mpt2sas_config_get_ioc_pg8(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1102 *mpi_reply, Mpi2IOCPage8_t *config_page);
1103int mpt2sas_config_get_expander_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1104 *mpi_reply, Mpi2ExpanderPage0_t *config_page, u32 form, u32 handle);
1105int mpt2sas_config_get_expander_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1106 *mpi_reply, Mpi2ExpanderPage1_t *config_page, u32 phy_number, u16 handle);
1107int mpt2sas_config_get_enclosure_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1108 *mpi_reply, Mpi2SasEnclosurePage0_t *config_page, u32 form, u32 handle);
1109int mpt2sas_config_get_phy_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1110 *mpi_reply, Mpi2SasPhyPage0_t *config_page, u32 phy_number);
1111int mpt2sas_config_get_phy_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1112 *mpi_reply, Mpi2SasPhyPage1_t *config_page, u32 phy_number);
1113int mpt2sas_config_get_raid_volume_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1114 *mpi_reply, Mpi2RaidVolPage1_t *config_page, u32 form, u32 handle);
1115int mpt2sas_config_get_number_pds(struct MPT2SAS_ADAPTER *ioc, u16 handle, u8 *num_pds);
1116int mpt2sas_config_get_raid_volume_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1117 *mpi_reply, Mpi2RaidVolPage0_t *config_page, u32 form, u32 handle, u16 sz);
1118int mpt2sas_config_get_phys_disk_pg0(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t
1119 *mpi_reply, Mpi2RaidPhysDiskPage0_t *config_page, u32 form,
1120 u32 form_specific);
1121int mpt2sas_config_get_volume_handle(struct MPT2SAS_ADAPTER *ioc, u16 pd_handle,
1122 u16 *volume_handle);
1123int mpt2sas_config_get_volume_wwid(struct MPT2SAS_ADAPTER *ioc, u16 volume_handle,
1124 u64 *wwid);
1125
1126extern struct device_attribute *mpt2sas_host_attrs[];
1127extern struct device_attribute *mpt2sas_dev_attrs[];
1128void mpt2sas_ctl_init(void);
1129void mpt2sas_ctl_exit(void);
1130u8 mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
1131 u32 reply);
1132void mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase);
1133u8 mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
1134 u32 reply);
1135void mpt2sas_ctl_add_to_event_log(struct MPT2SAS_ADAPTER *ioc,
1136 Mpi2EventNotificationReply_t *mpi_reply);
1137
1138void mpt2sas_enable_diag_buffer(struct MPT2SAS_ADAPTER *ioc,
1139 u8 bits_to_regsiter);
1140
1141
1142u8 mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
1143 u32 reply);
1144struct _sas_port *mpt2sas_transport_port_add(struct MPT2SAS_ADAPTER *ioc,
1145 u16 handle, u64 sas_address);
1146void mpt2sas_transport_port_remove(struct MPT2SAS_ADAPTER *ioc, u64 sas_address,
1147 u64 sas_address_parent);
1148int mpt2sas_transport_add_host_phy(struct MPT2SAS_ADAPTER *ioc, struct _sas_phy
1149 *mpt2sas_phy, Mpi2SasPhyPage0_t phy_pg0, struct device *parent_dev);
1150int mpt2sas_transport_add_expander_phy(struct MPT2SAS_ADAPTER *ioc, struct _sas_phy
1151 *mpt2sas_phy, Mpi2ExpanderPage1_t expander_pg1, struct device *parent_dev);
1152void mpt2sas_transport_update_links(struct MPT2SAS_ADAPTER *ioc,
1153 u64 sas_address, u16 handle, u8 phy_number, u8 link_rate);
1154extern struct sas_function_template mpt2sas_transport_functions;
1155extern struct scsi_transport_template *mpt2sas_transport_template;
1156extern int scsi_internal_device_block(struct scsi_device *sdev);
1157extern u8 mpt2sas_stm_zero_smid_handler(struct MPT2SAS_ADAPTER *ioc,
1158 u8 msix_index, u32 reply);
1159extern int scsi_internal_device_unblock(struct scsi_device *sdev);
1160
1161#endif
1162