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