summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorSusan Scheufele <Susan.Scheufele@Sun.COM>2010-06-16 20:48:30 -0700
committerSusan Scheufele <Susan.Scheufele@Sun.COM>2010-06-16 20:48:30 -0700
commitb13a95430748795770df36722891ee4065f08f5a (patch)
tree6148ab7da555e3160f34eb283dcf8a44f9a9135d /usr/src
parent8d61a337e3509e92fccb0fdeb26db712c21d43cd (diff)
downloadillumos-gate-b13a95430748795770df36722891ee4065f08f5a.tar.gz
6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/io/mr_sas/mr_sas.c34
-rw-r--r--usr/src/uts/common/io/mr_sas/mr_sas.h2
2 files changed, 19 insertions, 17 deletions
diff --git a/usr/src/uts/common/io/mr_sas/mr_sas.c b/usr/src/uts/common/io/mr_sas/mr_sas.c
index 7af147e9fd..64833a57d3 100644
--- a/usr/src/uts/common/io/mr_sas/mr_sas.c
+++ b/usr/src/uts/common/io/mr_sas/mr_sas.c
@@ -1679,20 +1679,6 @@ mrsas_isr(struct mrsas_instance *instance)
}
con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
- producer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
- instance->producer);
- consumer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
- instance->consumer);
-
- con_log(CL_ANN1, (CE_NOTE, " producer %x consumer %x ",
- producer, consumer));
- if (producer == consumer) {
- con_log(CL_ANN1, (CE_WARN, "producer = consumer case"));
- DTRACE_PROBE2(isr_pc_err, uint32_t, producer,
- uint32_t, consumer);
- return (DDI_INTR_CLAIMED);
- }
-
#ifdef OCRDEBUG
if (debug_consecutive_timeout_after_ocr_g == 1) {
con_log(CL_ANN1, (CE_NOTE,
@@ -1716,6 +1702,22 @@ mrsas_isr(struct mrsas_instance *instance)
mutex_enter(&instance->completed_pool_mtx);
mutex_enter(&instance->cmd_pend_mtx);
+ producer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
+ instance->producer);
+ consumer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
+ instance->consumer);
+
+ con_log(CL_ANN1, (CE_NOTE, " producer %x consumer %x ",
+ producer, consumer));
+ if (producer == consumer) {
+ con_log(CL_ANN1, (CE_WARN, "producer = consumer case"));
+ DTRACE_PROBE2(isr_pc_err, uint32_t, producer,
+ uint32_t, consumer);
+ mutex_exit(&instance->completed_pool_mtx);
+ mutex_exit(&instance->cmd_pend_mtx);
+ return (DDI_INTR_CLAIMED);
+ }
+
while (consumer != producer) {
context = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
&instance->reply_queue[consumer]);
@@ -1740,11 +1742,11 @@ mrsas_isr(struct mrsas_instance *instance)
consumer = 0;
}
}
+ ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
+ instance->consumer, consumer);
mutex_exit(&instance->cmd_pend_mtx);
mutex_exit(&instance->completed_pool_mtx);
- ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
- instance->consumer, consumer);
(void) ddi_dma_sync(instance->mfi_internal_dma_obj.dma_handle,
0, 0, DDI_DMA_SYNC_FORDEV);
diff --git a/usr/src/uts/common/io/mr_sas/mr_sas.h b/usr/src/uts/common/io/mr_sas/mr_sas.h
index 7d2e21de2b..c438a2433b 100644
--- a/usr/src/uts/common/io/mr_sas/mr_sas.h
+++ b/usr/src/uts/common/io/mr_sas/mr_sas.h
@@ -49,7 +49,7 @@ extern "C" {
/*
* MegaRAID SAS2.0 Driver meta data
*/
-#define MRSAS_VERSION "LSIv2.6"
+#define MRSAS_VERSION "LSIv2.7"
#define MRSAS_RELDATE "Apr 21, 2010"
#define MRSAS_TRUE 1