aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/mvsas/mv_94xx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/mvsas/mv_94xx.c')
-rw-r--r--drivers/scsi/mvsas/mv_94xx.c32
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
370static 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
370static void mvs_94xx_free_reg_set(struct mvs_info *mvi, u8 *tfs) 399static 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