diff options
Diffstat (limited to 'drivers/message/fusion/mptspi.c')
-rw-r--r-- | drivers/message/fusion/mptspi.c | 71 |
1 files changed, 38 insertions, 33 deletions
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index 61620144e49c..c5b808fd55ba 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c | |||
@@ -300,7 +300,7 @@ mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id) | |||
300 | flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE | | 300 | flagsLength = MPT_SGE_FLAGS_SSIMPLE_WRITE | |
301 | (IOCPage4Ptr->Header.PageLength + ii) * 4; | 301 | (IOCPage4Ptr->Header.PageLength + ii) * 4; |
302 | 302 | ||
303 | mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma); | 303 | ioc->add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma); |
304 | 304 | ||
305 | ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT | 305 | ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT |
306 | "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n", | 306 | "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n", |
@@ -614,19 +614,24 @@ static void mptspi_read_parameters(struct scsi_target *starget) | |||
614 | spi_width(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WIDE) ? 1 : 0; | 614 | spi_width(starget) = (nego & MPI_SCSIDEVPAGE0_NP_WIDE) ? 1 : 0; |
615 | } | 615 | } |
616 | 616 | ||
617 | static int | 617 | int |
618 | mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id) | 618 | mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id) |
619 | { | 619 | { |
620 | MPT_ADAPTER *ioc = hd->ioc; | ||
620 | MpiRaidActionRequest_t *pReq; | 621 | MpiRaidActionRequest_t *pReq; |
621 | MPT_FRAME_HDR *mf; | 622 | MPT_FRAME_HDR *mf; |
622 | MPT_ADAPTER *ioc = hd->ioc; | 623 | int ret; |
624 | unsigned long timeleft; | ||
625 | |||
626 | mutex_lock(&ioc->internal_cmds.mutex); | ||
623 | 627 | ||
624 | /* Get and Populate a free Frame | 628 | /* Get and Populate a free Frame |
625 | */ | 629 | */ |
626 | if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) { | 630 | if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) { |
627 | ddvprintk(ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n", | 631 | dfailprintk(hd->ioc, printk(MYIOC_s_WARN_FMT |
628 | ioc->name)); | 632 | "%s: no msg frames!\n", ioc->name, __func__)); |
629 | return -EAGAIN; | 633 | ret = -EAGAIN; |
634 | goto out; | ||
630 | } | 635 | } |
631 | pReq = (MpiRaidActionRequest_t *)mf; | 636 | pReq = (MpiRaidActionRequest_t *)mf; |
632 | if (quiesce) | 637 | if (quiesce) |
@@ -643,29 +648,36 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id) | |||
643 | pReq->Reserved2 = 0; | 648 | pReq->Reserved2 = 0; |
644 | pReq->ActionDataWord = 0; /* Reserved for this action */ | 649 | pReq->ActionDataWord = 0; /* Reserved for this action */ |
645 | 650 | ||
646 | mpt_add_sge((char *)&pReq->ActionDataSGE, | 651 | ioc->add_sge((char *)&pReq->ActionDataSGE, |
647 | MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); | 652 | MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); |
648 | 653 | ||
649 | ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n", | 654 | ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n", |
650 | ioc->name, pReq->Action, channel, id)); | 655 | ioc->name, pReq->Action, channel, id)); |
651 | 656 | ||
652 | hd->pLocal = NULL; | 657 | INITIALIZE_MGMT_STATUS(ioc->internal_cmds.status) |
653 | hd->timer.expires = jiffies + HZ*10; /* 10 second timeout */ | ||
654 | hd->scandv_wait_done = 0; | ||
655 | |||
656 | /* Save cmd pointer, for resource free if timeout or | ||
657 | * FW reload occurs | ||
658 | */ | ||
659 | hd->cmdPtr = mf; | ||
660 | |||
661 | add_timer(&hd->timer); | ||
662 | mpt_put_msg_frame(ioc->InternalCtx, ioc, mf); | 658 | mpt_put_msg_frame(ioc->InternalCtx, ioc, mf); |
663 | wait_event(hd->scandv_waitq, hd->scandv_wait_done); | 659 | timeleft = wait_for_completion_timeout(&ioc->internal_cmds.done, 10*HZ); |
660 | if (!(ioc->internal_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) { | ||
661 | ret = -ETIME; | ||
662 | dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s: TIMED OUT!\n", | ||
663 | ioc->name, __func__)); | ||
664 | if (ioc->internal_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) | ||
665 | goto out; | ||
666 | if (!timeleft) { | ||
667 | printk(MYIOC_s_WARN_FMT "Issuing Reset from %s!!\n", | ||
668 | ioc->name, __func__); | ||
669 | mpt_HardResetHandler(ioc, CAN_SLEEP); | ||
670 | mpt_free_msg_frame(ioc, mf); | ||
671 | } | ||
672 | goto out; | ||
673 | } | ||
664 | 674 | ||
665 | if ((hd->pLocal == NULL) || (hd->pLocal->completion != 0)) | 675 | ret = ioc->internal_cmds.completion_code; |
666 | return -1; | ||
667 | 676 | ||
668 | return 0; | 677 | out: |
678 | CLEAR_MGMT_STATUS(ioc->internal_cmds.status) | ||
679 | mutex_unlock(&ioc->internal_cmds.mutex); | ||
680 | return ret; | ||
669 | } | 681 | } |
670 | 682 | ||
671 | static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd, | 683 | static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd, |
@@ -1423,17 +1435,15 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1423 | * A slightly different algorithm is required for | 1435 | * A slightly different algorithm is required for |
1424 | * 64bit SGEs. | 1436 | * 64bit SGEs. |
1425 | */ | 1437 | */ |
1426 | scale = ioc->req_sz/(sizeof(dma_addr_t) + sizeof(u32)); | 1438 | scale = ioc->req_sz/ioc->SGE_size; |
1427 | if (sizeof(dma_addr_t) == sizeof(u64)) { | 1439 | if (ioc->sg_addr_size == sizeof(u64)) { |
1428 | numSGE = (scale - 1) * | 1440 | numSGE = (scale - 1) * |
1429 | (ioc->facts.MaxChainDepth-1) + scale + | 1441 | (ioc->facts.MaxChainDepth-1) + scale + |
1430 | (ioc->req_sz - 60) / (sizeof(dma_addr_t) + | 1442 | (ioc->req_sz - 60) / ioc->SGE_size; |
1431 | sizeof(u32)); | ||
1432 | } else { | 1443 | } else { |
1433 | numSGE = 1 + (scale - 1) * | 1444 | numSGE = 1 + (scale - 1) * |
1434 | (ioc->facts.MaxChainDepth-1) + scale + | 1445 | (ioc->facts.MaxChainDepth-1) + scale + |
1435 | (ioc->req_sz - 64) / (sizeof(dma_addr_t) + | 1446 | (ioc->req_sz - 64) / ioc->SGE_size; |
1436 | sizeof(u32)); | ||
1437 | } | 1447 | } |
1438 | 1448 | ||
1439 | if (numSGE < sh->sg_tablesize) { | 1449 | if (numSGE < sh->sg_tablesize) { |
@@ -1464,9 +1474,6 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1464 | 1474 | ||
1465 | /* Clear the TM flags | 1475 | /* Clear the TM flags |
1466 | */ | 1476 | */ |
1467 | hd->tmPending = 0; | ||
1468 | hd->tmState = TM_STATE_NONE; | ||
1469 | hd->resetPending = 0; | ||
1470 | hd->abortSCpnt = NULL; | 1477 | hd->abortSCpnt = NULL; |
1471 | 1478 | ||
1472 | /* Clear the pointer used to store | 1479 | /* Clear the pointer used to store |
@@ -1493,8 +1500,6 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1493 | mpt_saf_te)); | 1500 | mpt_saf_te)); |
1494 | ioc->spi_data.noQas = 0; | 1501 | ioc->spi_data.noQas = 0; |
1495 | 1502 | ||
1496 | init_waitqueue_head(&hd->scandv_waitq); | ||
1497 | hd->scandv_wait_done = 0; | ||
1498 | hd->last_queue_full = 0; | 1503 | hd->last_queue_full = 0; |
1499 | hd->spi_pending = 0; | 1504 | hd->spi_pending = 0; |
1500 | 1505 | ||
@@ -1514,7 +1519,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1514 | * issue internal bus reset | 1519 | * issue internal bus reset |
1515 | */ | 1520 | */ |
1516 | if (ioc->spi_data.bus_reset) | 1521 | if (ioc->spi_data.bus_reset) |
1517 | mptscsih_TMHandler(hd, | 1522 | mptscsih_IssueTaskMgmt(hd, |
1518 | MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, | 1523 | MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, |
1519 | 0, 0, 0, 0, 5); | 1524 | 0, 0, 0, 0, 5); |
1520 | 1525 | ||