0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 #ifndef MPTBASE_H_INCLUDED
0049 #define MPTBASE_H_INCLUDED
0050
0051
0052 #include <linux/kernel.h>
0053 #include <linux/pci.h>
0054 #include <linux/mutex.h>
0055
0056 #include "lsi/mpi_type.h"
0057 #include "lsi/mpi.h" /* Fusion MPI(nterface) basic defs */
0058 #include "lsi/mpi_ioc.h" /* Fusion MPT IOC(ontroller) defs */
0059 #include "lsi/mpi_cnfg.h" /* IOC configuration support */
0060 #include "lsi/mpi_init.h" /* SCSI Host (initiator) protocol support */
0061 #include "lsi/mpi_lan.h" /* LAN over FC protocol support */
0062 #include "lsi/mpi_raid.h" /* Integrated Mirroring support */
0063
0064 #include "lsi/mpi_fc.h" /* Fibre Channel (lowlevel) support */
0065 #include "lsi/mpi_targ.h" /* SCSI/FCP Target protcol support */
0066 #include "lsi/mpi_tool.h" /* Tools support */
0067 #include "lsi/mpi_sas.h" /* SAS support */
0068
0069
0070
0071 #ifndef MODULEAUTHOR
0072 #define MODULEAUTHOR "LSI Corporation"
0073 #endif
0074
0075 #ifndef COPYRIGHT
0076 #define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR
0077 #endif
0078
0079 #define MPT_LINUX_VERSION_COMMON "3.04.20"
0080 #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.20"
0081 #define WHAT_MAGIC_STRING "@" "(" "#" ")"
0082
0083 #define show_mptmod_ver(s,ver) \
0084 printk(KERN_INFO "%s %s\n", s, ver);
0085
0086
0087
0088
0089
0090 #define MPT_MAX_ADAPTERS 18
0091 #define MPT_MAX_PROTOCOL_DRIVERS 16
0092 #define MPT_MAX_CALLBACKNAME_LEN 49
0093 #define MPT_MAX_BUS 1
0094 #define MPT_MAX_FC_DEVICES 255
0095 #define MPT_MAX_SCSI_DEVICES 16
0096 #define MPT_LAST_LUN 255
0097 #define MPT_SENSE_BUFFER_ALLOC 64
0098
0099 #if MPT_SENSE_BUFFER_ALLOC >= 256
0100 # undef MPT_SENSE_BUFFER_ALLOC
0101 # define MPT_SENSE_BUFFER_ALLOC 256
0102 # define MPT_SENSE_BUFFER_SIZE 255
0103 #else
0104 # define MPT_SENSE_BUFFER_SIZE MPT_SENSE_BUFFER_ALLOC
0105 #endif
0106
0107 #define MPT_NAME_LENGTH 32
0108 #define MPT_KOBJ_NAME_LEN 20
0109
0110 #define MPT_PROCFS_MPTBASEDIR "mpt"
0111
0112 #define MPT_PROCFS_SUMMARY_ALL_NODE MPT_PROCFS_MPTBASEDIR "/summary"
0113 #define MPT_PROCFS_SUMMARY_ALL_PATHNAME "/proc/" MPT_PROCFS_SUMMARY_ALL_NODE
0114 #define MPT_FW_REV_MAGIC_ID_STRING "FwRev="
0115
0116 #define MPT_MAX_REQ_DEPTH 1023
0117 #define MPT_DEFAULT_REQ_DEPTH 256
0118 #define MPT_MIN_REQ_DEPTH 128
0119
0120 #define MPT_MAX_REPLY_DEPTH MPT_MAX_REQ_DEPTH
0121 #define MPT_DEFAULT_REPLY_DEPTH 128
0122 #define MPT_MIN_REPLY_DEPTH 8
0123 #define MPT_MAX_REPLIES_PER_ISR 32
0124
0125 #define MPT_MAX_FRAME_SIZE 128
0126 #define MPT_DEFAULT_FRAME_SIZE 128
0127
0128 #define MPT_REPLY_FRAME_SIZE 0x50
0129
0130 #define MPT_SG_REQ_128_SCALE 1
0131 #define MPT_SG_REQ_96_SCALE 2
0132 #define MPT_SG_REQ_64_SCALE 4
0133
0134 #define CAN_SLEEP 1
0135 #define NO_SLEEP 0
0136
0137 #define MPT_COALESCING_TIMEOUT 0x10
0138
0139
0140
0141
0142
0143 #define MPT_ULTRA320 0x08
0144 #define MPT_ULTRA160 0x09
0145 #define MPT_ULTRA2 0x0A
0146 #define MPT_ULTRA 0x0C
0147 #define MPT_FAST 0x19
0148 #define MPT_SCSI 0x32
0149 #define MPT_ASYNC 0xFF
0150
0151 #define MPT_NARROW 0
0152 #define MPT_WIDE 1
0153
0154 #define C0_1030 0x08
0155 #define XL_929 0x01
0156
0157
0158
0159
0160
0161 #define MPT_FC_CAN_QUEUE 1024
0162 #define MPT_SCSI_CAN_QUEUE 127
0163 #define MPT_SAS_CAN_QUEUE 127
0164
0165
0166
0167
0168 #ifdef CONFIG_FUSION_MAX_SGE
0169 #if CONFIG_FUSION_MAX_SGE < 16
0170 #define MPT_SCSI_SG_DEPTH 16
0171 #elif CONFIG_FUSION_MAX_SGE > 128
0172 #define MPT_SCSI_SG_DEPTH 128
0173 #else
0174 #define MPT_SCSI_SG_DEPTH CONFIG_FUSION_MAX_SGE
0175 #endif
0176 #else
0177 #define MPT_SCSI_SG_DEPTH 40
0178 #endif
0179
0180 #ifdef CONFIG_FUSION_MAX_FC_SGE
0181 #if CONFIG_FUSION_MAX_FC_SGE < 16
0182 #define MPT_SCSI_FC_SG_DEPTH 16
0183 #elif CONFIG_FUSION_MAX_FC_SGE > 256
0184 #define MPT_SCSI_FC_SG_DEPTH 256
0185 #else
0186 #define MPT_SCSI_FC_SG_DEPTH CONFIG_FUSION_MAX_FC_SGE
0187 #endif
0188 #else
0189 #define MPT_SCSI_FC_SG_DEPTH 40
0190 #endif
0191
0192
0193 # define EVENT_DESCR_STR_SZ 100
0194
0195 #define MPT_POLLING_INTERVAL 1000
0196
0197 #ifdef __KERNEL__
0198
0199
0200 #include <linux/proc_fs.h>
0201
0202
0203
0204
0205
0206
0207
0208 #define MYIOC_s_FMT MYNAM ": %s: "
0209 #define MYIOC_s_DEBUG_FMT KERN_DEBUG MYNAM ": %s: "
0210 #define MYIOC_s_INFO_FMT KERN_INFO MYNAM ": %s: "
0211 #define MYIOC_s_NOTE_FMT KERN_NOTICE MYNAM ": %s: "
0212 #define MYIOC_s_WARN_FMT KERN_WARNING MYNAM ": %s: WARNING - "
0213 #define MYIOC_s_ERR_FMT KERN_ERR MYNAM ": %s: ERROR - "
0214
0215
0216
0217
0218
0219 #define ATTOFLAG_DISC 0x0001
0220 #define ATTOFLAG_TAGGED 0x0002
0221 #define ATTOFLAG_WIDE_ENB 0x0008
0222 #define ATTOFLAG_ID_ENB 0x0010
0223 #define ATTOFLAG_LUN_ENB 0x0060
0224
0225 typedef struct _ATTO_DEVICE_INFO
0226 {
0227 u8 Offset;
0228 u8 Period;
0229 u16 ATTOFlags;
0230 } ATTO_DEVICE_INFO, MPI_POINTER PTR_ATTO_DEVICE_INFO,
0231 ATTODeviceInfo_t, MPI_POINTER pATTODeviceInfo_t;
0232
0233 typedef struct _ATTO_CONFIG_PAGE_SCSI_PORT_2
0234 {
0235 CONFIG_PAGE_HEADER Header;
0236 u16 PortFlags;
0237 u16 Unused1;
0238 u32 Unused2;
0239 ATTO_DEVICE_INFO DeviceSettings[16];
0240 } fATTO_CONFIG_PAGE_SCSI_PORT_2, MPI_POINTER PTR_ATTO_CONFIG_PAGE_SCSI_PORT_2,
0241 ATTO_SCSIPortPage2_t, MPI_POINTER pATTO_SCSIPortPage2_t;
0242
0243
0244
0245
0246
0247
0248 typedef enum {
0249 MPTBASE_DRIVER,
0250 MPTCTL_DRIVER,
0251 MPTSPI_DRIVER,
0252 MPTFC_DRIVER,
0253 MPTSAS_DRIVER,
0254 MPTLAN_DRIVER,
0255 MPTSTM_DRIVER,
0256 MPTUNKNOWN_DRIVER
0257 } MPT_DRIVER_CLASS;
0258
0259 struct mpt_pci_driver{
0260 int (*probe) (struct pci_dev *dev);
0261 void (*remove) (struct pci_dev *dev);
0262 };
0263
0264
0265
0266
0267
0268 typedef union _MPT_FRAME_TRACKER {
0269 struct {
0270 struct list_head list;
0271 u32 arg1;
0272 u32 pad;
0273 void *argp1;
0274 } linkage;
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289 struct {
0290 u32 __hdr[2];
0291
0292
0293
0294
0295 union {
0296 u32 MsgContext;
0297 struct {
0298 u16 req_idx;
0299 u8 cb_idx;
0300 u8 rsvd;
0301 } fld;
0302 } msgctxu;
0303 } hwhdr;
0304
0305
0306
0307
0308
0309
0310 } MPT_FRAME_TRACKER;
0311
0312
0313
0314
0315
0316
0317
0318
0319
0320 typedef struct _MPT_FRAME_HDR {
0321 union {
0322 MPIHeader_t hdr;
0323 SCSIIORequest_t scsireq;
0324 SCSIIOReply_t sreply;
0325 ConfigReply_t configreply;
0326 MPIDefaultReply_t reply;
0327 MPT_FRAME_TRACKER frame;
0328 } u;
0329 } MPT_FRAME_HDR;
0330
0331 #define MPT_REQ_MSGFLAGS_DROPME 0x80
0332
0333 typedef struct _MPT_SGL_HDR {
0334 SGESimple32_t sge[1];
0335 } MPT_SGL_HDR;
0336
0337 typedef struct _MPT_SGL64_HDR {
0338 SGESimple64_t sge[1];
0339 } MPT_SGL64_HDR;
0340
0341
0342
0343
0344
0345 typedef struct _SYSIF_REGS
0346 {
0347 u32 Doorbell;
0348 u32 WriteSequence;
0349 u32 Diagnostic;
0350 u32 TestBase;
0351 u32 DiagRwData;
0352 u32 DiagRwAddress;
0353 u32 Reserved1[6];
0354 u32 IntStatus;
0355 u32 IntMask;
0356 u32 Reserved2[2];
0357 u32 RequestFifo;
0358 u32 ReplyFifo;
0359 u32 RequestHiPriFifo;
0360 u32 Reserved3;
0361 u32 HostIndex;
0362 u32 Reserved4[15];
0363 u32 Fubar;
0364 u32 Reserved5[1050];
0365 u32 Reset_1078;
0366 } SYSIF_REGS;
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379 #define MPT_TARGET_NO_NEGO_WIDE 0x01
0380 #define MPT_TARGET_NO_NEGO_SYNC 0x02
0381 #define MPT_TARGET_NO_NEGO_QAS 0x04
0382 #define MPT_TAPE_NEGO_IDP 0x08
0383
0384
0385
0386
0387 typedef struct _VirtTarget {
0388 struct scsi_target *starget;
0389 u8 tflags;
0390 u8 ioc_id;
0391 u8 id;
0392 u8 channel;
0393 u8 minSyncFactor;
0394 u8 maxOffset;
0395 u8 maxWidth;
0396 u8 negoFlags;
0397 u8 raidVolume;
0398 u8 type;
0399 u8 deleted;
0400 u8 inDMD;
0401
0402 u32 num_luns;
0403 } VirtTarget;
0404
0405 typedef struct _VirtDevice {
0406 VirtTarget *vtarget;
0407 u8 configured_lun;
0408 u64 lun;
0409 } VirtDevice;
0410
0411
0412
0413
0414 #define MPT_TARGET_DEFAULT_DV_STATUS 0x00
0415 #define MPT_TARGET_FLAGS_VALID_NEGO 0x01
0416 #define MPT_TARGET_FLAGS_VALID_INQUIRY 0x02
0417 #define MPT_TARGET_FLAGS_Q_YES 0x08
0418 #define MPT_TARGET_FLAGS_VALID_56 0x10
0419 #define MPT_TARGET_FLAGS_SAF_TE_ISSUED 0x20
0420 #define MPT_TARGET_FLAGS_RAID_COMPONENT 0x40
0421 #define MPT_TARGET_FLAGS_LED_ON 0x80
0422
0423
0424
0425
0426
0427 #define MPTCTL_RESET_OK 0x01
0428
0429 #define MPT_MGMT_STATUS_RF_VALID 0x01
0430 #define MPT_MGMT_STATUS_COMMAND_GOOD 0x02
0431 #define MPT_MGMT_STATUS_PENDING 0x04
0432 #define MPT_MGMT_STATUS_DID_IOCRESET 0x08
0433
0434 #define MPT_MGMT_STATUS_SENSE_VALID 0x10
0435 #define MPT_MGMT_STATUS_TIMER_ACTIVE 0x20
0436 #define MPT_MGMT_STATUS_FREE_MF 0x40
0437
0438
0439 #define INITIALIZE_MGMT_STATUS(status) \
0440 status = MPT_MGMT_STATUS_PENDING;
0441 #define CLEAR_MGMT_STATUS(status) \
0442 status = 0;
0443 #define CLEAR_MGMT_PENDING_STATUS(status) \
0444 status &= ~MPT_MGMT_STATUS_PENDING;
0445 #define SET_MGMT_MSG_CONTEXT(msg_context, value) \
0446 msg_context = value;
0447
0448 typedef struct _MPT_MGMT {
0449 struct mutex mutex;
0450 struct completion done;
0451 u8 reply[MPT_DEFAULT_FRAME_SIZE];
0452 u8 sense[MPT_SENSE_BUFFER_ALLOC];
0453 u8 status;
0454 int completion_code;
0455 u32 msg_context;
0456 } MPT_MGMT;
0457
0458
0459
0460
0461 #define MPTCTL_EVENT_LOG_SIZE (0x000000032)
0462 typedef struct _mpt_ioctl_events {
0463 u32 event;
0464 u32 eventContext;
0465 u32 data[2];
0466 } MPT_IOCTL_EVENTS;
0467
0468
0469
0470
0471 #define MPT_CONFIG_GOOD MPI_IOCSTATUS_SUCCESS
0472 #define MPT_CONFIG_ERROR 0x002F
0473
0474
0475
0476
0477
0478 #define MPT_SCSICFG_USE_NVRAM 0x01
0479 #define MPT_SCSICFG_ALL_IDS 0x02
0480
0481
0482 typedef struct _SpiCfgData {
0483 u32 PortFlags;
0484 int *nvram;
0485 IOCPage4_t *pIocPg4;
0486 dma_addr_t IocPg4_dma;
0487 int IocPg4Sz;
0488 u8 minSyncFactor;
0489 u8 maxSyncOffset;
0490 u8 maxBusWidth;
0491 u8 busType;
0492 u8 sdp1version;
0493 u8 sdp1length;
0494 u8 sdp0version;
0495 u8 sdp0length;
0496 u8 dvScheduled;
0497 u8 noQas;
0498 u8 Saf_Te;
0499
0500
0501
0502 u8 bus_reset;
0503 u8 rsvd[1];
0504 }SpiCfgData;
0505
0506 typedef struct _SasCfgData {
0507 u8 ptClear;
0508
0509
0510
0511
0512 }SasCfgData;
0513
0514
0515
0516
0517
0518 struct inactive_raid_component_info {
0519 struct list_head list;
0520 u8 volumeID;
0521 u8 volumeBus;
0522 IOC_3_PHYS_DISK d;
0523 };
0524
0525 typedef struct _RaidCfgData {
0526 IOCPage2_t *pIocPg2;
0527 IOCPage3_t *pIocPg3;
0528 struct mutex inactive_list_mutex;
0529 struct list_head inactive_list;
0530
0531
0532 }RaidCfgData;
0533
0534 typedef struct _FcCfgData {
0535
0536 struct {
0537 FCPortPage1_t *data;
0538 dma_addr_t dma;
0539 int pg_sz;
0540 } fc_port_page1[2];
0541 } FcCfgData;
0542
0543 #define MPT_RPORT_INFO_FLAGS_REGISTERED 0x01
0544 #define MPT_RPORT_INFO_FLAGS_MISSING 0x02
0545
0546
0547
0548
0549 struct mptfc_rport_info
0550 {
0551 struct list_head list;
0552 struct fc_rport *rport;
0553 struct scsi_target *starget;
0554 FCDevicePage0_t pg0;
0555 u8 flags;
0556 };
0557
0558
0559
0560
0561
0562
0563
0564
0565 #define MPT_HOST_BUS_UNKNOWN (0xFF)
0566 #define MPT_HOST_TOO_MANY_TM (0x05)
0567 #define MPT_HOST_NVRAM_INVALID (0xFFFFFFFF)
0568 #define MPT_HOST_NO_CHAIN (0xFFFFFFFF)
0569 #define MPT_NVRAM_MASK_TIMEOUT (0x000000FF)
0570 #define MPT_NVRAM_SYNC_MASK (0x0000FF00)
0571 #define MPT_NVRAM_SYNC_SHIFT (8)
0572 #define MPT_NVRAM_DISCONNECT_ENABLE (0x00010000)
0573 #define MPT_NVRAM_ID_SCAN_ENABLE (0x00020000)
0574 #define MPT_NVRAM_LUN_SCAN_ENABLE (0x00040000)
0575 #define MPT_NVRAM_TAG_QUEUE_ENABLE (0x00080000)
0576 #define MPT_NVRAM_WIDE_DISABLE (0x00100000)
0577 #define MPT_NVRAM_BOOT_CHOICE (0x00200000)
0578
0579 typedef enum {
0580 FC,
0581 SPI,
0582 SAS
0583 } BUS_TYPE;
0584
0585 typedef struct _MPT_SCSI_HOST {
0586 struct _MPT_ADAPTER *ioc;
0587 ushort sel_timeout[MPT_MAX_FC_DEVICES];
0588 char *info_kbuf;
0589 long last_queue_full;
0590 u16 spi_pending;
0591 struct list_head target_reset_list;
0592 } MPT_SCSI_HOST;
0593
0594 typedef void (*MPT_ADD_SGE)(void *pAddr, u32 flagslength, dma_addr_t dma_addr);
0595 typedef void (*MPT_ADD_CHAIN)(void *pAddr, u8 next, u16 length,
0596 dma_addr_t dma_addr);
0597 typedef void (*MPT_SCHEDULE_TARGET_RESET)(void *ioc);
0598 typedef void (*MPT_FLUSH_RUNNING_CMDS)(MPT_SCSI_HOST *hd);
0599
0600
0601
0602
0603 typedef struct _MPT_ADAPTER
0604 {
0605 int id;
0606 int pci_irq;
0607 char name[MPT_NAME_LENGTH];
0608 const char *prod_name;
0609 #ifdef CONFIG_FUSION_LOGGING
0610
0611 char evStr[EVENT_DESCR_STR_SZ];
0612 #endif
0613 char board_name[16];
0614 char board_assembly[16];
0615 char board_tracer[16];
0616 u16 nvdata_version_persistent;
0617 u16 nvdata_version_default;
0618 int debug_level;
0619 u8 io_missing_delay;
0620 u16 device_missing_delay;
0621 SYSIF_REGS __iomem *chip;
0622 SYSIF_REGS __iomem *pio_chip;
0623 u8 bus_type;
0624 u32 mem_phys;
0625 u32 pio_mem_phys;
0626 int mem_size;
0627 int number_of_buses;
0628 int devices_per_bus;
0629 int alloc_total;
0630 u32 last_state;
0631 int active;
0632 u8 *alloc;
0633 dma_addr_t alloc_dma;
0634 u32 alloc_sz;
0635 MPT_FRAME_HDR *reply_frames;
0636 u32 reply_frames_low_dma;
0637 int reply_depth;
0638 int reply_sz;
0639 int num_chain;
0640 MPT_ADD_SGE add_sge;
0641
0642 MPT_ADD_CHAIN add_chain;
0643
0644
0645
0646
0647
0648
0649 int *ReqToChain;
0650 int *RequestNB;
0651 int *ChainToChain;
0652 u8 *ChainBuffer;
0653 dma_addr_t ChainBufferDMA;
0654 struct list_head FreeChainQ;
0655 spinlock_t FreeChainQlock;
0656
0657 dma_addr_t req_frames_dma;
0658 MPT_FRAME_HDR *req_frames;
0659 u32 req_frames_low_dma;
0660 int req_depth;
0661 int req_sz;
0662 spinlock_t FreeQlock;
0663 struct list_head FreeQ;
0664
0665
0666
0667
0668 u8 *sense_buf_pool;
0669 dma_addr_t sense_buf_pool_dma;
0670 u32 sense_buf_low_dma;
0671 u8 *HostPageBuffer;
0672 u32 HostPageBuffer_sz;
0673 dma_addr_t HostPageBuffer_dma;
0674 struct pci_dev *pcidev;
0675 int bars;
0676 int msi_enable;
0677 u8 __iomem *memmap;
0678 struct Scsi_Host *sh;
0679 SpiCfgData spi_data;
0680 RaidCfgData raid_data;
0681 SasCfgData sas_data;
0682 FcCfgData fc_data;
0683 struct proc_dir_entry *ioc_dentry;
0684 struct _MPT_ADAPTER *alt_ioc;
0685 u32 biosVersion;
0686 int eventTypes;
0687 int eventContext;
0688 int eventLogSize;
0689 struct _mpt_ioctl_events *events;
0690 u8 *cached_fw;
0691 dma_addr_t cached_fw_dma;
0692 int hs_reply_idx;
0693 #ifndef MFCNT
0694 u32 pad0;
0695 #else
0696 u32 mfcnt;
0697 #endif
0698 u32 NB_for_64_byte_frame;
0699 u32 hs_req[MPT_MAX_FRAME_SIZE/sizeof(u32)];
0700 u16 hs_reply[MPT_MAX_FRAME_SIZE/sizeof(u16)];
0701 IOCFactsReply_t facts;
0702 PortFactsReply_t pfacts[2];
0703 FCPortPage0_t fc_port_page0[2];
0704 LANPage0_t lan_cnfg_page0;
0705 LANPage1_t lan_cnfg_page1;
0706
0707 u8 ir_firmware;
0708
0709
0710
0711
0712
0713
0714 int errata_flag_1064;
0715 int aen_event_read_flag;
0716 u8 FirstWhoInit;
0717 u8 upload_fw;
0718 u8 NBShiftFactor;
0719 u8 pad1[4];
0720 u8 DoneCtx;
0721 u8 TaskCtx;
0722 u8 InternalCtx;
0723 struct list_head list;
0724 struct net_device *netdev;
0725 struct list_head sas_topology;
0726 struct mutex sas_topology_mutex;
0727
0728 struct workqueue_struct *fw_event_q;
0729 struct list_head fw_event_list;
0730 spinlock_t fw_event_lock;
0731 u8 fw_events_off;
0732 char fw_event_q_name[MPT_KOBJ_NAME_LEN];
0733
0734 struct mutex sas_discovery_mutex;
0735 u8 sas_discovery_runtime;
0736 u8 sas_discovery_ignore_events;
0737
0738
0739 struct mptsas_portinfo *hba_port_info;
0740 u64 hba_port_sas_addr;
0741 u16 hba_port_num_phy;
0742 struct list_head sas_device_info_list;
0743 struct mutex sas_device_info_mutex;
0744 u8 old_sas_discovery_protocal;
0745 u8 sas_discovery_quiesce_io;
0746 int sas_index;
0747 MPT_MGMT sas_mgmt;
0748 MPT_MGMT mptbase_cmds;
0749 MPT_MGMT internal_cmds;
0750 MPT_MGMT taskmgmt_cmds;
0751 MPT_MGMT ioctl_cmds;
0752 spinlock_t taskmgmt_lock;
0753 int taskmgmt_in_progress;
0754 u8 taskmgmt_quiesce_io;
0755 u8 ioc_reset_in_progress;
0756 u8 reset_status;
0757 u8 wait_on_reset_completion;
0758 MPT_SCHEDULE_TARGET_RESET schedule_target_reset;
0759 MPT_FLUSH_RUNNING_CMDS schedule_dead_ioc_flush_running_cmds;
0760 struct work_struct sas_persist_task;
0761
0762 struct work_struct fc_setup_reset_work;
0763 struct list_head fc_rports;
0764 struct work_struct fc_lsc_work;
0765 u8 fc_link_speed[2];
0766 spinlock_t fc_rescan_work_lock;
0767 struct work_struct fc_rescan_work;
0768 char fc_rescan_work_q_name[MPT_KOBJ_NAME_LEN];
0769 struct workqueue_struct *fc_rescan_work_q;
0770
0771
0772 unsigned long hard_resets;
0773
0774 unsigned long soft_resets;
0775
0776 unsigned long timeouts;
0777
0778 struct scsi_cmnd **ScsiLookup;
0779 spinlock_t scsi_lookup_lock;
0780 u64 dma_mask;
0781 u32 broadcast_aen_busy;
0782 char reset_work_q_name[MPT_KOBJ_NAME_LEN];
0783 struct workqueue_struct *reset_work_q;
0784 struct delayed_work fault_reset_work;
0785
0786 u8 sg_addr_size;
0787 u8 in_rescan;
0788 u8 SGE_size;
0789
0790 } MPT_ADAPTER;
0791
0792
0793
0794
0795
0796
0797 typedef int (*MPT_CALLBACK)(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply);
0798 typedef int (*MPT_EVHANDLER)(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply);
0799 typedef int (*MPT_RESETHANDLER)(MPT_ADAPTER *ioc, int reset_phase);
0800
0801 #define MPT_IOC_PRE_RESET 0
0802 #define MPT_IOC_POST_RESET 1
0803 #define MPT_IOC_SETUP_RESET 2
0804
0805
0806
0807
0808
0809 typedef struct _MPT_HOST_EVENT {
0810 EventNotificationReply_t MpiEvent;
0811 u32 pad[6];
0812 void *next;
0813 } MPT_HOST_EVENT;
0814
0815 #define MPT_HOSTEVENT_IOC_BRINGUP 0x91
0816 #define MPT_HOSTEVENT_IOC_RECOVER 0x92
0817
0818
0819
0820
0821 typedef struct _mpt_sge {
0822 u32 FlagsLength;
0823 dma_addr_t Address;
0824 } MptSge_t;
0825
0826
0827 #define mpt_msg_flags(ioc) \
0828 (ioc->sg_addr_size == sizeof(u64)) ? \
0829 MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_64 : \
0830 MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_32
0831
0832 #define MPT_SGE_FLAGS_64_BIT_ADDRESSING \
0833 (MPI_SGE_FLAGS_64_BIT_ADDRESSING << MPI_SGE_FLAGS_SHIFT)
0834
0835
0836
0837
0838
0839 #include "mptdebug.h"
0840
0841 #define MPT_INDEX_2_MFPTR(ioc,idx) \
0842 (MPT_FRAME_HDR*)( (u8*)(ioc)->req_frames + (ioc)->req_sz * (idx) )
0843
0844 #define MFPTR_2_MPT_INDEX(ioc,mf) \
0845 (int)( ((u8*)mf - (u8*)(ioc)->req_frames) / (ioc)->req_sz )
0846
0847 #define MPT_INDEX_2_RFPTR(ioc,idx) \
0848 (MPT_FRAME_HDR*)( (u8*)(ioc)->reply_frames + (ioc)->req_sz * (idx) )
0849
0850
0851
0852 #define SCSI_STD_SENSE_BYTES 18
0853 #define SCSI_STD_INQUIRY_BYTES 36
0854 #define SCSI_MAX_INQUIRY_BYTES 96
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864 typedef struct _MPT_LOCAL_REPLY {
0865 ConfigPageHeader_t header;
0866 int completion;
0867 u8 sense[SCSI_STD_SENSE_BYTES];
0868 u8 scsiStatus;
0869 u8 skip;
0870 u32 pad;
0871 } MPT_LOCAL_REPLY;
0872
0873
0874
0875
0876
0877 #define TM_STATE_NONE (0)
0878 #define TM_STATE_IN_PROGRESS (1)
0879 #define TM_STATE_ERROR (2)
0880
0881
0882
0883
0884
0885
0886
0887 struct scsi_cmnd;
0888
0889
0890
0891
0892
0893 typedef struct _x_config_parms {
0894 union {
0895 ConfigExtendedPageHeader_t *ehdr;
0896 ConfigPageHeader_t *hdr;
0897 } cfghdr;
0898 dma_addr_t physAddr;
0899 u32 pageAddr;
0900 u16 status;
0901 u8 action;
0902 u8 dir;
0903 u8 timeout;
0904 } CONFIGPARMS;
0905
0906
0907
0908
0909
0910 extern int mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id);
0911 extern void mpt_detach(struct pci_dev *pdev);
0912 #ifdef CONFIG_PM
0913 extern int mpt_suspend(struct pci_dev *pdev, pm_message_t state);
0914 extern int mpt_resume(struct pci_dev *pdev);
0915 #endif
0916 extern u8 mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass,
0917 char *func_name);
0918 extern void mpt_deregister(u8 cb_idx);
0919 extern int mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc);
0920 extern void mpt_event_deregister(u8 cb_idx);
0921 extern int mpt_reset_register(u8 cb_idx, MPT_RESETHANDLER reset_func);
0922 extern void mpt_reset_deregister(u8 cb_idx);
0923 extern int mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, u8 cb_idx);
0924 extern void mpt_device_driver_deregister(u8 cb_idx);
0925 extern MPT_FRAME_HDR *mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc);
0926 extern void mpt_free_msg_frame(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
0927 extern void mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
0928 extern void mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf);
0929
0930 extern int mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag);
0931 extern int mpt_verify_adapter(int iocid, MPT_ADAPTER **iocpp);
0932 extern u32 mpt_GetIocState(MPT_ADAPTER *ioc, int cooked);
0933 extern void mpt_print_ioc_summary(MPT_ADAPTER *ioc, char *buf, int *size, int len, int showlan);
0934 extern int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag);
0935 extern int mpt_Soft_Hard_ResetHandler(MPT_ADAPTER *ioc, int sleepFlag);
0936 extern int mpt_config(MPT_ADAPTER *ioc, CONFIGPARMS *cfg);
0937 extern int mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size);
0938 extern void mpt_free_fw_memory(MPT_ADAPTER *ioc);
0939 extern int mpt_findImVolumes(MPT_ADAPTER *ioc);
0940 extern int mptbase_sas_persist_operation(MPT_ADAPTER *ioc, u8 persist_opcode);
0941 extern int mpt_raid_phys_disk_pg0(MPT_ADAPTER *ioc, u8 phys_disk_num, pRaidPhysDiskPage0_t phys_disk);
0942 extern int mpt_raid_phys_disk_pg1(MPT_ADAPTER *ioc, u8 phys_disk_num,
0943 pRaidPhysDiskPage1_t phys_disk);
0944 extern int mpt_raid_phys_disk_get_num_paths(MPT_ADAPTER *ioc,
0945 u8 phys_disk_num);
0946 extern int mpt_set_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc);
0947 extern void mpt_clear_taskmgmt_in_progress_flag(MPT_ADAPTER *ioc);
0948 extern void mpt_halt_firmware(MPT_ADAPTER *ioc);
0949
0950
0951
0952
0953
0954 extern struct list_head ioc_list;
0955 extern int mpt_fwfault_debug;
0956
0957
0958 #endif
0959
0960 #ifdef CONFIG_64BIT
0961 #define CAST_U32_TO_PTR(x) ((void *)(u64)x)
0962 #define CAST_PTR_TO_U32(x) ((u32)(u64)x)
0963 #else
0964 #define CAST_U32_TO_PTR(x) ((void *)x)
0965 #define CAST_PTR_TO_U32(x) ((u32)x)
0966 #endif
0967
0968 #define MPT_PROTOCOL_FLAGS_c_c_c_c(pflags) \
0969 ((pflags) & MPI_PORTFACTS_PROTOCOL_INITIATOR) ? 'I' : 'i', \
0970 ((pflags) & MPI_PORTFACTS_PROTOCOL_TARGET) ? 'T' : 't', \
0971 ((pflags) & MPI_PORTFACTS_PROTOCOL_LAN) ? 'L' : 'l', \
0972 ((pflags) & MPI_PORTFACTS_PROTOCOL_LOGBUSADDR) ? 'B' : 'b'
0973
0974
0975
0976
0977
0978
0979 #define MPT_TRANSFER_IOC_TO_HOST (0x00000000)
0980 #define MPT_TRANSFER_HOST_TO_IOC (0x04000000)
0981 #define MPT_SGE_FLAGS_LAST_ELEMENT (0x80000000)
0982 #define MPT_SGE_FLAGS_END_OF_BUFFER (0x40000000)
0983 #define MPT_SGE_FLAGS_LOCAL_ADDRESS (0x08000000)
0984 #define MPT_SGE_FLAGS_DIRECTION (0x04000000)
0985 #define MPT_SGE_FLAGS_END_OF_LIST (0x01000000)
0986
0987 #define MPT_SGE_FLAGS_TRANSACTION_ELEMENT (0x00000000)
0988 #define MPT_SGE_FLAGS_SIMPLE_ELEMENT (0x10000000)
0989 #define MPT_SGE_FLAGS_CHAIN_ELEMENT (0x30000000)
0990 #define MPT_SGE_FLAGS_ELEMENT_MASK (0x30000000)
0991
0992 #define MPT_SGE_FLAGS_SSIMPLE_READ \
0993 (MPT_SGE_FLAGS_LAST_ELEMENT | \
0994 MPT_SGE_FLAGS_END_OF_BUFFER | \
0995 MPT_SGE_FLAGS_END_OF_LIST | \
0996 MPT_SGE_FLAGS_SIMPLE_ELEMENT | \
0997 MPT_TRANSFER_IOC_TO_HOST)
0998 #define MPT_SGE_FLAGS_SSIMPLE_WRITE \
0999 (MPT_SGE_FLAGS_LAST_ELEMENT | \
1000 MPT_SGE_FLAGS_END_OF_BUFFER | \
1001 MPT_SGE_FLAGS_END_OF_LIST | \
1002 MPT_SGE_FLAGS_SIMPLE_ELEMENT | \
1003 MPT_TRANSFER_HOST_TO_IOC)
1004
1005
1006 #endif
1007