From 940efceed6b67909bbec473feca747d2fbaa32b9 Mon Sep 17 00:00:00 2001 From: Andy Giles Date: Wed, 25 Jun 2014 17:47:41 +0200 Subject: [PATCH] 5017 use 64bit DMA in mpt_sas Reviewed by: Hans Rosenfeld Reviewed by: Josef 'Jeff' Sipek Approved by: Robert Mustacchi --- .../uts/common/io/scsi/adapters/mpt_sas/mptsas.c | 111 +++++++++++++-------- .../common/io/scsi/adapters/mpt_sas/mptsas_impl.c | 55 +++++----- .../common/io/scsi/adapters/mpt_sas/mptsas_init.c | 3 +- .../common/io/scsi/adapters/mpt_sas/mptsas_raid.c | 8 +- .../common/sys/scsi/adapters/mpt_sas/mptsas_var.h | 24 ++--- 5 files changed, 114 insertions(+), 87 deletions(-) diff --git a/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas.c b/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas.c index 9fb05cf213..11232881e1 100644 --- a/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas.c +++ b/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas.c @@ -500,7 +500,7 @@ ddi_dma_attr_t mptsas_dma_attrs64 = { 0xffffffffull, /* max segment size (DMA boundary) */ MPTSAS_MAX_DMA_SEGS, /* scatter/gather list length */ 512, /* granularity - device transfer size */ - DDI_DMA_RELAXED_ORDERING /* flags, enable relaxed ordering */ + 0 /* flags, set to 0 */ }; ddi_device_acc_attr_t mptsas_dev_attr = { @@ -614,6 +614,16 @@ static int mptsas_timeouts_enabled = 0; int mptsas_extreq_sense_bufsize = 256*64; /* + * We believe that all software resrictions of having to run with DMA + * attributes to limit allocation to the first 4G are removed. + * However, this flag remains to enable quick switchback should suspicious + * problems emerge. + * Note that scsi_alloc_consistent_buf() does still adhere to allocating + * 32 bit addressable memory, but we can cope if that is changed now. + */ +int mptsas_use_64bit_msgaddr = 1; + +/* * warlock directives */ _NOTE(SCHEME_PROTECTS_DATA("unique per pkt", scsi_pkt \ @@ -1192,7 +1202,11 @@ mptsas_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) /* Make a per-instance copy of the structures */ mpt->m_io_dma_attr = mptsas_dma_attrs64; - mpt->m_msg_dma_attr = mptsas_dma_attrs; + if (mptsas_use_64bit_msgaddr) { + mpt->m_msg_dma_attr = mptsas_dma_attrs64; + } else { + mpt->m_msg_dma_attr = mptsas_dma_attrs; + } mpt->m_reg_acc_attr = mptsas_dev_attr; mpt->m_dev_acc_attr = mptsas_dev_attr; @@ -4049,7 +4063,7 @@ mptsas_cache_frames_constructor(void *buf, void *cdrarg, int kmflags) * address to dma to and from the driver. The second * address is the address mpt uses to fill in the SGL. */ - p->m_phys_addr = cookie.dmac_address; + p->m_phys_addr = cookie.dmac_laddress; return (DDI_SUCCESS); } @@ -4291,6 +4305,7 @@ mptsas_sge_chain(mptsas_t *mpt, mptsas_cmd_t *cmd, { pMpi2SGESimple64_t sge; pMpi2SGEChain64_t sgechain; + uint64_t nframe_phys_addr; uint_t cookiec; mptti_t *dmap; uint32_t flags; @@ -4414,10 +4429,8 @@ mptsas_sge_chain(mptsas_t *mpt, mptsas_cmd_t *cmd, p = cmd->cmd_extra_frames; ddi_put16(acc_hdl, &sgechain->Length, chainlength); - ddi_put32(acc_hdl, &sgechain->Address.Low, - p->m_phys_addr); - /* SGL is allocated in the first 4G mem range */ - ddi_put32(acc_hdl, &sgechain->Address.High, 0); + ddi_put32(acc_hdl, &sgechain->Address.Low, p->m_phys_addr); + ddi_put32(acc_hdl, &sgechain->Address.High, p->m_phys_addr >> 32); /* * If there are more than 2 frames left we have to @@ -4475,12 +4488,14 @@ mptsas_sge_chain(mptsas_t *mpt, mptsas_cmd_t *cmd, * Note that frames are in contiguous * memory space. */ + nframe_phys_addr = p->m_phys_addr + + (mpt->m_req_frame_size * k); ddi_put32(p->m_acc_hdl, &sgechain->Address.Low, - (p->m_phys_addr + - (mpt->m_req_frame_size * k))); + nframe_phys_addr); ddi_put32(p->m_acc_hdl, - &sgechain->Address.High, 0); + &sgechain->Address.High, + nframe_phys_addr >> 32); /* * If there are more than 2 frames left @@ -4630,6 +4645,7 @@ mptsas_ieee_sge_chain(mptsas_t *mpt, mptsas_cmd_t *cmd, { pMpi2IeeeSgeSimple64_t ieeesge; pMpi25IeeeSgeChain64_t ieeesgechain; + uint64_t nframe_phys_addr; uint_t cookiec; mptti_t *dmap; uint8_t flags; @@ -4749,10 +4765,8 @@ mptsas_ieee_sge_chain(mptsas_t *mpt, mptsas_cmd_t *cmd, p = cmd->cmd_extra_frames; ddi_put32(acc_hdl, &ieeesgechain->Length, chainlength); - ddi_put32(acc_hdl, &ieeesgechain->Address.Low, - p->m_phys_addr); - /* SGL is allocated in the first 4G mem range */ - ddi_put32(acc_hdl, &ieeesgechain->Address.High, 0); + ddi_put32(acc_hdl, &ieeesgechain->Address.Low, p->m_phys_addr); + ddi_put32(acc_hdl, &ieeesgechain->Address.High, p->m_phys_addr >> 32); /* * If there are more than 2 frames left we have to @@ -4809,12 +4823,14 @@ mptsas_ieee_sge_chain(mptsas_t *mpt, mptsas_cmd_t *cmd, * Note that frames are in contiguous * memory space. */ + nframe_phys_addr = p->m_phys_addr + + (mpt->m_req_frame_size * k); ddi_put32(p->m_acc_hdl, &ieeesgechain->Address.Low, - (p->m_phys_addr + - (mpt->m_req_frame_size * k))); + nframe_phys_addr); ddi_put32(p->m_acc_hdl, - &ieeesgechain->Address.High, 0); + &ieeesgechain->Address.High, + nframe_phys_addr >> 32); /* * If there are more than 2 frames left @@ -5165,7 +5181,7 @@ mptsas_handle_address_reply(mptsas_t *mpt, pMpi2AddressReplyDescriptor_t address_reply; pMPI2DefaultReply_t reply; mptsas_fw_diagnostic_buffer_t *pBuffer; - uint32_t reply_addr; + uint32_t reply_addr, reply_frame_dma_baseaddr; uint16_t SMID, iocstatus; mptsas_slots_t *slots = mpt->m_active; mptsas_cmd_t *cmd = NULL; @@ -5184,10 +5200,11 @@ mptsas_handle_address_reply(mptsas_t *mpt, * If reply frame is not in the proper range we should ignore this * message and exit the interrupt handler. */ - if ((reply_addr < mpt->m_reply_frame_dma_addr) || - (reply_addr >= (mpt->m_reply_frame_dma_addr + + reply_frame_dma_baseaddr = mpt->m_reply_frame_dma_addr & 0xffffffffu; + if ((reply_addr < reply_frame_dma_baseaddr) || + (reply_addr >= (reply_frame_dma_baseaddr + (mpt->m_reply_frame_size * mpt->m_max_replies))) || - ((reply_addr - mpt->m_reply_frame_dma_addr) % + ((reply_addr - reply_frame_dma_baseaddr) % mpt->m_reply_frame_size != 0)) { mptsas_log(mpt, CE_WARN, "?Received invalid reply frame " "address 0x%x\n", reply_addr); @@ -5198,7 +5215,7 @@ mptsas_handle_address_reply(mptsas_t *mpt, (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0, DDI_DMA_SYNC_FORCPU); reply = (pMPI2DefaultReply_t)(mpt->m_reply_frame + (reply_addr - - mpt->m_reply_frame_dma_addr)); + reply_frame_dma_baseaddr)); function = ddi_get8(mpt->m_acc_reply_frame_hdl, &reply->Function); NDBG31(("mptsas_handle_address_reply: function 0x%x, reply_addr=0x%x", @@ -5263,7 +5280,7 @@ mptsas_handle_address_reply(mptsas_t *mpt, cv_signal(&mpt->m_fw_cv); break; case MPI2_FUNCTION_EVENT_NOTIFICATION: - reply_frame_no = (reply_addr - mpt->m_reply_frame_dma_addr) / + reply_frame_no = (reply_addr - reply_frame_dma_baseaddr) / mpt->m_reply_frame_size; args = &mpt->m_replyh_args[reply_frame_no]; args->mpt = (void *)mpt; @@ -6737,7 +6754,8 @@ mptsas_record_event(void *args) mpt = replyh_arg->mpt; eventreply = (pMpi2EventNotificationReply_t) - (mpt->m_reply_frame + (rfm - mpt->m_reply_frame_dma_addr)); + (mpt->m_reply_frame + (rfm - + (mpt->m_reply_frame_dma_addr & 0xffffffffu))); event = ddi_get16(mpt->m_acc_reply_frame_hdl, &eventreply->Event); @@ -6825,7 +6843,8 @@ mptsas_handle_event_sync(void *args) ASSERT(mutex_owned(&mpt->m_mutex)); eventreply = (pMpi2EventNotificationReply_t) - (mpt->m_reply_frame + (rfm - mpt->m_reply_frame_dma_addr)); + (mpt->m_reply_frame + (rfm - + (mpt->m_reply_frame_dma_addr & 0xffffffffu))); event = ddi_get16(mpt->m_acc_reply_frame_hdl, &eventreply->Event); if (iocstatus = ddi_get16(mpt->m_acc_reply_frame_hdl, @@ -7529,7 +7548,8 @@ mptsas_handle_event(void *args) } eventreply = (pMpi2EventNotificationReply_t) - (mpt->m_reply_frame + (rfm - mpt->m_reply_frame_dma_addr)); + (mpt->m_reply_frame + (rfm - + (mpt->m_reply_frame_dma_addr & 0xffffffffu))); event = ddi_get16(mpt->m_acc_reply_frame_hdl, &eventreply->Event); if (iocstatus = ddi_get16(mpt->m_acc_reply_frame_hdl, @@ -8321,7 +8341,7 @@ mptsas_start_cmd(mptsas_t *mpt, mptsas_cmd_t *cmd) mptsas_target_t *ptgt = cmd->cmd_tgt_addr; uint16_t SMID, io_flags = 0; uint8_t ars_size; - uint32_t request_desc_low, request_desc_high; + uint64_t request_desc; uint32_t ars_dmaaddrlow; mptsas_cmd_t *c; @@ -8432,9 +8452,9 @@ mptsas_start_cmd(mptsas_t *mpt, mptsas_cmd_t *cmd) if (mptsas_use_fastpath && ptgt->m_io_flags & MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) { io_flags |= MPI25_SCSIIO_IOFLAGS_FAST_PATH; - request_desc_low = MPI25_REQ_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO; + request_desc = MPI25_REQ_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO; } else { - request_desc_low = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO; + request_desc = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO; } ddi_put16(acc_hdl, &io_request->IoFlags, io_flags); /* @@ -8468,9 +8488,9 @@ mptsas_start_cmd(mptsas_t *mpt, mptsas_cmd_t *cmd) /* * Build request descriptor and write it to the request desc post reg. */ - request_desc_low |= (SMID << 16); - request_desc_high = ptgt->m_devhdl << 16; - MPTSAS_START_CMD(mpt, request_desc_low, request_desc_high); + request_desc |= (SMID << 16); + request_desc |= (uint64_t)ptgt->m_devhdl << 48; + MPTSAS_START_CMD(mpt, request_desc); /* * Start timeout. @@ -10235,8 +10255,8 @@ mptsas_start_passthru(mptsas_t *mpt, mptsas_cmd_t *cmd) struct scsi_pkt *pkt = cmd->cmd_pkt; mptsas_pt_request_t *pt = pkt->pkt_ha_private; uint32_t request_size; - uint32_t request_desc_low, request_desc_high = 0; uint32_t i; + uint64_t request_desc = 0; uint8_t desc_type; uint16_t SMID; uint8_t *request, function; @@ -10332,8 +10352,8 @@ mptsas_start_passthru(mptsas_t *mpt, mptsas_cmd_t *cmd) */ if (function == MPI2_FUNCTION_SCSI_IO_REQUEST) { desc_type = MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO; - request_desc_high = (ddi_get16(acc_hdl, - &scsi_io_req->DevHandle) << 16); + request_desc = ((uint64_t)ddi_get16(acc_hdl, + &scsi_io_req->DevHandle) << 48); } (void) ddi_dma_sync(mpt->m_dma_req_sense_hdl, 0, 0, DDI_DMA_SYNC_FORDEV); @@ -10345,9 +10365,9 @@ mptsas_start_passthru(mptsas_t *mpt, mptsas_cmd_t *cmd) * finish. */ (void) ddi_dma_sync(dma_hdl, 0, 0, DDI_DMA_SYNC_FORDEV); - request_desc_low = (SMID << 16) + desc_type; + request_desc |= (SMID << 16) + desc_type; cmd->cmd_rfm = NULL; - MPTSAS_START_CMD(mpt, request_desc_low, request_desc_high); + MPTSAS_START_CMD(mpt, request_desc); if ((mptsas_check_dma_handle(dma_hdl) != DDI_SUCCESS) || (mptsas_check_acc_handle(acc_hdl) != DDI_SUCCESS)) { ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED); @@ -10943,7 +10963,7 @@ mptsas_do_passthru(mptsas_t *mpt, uint8_t *request, uint8_t *reply, DDI_DMA_SYNC_FORCPU); reply_msg = (pMPI2DefaultReply_t) (mpt->m_reply_frame + (cmd->cmd_rfm - - mpt->m_reply_frame_dma_addr)); + (mpt->m_reply_frame_dma_addr & 0xffffffffu))); } mptsas_fma_check(mpt, cmd); @@ -11137,7 +11157,8 @@ mptsas_start_diag(mptsas_t *mpt, mptsas_cmd_t *cmd) pMpi2DiagReleaseRequest_t pDiag_release_msg; struct scsi_pkt *pkt = cmd->cmd_pkt; mptsas_diag_request_t *diag = pkt->pkt_ha_private; - uint32_t request_desc_low, i; + uint32_t i; + uint64_t request_desc; ASSERT(mutex_owned(&mpt->m_mutex)); @@ -11190,10 +11211,10 @@ mptsas_start_diag(mptsas_t *mpt, mptsas_cmd_t *cmd) */ (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0, DDI_DMA_SYNC_FORDEV); - request_desc_low = (cmd->cmd_slot << 16) + + request_desc = (cmd->cmd_slot << 16) + MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; cmd->cmd_rfm = NULL; - MPTSAS_START_CMD(mpt, request_desc_low, 0); + MPTSAS_START_CMD(mpt, request_desc); if ((mptsas_check_dma_handle(mpt->m_dma_req_frame_hdl) != DDI_SUCCESS) || (mptsas_check_acc_handle(mpt->m_acc_req_frame_hdl) != @@ -11291,7 +11312,8 @@ mptsas_post_fw_diag_buffer(mptsas_t *mpt, (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0, DDI_DMA_SYNC_FORCPU); reply = (pMpi2DiagBufferPostReply_t)(mpt->m_reply_frame + - (cmd->cmd_rfm - mpt->m_reply_frame_dma_addr)); + (cmd->cmd_rfm - + (mpt->m_reply_frame_dma_addr & 0xffffffffu))); /* * Get the reply message data @@ -11445,7 +11467,8 @@ mptsas_release_fw_diag_buffer(mptsas_t *mpt, (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0, DDI_DMA_SYNC_FORCPU); reply = (pMpi2DiagReleaseReply_t)(mpt->m_reply_frame + - (cmd->cmd_rfm - mpt->m_reply_frame_dma_addr)); + (cmd->cmd_rfm - + (mpt->m_reply_frame_dma_addr & 0xffffffffu))); /* * Get the reply message data @@ -12889,7 +12912,7 @@ mur: * Initialize the Reply Free Queue with the physical addresses of our * reply frames. */ - cookie.dmac_address = mpt->m_reply_frame_dma_addr; + cookie.dmac_address = mpt->m_reply_frame_dma_addr & 0xffffffffu; for (i = 0; i < mpt->m_max_replies; i++) { ddi_put32(mpt->m_acc_free_queue_hdl, &((uint32_t *)(void *)mpt->m_free_queue)[i], diff --git a/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_impl.c b/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_impl.c index ba5133977b..ddf1cb2553 100644 --- a/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_impl.c +++ b/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_impl.c @@ -203,7 +203,8 @@ mptsas_start_config_page_access(mptsas_t *mpt, mptsas_cmd_t *cmd) struct scsi_pkt *pkt = cmd->cmd_pkt; mptsas_config_request_t *config = pkt->pkt_ha_private; uint8_t direction; - uint32_t length, flagslength, request_desc_low; + uint32_t length, flagslength; + uint64_t request_desc; ASSERT(mutex_owned(&mpt->m_mutex)); @@ -277,10 +278,10 @@ mptsas_start_config_page_access(mptsas_t *mpt, mptsas_cmd_t *cmd) (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0, DDI_DMA_SYNC_FORDEV); - request_desc_low = (cmd->cmd_slot << 16) + + request_desc = (cmd->cmd_slot << 16) + MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; cmd->cmd_rfm = NULL; - MPTSAS_START_CMD(mpt, request_desc_low, 0); + MPTSAS_START_CMD(mpt, request_desc); if ((mptsas_check_dma_handle(mpt->m_dma_req_frame_hdl) != DDI_SUCCESS) || (mptsas_check_acc_handle(mpt->m_acc_req_frame_hdl) != @@ -390,7 +391,7 @@ mptsas_access_config_page(mptsas_t *mpt, uint8_t action, uint8_t page_type, (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0, DDI_DMA_SYNC_FORCPU); reply = (pMpi2ConfigReply_t)(mpt->m_reply_frame + (cmd->cmd_rfm - - mpt->m_reply_frame_dma_addr)); + - (mpt->m_reply_frame_dma_addr & 0xffffffffu))); config.page_type = ddi_get8(mpt->m_acc_reply_frame_hdl, &reply->Header.PageType); config.page_number = ddi_get8(mpt->m_acc_reply_frame_hdl, @@ -535,7 +536,7 @@ mptsas_access_config_page(mptsas_t *mpt, uint8_t action, uint8_t page_type, (void) ddi_dma_sync(cmd->cmd_dmahandle, 0, 0, DDI_DMA_SYNC_FORCPU); reply = (pMpi2ConfigReply_t)(mpt->m_reply_frame + (cmd->cmd_rfm - - mpt->m_reply_frame_dma_addr)); + - (mpt->m_reply_frame_dma_addr & 0xffffffffu))); iocstatus = ddi_get16(mpt->m_acc_reply_frame_hdl, &reply->IOCStatus); iocstatus = MPTSAS_IOCSTATUS(iocstatus); @@ -612,7 +613,7 @@ page_done: int mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action, uint8_t pagetype, uint32_t pageaddress, uint8_t pagenumber, uint8_t pageversion, - uint8_t pagelength, uint32_t SGEflagslength, uint32_t SGEaddress32) + uint8_t pagelength, uint32_t SGEflagslength, uint64_t SGEaddress) { pMpi2ConfigRequest_t config; int send_numbytes; @@ -629,7 +630,10 @@ mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action, uint8_t pagetype, ddi_put32(mpt->m_hshk_acc_hdl, &config->PageBufferSGE.MpiSimple.FlagsLength, SGEflagslength); ddi_put32(mpt->m_hshk_acc_hdl, - &config->PageBufferSGE.MpiSimple.u.Address32, SGEaddress32); + &config->PageBufferSGE.MpiSimple.u.Address64.Low, SGEaddress); + ddi_put32(mpt->m_hshk_acc_hdl, + &config->PageBufferSGE.MpiSimple.u.Address64.High, + SGEaddress >> 32); send_numbytes = sizeof (MPI2_CONFIG_REQUEST); /* @@ -646,7 +650,7 @@ int mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action, uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber, uint8_t pageversion, uint16_t extpagelength, - uint32_t SGEflagslength, uint32_t SGEaddress32) + uint32_t SGEflagslength, uint64_t SGEaddress) { pMpi2ConfigRequest_t config; int send_numbytes; @@ -665,7 +669,10 @@ mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action, ddi_put32(mpt->m_hshk_acc_hdl, &config->PageBufferSGE.MpiSimple.FlagsLength, SGEflagslength); ddi_put32(mpt->m_hshk_acc_hdl, - &config->PageBufferSGE.MpiSimple.u.Address32, SGEaddress32); + &config->PageBufferSGE.MpiSimple.u.Address64.Low, SGEaddress); + ddi_put32(mpt->m_hshk_acc_hdl, + &config->PageBufferSGE.MpiSimple.u.Address64.High, + SGEaddress >> 32); send_numbytes = sizeof (MPI2_CONFIG_REQUEST); /* @@ -1093,7 +1100,7 @@ mptsas_ioc_task_management(mptsas_t *mpt, int task_type, uint16_t dev_handle, mptsas_cmd_t *cmd; struct scsi_pkt *pkt; mptsas_slots_t *slots = mpt->m_active; - uint32_t request_desc_low, i; + uint64_t request_desc, i; pMPI2DefaultReply_t reply_msg; /* @@ -1149,9 +1156,9 @@ mptsas_ioc_task_management(mptsas_t *mpt, int task_type, uint16_t dev_handle, */ (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0, DDI_DMA_SYNC_FORDEV); - request_desc_low = (cmd->cmd_slot << 16) + + request_desc = (cmd->cmd_slot << 16) + MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY; - MPTSAS_START_CMD(mpt, request_desc_low, 0); + MPTSAS_START_CMD(mpt, request_desc); rval = mptsas_poll(mpt, cmd, MPTSAS_POLL_TIME); if (pkt->pkt_reason == CMD_INCOMPLETE) @@ -1167,7 +1174,7 @@ mptsas_ioc_task_management(mptsas_t *mpt, int task_type, uint16_t dev_handle, DDI_DMA_SYNC_FORCPU); reply_msg = (pMPI2DefaultReply_t) (mpt->m_reply_frame + (cmd->cmd_rfm - - mpt->m_reply_frame_dma_addr)); + (mpt->m_reply_frame_dma_addr & 0xffffffffu))); if (reply_size > sizeof (MPI2_SCSI_TASK_MANAGE_REPLY)) { reply_size = sizeof (MPI2_SCSI_TASK_MANAGE_REPLY); } @@ -1303,7 +1310,7 @@ mptsas_update_flash(mptsas_t *mpt, caddr_t ptrbuffer, uint32_t size, struct scsi_pkt *pkt; int i; int rvalue = 0; - uint32_t request_desc_low; + uint64_t request_desc; if (mpt->m_MPI25 && !mptsas_enable_mpi25_flashupdate) { /* @@ -1389,10 +1396,10 @@ mptsas_update_flash(mptsas_t *mpt, caddr_t ptrbuffer, uint32_t size, */ (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0, DDI_DMA_SYNC_FORDEV); - request_desc_low = (cmd->cmd_slot << 16) + + request_desc = (cmd->cmd_slot << 16) + MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; cmd->cmd_rfm = NULL; - MPTSAS_START_CMD(mpt, request_desc_low, 0); + MPTSAS_START_CMD(mpt, request_desc); rvalue = 0; (void) cv_reltimedwait(&mpt->m_fw_cv, &mpt->m_mutex, @@ -2004,7 +2011,7 @@ mptsas_get_sas_io_unit_page_hndshk(mptsas_t *mpt) MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_SIMPLE_ELEMENT | MPI2_SGE_FLAGS_SYSTEM_ADDRESS | - MPI2_SGE_FLAGS_32_BIT_ADDRESSING | + MPI2_SGE_FLAGS_64_BIT_ADDRESSING | MPI2_SGE_FLAGS_IOC_TO_HOST | MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT); @@ -2020,7 +2027,7 @@ mptsas_get_sas_io_unit_page_hndshk(mptsas_t *mpt) MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_SIMPLE_ELEMENT | MPI2_SGE_FLAGS_SYSTEM_ADDRESS | - MPI2_SGE_FLAGS_32_BIT_ADDRESSING | + MPI2_SGE_FLAGS_64_BIT_ADDRESSING | MPI2_SGE_FLAGS_IOC_TO_HOST | MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT); @@ -2064,7 +2071,7 @@ mptsas_get_sas_io_unit_page_hndshk(mptsas_t *mpt) MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, page_number, ddi_get8(recv_accessp, &configreply->Header.PageVersion), ddi_get16(recv_accessp, &configreply->ExtPageLength), - flags_length, page_cookie.dmac_address)) { + flags_length, page_cookie.dmac_laddress)) { goto cleanup; } @@ -2314,6 +2321,8 @@ mptsas_get_manufacture_page5(mptsas_t *mpt) bzero(page_memp, sizeof (MPI2_CONFIG_PAGE_MAN_5)); m5 = (pMpi2ManufacturingPage5_t)page_memp; + NDBG20(("mptsas_get_manufacture_page5: paddr 0x%p", + (void *)(uintptr_t)page_cookie.dmac_laddress)); /* * Give reply address to IOC to store config page in and send @@ -2323,7 +2332,7 @@ mptsas_get_manufacture_page5(mptsas_t *mpt) flagslength = sizeof (MPI2_CONFIG_PAGE_MAN_5); flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_SIMPLE_ELEMENT | - MPI2_SGE_FLAGS_SYSTEM_ADDRESS | MPI2_SGE_FLAGS_32_BIT_ADDRESSING | + MPI2_SGE_FLAGS_SYSTEM_ADDRESS | MPI2_SGE_FLAGS_64_BIT_ADDRESSING | MPI2_SGE_FLAGS_IOC_TO_HOST | MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT); @@ -2332,7 +2341,7 @@ mptsas_get_manufacture_page5(mptsas_t *mpt) MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 5, ddi_get8(recv_accessp, &configreply->Header.PageVersion), ddi_get8(recv_accessp, &configreply->Header.PageLength), - flagslength, page_cookie.dmac_address)) { + flagslength, page_cookie.dmac_laddress)) { rval = DDI_FAILURE; goto done; } @@ -2699,7 +2708,7 @@ mptsas_get_manufacture_page0(mptsas_t *mpt) flagslength = sizeof (MPI2_CONFIG_PAGE_MAN_0); flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT | MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_SIMPLE_ELEMENT | - MPI2_SGE_FLAGS_SYSTEM_ADDRESS | MPI2_SGE_FLAGS_32_BIT_ADDRESSING | + MPI2_SGE_FLAGS_SYSTEM_ADDRESS | MPI2_SGE_FLAGS_64_BIT_ADDRESSING | MPI2_SGE_FLAGS_IOC_TO_HOST | MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT); @@ -2708,7 +2717,7 @@ mptsas_get_manufacture_page0(mptsas_t *mpt) MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, ddi_get8(recv_accessp, &configreply->Header.PageVersion), ddi_get8(recv_accessp, &configreply->Header.PageLength), - flagslength, page_cookie.dmac_address)) { + flagslength, page_cookie.dmac_laddress)) { rval = DDI_FAILURE; goto done; } diff --git a/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_init.c b/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_init.c index b41d154d74..380a0c10a6 100644 --- a/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_init.c +++ b/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_init.c @@ -656,7 +656,8 @@ mptsas_do_ioc_init(mptsas_t *mpt, caddr_t memp, int var, * These addresses are set using the DMA cookie addresses from when the * memory was allocated. Sense buffer hi address should be 0. */ - ddi_put32(accessp, &init->SenseBufferAddressHigh, 0); + ddi_put32(accessp, &init->SenseBufferAddressHigh, + (uint32_t)(mpt->m_req_sense_dma_addr >> 32)); ddi_put32(accessp, &init->SystemReplyAddressHigh, (uint32_t)(mpt->m_reply_frame_dma_addr >> 32)); ddi_put32(accessp, &init->SystemRequestFrameBaseAddress.High, diff --git a/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_raid.c b/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_raid.c index e64ca18cd0..371db950e5 100644 --- a/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_raid.c +++ b/usr/src/uts/common/io/scsi/adapters/mpt_sas/mptsas_raid.c @@ -22,6 +22,7 @@ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * Copyright (c) 2014, Tegile Systems Inc. All rights reserved. */ /* @@ -572,7 +573,8 @@ mptsas_raid_action_system_shutdown(mptsas_t *mpt) mptsas_slots_t *slots = mpt->m_active; int config, vol; mptsas_cmd_t *cmd; - uint32_t request_desc_low, reply_addr; + uint32_t reply_addr; + uint64_t request_desc; int cnt; pMpi2ReplyDescriptorsUnion_t reply_desc_union; pMPI2DefaultReply_t reply; @@ -631,9 +633,9 @@ mptsas_raid_action_system_shutdown(mptsas_t *mpt) */ (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0, DDI_DMA_SYNC_FORDEV); - request_desc_low = (cmd->cmd_slot << 16) + + request_desc = (cmd->cmd_slot << 16) + MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE; - MPTSAS_START_CMD(mpt, request_desc_low, 0); + MPTSAS_START_CMD(mpt, request_desc); /* * Even though reply does not matter because the system is shutting diff --git a/usr/src/uts/common/sys/scsi/adapters/mpt_sas/mptsas_var.h b/usr/src/uts/common/sys/scsi/adapters/mpt_sas/mptsas_var.h index 1ef957f7c8..836548aa30 100644 --- a/usr/src/uts/common/sys/scsi/adapters/mpt_sas/mptsas_var.h +++ b/usr/src/uts/common/sys/scsi/adapters/mpt_sas/mptsas_var.h @@ -253,7 +253,7 @@ typedef struct mptsas_cache_frames { ddi_dma_handle_t m_dma_hdl; ddi_acc_handle_t m_acc_hdl; caddr_t m_frames_addr; - uint32_t m_phys_addr; + uint64_t m_phys_addr; } mptsas_cache_frames_t; typedef struct mptsas_cmd { @@ -1128,11 +1128,11 @@ _NOTE(DATA_READABLE_WITHOUT_LOCK(mptsas::m_instance)) (uint32_t *)(mpt->m_devaddr + NREG_DSPS))) -#define MPTSAS_START_CMD(mpt, req_desc_lo, req_desc_hi) \ - ddi_put32(mpt->m_datap, &mpt->m_reg->RequestDescriptorPostLow,\ - req_desc_lo);\ - ddi_put32(mpt->m_datap, &mpt->m_reg->RequestDescriptorPostHigh,\ - req_desc_hi); +#define MPTSAS_START_CMD(mpt, req_desc) \ + ddi_put32(mpt->m_datap, &mpt->m_reg->RequestDescriptorPostLow, \ + req_desc & 0xffffffffu); \ + ddi_put32(mpt->m_datap, &mpt->m_reg->RequestDescriptorPostHigh, \ + (req_desc >> 32) & 0xffffffffu); #define INTPENDING(mpt) \ (MPTSAS_GET_ISTAT(mpt) & MPI2_HIS_REPLY_DESCRIPTOR_INTERRUPT) @@ -1275,14 +1275,6 @@ void mptsas_waitq_add(mptsas_t *mpt, mptsas_cmd_t *cmd); void mptsas_log(struct mptsas *mpt, int level, char *fmt, ...); int mptsas_poll(mptsas_t *mpt, mptsas_cmd_t *poll_cmd, int polltime); int mptsas_do_dma(mptsas_t *mpt, uint32_t size, int var, int (*callback)()); -int mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action, - uint8_t pagetype, uint32_t pageaddress, uint8_t pagenumber, - uint8_t pageversion, uint8_t pagelength, uint32_t - SGEflagslength, uint32_t SGEaddress32); -int mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action, - uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber, - uint8_t pageversion, uint16_t extpagelength, - uint32_t SGEflagslength, uint32_t SGEaddress32); int mptsas_update_flash(mptsas_t *mpt, caddr_t ptrbuffer, uint32_t size, uint8_t type, int mode); int mptsas_check_flash(mptsas_t *mpt, caddr_t origfile, uint32_t size, @@ -1314,11 +1306,11 @@ int mptsas_get_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes, int mptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action, uint8_t pagetype, uint32_t pageaddress, uint8_t pagenumber, uint8_t pageversion, uint8_t pagelength, uint32_t SGEflagslength, - uint32_t SGEaddress32); + uint64_t SGEaddress); int mptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action, uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber, uint8_t pageversion, uint16_t extpagelength, - uint32_t SGEflagslength, uint32_t SGEaddress32); + uint32_t SGEflagslength, uint64_t SGEaddress); int mptsas_request_from_pool(mptsas_t *mpt, mptsas_cmd_t **cmd, struct scsi_pkt **pkt); -- 2.11.4.GIT