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