/* Global list and lock for storing multiple adapters managed by the driver */ extern spinlock_t mrioc_list_lock; externstruct list_head mrioc_list; externint prot_mask; extern atomic64_t event_counter;
/* MSI Index from Reply Queue Index */ #define REPLY_QUEUE_IDX_TO_MSIX_IDX(qidx, offset) (qidx + offset)
/* * Maximum data transfer size definitions for management * application commands
*/ #define MPI3MR_MAX_APP_XFER_SIZE (1 * 1024 * 1024) #define MPI3MR_MAX_APP_XFER_SEGMENTS 512 /* * 2048 sectors are for data buffers and additional 512 sectors for * other buffers
*/ #define MPI3MR_MAX_APP_XFER_SECTORS (2048 + 512)
/** * struct segments - memory descriptor structure to store * virtual and dma addresses for operational queue segments. * * @segment: virtual address * @segment_dma: dma address
*/ struct segments { void *segment;
dma_addr_t segment_dma;
};
/** * struct op_req_qinfo - Operational Request Queue Information * * @ci: consumer index * @pi: producer index * @num_request: Maximum number of entries in the queue * @qid: Queue Id starting from 1 * @reply_qid: Associated reply queue Id * @num_segments: Number of discontiguous memory segments * @segment_qd: Depth of each segments * @q_lock: Concurrent queue access lock * @q_segments: Segment descriptor pointer * @q_segment_list: Segment list base virtual address * @q_segment_list_dma: Segment list base DMA address
*/ struct op_req_qinfo {
u16 ci;
u16 pi;
u16 num_requests;
u16 qid;
u16 reply_qid;
u16 num_segments;
u16 segment_qd;
spinlock_t q_lock; struct segments *q_segments; void *q_segment_list;
dma_addr_t q_segment_list_dma;
};
/** * struct op_reply_qinfo - Operational Reply Queue Information * * @ci: consumer index * @qid: Queue Id starting from 1 * @num_replies: Maximum number of entries in the queue * @num_segments: Number of discontiguous memory segments * @segment_qd: Depth of each segments * @q_segments: Segment descriptor pointer * @q_segment_list: Segment list base virtual address * @q_segment_list_dma: Segment list base DMA address * @ephase: Expected phased identifier for the reply queue * @pend_ios: Number of IOs pending in HW for this queue * @enable_irq_poll: Flag to indicate polling is enabled * @in_use: Queue is handled by poll/ISR * @qtype: Type of queue (types defined in enum queue_type) * @qfull_watermark: Watermark defined in reply queue to avoid * reply queue full
*/ struct op_reply_qinfo {
u16 ci;
u16 qid;
u16 num_replies;
u16 num_segments;
u16 segment_qd; struct segments *q_segments; void *q_segment_list;
dma_addr_t q_segment_list_dma;
u8 ephase;
atomic_t pend_ios; bool enable_irq_poll;
atomic_t in_use; enum queue_type qtype;
u16 qfull_watermark;
};
/** * struct mpi3mr_intr_info - Interrupt cookie information * * @mrioc: Adapter instance reference * @os_irq: irq number * @msix_index: MSIx index * @op_reply_q: Associated operational reply queue * @name: Dev name for the irq claiming device
*/ struct mpi3mr_intr_info { struct mpi3mr_ioc *mrioc; int os_irq;
u16 msix_index; struct op_reply_qinfo *op_reply_q; char name[MPI3MR_NAME_LENGTH];
};
/** * struct mpi3mr_throttle_group_info - Throttle group info * * @io_divert: Flag indicates io divert is on or off for the TG * @need_qd_reduction: Flag to indicate QD reduction is needed * @qd_reduction: Queue Depth reduction in units of 10% * @fw_qd: QueueDepth value reported by the firmware * @modified_qd: Modified QueueDepth value due to throttling * @id: Throttle Group ID. * @high: High limit to turn on throttling in 512 byte blocks * @low: Low limit to turn off throttling in 512 byte blocks * @pend_large_data_sz: Counter to track pending large data
*/ struct mpi3mr_throttle_group_info {
u8 io_divert;
u8 need_qd_reduction;
u8 qd_reduction;
u16 fw_qd;
u16 modified_qd;
u16 id;
u32 high;
u32 low;
atomic_t pend_large_data_sz;
};
/* IOCTL data transfer sge*/ #define MPI3MR_NUM_IOCTL_SGE 256 #define MPI3MR_IOCTL_SGE_SIZE (8 * 1024)
/** * struct mpi3mr_hba_port - HBA's port information * @port_id: Port number * @flags: HBA port flags
*/ struct mpi3mr_hba_port { struct list_head list;
u8 port_id;
u8 flags;
};
/** * struct mpi3mr_sas_port - Internal SAS port information * @port_list: List of ports belonging to a SAS node * @num_phys: Number of phys associated with port * @marked_responding: used while refresing the sas ports * @lowest_phy: lowest phy ID of current sas port, valid for controller port * @phy_mask: phy_mask of current sas port, valid for controller port * @hba_port: HBA port entry * @remote_identify: Attached device identification * @rphy: SAS transport layer rphy object * @port: SAS transport layer port object * @phy_list: mpi3mr_sas_phy objects belonging to this port
*/ struct mpi3mr_sas_port { struct list_head port_list;
u8 num_phys;
u8 marked_responding; int lowest_phy;
u64 phy_mask; struct mpi3mr_hba_port *hba_port; struct sas_identify remote_identify; struct sas_rphy *rphy; struct sas_port *port; struct list_head phy_list;
};
/** * struct mpi3mr_sas_phy - Internal SAS Phy information * @port_siblings: List of phys belonging to a port * @identify: Phy identification * @remote_identify: Attached device identification * @phy: SAS transport layer Phy object * @phy_id: Unique phy id within a port * @handle: Firmware device handle for this phy * @attached_handle: Firmware device handle for attached device * @phy_belongs_to_port: Flag to indicate phy belongs to port @hba_port: HBA port entry
*/ struct mpi3mr_sas_phy { struct list_head port_siblings; struct sas_identify identify; struct sas_identify remote_identify; struct sas_phy *phy;
u8 phy_id;
u16 handle;
u16 attached_handle;
u8 phy_belongs_to_port; struct mpi3mr_hba_port *hba_port;
};
/** * struct mpi3mr_sas_node - SAS host/expander information * @list: List of sas nodes in a controller * @parent_dev: Parent device class * @num_phys: Number phys belonging to sas_node * @sas_address: SAS address of sas_node * @handle: Firmware device handle for this sas_host/expander * @sas_address_parent: SAS address of parent expander or host * @enclosure_handle: Firmware handle of enclosure of this node * @device_info: Capabilities of this sas_host/expander * @non_responding: used to refresh the expander devices during reset * @host_node: Flag to indicate this is a host_node * @hba_port: HBA port entry * @phy: A list of phys that make up this sas_host/expander * @sas_port_list: List of internal ports of this node * @rphy: sas_rphy object of this expander node
*/ struct mpi3mr_sas_node { struct list_head list; struct device *parent_dev;
u8 num_phys;
u64 sas_address;
u16 handle;
u64 sas_address_parent;
u16 enclosure_handle;
u64 enclosure_logical_id;
u8 non_responding;
u8 host_node; struct mpi3mr_hba_port *hba_port; struct mpi3mr_sas_phy *phy; struct list_head sas_port_list; struct sas_rphy *rphy;
};
/** * struct mpi3mr_enclosure_node - enclosure information * @list: List of enclosures * @pg0: Enclosure page 0;
*/ struct mpi3mr_enclosure_node { struct list_head list; struct mpi3_enclosure_page0 pg0;
};
/** * struct tgt_dev_sas_sata - SAS/SATA device specific * information cached from firmware given data * * @sas_address: World wide unique SAS address * @sas_address_parent: Sas address of parent expander or host * @dev_info: Device information bits * @phy_id: Phy identifier provided in device page 0 * @attached_phy_id: Attached phy identifier provided in device page 0 * @sas_transport_attached: Is this device exposed to transport * @pend_sas_rphy_add: Flag to check device is in process of add * @hba_port: HBA port entry * @rphy: SAS transport layer rphy object
*/ struct tgt_dev_sas_sata {
u64 sas_address;
u64 sas_address_parent;
u16 dev_info;
u8 phy_id;
u8 attached_phy_id;
u8 sas_transport_attached;
u8 pend_sas_rphy_add; struct mpi3mr_hba_port *hba_port; struct sas_rphy *rphy;
};
/** * struct tgt_dev_pcie - PCIe device specific information cached * from firmware given data * * @mdts: Maximum data transfer size * @capb: Device capabilities * @pgsz: Device page size * @abort_to: Timeout for abort TM * @reset_to: Timeout for Target/LUN reset TM * @dev_info: Device information bits
*/ struct tgt_dev_pcie {
u32 mdts;
u16 capb;
u8 pgsz;
u8 abort_to;
u8 reset_to;
u16 dev_info;
};
/** * struct tgt_dev_vd - virtual device specific information * cached from firmware given data * * @state: State of the VD * @tg_qd_reduction: Queue Depth reduction in units of 10% * @tg_id: VDs throttle group ID * @high: High limit to turn on throttling in 512 byte blocks * @low: Low limit to turn off throttling in 512 byte blocks * @tg: Pointer to throttle group info
*/ struct tgt_dev_vd {
u8 state;
u8 tg_qd_reduction;
u16 tg_id;
u32 tg_high;
u32 tg_low; struct mpi3mr_throttle_group_info *tg;
};
/** * union _form_spec_inf - union of device specific information
*/ union _form_spec_inf { struct tgt_dev_sas_sata sas_sata_inf; struct tgt_dev_pcie pcie_inf; struct tgt_dev_vd vd_inf;
};
/** * struct mpi3mr_stgt_priv_data - SCSI target private structure * * @starget: Scsi_target pointer * @dev_handle: FW device handle * @perst_id: FW assigned Persistent ID * @num_luns: Number of Logical Units * @block_io: I/O blocked to the device or not * @dev_removed: Device removed in the Firmware * @dev_removedelay: Device is waiting to be removed in FW * @dev_type: Device type * @dev_nvme_dif: Device is NVMe DIF enabled * @wslen: Write same max length * @io_throttle_enabled: I/O throttling needed or not * @io_divert: Flag indicates io divert is on or off for the dev * @throttle_group: Pointer to throttle group info * @tgt_dev: Internal target device pointer * @pend_count: Counter to track pending I/Os during error * handling
*/ struct mpi3mr_stgt_priv_data { struct scsi_target *starget;
u16 dev_handle;
u16 perst_id;
u32 num_luns;
atomic_t block_io;
u8 dev_removed;
u8 dev_removedelay;
u8 dev_type;
u8 dev_nvme_dif;
u16 wslen;
u8 io_throttle_enabled;
u8 io_divert; struct mpi3mr_throttle_group_info *throttle_group; struct mpi3mr_tgt_dev *tgt_dev;
u32 pend_count;
};
/** * struct mpi3mr_stgt_priv_data - SCSI device private structure * * @tgt_priv_data: Scsi_target private data pointer * @lun_id: LUN ID of the device * @ncq_prio_enable: NCQ priority enable for SATA device * @pend_count: Counter to track pending I/Os during error * handling * @wslen: Write same max length
*/ struct mpi3mr_sdev_priv_data { struct mpi3mr_stgt_priv_data *tgt_priv_data;
u32 lun_id;
u8 ncq_prio_enable;
u32 pend_count;
u16 wslen;
};
/** * struct mpi3mr_drv_cmd - Internal command tracker * * @mutex: Command mutex * @done: Completeor for wakeup * @reply: Firmware reply for internal commands * @sensebuf: Sensebuf for SCSI IO commands * @iou_rc: IO Unit control reason code * @state: Command State * @dev_handle: Firmware handle for device specific commands * @ioc_status: IOC status from the firmware * @ioc_loginfo:IOC log info from the firmware * @is_waiting: Is the command issued in block mode * @is_sense: Is Sense data present * @retry_count: Retry count for retriable commands * @host_tag: Host tag used by the command * @callback: Callback for non blocking commands
*/ struct mpi3mr_drv_cmd { struct mutex mutex; struct completion done; void *reply;
u8 *sensebuf;
u8 iou_rc;
u16 state;
u16 dev_handle;
u16 ioc_status;
u32 ioc_loginfo;
u8 is_waiting;
u8 is_sense;
u8 retry_count;
u16 host_tag;
/** * union mpi3mr_trigger_data - Trigger data information * @fault: Fault code * @global: Global trigger data * @element: element trigger data
*/ union mpi3mr_trigger_data {
u16 fault;
u64 global; union mpi3_driver2_trigger_element element;
};
/** * struct trigger_event_data - store trigger related * information. * * @trace_hdb: Trace diag buffer descriptor reference * @fw_hdb: FW diag buffer descriptor reference * @trigger_type: Trigger type * @trigger_specific_data: Trigger specific data * @snapdump: Snapdump enable or disable flag
*/ struct trigger_event_data { struct diag_buffer_desc *trace_hdb; struct diag_buffer_desc *fw_hdb;
u8 trigger_type; union mpi3mr_trigger_data trigger_specific_data; bool snapdump;
};
/** * struct diag_buffer_desc - memory descriptor structure to * store virtual, dma addresses, size, buffer status for host * diagnostic buffers. * * @type: Buffer type * @trigger_data: Trigger data * @trigger_type: Trigger type * @status: Buffer status * @size: Buffer size * @addr: Virtual address * @dma_addr: Buffer DMA address * @is_segmented: The buffer is segmented or not * @disabled_after_reset: The buffer is disabled after reset
*/ struct diag_buffer_desc {
u8 type; union mpi3mr_trigger_data trigger_data;
u8 trigger_type;
u8 status;
u32 size; void *addr;
dma_addr_t dma_addr; bool is_segmented; bool disabled_after_reset;
};
/** * struct dma_memory_desc - memory descriptor structure to store * virtual address, dma address and size for any generic dma * memory allocations in the driver. * * @size: buffer size * @addr: virtual address * @dma_addr: dma address
*/ struct dma_memory_desc {
u32 size; void *addr;
dma_addr_t dma_addr;
};
/** * struct chain_element - memory descriptor structure to store * virtual and dma addresses for chain elements. * * @addr: virtual address * @dma_addr: dma address
*/ struct chain_element { void *addr;
dma_addr_t dma_addr;
};
/** * struct scmd_priv - SCSI command private data * * @host_tag: Host tag specific to operational queue * @in_lld_scope: Command in LLD scope or not * @meta_sg_valid: DIX command with meta data SGL or not * @scmd: SCSI Command pointer * @req_q_idx: Operational request queue index * @chain_idx: Chain frame index * @meta_chain_idx: Chain frame index of meta data SGL * @mpi3mr_scsiio_req: MPI SCSI IO request
*/ struct scmd_priv {
u16 host_tag;
u8 in_lld_scope;
u8 meta_sg_valid; struct scsi_cmnd *scmd;
u16 req_q_idx; int chain_idx; int meta_chain_idx;
u8 mpi3mr_scsiio_req[MPI3MR_ADMIN_REQ_FRAME_SZ];
};
/** * struct mpi3mr_ioc - Adapter anchor structure stored in shost * private data * * @list: List pointer * @pdev: PCI device pointer * @shost: Scsi_Host pointer * @id: Controller ID * @cpu_count: Number of online CPUs * @irqpoll_sleep: usleep unit used in threaded isr irqpoll * @name: Controller ASCII name * @driver_name: Driver ASCII name * @sysif_regs: System interface registers virtual address * @sysif_regs_phys: System interface registers physical address * @bars: PCI BARS * @dma_mask: DMA mask * @msix_count: Number of MSIX vectors used * @intr_enabled: Is interrupts enabled * @num_admin_req: Number of admin requests * @admin_req_q_sz: Admin request queue size * @admin_req_pi: Admin request queue producer index * @admin_req_ci: Admin request queue consumer index * @admin_req_base: Admin request queue base virtual address * @admin_req_dma: Admin request queue base dma address * @admin_req_lock: Admin queue access lock * @num_admin_replies: Number of admin replies * @admin_reply_q_sz: Admin reply queue size * @admin_reply_ci: Admin reply queue consumer index * @admin_reply_ephase:Admin reply queue expected phase * @admin_reply_base: Admin reply queue base virtual address * @admin_reply_dma: Admin reply queue base dma address * @admin_reply_q_in_use: Queue is handled by poll/ISR * @admin_pend_isr: Count of unprocessed admin ISR/poll calls * due to another thread processing replies * @ready_timeout: Controller ready timeout * @intr_info: Interrupt cookie pointer * @intr_info_count: Number of interrupt cookies * @is_intr_info_set: Flag to indicate intr info is setup * @num_queues: Number of operational queues * @num_op_req_q: Number of operational request queues * @req_qinfo: Operational request queue info pointer * @num_op_reply_q: Number of operational reply queues * @op_reply_qinfo: Operational reply queue info pointer * @init_cmds: Command tracker for initialization commands * @cfg_cmds: Command tracker for configuration requests * @facts: Cached IOC facts data * @op_reply_desc_sz: Operational reply descriptor size * @num_reply_bufs: Number of reply buffers allocated * @reply_buf_pool: Reply buffer pool * @reply_buf: Reply buffer base virtual address * @reply_buf_dma: Reply buffer DMA address * @reply_buf_dma_max_address: Reply DMA address max limit * @reply_free_qsz: Reply free queue size * @reply_free_q_pool: Reply free queue pool * @reply_free_q: Reply free queue base virtual address * @reply_free_q_dma: Reply free queue base DMA address * @reply_free_queue_lock: Reply free queue lock * @reply_free_queue_host_index: Reply free queue host index * @num_sense_bufs: Number of sense buffers * @sense_buf_pool: Sense buffer pool * @sense_buf: Sense buffer base virtual address * @sense_buf_dma: Sense buffer base DMA address * @sense_buf_q_sz: Sense buffer queue size * @sense_buf_q_pool: Sense buffer queue pool * @sense_buf_q: Sense buffer queue virtual address * @sense_buf_q_dma: Sense buffer queue DMA address * @sbq_lock: Sense buffer queue lock * @sbq_host_index: Sense buffer queuehost index * @event_masks: Event mask bitmap * @fwevt_worker_thread: Firmware event worker thread * @fwevt_lock: Firmware event lock * @fwevt_list: Firmware event list * @watchdog_work_q_name: Fault watchdog worker thread name * @watchdog_work_q: Fault watchdog worker thread * @watchdog_work: Fault watchdog work * @watchdog_lock: Fault watchdog lock * @is_driver_loading: Is driver still loading * @scan_started: Async scan started * @scan_failed: Asycn scan failed * @stop_drv_processing: Stop all command processing * @device_refresh_on: Don't process the events until devices are refreshed * @max_host_ios: Maximum host I/O count * @max_sgl_entries: Max SGL entries per I/O * @chain_buf_count: Chain buffer count * @chain_buf_pool: Chain buffer pool * @chain_sgl_list: Chain SGL list * @chain_bitmap: Chain buffer allocator bitmap * @chain_buf_lock: Chain buffer list lock * @bsg_cmds: Command tracker for BSG command * @host_tm_cmds: Command tracker for task management commands * @dev_rmhs_cmds: Command tracker for device removal commands * @evtack_cmds: Command tracker for event ack commands * @devrem_bitmap: Device removal bitmap * @dev_handle_bitmap_bits: Number of bits in device handle bitmap * @removepend_bitmap: Remove pending bitmap * @delayed_rmhs_list: Delayed device removal list * @evtack_cmds_bitmap: Event Ack bitmap * @delayed_evtack_cmds_list: Delayed event acknowledgment list * @ts_update_counter: Timestamp update counter * @ts_update_interval: Timestamp update interval * @reset_in_progress: Reset in progress flag * @unrecoverable: Controller unrecoverable flag * @io_admin_reset_sync: Manage state of I/O ops during an admin reset process * @prev_reset_result: Result of previous reset * @reset_mutex: Controller reset mutex * @reset_waitq: Controller reset wait queue * @prepare_for_reset: Prepare for reset event received * @prepare_for_reset_timeout_counter: Prepare for reset timeout * @prp_list_virt: NVMe encapsulated PRP list virtual base * @prp_list_dma: NVMe encapsulated PRP list DMA * @prp_sz: NVME encapsulated PRP list size * @diagsave_timeout: Diagnostic information save timeout * @logging_level: Controller debug logging level * @flush_io_count: I/O count to flush after reset * @current_event: Firmware event currently in process * @driver_info: Driver, Kernel, OS information to firmware * @change_count: Topology change count * @pel_enabled: Persistent Event Log(PEL) enabled or not * @pel_abort_requested: PEL abort is requested or not * @pel_class: PEL Class identifier * @pel_locale: PEL Locale identifier * @pel_cmds: Command tracker for PEL wait command * @pel_abort_cmd: Command tracker for PEL abort command * @pel_newest_seqnum: Newest PEL sequenece number * @pel_seqnum_virt: PEL sequence number virtual address * @pel_seqnum_dma: PEL sequence number DMA address * @pel_seqnum_sz: PEL sequenece number size * @op_reply_q_offset: Operational reply queue offset with MSIx * @default_qcount: Total Default queues * @active_poll_qcount: Currently active poll queue count * @requested_poll_qcount: User requested poll queue count * @bsg_dev: BSG device structure * @bsg_queue: Request queue for BSG device * @stop_bsgs: Stop BSG request flag * @logdata_buf: Circular buffer to store log data entries * @logdata_buf_idx: Index of entry in buffer to store * @logdata_entry_sz: log data entry size * @adm_req_q_bar_writeq_lock: Admin request queue lock * @adm_reply_q_bar_writeq_lock: Admin reply queue lock * @pend_large_data_sz: Counter to track pending large data * @io_throttle_data_length: I/O size to track in 512b blocks * @io_throttle_high: I/O size to start throttle in 512b blocks * @io_throttle_low: I/O size to stop throttle in 512b blocks * @num_io_throttle_group: Maximum number of throttle groups * @throttle_groups: Pointer to throttle group info structures * @sas_transport_enabled: SAS transport enabled or not * @scsi_device_channel: Channel ID for SCSI devices * @transport_cmds: Command tracker for SAS transport commands * @sas_hba: SAS node for the controller * @sas_expander_list: SAS node list of expanders * @sas_node_lock: Lock to protect SAS node list * @hba_port_table_list: List of HBA Ports * @enclosure_list: List of Enclosure objects * @diag_buffers: Host diagnostic buffers * @driver_pg2: Driver page 2 pointer * @reply_trigger_present: Reply trigger present flag * @event_trigger_present: Event trigger present flag * @scsisense_trigger_present: Scsi sense trigger present flag * @ioctl_dma_pool: DMA pool for IOCTL data buffers * @ioctl_sge: DMA buffer descriptors for IOCTL data * @ioctl_chain_sge: DMA buffer descriptor for IOCTL chain * @ioctl_resp_sge: DMA buffer descriptor for Mgmt cmd response * @ioctl_sges_allocated: Flag for IOCTL SGEs allocated or not * @trace_release_trigger_active: Trace trigger active flag * @fw_release_trigger_active: Fw release trigger active flag * @snapdump_trigger_active: Snapdump trigger active flag * @pci_err_recovery: PCI error recovery in progress * @block_on_pci_err: Block IO during PCI error recovery * @reply_qfull_count: Occurences of reply queue full avoidance kicking-in * @prevent_reply_qfull: Enable reply queue prevention * @seg_tb_support: Segmented trace buffer support * @num_tb_segs: Number of Segments in Trace buffer * @trace_buf_pool: DMA pool for Segmented trace buffer segments * @trace_buf: Trace buffer segments memory descriptor
*/ struct mpi3mr_ioc { struct list_head list; struct pci_dev *pdev; struct Scsi_Host *shost;
u8 id; int cpu_count; bool enable_segqueue;
u32 irqpoll_sleep;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.