aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/aacraid/aachba.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/aacraid/aachba.c')
-rw-r--r--drivers/scsi/aacraid/aachba.c41
1 files changed, 23 insertions, 18 deletions
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index a1e473003671..31319d052102 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -387,6 +387,7 @@ static void get_container_name_callback(void *context, struct fib * fibptr)
387 struct scsi_cmnd * scsicmd; 387 struct scsi_cmnd * scsicmd;
388 388
389 scsicmd = (struct scsi_cmnd *) context; 389 scsicmd = (struct scsi_cmnd *) context;
390 scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
390 391
391 dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies)); 392 dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies));
392 if (fibptr == NULL) 393 if (fibptr == NULL)
@@ -453,8 +454,10 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd, int cid)
453 /* 454 /*
454 * Check that the command queued to the controller 455 * Check that the command queued to the controller
455 */ 456 */
456 if (status == -EINPROGRESS) 457 if (status == -EINPROGRESS) {
458 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
457 return 0; 459 return 0;
460 }
458 461
459 printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status); 462 printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status);
460 aac_fib_complete(cmd_fibcontext); 463 aac_fib_complete(cmd_fibcontext);
@@ -907,6 +910,7 @@ static void io_callback(void *context, struct fib * fibptr)
907 u32 cid; 910 u32 cid;
908 911
909 scsicmd = (struct scsi_cmnd *) context; 912 scsicmd = (struct scsi_cmnd *) context;
913 scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
910 914
911 dev = (struct aac_dev *)scsicmd->device->host->hostdata; 915 dev = (struct aac_dev *)scsicmd->device->host->hostdata;
912 cid = scmd_id(scsicmd); 916 cid = scmd_id(scsicmd);
@@ -1151,8 +1155,10 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid)
1151 /* 1155 /*
1152 * Check that the command queued to the controller 1156 * Check that the command queued to the controller
1153 */ 1157 */
1154 if (status == -EINPROGRESS) 1158 if (status == -EINPROGRESS) {
1159 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
1155 return 0; 1160 return 0;
1161 }
1156 1162
1157 printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status); 1163 printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status);
1158 /* 1164 /*
@@ -1318,8 +1324,8 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
1318 /* 1324 /*
1319 * Check that the command queued to the controller 1325 * Check that the command queued to the controller
1320 */ 1326 */
1321 if (status == -EINPROGRESS) 1327 if (status == -EINPROGRESS) {
1322 { 1328 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
1323 return 0; 1329 return 0;
1324 } 1330 }
1325 1331
@@ -1341,6 +1347,7 @@ static void synchronize_callback(void *context, struct fib *fibptr)
1341 struct scsi_cmnd *cmd; 1347 struct scsi_cmnd *cmd;
1342 1348
1343 cmd = context; 1349 cmd = context;
1350 cmd->SCp.phase = AAC_OWNER_MIDLEVEL;
1344 1351
1345 dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n", 1352 dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n",
1346 smp_processor_id(), jiffies)); 1353 smp_processor_id(), jiffies));
@@ -1386,12 +1393,12 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid)
1386 unsigned long flags; 1393 unsigned long flags;
1387 1394
1388 /* 1395 /*
1389 * Wait for all commands to complete to this specific 1396 * Wait for all outstanding queued commands to complete to this
1390 * target (block). 1397 * specific target (block).
1391 */ 1398 */
1392 spin_lock_irqsave(&sdev->list_lock, flags); 1399 spin_lock_irqsave(&sdev->list_lock, flags);
1393 list_for_each_entry(cmd, &sdev->cmd_list, list) 1400 list_for_each_entry(cmd, &sdev->cmd_list, list)
1394 if (cmd != scsicmd && cmd->serial_number != 0) { 1401 if (cmd != scsicmd && cmd->SCp.phase == AAC_OWNER_FIRMWARE) {
1395 ++active; 1402 ++active;
1396 break; 1403 break;
1397 } 1404 }
@@ -1434,8 +1441,10 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid)
1434 /* 1441 /*
1435 * Check that the command queued to the controller 1442 * Check that the command queued to the controller
1436 */ 1443 */
1437 if (status == -EINPROGRESS) 1444 if (status == -EINPROGRESS) {
1445 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
1438 return 0; 1446 return 0;
1447 }
1439 1448
1440 printk(KERN_WARNING 1449 printk(KERN_WARNING
1441 "aac_synchronize: aac_fib_send failed with status: %d.\n", status); 1450 "aac_synchronize: aac_fib_send failed with status: %d.\n", status);
@@ -1458,7 +1467,6 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
1458 struct Scsi_Host *host = scsicmd->device->host; 1467 struct Scsi_Host *host = scsicmd->device->host;
1459 struct aac_dev *dev = (struct aac_dev *)host->hostdata; 1468 struct aac_dev *dev = (struct aac_dev *)host->hostdata;
1460 struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev; 1469 struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev;
1461 int ret;
1462 1470
1463 /* 1471 /*
1464 * If the bus, id or lun is out of range, return fail 1472 * If the bus, id or lun is out of range, return fail
@@ -1729,24 +1737,19 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
1729 * containers to /dev/sd device names 1737 * containers to /dev/sd device names
1730 */ 1738 */
1731 1739
1732 spin_unlock_irq(host->host_lock);
1733 if (scsicmd->request->rq_disk) 1740 if (scsicmd->request->rq_disk)
1734 strlcpy(fsa_dev_ptr[cid].devname, 1741 strlcpy(fsa_dev_ptr[cid].devname,
1735 scsicmd->request->rq_disk->disk_name, 1742 scsicmd->request->rq_disk->disk_name,
1736 min(sizeof(fsa_dev_ptr[cid].devname), 1743 min(sizeof(fsa_dev_ptr[cid].devname),
1737 sizeof(scsicmd->request->rq_disk->disk_name) + 1)); 1744 sizeof(scsicmd->request->rq_disk->disk_name) + 1));
1738 ret = aac_read(scsicmd, cid); 1745
1739 spin_lock_irq(host->host_lock); 1746 return aac_read(scsicmd, cid);
1740 return ret;
1741 1747
1742 case WRITE_6: 1748 case WRITE_6:
1743 case WRITE_10: 1749 case WRITE_10:
1744 case WRITE_12: 1750 case WRITE_12:
1745 case WRITE_16: 1751 case WRITE_16:
1746 spin_unlock_irq(host->host_lock); 1752 return aac_write(scsicmd, cid);
1747 ret = aac_write(scsicmd, cid);
1748 spin_lock_irq(host->host_lock);
1749 return ret;
1750 1753
1751 case SYNCHRONIZE_CACHE: 1754 case SYNCHRONIZE_CACHE:
1752 /* Issue FIB to tell Firmware to flush it's cache */ 1755 /* Issue FIB to tell Firmware to flush it's cache */
@@ -1891,6 +1894,7 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
1891 struct scsi_cmnd *scsicmd; 1894 struct scsi_cmnd *scsicmd;
1892 1895
1893 scsicmd = (struct scsi_cmnd *) context; 1896 scsicmd = (struct scsi_cmnd *) context;
1897 scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
1894 dev = (struct aac_dev *)scsicmd->device->host->hostdata; 1898 dev = (struct aac_dev *)scsicmd->device->host->hostdata;
1895 1899
1896 if (fibptr == NULL) 1900 if (fibptr == NULL)
@@ -2162,7 +2166,8 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
2162 /* 2166 /*
2163 * Check that the command queued to the controller 2167 * Check that the command queued to the controller
2164 */ 2168 */
2165 if (status == -EINPROGRESS){ 2169 if (status == -EINPROGRESS) {
2170 scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
2166 return 0; 2171 return 0;
2167 } 2172 }
2168 2173