Mercurial > illumos > illumos-gate
changeset 10600:687e6ace87ba
6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
6879730 mr_sas returns stale DMA data to applications
6879745 inapproprate FMA check points exist in mr_sas driver
author | Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM> |
---|---|
date | Tue, 22 Sep 2009 10:33:14 +0800 |
parents | 28d1f04d24a6 |
children | 531239fefdcd |
files | usr/src/uts/common/io/mr_sas/mr_sas.c usr/src/uts/common/io/mr_sas/mr_sas.conf usr/src/uts/common/io/mr_sas/mr_sas.h |
diffstat | 3 files changed, 37 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/io/mr_sas/mr_sas.c Mon Sep 21 18:02:54 2009 -0700 +++ b/usr/src/uts/common/io/mr_sas/mr_sas.c Tue Sep 22 10:33:14 2009 +0800 @@ -81,8 +81,9 @@ * Local static data */ static void *mrsas_state = NULL; -static int debug_level_g = CL_NONE; -boolean_t mrsas_relaxed_ordering = B_TRUE; +static volatile boolean_t mrsas_relaxed_ordering = B_TRUE; +static volatile int debug_level_g = CL_NONE; +static volatile int msi_enable = 1; #pragma weak scsi_hba_open #pragma weak scsi_hba_close @@ -262,7 +263,6 @@ off_t reglength = 0; int intr_types = 0; char *data; - int msi_enable = 0; scsi_hba_tran_t *tran; ddi_dma_attr_t tran_dma_attr; @@ -457,13 +457,12 @@ */ instance->func_ptr->disable_intr(instance); - msi_enable = 0; if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, 0, "mrsas-enable-msi", &data) == DDI_SUCCESS) { - if (strncmp(data, "yes", 3) == 0) { - msi_enable = 1; - con_log(CL_ANN, (CE_WARN, - "msi_enable = %d ENABLED", + if (strncmp(data, "no", 3) == 0) { + msi_enable = 0; + con_log(CL_ANN1, (CE_WARN, + "msi_enable = %d disabled", msi_enable)); } ddi_prop_free(data); @@ -771,7 +770,8 @@ } break; case DDI_INFO_DEVT2INSTANCE: - *resultp = (void *)instance; + *resultp = (void *)(intptr_t) + (MINOR2INST(getminor((dev_t)arg))); rval = DDI_SUCCESS; break; default: @@ -1318,8 +1318,8 @@ ((struct scsi_status *)pkt->pkt_scbp)->sts_busy = 1; } + (void) mrsas_common_check(instance, cmd); return_mfi_pkt(instance, cmd); - (void) mrsas_common_check(instance, cmd); if (pkt->pkt_comp) { (*pkt->pkt_comp)(pkt); @@ -2085,8 +2085,9 @@ instance->aen_cmd->abort_aen = 1; instance->aen_cmd = 0; + (void) mrsas_common_check(instance, cmd); + return_mfi_pkt(instance, cmd); - (void) mrsas_common_check(instance, cmd); return (ret); } @@ -2190,13 +2191,16 @@ /* issue the init frame in polled mode */ if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) { con_log(CL_ANN, (CE_WARN, "failed to init firmware")); + return_mfi_pkt(instance, cmd); + goto fail_fw_init; + } + + if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) { + return_mfi_pkt(instance, cmd); goto fail_fw_init; } return_mfi_pkt(instance, cmd); - if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) { - goto fail_fw_init; - } /* gather misc FW related information */ if (!get_ctrl_info(instance, &ctrl_info)) { @@ -2208,10 +2212,6 @@ PAGESIZE / 512; } - if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) { - goto fail_fw_init; - } - return (DDI_SUCCESS); fail_fw_init: @@ -2447,10 +2447,12 @@ if (mrsas_free_dma_obj(instance, dcmd_dma_obj) != DDI_SUCCESS) ret = DDI_FAILURE; - return_mfi_pkt(instance, cmd); if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) { ret = DDI_FAILURE; } + + return_mfi_pkt(instance, cmd); + return (ret); } @@ -2869,10 +2871,10 @@ atomic_add_16(&instance->fw_outstanding, (-1)); + (void) mrsas_common_check(instance, cmd); + return_mfi_pkt(instance, cmd); - (void) mrsas_common_check(instance, cmd); - if (acmd->cmd_dmahandle) { if (mrsas_check_dma_handle( acmd->cmd_dmahandle) != DDI_SUCCESS) { @@ -3554,6 +3556,7 @@ "could not allocate data transfer buffer.")); return (DDI_FAILURE); } + (void) memset(pthru_dma_obj.buffer, 0, xferlen); /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */ if (kpthru->flags & MFI_FRAME_DIR_WRITE) { @@ -3573,7 +3576,7 @@ } ddi_put8(acc_handle, &pthru->cmd, kpthru->cmd); - ddi_put8(acc_handle, &pthru->sense_len, kpthru->sense_len); + ddi_put8(acc_handle, &pthru->sense_len, 0); ddi_put8(acc_handle, &pthru->cmd_status, 0); ddi_put8(acc_handle, &pthru->scsi_status, 0); ddi_put8(acc_handle, &pthru->target_id, kpthru->target_id); @@ -3684,6 +3687,7 @@ "could not allocate data transfer buffer.")); return (DDI_FAILURE); } + (void) memset(dcmd_dma_obj.buffer, 0, xferlen); /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */ if (kdcmd->flags & MFI_FRAME_DIR_WRITE) { @@ -3835,6 +3839,7 @@ "could not allocate data transfer buffer.")); return (DDI_FAILURE); } + (void) memset(request_dma_obj.buffer, 0, request_xferlen); /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */ for (i = 0; i < request_xferlen; i++) { @@ -3865,6 +3870,7 @@ "could not allocate data transfer buffer.")); return (DDI_FAILURE); } + (void) memset(response_dma_obj.buffer, 0, response_xferlen); /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */ for (i = 0; i < response_xferlen; i++) { @@ -4068,6 +4074,7 @@ "could not allocate data transfer buffer.")); return (DDI_FAILURE); } + (void) memset(fis_dma_obj.buffer, 0, fis_xferlen); /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */ for (i = 0; i < fis_xferlen; i++) { @@ -4100,6 +4107,7 @@ "could not allocate data transfer buffer.")); return (DDI_FAILURE); } + (void) memset(data_dma_obj.buffer, 0, data_xferlen); /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */ for (i = 0; i < data_xferlen; i++) { @@ -4359,10 +4367,11 @@ break; } + if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) + rval = DDI_FAILURE; return_mfi_pkt(instance, cmd); - if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) - rval = DDI_FAILURE; + return (rval); } @@ -4449,7 +4458,8 @@ } } } else { - curr_aen.word = class_locale_word; + curr_aen.word = LE_32(class_locale_word); + curr_aen.members.locale = LE_16(curr_aen.members.locale); } cmd = get_mfi_pkt(instance); @@ -4732,7 +4742,7 @@ } if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) { - ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED); + ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST); ret = DDI_INTR_UNCLAIMED; }
--- a/usr/src/uts/common/io/mr_sas/mr_sas.conf Mon Sep 21 18:02:54 2009 -0700 +++ b/usr/src/uts/common/io/mr_sas/mr_sas.conf Tue Sep 22 10:33:14 2009 +0800 @@ -11,5 +11,3 @@ # # global definitions -# MSI specific flag. user can uncomment this line and set flag "yes" to enable MSI -#mrsas-enable-msi="yes";
--- a/usr/src/uts/common/io/mr_sas/mr_sas.h Mon Sep 21 18:02:54 2009 -0700 +++ b/usr/src/uts/common/io/mr_sas/mr_sas.h Tue Sep 22 10:33:14 2009 +0800 @@ -50,7 +50,7 @@ /* * MegaRAID SAS2.0 Driver meta data */ -#define MRSAS_VERSION "LSIv2.1" +#define MRSAS_VERSION "LSIv2.2" #define MRSAS_RELDATE "May 11, 2009" #define MRSAS_TRUE 1