|
@@ -741,7 +741,6 @@ static int
|
|
|
megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *))
|
|
|
{
|
|
|
u32 frame_count;
|
|
|
- unsigned long flags;
|
|
|
struct megasas_cmd *cmd;
|
|
|
struct megasas_instance *instance;
|
|
|
|
|
@@ -776,9 +775,7 @@ megasas_queue_command(struct scsi_cmnd *scmd, void (*done) (struct scsi_cmnd *))
|
|
|
/*
|
|
|
* Issue the command to the FW
|
|
|
*/
|
|
|
- spin_lock_irqsave(&instance->instance_lock, flags);
|
|
|
- instance->fw_outstanding++;
|
|
|
- spin_unlock_irqrestore(&instance->instance_lock, flags);
|
|
|
+ atomic_inc(&instance->fw_outstanding);
|
|
|
|
|
|
instance->instancet->fire_cmd(cmd->frame_phys_addr ,cmd->frame_count-1,instance->reg_set);
|
|
|
|
|
@@ -826,19 +823,20 @@ static int megasas_wait_for_outstanding(struct megasas_instance *instance)
|
|
|
|
|
|
for (i = 0; i < wait_time; i++) {
|
|
|
|
|
|
- if (!instance->fw_outstanding)
|
|
|
+ int outstanding = atomic_read(&instance->fw_outstanding);
|
|
|
+
|
|
|
+ if (!outstanding)
|
|
|
break;
|
|
|
|
|
|
if (!(i % MEGASAS_RESET_NOTICE_INTERVAL)) {
|
|
|
printk(KERN_NOTICE "megasas: [%2d]waiting for %d "
|
|
|
- "commands to complete\n", i,
|
|
|
- instance->fw_outstanding);
|
|
|
+ "commands to complete\n",i,outstanding);
|
|
|
}
|
|
|
|
|
|
msleep(1000);
|
|
|
}
|
|
|
|
|
|
- if (instance->fw_outstanding) {
|
|
|
+ if (atomic_read(&instance->fw_outstanding)) {
|
|
|
instance->hw_crit_error = 1;
|
|
|
return FAILED;
|
|
|
}
|
|
@@ -1050,7 +1048,6 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
|
|
|
{
|
|
|
int exception = 0;
|
|
|
struct megasas_header *hdr = &cmd->frame->hdr;
|
|
|
- unsigned long flags;
|
|
|
|
|
|
if (cmd->scmd) {
|
|
|
cmd->scmd->SCp.ptr = (char *)0;
|
|
@@ -1082,9 +1079,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
|
|
|
|
|
|
if (exception) {
|
|
|
|
|
|
- spin_lock_irqsave(&instance->instance_lock, flags);
|
|
|
- instance->fw_outstanding--;
|
|
|
- spin_unlock_irqrestore(&instance->instance_lock, flags);
|
|
|
+ atomic_dec(&instance->fw_outstanding);
|
|
|
|
|
|
megasas_unmap_sgbuf(instance, cmd);
|
|
|
cmd->scmd->scsi_done(cmd->scmd);
|
|
@@ -1132,9 +1127,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- spin_lock_irqsave(&instance->instance_lock, flags);
|
|
|
- instance->fw_outstanding--;
|
|
|
- spin_unlock_irqrestore(&instance->instance_lock, flags);
|
|
|
+ atomic_dec(&instance->fw_outstanding);
|
|
|
|
|
|
megasas_unmap_sgbuf(instance, cmd);
|
|
|
cmd->scmd->scsi_done(cmd->scmd);
|
|
@@ -2171,11 +2164,12 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
*/
|
|
|
INIT_LIST_HEAD(&instance->cmd_pool);
|
|
|
|
|
|
+ atomic_set(&instance->fw_outstanding,0);
|
|
|
+
|
|
|
init_waitqueue_head(&instance->int_cmd_wait_q);
|
|
|
init_waitqueue_head(&instance->abort_cmd_wait_q);
|
|
|
|
|
|
spin_lock_init(&instance->cmd_pool_lock);
|
|
|
- spin_lock_init(&instance->instance_lock);
|
|
|
|
|
|
sema_init(&instance->aen_mutex, 1);
|
|
|
sema_init(&instance->ioctl_sem, MEGASAS_INT_CMDS);
|