diff options
Diffstat (limited to 'drivers/scsi/mvsas/mv_94xx.c')
-rw-r--r-- | drivers/scsi/mvsas/mv_94xx.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/drivers/scsi/mvsas/mv_94xx.c b/drivers/scsi/mvsas/mv_94xx.c index 78162c3c36e6..9d60c7c19b32 100644 --- a/drivers/scsi/mvsas/mv_94xx.c +++ b/drivers/scsi/mvsas/mv_94xx.c | |||
@@ -249,7 +249,7 @@ static int __devinit mvs_94xx_init(struct mvs_info *mvi) | |||
249 | 249 | ||
250 | /* enable completion queue interrupt */ | 250 | /* enable completion queue interrupt */ |
251 | tmp = (CINT_PORT_MASK | CINT_DONE | CINT_MEM | CINT_SRS | CINT_CI_STOP | | 251 | tmp = (CINT_PORT_MASK | CINT_DONE | CINT_MEM | CINT_SRS | CINT_CI_STOP | |
252 | CINT_DMA_PCIE); | 252 | CINT_DMA_PCIE | CINT_NON_SPEC_NCQ_ERROR); |
253 | tmp |= CINT_PHY_MASK; | 253 | tmp |= CINT_PHY_MASK; |
254 | mw32(MVS_INT_MASK, tmp); | 254 | mw32(MVS_INT_MASK, tmp); |
255 | 255 | ||
@@ -367,6 +367,35 @@ static void mvs_94xx_issue_stop(struct mvs_info *mvi, enum mvs_port_type type, | |||
367 | mw32(MVS_PCS, tmp); | 367 | mw32(MVS_PCS, tmp); |
368 | } | 368 | } |
369 | 369 | ||
370 | static void mvs_94xx_non_spec_ncq_error(struct mvs_info *mvi) | ||
371 | { | ||
372 | void __iomem *regs = mvi->regs; | ||
373 | u32 err_0, err_1; | ||
374 | u8 i; | ||
375 | struct mvs_device *device; | ||
376 | |||
377 | err_0 = mr32(MVS_NON_NCQ_ERR_0); | ||
378 | err_1 = mr32(MVS_NON_NCQ_ERR_1); | ||
379 | |||
380 | mv_dprintk("non specific ncq error err_0:%x,err_1:%x.\n", | ||
381 | err_0, err_1); | ||
382 | for (i = 0; i < 32; i++) { | ||
383 | if (err_0 & bit(i)) { | ||
384 | device = mvs_find_dev_by_reg_set(mvi, i); | ||
385 | if (device) | ||
386 | mvs_release_task(mvi, device->sas_device); | ||
387 | } | ||
388 | if (err_1 & bit(i)) { | ||
389 | device = mvs_find_dev_by_reg_set(mvi, i+32); | ||
390 | if (device) | ||
391 | mvs_release_task(mvi, device->sas_device); | ||
392 | } | ||
393 | } | ||
394 | |||
395 | mw32(MVS_NON_NCQ_ERR_0, err_0); | ||
396 | mw32(MVS_NON_NCQ_ERR_1, err_1); | ||
397 | } | ||
398 | |||
370 | static void mvs_94xx_free_reg_set(struct mvs_info *mvi, u8 *tfs) | 399 | static void mvs_94xx_free_reg_set(struct mvs_info *mvi, u8 *tfs) |
371 | { | 400 | { |
372 | void __iomem *regs = mvi->regs; | 401 | void __iomem *regs = mvi->regs; |
@@ -679,5 +708,6 @@ const struct mvs_dispatch mvs_94xx_dispatch = { | |||
679 | #ifndef DISABLE_HOTPLUG_DMA_FIX | 708 | #ifndef DISABLE_HOTPLUG_DMA_FIX |
680 | mvs_94xx_fix_dma, | 709 | mvs_94xx_fix_dma, |
681 | #endif | 710 | #endif |
711 | mvs_94xx_non_spec_ncq_error, | ||
682 | }; | 712 | }; |
683 | 713 | ||