Print this page
XXXX Nexenta fixes for mpt_sas(7d)
*** 206,224 ****
uint16_t m_qfull_retry_interval;
uint8_t m_qfull_retries;
uint16_t m_enclosure;
uint16_t m_slot_num;
uint32_t m_tgt_unconfigured;
- /*
- * For the common case, the elements in this structure are
- * protected by the per hba instance mutex. In order to make
- * the key code path in ISR lockless, a separate mutex is
- * introdeced to protect those shown in ISR.
- */
- kmutex_t m_tgt_intr_mutex;
-
} mptsas_target_t;
typedef struct mptsas_smp {
uint64_t m_sasaddr; /* hash key1 */
mptsas_phymask_t m_phymask; /* hash key2 */
--- 206,218 ----
uint16_t m_qfull_retry_interval;
uint8_t m_qfull_retries;
uint16_t m_enclosure;
uint16_t m_slot_num;
uint32_t m_tgt_unconfigured;
+ uint32_t m_timeout_interval;
+ uint8_t m_timeout_count;
} mptsas_target_t;
typedef struct mptsas_smp {
uint64_t m_sasaddr; /* hash key1 */
mptsas_phymask_t m_phymask; /* hash key2 */
*** 599,635 ****
#define MPTSAS_SLOTS_SIZE(mpt) \
(sizeof (struct mptsas_slots) + (sizeof (struct mptsas_cmd *) * \
mpt->m_max_requests))
#define MPTSAS_TM_SLOT(mpt) (mpt->m_max_requests - 1)
- typedef struct mptsas_slot_free_e {
- processorid_t cpuid;
- int slot;
- list_node_t node;
- } mptsas_slot_free_e_t;
-
/*
- * each of the allocq and releaseq in all CPU groups resides in separate
- * cacheline(64 bytes). Multiple mutex in the same cacheline is not good
- * for performance.
- */
- typedef union mptsas_slot_freeq {
- struct {
- kmutex_t m_fq_mutex;
- list_t m_fq_list;
- int m_fq_n;
- int m_fq_n_init;
- } s;
- char pad[64];
- } mptsas_slot_freeq_t;
-
- typedef struct mptsas_slot_freeq_pair {
- mptsas_slot_freeq_t m_slot_allocq;
- mptsas_slot_freeq_t m_slot_releq;
- } mptsas_slot_freeq_pair_t;
-
- /*
* Macro for phy_flags
*/
typedef struct smhba_info {
kmutex_t phy_mutex;
--- 593,603 ----
*** 690,700 ****
--- 658,670 ----
struct mptsas *m_next;
scsi_hba_tran_t *m_tran;
smp_hba_tran_t *m_smptran;
kmutex_t m_mutex;
+ kmutex_t m_passthru_mutex;
kcondvar_t m_cv;
+ kcondvar_t m_passthru_cv;
kcondvar_t m_fw_cv;
kcondvar_t m_config_cv;
kcondvar_t m_fw_diag_cv;
dev_info_t *m_dip;
*** 706,720 ****
struct mptsas_slots *m_active; /* outstanding cmds */
mptsas_cmd_t *m_waitq; /* cmd queue for active request */
mptsas_cmd_t **m_waitqtail; /* wait queue tail ptr */
mptsas_cmd_t *m_doneq; /* queue of completed commands */
mptsas_cmd_t **m_donetail; /* queue tail ptr */
- kmutex_t m_passthru_mutex;
- kcondvar_t m_passthru_cv;
/*
* variables for helper threads (fan-out interrupts)
*/
mptsas_doneq_thread_list_t *m_doneq_thread_id;
uint32_t m_doneq_thread_n;
--- 676,693 ----
struct mptsas_slots *m_active; /* outstanding cmds */
mptsas_cmd_t *m_waitq; /* cmd queue for active request */
mptsas_cmd_t **m_waitqtail; /* wait queue tail ptr */
+ kmutex_t m_tx_waitq_mutex;
+ mptsas_cmd_t *m_tx_waitq; /* TX cmd queue for active request */
+ mptsas_cmd_t **m_tx_waitqtail; /* tx_wait queue tail ptr */
+ int m_tx_draining; /* TX queue draining flag */
+
mptsas_cmd_t *m_doneq; /* queue of completed commands */
mptsas_cmd_t **m_donetail; /* queue tail ptr */
/*
* variables for helper threads (fan-out interrupts)
*/
mptsas_doneq_thread_list_t *m_doneq_thread_id;
uint32_t m_doneq_thread_n;
*** 749,765 ****
ddi_acc_handle_t m_acc_free_queue_hdl;
ddi_dma_handle_t m_dma_post_queue_hdl;
ddi_acc_handle_t m_acc_post_queue_hdl;
/*
- * Try the best to make the key code path in the ISR lockless.
- * so avoid to use the per instance mutex m_mutex in the ISR. Introduce
- * a separate mutex to protect the elements shown in ISR.
- */
- kmutex_t m_intr_mutex;
-
- /*
* list of reset notification requests
*/
struct scsi_reset_notify_entry *m_reset_notify_listf;
/*
--- 722,731 ----
*** 847,861 ****
/*
* per instance data structures for dma memory resources for
* MPI handshake protocol. only one handshake cmd can run at a time.
*/
ddi_dma_handle_t m_hshk_dma_hdl;
-
ddi_acc_handle_t m_hshk_acc_hdl;
-
caddr_t m_hshk_memp;
-
size_t m_hshk_dma_size;
/* Firmware version on the card at boot time */
uint32_t m_fwversion;
--- 813,824 ----
*** 922,940 ****
* IR Capable flag
*/
uint8_t m_ir_capable;
/*
- * release and alloc queue for slot
- */
- int m_slot_freeq_pair_n;
- mptsas_slot_freeq_pair_t *m_slot_freeq_pairp;
- mptsas_slot_free_e_t *m_slot_free_ae;
- #define MPI_ADDRESS_COALSCE_MAX 128
- pMpi2ReplyDescriptorsUnion_t m_reply;
-
- /*
* Is HBA processing a diag reset?
*/
uint8_t m_in_reset;
/*
--- 885,894 ----