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
47
48#ifndef MPTBASE_H_INCLUDED
49#define MPTBASE_H_INCLUDED
50
51
52#include <linux/kernel.h>
53#include <linux/pci.h>
54#include <linux/mutex.h>
55
56#include "lsi/mpi_type.h"
57#include "lsi/mpi.h"
58#include "lsi/mpi_ioc.h"
59#include "lsi/mpi_cnfg.h"
60#include "lsi/mpi_init.h"
61#include "lsi/mpi_lan.h"
62#include "lsi/mpi_raid.h"
63
64#include "lsi/mpi_fc.h"
65#include "lsi/mpi_targ.h"
66#include "lsi/mpi_tool.h"
67#include "lsi/mpi_sas.h"
68
69
70
71#ifndef MODULEAUTHOR
72#define MODULEAUTHOR "LSI Corporation"
73#endif
74
75#ifndef COPYRIGHT
76#define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR
77#endif
78
79#define MPT_LINUX_VERSION_COMMON "3.04.12"
80#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.12"
81#define WHAT_MAGIC_STRING "@" "(" "#" ")"
82
83#define show_mptmod_ver(s,ver) \
84 printk(KERN_INFO "%s %s\n", s, ver);
85
86
87
88
89
90#define MPT_MAX_ADAPTERS 18
91#define MPT_MAX_PROTOCOL_DRIVERS 16
92#define MPT_MAX_BUS 1
93#define MPT_MAX_FC_DEVICES 255
94#define MPT_MAX_SCSI_DEVICES 16
95#define MPT_LAST_LUN 255
96#define MPT_SENSE_BUFFER_ALLOC 64
97
98#if MPT_SENSE_BUFFER_ALLOC >= 256
99# undef MPT_SENSE_BUFFER_ALLOC
100# define MPT_SENSE_BUFFER_ALLOC 256
101# define MPT_SENSE_BUFFER_SIZE 255
102#else
103# define MPT_SENSE_BUFFER_SIZE MPT_SENSE_BUFFER_ALLOC
104#endif
105
106#define MPT_NAME_LENGTH 32
107#define MPT_KOBJ_NAME_LEN 20
108
109#define MPT_PROCFS_MPTBASEDIR "mpt"
110
111#define MPT_PROCFS_SUMMARY_ALL_NODE MPT_PROCFS_MPTBASEDIR "/summary"
112#define MPT_PROCFS_SUMMARY_ALL_PATHNAME "/proc/" MPT_PROCFS_SUMMARY_ALL_NODE
113#define MPT_FW_REV_MAGIC_ID_STRING "FwRev="
114
115#define MPT_MAX_REQ_DEPTH 1023
116#define MPT_DEFAULT_REQ_DEPTH 256
117#define MPT_MIN_REQ_DEPTH 128
118
119#define MPT_MAX_REPLY_DEPTH MPT_MAX_REQ_DEPTH
120#define MPT_DEFAULT_REPLY_DEPTH 128
121#define MPT_MIN_REPLY_DEPTH 8
122#define MPT_MAX_REPLIES_PER_ISR 32
123
124#define MPT_MAX_FRAME_SIZE 128
125#define MPT_DEFAULT_FRAME_SIZE 128
126
127#define MPT_REPLY_FRAME_SIZE 0x50
128
129#define MPT_SG_REQ_128_SCALE 1
130#define MPT_SG_REQ_96_SCALE 2
131#define MPT_SG_REQ_64_SCALE 4
132
133#define CAN_SLEEP 1
134#define NO_SLEEP 0
135
136#define MPT_COALESCING_TIMEOUT 0x10
137
138
139
140
141
142#define MPT_ULTRA320 0x08
143#define MPT_ULTRA160 0x09
144#define MPT_ULTRA2 0x0A
145#define MPT_ULTRA 0x0C
146#define MPT_FAST 0x19
147#define MPT_SCSI 0x32
148#define MPT_ASYNC 0xFF
149
150#define MPT_NARROW 0
151#define MPT_WIDE 1
152
153#define C0_1030 0x08
154#define XL_929 0x01
155
156
157
158
159
160#define MPT_FC_CAN_QUEUE 1024
161#define MPT_SCSI_CAN_QUEUE 127
162#define MPT_SAS_CAN_QUEUE 127
163
164
165
166
167#ifdef CONFIG_FUSION_MAX_SGE
168#if CONFIG_FUSION_MAX_SGE < 16
169#define MPT_SCSI_SG_DEPTH 16
170#elif CONFIG_FUSION_MAX_SGE > 128
171#define MPT_SCSI_SG_DEPTH 128
172#else
173#define MPT_SCSI_SG_DEPTH CONFIG_FUSION_MAX_SGE
174#endif
175#else
176#define MPT_SCSI_SG_DEPTH 40
177#endif
178
179#ifdef CONFIG_FUSION_MAX_FC_SGE
180#if CONFIG_FUSION_MAX_FC_SGE < 16
181#define MPT_SCSI_FC_SG_DEPTH 16
182#elif CONFIG_FUSION_MAX_FC_SGE > 256
183#define MPT_SCSI_FC_SG_DEPTH 256
184#else
185#define MPT_SCSI_FC_SG_DEPTH CONFIG_FUSION_MAX_FC_SGE
186#endif
187#else
188#define MPT_SCSI_FC_SG_DEPTH 40
189#endif
190
191
192# define EVENT_DESCR_STR_SZ 100
193
194#define MPT_POLLING_INTERVAL 1000
195
196#ifdef __KERNEL__
197
198
199#include <linux/proc_fs.h>
200
201
202
203
204
205
206
207#define MYIOC_s_FMT MYNAM ": %s: "
208#define MYIOC_s_DEBUG_FMT KERN_DEBUG MYNAM ": %s: "
209#define MYIOC_s_INFO_FMT KERN_INFO MYNAM ": %s: "
210#define MYIOC_s_NOTE_FMT KERN_NOTICE MYNAM ": %s: "
211#define MYIOC_s_WARN_FMT KERN_WARNING MYNAM ": %s: WARNING - "
212#define MYIOC_s_ERR_FMT KERN_ERR MYNAM ": %s: ERROR - "
213
214
215
216
217
218#define ATTOFLAG_DISC 0x0001
219#define ATTOFLAG_TAGGED 0x0002
220#define ATTOFLAG_WIDE_ENB 0x0008
221#define ATTOFLAG_ID_ENB 0x0010
222#define ATTOFLAG_LUN_ENB 0x0060
223
224typedef struct _ATTO_DEVICE_INFO
225{
226 u8 Offset;
227 u8 Period;
228 u16 ATTOFlags;
229} ATTO_DEVICE_INFO, MPI_POINTER PTR_ATTO_DEVICE_INFO,
230 ATTODeviceInfo_t, MPI_POINTER pATTODeviceInfo_t;
231
232typedef struct _ATTO_CONFIG_PAGE_SCSI_PORT_2
233{
234 CONFIG_PAGE_HEADER Header;
235 u16 PortFlags;
236 u16 Unused1;
237 u32 Unused2;
238 ATTO_DEVICE_INFO DeviceSettings[16];
239} fATTO_CONFIG_PAGE_SCSI_PORT_2, MPI_POINTER PTR_ATTO_CONFIG_PAGE_SCSI_PORT_2,
240 ATTO_SCSIPortPage2_t, MPI_POINTER pATTO_SCSIPortPage2_t;
241
242
243
244
245
246
247typedef enum {
248 MPTBASE_DRIVER,
249 MPTCTL_DRIVER,
250 MPTSPI_DRIVER,
251 MPTFC_DRIVER,
252 MPTSAS_DRIVER,
253 MPTLAN_DRIVER,
254 MPTSTM_DRIVER,
255 MPTUNKNOWN_DRIVER
256} MPT_DRIVER_CLASS;
257
258struct mpt_pci_driver{
259 int (*probe) (struct pci_dev *dev, const struct pci_device_id *id);
260 void (*remove) (struct pci_dev *dev);
261};
262
263
264
265
266
267typedef union _MPT_FRAME_TRACKER {
268 struct {
269 struct list_head list;
270 u32 arg1;
271 u32 pad;
272 void *argp1;
273 } linkage;
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288 struct {
289 u32 __hdr[2];
290
291
292
293
294 union {
295 u32 MsgContext;
296 struct {
297 u16 req_idx;
298 u8 cb_idx;
299 u8 rsvd;
300 } fld;
301 } msgctxu;
302 } hwhdr;
303
304
305
306
307
308
309} MPT_FRAME_TRACKER;
310
311
312
313
314
315
316
317
318
319typedef struct _MPT_FRAME_HDR {
320 union {
321 MPIHeader_t hdr;
322 SCSIIORequest_t scsireq;
323 SCSIIOReply_t sreply;
324 ConfigReply_t configreply;
325 MPIDefaultReply_t reply;
326 MPT_FRAME_TRACKER frame;
327 } u;
328} MPT_FRAME_HDR;
329
330#define MPT_REQ_MSGFLAGS_DROPME 0x80
331
332typedef struct _MPT_SGL_HDR {
333 SGESimple32_t sge[1];
334} MPT_SGL_HDR;
335
336typedef struct _MPT_SGL64_HDR {
337 SGESimple64_t sge[1];
338} MPT_SGL64_HDR;
339
340
341
342
343
344typedef struct _SYSIF_REGS
345{
346 u32 Doorbell;
347 u32 WriteSequence;
348 u32 Diagnostic;
349 u32 TestBase;
350 u32 DiagRwData;
351 u32 DiagRwAddress;
352 u32 Reserved1[6];
353 u32 IntStatus;
354 u32 IntMask;
355 u32 Reserved2[2];
356 u32 RequestFifo;
357 u32 ReplyFifo;
358 u32 RequestHiPriFifo;
359 u32 Reserved3;
360 u32 HostIndex;
361 u32 Reserved4[15];
362 u32 Fubar;
363 u32 Reserved5[1050];
364 u32 Reset_1078;
365} SYSIF_REGS;
366
367
368
369
370
371
372
373
374
375
376
377
378#define MPT_TARGET_NO_NEGO_WIDE 0x01
379#define MPT_TARGET_NO_NEGO_SYNC 0x02
380#define MPT_TARGET_NO_NEGO_QAS 0x04
381#define MPT_TAPE_NEGO_IDP 0x08
382
383
384
385
386typedef struct _VirtTarget {
387 struct scsi_target *starget;
388 u8 tflags;
389 u8 ioc_id;
390 u8 id;
391 u8 channel;
392 u8 minSyncFactor;
393 u8 maxOffset;
394 u8 maxWidth;
395 u8 negoFlags;
396 u8 raidVolume;
397 u8 type;
398 u8 deleted;
399 u32 num_luns;
400} VirtTarget;
401
402typedef struct _VirtDevice {
403 VirtTarget *vtarget;
404 u8 configured_lun;
405 int lun;
406} VirtDevice;
407
408
409
410
411#define MPT_TARGET_DEFAULT_DV_STATUS 0x00
412#define MPT_TARGET_FLAGS_VALID_NEGO 0x01
413#define MPT_TARGET_FLAGS_VALID_INQUIRY 0x02
414#define MPT_TARGET_FLAGS_Q_YES 0x08
415#define MPT_TARGET_FLAGS_VALID_56 0x10
416#define MPT_TARGET_FLAGS_SAF_TE_ISSUED 0x20
417#define MPT_TARGET_FLAGS_RAID_COMPONENT 0x40
418#define MPT_TARGET_FLAGS_LED_ON 0x80
419
420
421
422
423typedef struct {
424 const char *name;
425 mode_t mode;
426 int pad;
427 read_proc_t *read_proc;
428 write_proc_t *write_proc;
429} mpt_proc_entry_t;
430
431#define MPT_PROC_READ_RETURN(buf,start,offset,request,eof,len) \
432do { \
433 len -= offset; \
434 if (len < request) { \
435 *eof = 1; \
436 if (len <= 0) \
437 return 0; \
438 } else \
439 len = request; \
440 *start = buf + offset; \
441 return len; \
442} while (0)
443
444
445
446
447
448
449#define MPTCTL_RESET_OK 0x01
450
451#define MPT_MGMT_STATUS_RF_VALID 0x01
452#define MPT_MGMT_STATUS_COMMAND_GOOD 0x02
453#define MPT_MGMT_STATUS_PENDING 0x04
454#define MPT_MGMT_STATUS_DID_IOCRESET 0x08
455
456#define MPT_MGMT_STATUS_SENSE_VALID 0x10
457#define MPT_MGMT_STATUS_TIMER_ACTIVE 0x20
458#define MPT_MGMT_STATUS_FREE_MF 0x40
459
460
461#define INITIALIZE_MGMT_STATUS(status) \
462 status = MPT_MGMT_STATUS_PENDING;
463#define CLEAR_MGMT_STATUS(status) \
464 status = 0;
465#define CLEAR_MGMT_PENDING_STATUS(status) \
466 status &= ~MPT_MGMT_STATUS_PENDING;
467#define SET_MGMT_MSG_CONTEXT(msg_context, value) \
468 msg_context = value;
469
470typedef struct _MPT_MGMT {
471 struct mutex mutex;
472 struct completion done;
473 u8 reply[MPT_DEFAULT_FRAME_SIZE];
474 u8 sense[MPT_SENSE_BUFFER_ALLOC];
475 u8 status;
476 int completion_code;
477 u32 msg_context;
478} MPT_MGMT;
479
480
481
482
483#define MPTCTL_EVENT_LOG_SIZE (0x000000032)
484typedef struct _mpt_ioctl_events {
485 u32 event;
486 u32 eventContext;
487 u32 data[2];
488} MPT_IOCTL_EVENTS;
489
490
491
492
493#define MPT_CONFIG_GOOD MPI_IOCSTATUS_SUCCESS
494#define MPT_CONFIG_ERROR 0x002F
495
496
497
498
499
500#define MPT_SCSICFG_USE_NVRAM 0x01
501#define MPT_SCSICFG_ALL_IDS 0x02
502
503
504typedef struct _SpiCfgData {
505 u32 PortFlags;
506 int *nvram;
507 IOCPage4_t *pIocPg4;
508 dma_addr_t IocPg4_dma;
509 int IocPg4Sz;
510 u8 minSyncFactor;
511 u8 maxSyncOffset;
512 u8 maxBusWidth;
513 u8 busType;
514 u8 sdp1version;
515 u8 sdp1length;
516 u8 sdp0version;
517 u8 sdp0length;
518 u8 dvScheduled;
519 u8 noQas;
520 u8 Saf_Te;
521
522
523
524 u8 bus_reset;
525 u8 rsvd[1];
526}SpiCfgData;
527
528typedef struct _SasCfgData {
529 u8 ptClear;
530
531
532
533
534}SasCfgData;
535
536
537
538
539
540struct inactive_raid_component_info {
541 struct list_head list;
542 u8 volumeID;
543 u8 volumeBus;
544 IOC_3_PHYS_DISK d;
545};
546
547typedef struct _RaidCfgData {
548 IOCPage2_t *pIocPg2;
549 IOCPage3_t *pIocPg3;
550 struct mutex inactive_list_mutex;
551 struct list_head inactive_list;
552
553
554}RaidCfgData;
555
556typedef struct _FcCfgData {
557
558 struct {
559 FCPortPage1_t *data;
560 dma_addr_t dma;
561 int pg_sz;
562 } fc_port_page1[2];
563} FcCfgData;
564
565#define MPT_RPORT_INFO_FLAGS_REGISTERED 0x01
566#define MPT_RPORT_INFO_FLAGS_MISSING 0x02
567
568
569
570
571struct mptfc_rport_info
572{
573 struct list_head list;
574 struct fc_rport *rport;
575 struct scsi_target *starget;
576 FCDevicePage0_t pg0;
577 u8 flags;
578};
579
580typedef void (*MPT_ADD_SGE)(void *pAddr, u32 flagslength, dma_addr_t dma_addr);
581typedef void (*MPT_ADD_CHAIN)(void *pAddr, u8 next, u16 length,
582 dma_addr_t dma_addr);
583
584
585
586
587typedef struct _MPT_ADAPTER
588{
589 int id;
590 int pci_irq;
591 char name[MPT_NAME_LENGTH];
592 char prod_name[MPT_NAME_LENGTH];
593#ifdef CONFIG_FUSION_LOGGING
594
595 char evStr[EVENT_DESCR_STR_SZ];
596#endif
597 char board_name[16];
598 char board_assembly[16];
599 char board_tracer[16];
600 u16 nvdata_version_persistent;
601 u16 nvdata_version_default;
602 int debug_level;
603 u8 io_missing_delay;
604 u8 device_missing_delay;
605 SYSIF_REGS __iomem *chip;
606 SYSIF_REGS __iomem *pio_chip;
607 u8 bus_type;
608 u32 mem_phys;
609 u32 pio_mem_phys;
610 int mem_size;
611 int number_of_buses;
612 int devices_per_bus;
613 int alloc_total;
614 u32 last_state;
615 int active;
616 u8 *alloc;
617 dma_addr_t alloc_dma;
618 u32 alloc_sz;
619 MPT_FRAME_HDR *reply_frames;
620 u32 reply_frames_low_dma;
621 int reply_depth;
622 int reply_sz;
623 int num_chain;
624 MPT_ADD_SGE add_sge;
625
626 MPT_ADD_CHAIN add_chain;
627
628
629
630
631
632
633 int *ReqToChain;
634 int *RequestNB;
635 int *ChainToChain;
636 u8 *ChainBuffer;
637 dma_addr_t ChainBufferDMA;
638 struct list_head FreeChainQ;
639 spinlock_t FreeChainQlock;
640
641 dma_addr_t req_frames_dma;
642 MPT_FRAME_HDR *req_frames;
643 u32 req_frames_low_dma;
644 int req_depth;
645 int req_sz;
646 spinlock_t FreeQlock;
647 struct list_head FreeQ;
648
649
650
651
652 u8 *sense_buf_pool;
653 dma_addr_t sense_buf_pool_dma;
654 u32 sense_buf_low_dma;
655 u8 *HostPageBuffer;
656 u32 HostPageBuffer_sz;
657 dma_addr_t HostPageBuffer_dma;
658 int mtrr_reg;
659 struct pci_dev *pcidev;
660 int bars;
661 int msi_enable;
662 u8 __iomem *memmap;
663 struct Scsi_Host *sh;
664 SpiCfgData spi_data;
665 RaidCfgData raid_data;
666 SasCfgData sas_data;
667 FcCfgData fc_data;
668 struct proc_dir_entry *ioc_dentry;
669 struct _MPT_ADAPTER *alt_ioc;
670 u32 biosVersion;
671 int eventTypes;
672 int eventContext;
673 int eventLogSize;
674 struct _mpt_ioctl_events *events;
675 u8 *cached_fw;
676 dma_addr_t cached_fw_dma;
677 int hs_reply_idx;
678#ifndef MFCNT
679 u32 pad0;
680#else
681 u32 mfcnt;
682#endif
683 u32 NB_for_64_byte_frame;
684 u32 hs_req[MPT_MAX_FRAME_SIZE/sizeof(u32)];
685 u16 hs_reply[MPT_MAX_FRAME_SIZE/sizeof(u16)];
686 IOCFactsReply_t facts;
687 PortFactsReply_t pfacts[2];
688 FCPortPage0_t fc_port_page0[2];
689 LANPage0_t lan_cnfg_page0;
690 LANPage1_t lan_cnfg_page1;
691
692 u8 ir_firmware;
693
694
695
696
697
698
699 int errata_flag_1064;
700 int aen_event_read_flag;
701 u8 FirstWhoInit;
702 u8 upload_fw;
703 u8 NBShiftFactor;
704 u8 pad1[4];
705 u8 DoneCtx;
706 u8 TaskCtx;
707 u8 InternalCtx;
708 struct list_head list;
709 struct net_device *netdev;
710 struct list_head sas_topology;
711 struct mutex sas_topology_mutex;
712
713 struct workqueue_struct *fw_event_q;
714 struct list_head fw_event_list;
715 spinlock_t fw_event_lock;
716 u8 fw_events_off;
717 char fw_event_q_name[MPT_KOBJ_NAME_LEN];
718
719 struct mutex sas_discovery_mutex;
720 u8 sas_discovery_runtime;
721 u8 sas_discovery_ignore_events;
722
723
724 struct mptsas_portinfo *hba_port_info;
725 u64 hba_port_sas_addr;
726 u16 hba_port_num_phy;
727 struct list_head sas_device_info_list;
728 struct mutex sas_device_info_mutex;
729 u8 old_sas_discovery_protocal;
730 u8 sas_discovery_quiesce_io;
731 int sas_index;
732 MPT_MGMT sas_mgmt;
733 MPT_MGMT mptbase_cmds;
734 MPT_MGMT internal_cmds;
735 MPT_MGMT taskmgmt_cmds;
736 MPT_MGMT ioctl_cmds;
737 spinlock_t taskmgmt_lock;
738 int taskmgmt_in_progress;
739 u8 taskmgmt_quiesce_io;
740 u8 ioc_reset_in_progress;
741 struct work_struct sas_persist_task;
742
743 struct work_struct fc_setup_reset_work;
744 struct list_head fc_rports;
745 struct work_struct fc_lsc_work;
746 u8 fc_link_speed[2];
747 spinlock_t fc_rescan_work_lock;
748 struct work_struct fc_rescan_work;
749 char fc_rescan_work_q_name[MPT_KOBJ_NAME_LEN];
750 struct workqueue_struct *fc_rescan_work_q;
751
752
753 unsigned long hard_resets;
754
755 unsigned long soft_resets;
756
757 unsigned long timeouts;
758
759 struct scsi_cmnd **ScsiLookup;
760 spinlock_t scsi_lookup_lock;
761 u64 dma_mask;
762 u32 broadcast_aen_busy;
763 char reset_work_q_name[MPT_KOBJ_NAME_LEN];
764 struct workqueue_struct *reset_work_q;
765 struct delayed_work fault_reset_work;
766
767 u8 sg_addr_size;
768 u8 in_rescan;
769 u8 SGE_size;
770
771} MPT_ADAPTER;
772
773
774
775
776
777
778typedef int (*MPT_CALLBACK)(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply);
779typedef int (*MPT_EVHANDLER)(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply);
780typedef int (*MPT_RESETHANDLER)(MPT_ADAPTER *ioc, int reset_phase);
781
782#define MPT_IOC_PRE_RESET 0
783#define MPT_IOC_POST_RESET 1
784#define MPT_IOC_SETUP_RESET 2
785
786
787
788
789
790typedef struct _MPT_HOST_EVENT {
791 EventNotificationReply_t MpiEvent;
792 u32 pad[6];
793 void *next;
794} MPT_HOST_EVENT;
795
796#define MPT_HOSTEVENT_IOC_BRINGUP 0x91
797#define MPT_HOSTEVENT_IOC_RECOVER 0x92
798
799
800
801
802typedef struct _mpt_sge {
803 u32 FlagsLength;
804 dma_addr_t Address;
805} MptSge_t;
806
807
808#define mpt_msg_flags(ioc) \
809 (ioc->sg_addr_size == sizeof(u64)) ? \
810 MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_64 : \
811 MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_32
812
813#define MPT_SGE_FLAGS_64_BIT_ADDRESSING \
814 (MPI_SGE_FLAGS_64_BIT_ADDRESSING << MPI_SGE_FLAGS_SHIFT)
815
816
817
818
819
820#include "mptdebug.h"
821
822#define MPT_INDEX_2_MFPTR(ioc,idx) \
823 (MPT_FRAME_HDR*)( (u8*)(ioc)->req_frames + (ioc)->req_sz * (idx) )
824
825#define MFPTR_2_MPT_INDEX(ioc,mf) \
826 (int)( ((u8*)mf - (u8*)(ioc)->req_frames) / (ioc)->req_sz )
827
828#define MPT_INDEX_2_RFPTR(ioc,idx) \
829 (MPT_FRAME_HDR*)( (u8*)(ioc)->reply_frames + (ioc)->req_sz * (idx) )
830
831
832
833#define SCSI_STD_SENSE_BYTES 18
834#define SCSI_STD_INQUIRY_BYTES 36
835#define SCSI_MAX_INQUIRY_BYTES 96
836
837
838
839
840
841
842
843
844
845typedef struct _MPT_LOCAL_REPLY {
846 ConfigPageHeader_t header;
847 int completion;
848 u8 sense[SCSI_STD_SENSE_BYTES];
849 u8 scsiStatus;
850 u8 skip;
851 u32 pad;
852} MPT_LOCAL_REPLY;
853
854#define MPT_HOST_BUS_UNKNOWN (0xFF)
855#define MPT_HOST_TOO_MANY_TM (0x05)
856#define MPT_HOST_NVRAM_INVALID (0xFFFFFFFF)
857#define MPT_HOST_NO_CHAIN (0xFFFFFFFF)
858#define MPT_NVRAM_MASK_TIMEOUT (0x000000FF)
859#define MPT_NVRAM_SYNC_MASK (0x0000FF00)
860#define MPT_NVRAM_SYNC_SHIFT (8)
861#define MPT_NVRAM_DISCONNECT_ENABLE (0x00010000)
862#define MPT_NVRAM_ID_SCAN_ENABLE (0x00020000)
863#define MPT_NVRAM_LUN_SCAN_ENABLE (0x00040000)
864#define MPT_NVRAM_TAG_QUEUE_ENABLE (0x00080000)
865#define MPT_NVRAM_WIDE_DISABLE (0x00100000)
866#define MPT_NVRAM_BOOT_CHOICE (0x00200000)
867
868
869
870
871#define TM_STATE_NONE (0)
872#define TM_STATE_IN_PROGRESS (1)
873#define TM_STATE_ERROR (2)
874
875typedef enum {
876 FC,
877 SPI,
878 SAS
879} BUS_TYPE;
880
881typedef struct _MPT_SCSI_HOST {
882 MPT_ADAPTER *ioc;
883 ushort sel_timeout[MPT_MAX_FC_DEVICES];
884 char *info_kbuf;
885 long last_queue_full;
886 u16 spi_pending;
887 struct list_head target_reset_list;
888} MPT_SCSI_HOST;
889
890
891
892
893
894
895
896struct scsi_cmnd;
897
898
899
900
901
902typedef struct _x_config_parms {
903 union {
904 ConfigExtendedPageHeader_t *ehdr;
905 ConfigPageHeader_t *hdr;
906 } cfghdr;
907 dma_addr_t physAddr;
908 u32 pageAddr;
909 u16 status;
910 u8 action;
911 u8 dir;
912 u8 timeout;
913} CONFIGPARMS;
914
915
916
917
918
919extern int mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id);
920extern void mpt_detach(struct pci_dev *pdev);
921#ifdef CONFIG_PM
922extern int mpt_suspend(struct pci_dev *pdev, pm_message_t state);
923extern int mpt_resume(struct pci_dev *pdev);
924#endif
925extern u8 mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass);
926extern void mpt_deregister(u8 cb_idx);
927extern int mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc);
928extern void mpt_event_deregister(u8 cb_idx);
929extern int mpt_reset_register(u8 cb_idx, MPT_RESETHANDLER reset_func);
930extern void mpt_reset_deregister(u8 cb_idx);
931extern int mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, u8 cb_idx);
932extern void mpt_device_driver_deregister(u8 cb_idx);
933extern MPT_FRAME_HDR *mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc);
934extern void mpt_free_msg_frame(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
935extern void mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
936extern void mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
937
938extern int mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag);
939extern int mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp);
940extern u32 mpt_GetIocState(MPT_ADAPTER *ioc, int cooked);
941extern void mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buf, int *size, int len, int showlan);
942extern int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag);
943extern int mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *cfg);
944extern int mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size);
945extern void mpt_free_fw_memory(MPT_ADAPTER *ioc);
946extern int mpt_findImVolumes(MPT_ADAPTER *ioc);
947extern int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
948extern int mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhysDiskPage0_t phys_disk);
949extern int mpt_raid_phys_disk_pg1(MPT_ADAPTER *ioc, u8 phys_disk_num,
950 pRaidPhysDiskPage1_t phys_disk);
951extern int mpt_raid_phys_disk_get_num_paths(MPT_ADAPTER *ioc,
952 u8 phys_disk_num);
953extern int mpt_set_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc);
954extern void mpt_clear_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc);
955extern void mpt_halt_firmware(MPT_ADAPTER *ioc);
956
957
958
959
960
961extern struct list_head ioc_list;
962extern int mpt_fwfault_debug;
963
964
965#endif
966
967#ifdef CONFIG_64BIT
968#define CAST_U32_TO_PTR(x) ((void *)(u64)x)
969#define CAST_PTR_TO_U32(x) ((u32)(u64)x)
970#else
971#define CAST_U32_TO_PTR(x) ((void *)x)
972#define CAST_PTR_TO_U32(x) ((u32)x)
973#endif
974
975#define MPT_PROTOCOL_FLAGS_c_c_c_c(pflags) \
976 ((pflags) & MPI_PORTFACTS_PROTOCOL_INITIATOR) ? 'I' : 'i', \
977 ((pflags) & MPI_PORTFACTS_PROTOCOL_TARGET) ? 'T' : 't', \
978 ((pflags) & MPI_PORTFACTS_PROTOCOL_LAN) ? 'L' : 'l', \
979 ((pflags) & MPI_PORTFACTS_PROTOCOL_LOGBUSADDR) ? 'B' : 'b'
980
981
982
983
984
985
986#define MPT_TRANSFER_IOC_TO_HOST (0x00000000)
987#define MPT_TRANSFER_HOST_TO_IOC (0x04000000)
988#define MPT_SGE_FLAGS_LAST_ELEMENT (0x80000000)
989#define MPT_SGE_FLAGS_END_OF_BUFFER (0x40000000)
990#define MPT_SGE_FLAGS_LOCAL_ADDRESS (0x08000000)
991#define MPT_SGE_FLAGS_DIRECTION (0x04000000)
992#define MPT_SGE_FLAGS_END_OF_LIST (0x01000000)
993
994#define MPT_SGE_FLAGS_TRANSACTION_ELEMENT (0x00000000)
995#define MPT_SGE_FLAGS_SIMPLE_ELEMENT (0x10000000)
996#define MPT_SGE_FLAGS_CHAIN_ELEMENT (0x30000000)
997#define MPT_SGE_FLAGS_ELEMENT_MASK (0x30000000)
998
999#define MPT_SGE_FLAGS_SSIMPLE_READ \
1000 (MPT_SGE_FLAGS_LAST_ELEMENT | \
1001 MPT_SGE_FLAGS_END_OF_BUFFER | \
1002 MPT_SGE_FLAGS_END_OF_LIST | \
1003 MPT_SGE_FLAGS_SIMPLE_ELEMENT | \
1004 MPT_TRANSFER_IOC_TO_HOST)
1005#define MPT_SGE_FLAGS_SSIMPLE_WRITE \
1006 (MPT_SGE_FLAGS_LAST_ELEMENT | \
1007 MPT_SGE_FLAGS_END_OF_BUFFER | \
1008 MPT_SGE_FLAGS_END_OF_LIST | \
1009 MPT_SGE_FLAGS_SIMPLE_ELEMENT | \
1010 MPT_TRANSFER_HOST_TO_IOC)
1011
1012
1013#endif
1014
1015