|
@@ -234,6 +234,16 @@ static int check_for_unit_attention(struct ctlr_info *h,
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+static int check_for_busy(struct ctlr_info *h, struct CommandList *c)
|
|
|
+{
|
|
|
+ if (c->err_info->CommandStatus != CMD_TARGET_STATUS ||
|
|
|
+ (c->err_info->ScsiStatus != SAM_STAT_BUSY &&
|
|
|
+ c->err_info->ScsiStatus != SAM_STAT_TASK_SET_FULL))
|
|
|
+ return 0;
|
|
|
+ dev_warn(&h->pdev->dev, HPSA "device busy");
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
static ssize_t host_store_rescan(struct device *dev,
|
|
|
struct device_attribute *attr,
|
|
|
const char *buf, size_t count)
|
|
@@ -1379,7 +1389,8 @@ static void hpsa_scsi_do_simple_cmd_with_retry(struct ctlr_info *h,
|
|
|
memset(c->err_info, 0, sizeof(*c->err_info));
|
|
|
hpsa_scsi_do_simple_cmd_core(h, c);
|
|
|
retry_count++;
|
|
|
- } while (check_for_unit_attention(h, c) && retry_count <= 3);
|
|
|
+ } while ((check_for_unit_attention(h, c) ||
|
|
|
+ check_for_busy(h, c)) && retry_count <= 3);
|
|
|
hpsa_pci_unmap(h->pdev, c, 1, data_direction);
|
|
|
}
|
|
|
|