ts->stat = SAS_QUEUE_FULL;
                pm8001_dev = ccb->device;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                spin_lock_irqsave(&t->task_state_lock, flags1);
                t->task_state_flags &= ~SAS_TASK_STATE_PENDING;
                t->task_state_flags &= ~SAS_TASK_AT_INITIATOR;
                        sas_ssp_task_response(pm8001_ha->dev, t, iu);
                }
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_ABORTED:
                PM8001_IO_DBG(pm8001_ha,
                ts->stat = SAS_DATA_UNDERRUN;
                ts->residual = param;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_NO_DEVICE:
                PM8001_IO_DBG(pm8001_ha,
                ts->stat = SAS_DATA_OVERRUN;
                ts->residual = 0;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                                        pm8001_printk("response to large\n"));
                }
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_ABORTED:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_ABORTED_TASK;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
                /* following cases are to do cases */
        case IO_UNDERFLOW:
                ts->stat = SAS_DATA_UNDERRUN;
                ts->residual =  param;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_NO_DEVICE:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_NO_DEVICE\n"));
                ts->resp = SAS_TASK_UNDELIVERED;
                ts->stat = SAS_PHY_DOWN;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_BREAK\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_INTERRUPTED;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_PHY_NOT_READY:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_EPROTO;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_UNKNOWN;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_CONT0;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_CONN_RATE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_WRONG_DEST;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_NAK_RECEIVED:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_NAK_RECEIVED\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_NAK_R_ERR;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_ACK_NAK_TIMEOUT:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_ACK_NAK_TIMEOUT\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_NAK_R_ERR;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_DMA:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_DMA\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_ABORTED_TASK;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_SATA_LINK_TIMEOUT:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_SATA_LINK_TIMEOUT\n"));
                ts->resp = SAS_TASK_UNDELIVERED;
                ts->stat = SAS_DEV_NO_RESPONSE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_REJECTED_NCQ_MODE:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_REJECTED_NCQ_MODE\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_DATA_UNDERRUN;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_OPEN_RETRY_TIMEOUT:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_OPEN_RETRY_TIMEOUT\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_TO;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_PORT_IN_RESET:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_PORT_IN_RESET\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_DEV_NO_RESPONSE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_DS_NON_OPERATIONAL:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("  IO_DS_IN_RECOVERY\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_DEV_NO_RESPONSE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_DS_IN_ERROR:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        default:
                PM8001_DEVIO_DBG(pm8001_ha,
                /* not allowed case. Therefore, return failed status */
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_DEV_NO_RESPONSE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        }
        spin_lock_irqsave(&t->task_state_lock, flags);
                ts->stat = SAS_DATA_OVERRUN;
                ts->residual = 0;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAM_STAT_GOOD;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_ABORTED:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_ABORTED_TASK;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OVERFLOW:
                PM8001_IO_DBG(pm8001_ha, pm8001_printk("IO_UNDERFLOW\n"));
                ts->stat = SAS_DATA_OVERRUN;
                ts->residual = 0;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_NO_DEVICE:
                PM8001_IO_DBG(pm8001_ha, pm8001_printk("IO_NO_DEVICE\n"));
 
                        sas_ssp_task_response(pm8001_ha->dev, t, iu);
                }
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_ABORTED:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_ABORTED IOMB Tag\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_ABORTED_TASK;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_UNDERFLOW:
                /* SSP Completion with error */
                ts->stat = SAS_DATA_UNDERRUN;
                ts->residual = param;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_NO_DEVICE:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_NO_DEVICE\n"));
                ts->resp = SAS_TASK_UNDELIVERED;
                ts->stat = SAS_PHY_DOWN;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                ts->stat = SAS_OPEN_REJECT;
                /* Force the midlayer to retry */
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_PHY_NOT_READY:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_INVALID_SSP_RSP_FRAME:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_EPROTO;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_UNKNOWN;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
        case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_BAD_DEST;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
                PM8001_IO_DBG(pm8001_ha, pm8001_printk(
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_CONN_RATE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_UNDELIVERED;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_WRONG_DEST;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_NAK_RECEIVED:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_ACK_NAK_TIMEOUT:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_ACK_NAK_TIMEOUT\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_NAK_R_ERR;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_DMA:
                PM8001_IO_DBG(pm8001_ha,
                pm8001_printk("IO_XFER_ERROR_DMA\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_OPEN_RETRY_TIMEOUT:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_OFFSET_MISMATCH:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_OFFSET_MISMATCH\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_PORT_IN_RESET:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_PORT_IN_RESET\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_DS_NON_OPERATIONAL:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_DS_IN_RECOVERY\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_TM_TAG_NOT_FOUND:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_TM_TAG_NOT_FOUND\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_SSP_EXT_IU_ZERO_LEN_ERROR:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_SSP_EXT_IU_ZERO_LEN_ERROR\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_HW_RESOURCE_BUSY:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        default:
                PM8001_DEVIO_DBG(pm8001_ha,
                /* not allowed case. Therefore, return failed status */
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        }
        PM8001_IO_DBG(pm8001_ha,
                ts->stat = SAS_DATA_OVERRUN;
                ts->residual = 0;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                                        pm8001_printk("response too large\n"));
                }
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_ABORTED:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_ABORTED_TASK;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
                /* following cases are to do cases */
        case IO_UNDERFLOW:
                ts->stat = SAS_DATA_UNDERRUN;
                ts->residual = param;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_NO_DEVICE:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_NO_DEVICE\n"));
                ts->resp = SAS_TASK_UNDELIVERED;
                ts->stat = SAS_PHY_DOWN;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_BREAK\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_INTERRUPTED;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_PHY_NOT_READY:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
                PM8001_IO_DBG(pm8001_ha, pm8001_printk(
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_EPROTO;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_UNKNOWN;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_CONT0;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
        case IO_XFER_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_CONN_RATE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
                PM8001_IO_DBG(pm8001_ha, pm8001_printk(
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_WRONG_DEST;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_NAK_RECEIVED:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_NAK_RECEIVED\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_NAK_R_ERR;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_ACK_NAK_TIMEOUT:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_ACK_NAK_TIMEOUT\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_NAK_R_ERR;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_DMA:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_DMA\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_ABORTED_TASK;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_SATA_LINK_TIMEOUT:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_SATA_LINK_TIMEOUT\n"));
                ts->resp = SAS_TASK_UNDELIVERED;
                ts->stat = SAS_DEV_NO_RESPONSE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_REJECTED_NCQ_MODE:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_ERROR_REJECTED_NCQ_MODE\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_DATA_UNDERRUN;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_OPEN_RETRY_TIMEOUT:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_XFER_OPEN_RETRY_TIMEOUT\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_TO;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_PORT_IN_RESET:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_PORT_IN_RESET\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_DEV_NO_RESPONSE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_DS_NON_OPERATIONAL:
                PM8001_IO_DBG(pm8001_ha,
                        pm8001_printk("IO_DS_IN_RECOVERY\n"));
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_DEV_NO_RESPONSE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_DS_IN_ERROR:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_OPEN_REJECT;
                ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        default:
                PM8001_DEVIO_DBG(pm8001_ha,
                /* not allowed case. Therefore, return failed status */
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_DEV_NO_RESPONSE;
+               if (pm8001_dev)
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        }
        spin_lock_irqsave(&t->task_state_lock, flags);
                ts->stat = SAS_DATA_OVERRUN;
                ts->residual = 0;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_XFER_ERROR_BREAK:
                PM8001_IO_DBG(pm8001_ha,
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAM_STAT_GOOD;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                if (pm8001_ha->smp_exp_mode == SMP_DIRECT) {
                        PM8001_IO_DBG(pm8001_ha,
                                pm8001_printk("DIRECT RESPONSE Length:%d\n",
                ts->resp = SAS_TASK_COMPLETE;
                ts->stat = SAS_ABORTED_TASK;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_OVERFLOW:
                PM8001_IO_DBG(pm8001_ha, pm8001_printk("IO_UNDERFLOW\n"));
                ts->stat = SAS_DATA_OVERRUN;
                ts->residual = 0;
                if (pm8001_dev)
-                       pm8001_dev->running_req--;
+                       atomic_dec(&pm8001_dev->running_req);
                break;
        case IO_NO_DEVICE:
                PM8001_IO_DBG(pm8001_ha, pm8001_printk("IO_NO_DEVICE\n"));
                                                        flags);
                                pm8001_ccb_task_free_done(pm8001_ha, task,
                                                                ccb, tag);
+                               atomic_dec(&pm8001_ha_dev->running_req);
                                return 0;
                        }
                }