Print this page
hg changesets 607a5b46a793..b706c96317c3
Fix ncpus for early boot config
Purge the ack to the interrupt before exiting mptsas_intr()
Changes from code review
Update tx waitq's code.
Create 2 threads, divide the workflow and deliver
to the hardware from the threads.
Added code to support using MSI-X interrupts across multiple
reply queues. Not tested with anything other than 3008 yet.
Changes to enable driver to compile.
Header paths, object lists, etc.
*** 20,29 ****
--- 20,30 ----
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
*/
/*
* Copyright (c) 2000 to 2010, LSI Corporation.
* All rights reserved.
*** 70,93 ****
#include <sys/byteorder.h>
#include <sys/raidioctl.h>
#pragma pack(1)
! #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_type.h>
! #include <sys/scsi/adapters/mpt_sas/mpi/mpi2.h>
! #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_cnfg.h>
! #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_init.h>
! #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_ioc.h>
! #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_raid.h>
! #include <sys/scsi/adapters/mpt_sas/mpi/mpi2_tool.h>
#pragma pack()
/*
* private header files.
*/
! #include <sys/scsi/adapters/mpt_sas/mptsas_var.h>
static int mptsas_get_raid_wwid(mptsas_t *mpt, mptsas_raidvol_t *raidvol);
extern int mptsas_check_dma_handle(ddi_dma_handle_t handle);
extern int mptsas_check_acc_handle(ddi_acc_handle_t handle);
--- 71,94 ----
#include <sys/byteorder.h>
#include <sys/raidioctl.h>
#pragma pack(1)
! #include <sys/scsi/adapters/mpt_sas3/mpi/mpi2_type.h>
! #include <sys/scsi/adapters/mpt_sas3/mpi/mpi2.h>
! #include <sys/scsi/adapters/mpt_sas3/mpi/mpi2_cnfg.h>
! #include <sys/scsi/adapters/mpt_sas3/mpi/mpi2_init.h>
! #include <sys/scsi/adapters/mpt_sas3/mpi/mpi2_ioc.h>
! #include <sys/scsi/adapters/mpt_sas3/mpi/mpi2_raid.h>
! #include <sys/scsi/adapters/mpt_sas3/mpi/mpi2_tool.h>
#pragma pack()
/*
* private header files.
*/
! #include <sys/scsi/adapters/mpt_sas3/mptsas3_var.h>
static int mptsas_get_raid_wwid(mptsas_t *mpt, mptsas_raidvol_t *raidvol);
extern int mptsas_check_dma_handle(ddi_dma_handle_t handle);
extern int mptsas_check_acc_handle(ddi_acc_handle_t handle);
*** 564,581 ****
* the normal code path of requests and replies.
*/
void
mptsas_raid_action_system_shutdown(mptsas_t *mpt)
{
pMpi2RaidActionRequest_t action;
uint8_t ir_active = FALSE, reply_type;
uint8_t function, found_reply = FALSE;
uint16_t SMID, action_type;
mptsas_slots_t *slots = mpt->m_active;
int config, vol;
mptsas_cmd_t *cmd;
! uint32_t request_desc_low, reply_addr;
int cnt;
pMpi2ReplyDescriptorsUnion_t reply_desc_union;
pMPI2DefaultReply_t reply;
pMpi2AddressReplyDescriptor_t address_reply;
--- 565,584 ----
* the normal code path of requests and replies.
*/
void
mptsas_raid_action_system_shutdown(mptsas_t *mpt)
{
+ mptsas_reply_pqueue_t *rpqp;
pMpi2RaidActionRequest_t action;
uint8_t ir_active = FALSE, reply_type;
uint8_t function, found_reply = FALSE;
uint16_t SMID, action_type;
mptsas_slots_t *slots = mpt->m_active;
int config, vol;
mptsas_cmd_t *cmd;
! uint32_t reply_addr;
! uint64_t request_desc;
int cnt;
pMpi2ReplyDescriptorsUnion_t reply_desc_union;
pMPI2DefaultReply_t reply;
pMpi2AddressReplyDescriptor_t address_reply;
*** 627,658 ****
action->Function = MPI2_FUNCTION_RAID_ACTION;
action->Action = MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED;
/*
* Send RAID Action.
*/
(void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0,
DDI_DMA_SYNC_FORDEV);
! request_desc_low = (cmd->cmd_slot << 16) +
MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
! MPTSAS_START_CMD(mpt, request_desc_low, 0);
/*
* Even though reply does not matter because the system is shutting
* down, wait no more than 5 seconds here to get the reply just because
* we don't want to leave it hanging if it's coming. Poll because
* interrupts are disabled when this function is called.
*/
for (cnt = 0; cnt < 5000; cnt++) {
/*
* Check for a reply.
*/
(void) ddi_dma_sync(mpt->m_dma_post_queue_hdl, 0, 0,
DDI_DMA_SYNC_FORCPU);
reply_desc_union = (pMpi2ReplyDescriptorsUnion_t)
! MPTSAS_GET_NEXT_REPLY(mpt, mpt->m_post_index);
if (ddi_get32(mpt->m_acc_post_queue_hdl,
&reply_desc_union->Words.Low) == 0xFFFFFFFF ||
ddi_get32(mpt->m_acc_post_queue_hdl,
&reply_desc_union->Words.High) == 0xFFFFFFFF) {
--- 630,663 ----
action->Function = MPI2_FUNCTION_RAID_ACTION;
action->Action = MPI2_RAID_ACTION_SYSTEM_SHUTDOWN_INITIATED;
/*
* Send RAID Action.
+ * Defaults to MSIxIndex of 0, so check reply q 0 below.
*/
(void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0,
DDI_DMA_SYNC_FORDEV);
! request_desc = (cmd->cmd_slot << 16) +
MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
! MPTSAS_START_CMD(mpt, request_desc);
/*
* Even though reply does not matter because the system is shutting
* down, wait no more than 5 seconds here to get the reply just because
* we don't want to leave it hanging if it's coming. Poll because
* interrupts are disabled when this function is called.
*/
+ rpqp = mpt->m_rep_post_queues;
for (cnt = 0; cnt < 5000; cnt++) {
/*
* Check for a reply.
*/
(void) ddi_dma_sync(mpt->m_dma_post_queue_hdl, 0, 0,
DDI_DMA_SYNC_FORCPU);
reply_desc_union = (pMpi2ReplyDescriptorsUnion_t)
! MPTSAS_GET_NEXT_REPLY(rpqp, rpqp->rpq_index);
if (ddi_get32(mpt->m_acc_post_queue_hdl,
&reply_desc_union->Words.Low) == 0xFFFFFFFF ||
ddi_get32(mpt->m_acc_post_queue_hdl,
&reply_desc_union->Words.High) == 0xFFFFFFFF) {
*** 723,746 ****
clear_and_continue:
/*
* Clear the reply descriptor for re-use and increment index.
*/
ddi_put64(mpt->m_acc_post_queue_hdl,
! &((uint64_t *)(void *)mpt->m_post_queue)[mpt->m_post_index],
0xFFFFFFFFFFFFFFFF);
(void) ddi_dma_sync(mpt->m_dma_post_queue_hdl, 0, 0,
DDI_DMA_SYNC_FORDEV);
/*
! * Update the global reply index and keep looking for the
* reply if not found yet.
*/
! if (++mpt->m_post_index == mpt->m_post_queue_depth) {
! mpt->m_post_index = 0;
}
ddi_put32(mpt->m_datap, &mpt->m_reg->ReplyPostHostIndex,
! mpt->m_post_index);
if (!found_reply) {
continue;
}
break;
--- 728,752 ----
clear_and_continue:
/*
* Clear the reply descriptor for re-use and increment index.
*/
ddi_put64(mpt->m_acc_post_queue_hdl,
! &((uint64_t *)(void *)rpqp->rpq_queue)[rpqp->rpq_index],
0xFFFFFFFFFFFFFFFF);
(void) ddi_dma_sync(mpt->m_dma_post_queue_hdl, 0, 0,
DDI_DMA_SYNC_FORDEV);
/*
! * Update the reply index and keep looking for the
* reply if not found yet.
*/
! if (++rpqp->rpq_index == mpt->m_post_queue_depth) {
! rpqp->rpq_index = 0;
}
+
ddi_put32(mpt->m_datap, &mpt->m_reg->ReplyPostHostIndex,
! rpqp->rpq_index);
if (!found_reply) {
continue;
}
break;