diff options
Diffstat (limited to 'drivers/message')
| -rw-r--r-- | drivers/message/fusion/mptbase.c | 27 | ||||
| -rw-r--r-- | drivers/message/fusion/mptbase.h | 1 | ||||
| -rw-r--r-- | drivers/message/fusion/mptscsih.c | 35 | ||||
| -rw-r--r-- | drivers/message/fusion/mptspi.c | 36 |
4 files changed, 51 insertions, 48 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 083acfd91d8b..97471af4309c 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
| @@ -1531,6 +1531,7 @@ mpt_resume(struct pci_dev *pdev) | |||
| 1531 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | 1531 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); |
| 1532 | u32 device_state = pdev->current_state; | 1532 | u32 device_state = pdev->current_state; |
| 1533 | int recovery_state; | 1533 | int recovery_state; |
| 1534 | int err; | ||
| 1534 | 1535 | ||
| 1535 | printk(MYIOC_s_INFO_FMT | 1536 | printk(MYIOC_s_INFO_FMT |
| 1536 | "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n", | 1537 | "pci-resume: pdev=0x%p, slot=%s, Previous operating state [D%d]\n", |
| @@ -1538,7 +1539,9 @@ mpt_resume(struct pci_dev *pdev) | |||
| 1538 | 1539 | ||
| 1539 | pci_set_power_state(pdev, 0); | 1540 | pci_set_power_state(pdev, 0); |
| 1540 | pci_restore_state(pdev); | 1541 | pci_restore_state(pdev); |
| 1541 | pci_enable_device(pdev); | 1542 | err = pci_enable_device(pdev); |
| 1543 | if (err) | ||
| 1544 | return err; | ||
| 1542 | 1545 | ||
| 1543 | /* enable interrupts */ | 1546 | /* enable interrupts */ |
| 1544 | CHIPREG_WRITE32(&ioc->chip->IntMask, MPI_HIM_DIM); | 1547 | CHIPREG_WRITE32(&ioc->chip->IntMask, MPI_HIM_DIM); |
| @@ -4739,12 +4742,8 @@ mpt_readScsiDevicePageHeaders(MPT_ADAPTER *ioc, int portnum) | |||
| 4739 | } | 4742 | } |
| 4740 | 4743 | ||
| 4741 | /** | 4744 | /** |
| 4742 | * mpt_inactive_raid_list_free | 4745 | * mpt_inactive_raid_list_free - This clears this link list. |
| 4743 | * | 4746 | * @ioc : pointer to per adapter structure |
| 4744 | * This clears this link list. | ||
| 4745 | * | ||
| 4746 | * @ioc - pointer to per adapter structure | ||
| 4747 | * | ||
| 4748 | **/ | 4747 | **/ |
| 4749 | static void | 4748 | static void |
| 4750 | mpt_inactive_raid_list_free(MPT_ADAPTER *ioc) | 4749 | mpt_inactive_raid_list_free(MPT_ADAPTER *ioc) |
| @@ -4764,15 +4763,11 @@ mpt_inactive_raid_list_free(MPT_ADAPTER *ioc) | |||
| 4764 | } | 4763 | } |
| 4765 | 4764 | ||
| 4766 | /** | 4765 | /** |
| 4767 | * mpt_inactive_raid_volumes | 4766 | * mpt_inactive_raid_volumes - sets up link list of phy_disk_nums for devices belonging in an inactive volume |
| 4768 | * | ||
| 4769 | * This sets up link list of phy_disk_nums for devices belonging in an inactive volume | ||
| 4770 | * | ||
| 4771 | * @ioc - pointer to per adapter structure | ||
| 4772 | * @channel - volume channel | ||
| 4773 | * @id - volume target id | ||
| 4774 | * | ||
| 4775 | * | 4767 | * |
| 4768 | * @ioc : pointer to per adapter structure | ||
| 4769 | * @channel : volume channel | ||
| 4770 | * @id : volume target id | ||
| 4776 | **/ | 4771 | **/ |
| 4777 | static void | 4772 | static void |
| 4778 | mpt_inactive_raid_volumes(MPT_ADAPTER *ioc, u8 channel, u8 id) | 4773 | mpt_inactive_raid_volumes(MPT_ADAPTER *ioc, u8 channel, u8 id) |
| @@ -6663,7 +6658,7 @@ union loginfo_type { | |||
| 6663 | /** | 6658 | /** |
| 6664 | * mpt_iocstatus_info_config - IOCSTATUS information for config pages | 6659 | * mpt_iocstatus_info_config - IOCSTATUS information for config pages |
| 6665 | * @ioc: Pointer to MPT_ADAPTER structure | 6660 | * @ioc: Pointer to MPT_ADAPTER structure |
| 6666 | * ioc_status: U32 IOCStatus word from IOC | 6661 | * @ioc_status: U32 IOCStatus word from IOC |
| 6667 | * @mf: Pointer to MPT request frame | 6662 | * @mf: Pointer to MPT request frame |
| 6668 | * | 6663 | * |
| 6669 | * Refer to lsi/mpi.h. | 6664 | * Refer to lsi/mpi.h. |
diff --git a/drivers/message/fusion/mptbase.h b/drivers/message/fusion/mptbase.h index e3a39272aad6..d25d3be8fcd2 100644 --- a/drivers/message/fusion/mptbase.h +++ b/drivers/message/fusion/mptbase.h | |||
| @@ -994,6 +994,7 @@ typedef struct _MPT_SCSI_HOST { | |||
| 994 | int scandv_wait_done; | 994 | int scandv_wait_done; |
| 995 | long last_queue_full; | 995 | long last_queue_full; |
| 996 | u16 tm_iocstatus; | 996 | u16 tm_iocstatus; |
| 997 | u16 spi_pending; | ||
| 997 | struct list_head target_reset_list; | 998 | struct list_head target_reset_list; |
| 998 | } MPT_SCSI_HOST; | 999 | } MPT_SCSI_HOST; |
| 999 | 1000 | ||
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c index 2a3e9e66d4ef..fa0f7761652a 100644 --- a/drivers/message/fusion/mptscsih.c +++ b/drivers/message/fusion/mptscsih.c | |||
| @@ -819,10 +819,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) | |||
| 819 | sc->resid=0; | 819 | sc->resid=0; |
| 820 | case MPI_IOCSTATUS_SCSI_RECOVERED_ERROR: /* 0x0040 */ | 820 | case MPI_IOCSTATUS_SCSI_RECOVERED_ERROR: /* 0x0040 */ |
| 821 | case MPI_IOCSTATUS_SUCCESS: /* 0x0000 */ | 821 | case MPI_IOCSTATUS_SUCCESS: /* 0x0000 */ |
| 822 | if (scsi_status == MPI_SCSI_STATUS_BUSY) | 822 | sc->result = (DID_OK << 16) | scsi_status; |
| 823 | sc->result = (DID_BUS_BUSY << 16) | scsi_status; | ||
| 824 | else | ||
| 825 | sc->result = (DID_OK << 16) | scsi_status; | ||
| 826 | if (scsi_state == 0) { | 823 | if (scsi_state == 0) { |
| 827 | ; | 824 | ; |
| 828 | } else if (scsi_state & MPI_SCSI_STATE_AUTOSENSE_VALID) { | 825 | } else if (scsi_state & MPI_SCSI_STATE_AUTOSENSE_VALID) { |
| @@ -1188,20 +1185,7 @@ mptscsih_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 1188 | int | 1185 | int |
| 1189 | mptscsih_resume(struct pci_dev *pdev) | 1186 | mptscsih_resume(struct pci_dev *pdev) |
| 1190 | { | 1187 | { |
| 1191 | MPT_ADAPTER *ioc = pci_get_drvdata(pdev); | 1188 | return mpt_resume(pdev); |
| 1192 | struct Scsi_Host *host = ioc->sh; | ||
| 1193 | MPT_SCSI_HOST *hd; | ||
| 1194 | |||
| 1195 | mpt_resume(pdev); | ||
| 1196 | |||
| 1197 | if(!host) | ||
| 1198 | return 0; | ||
| 1199 | |||
| 1200 | hd = (MPT_SCSI_HOST *)host->hostdata; | ||
| 1201 | if(!hd) | ||
| 1202 | return 0; | ||
| 1203 | |||
| 1204 | return 0; | ||
| 1205 | } | 1189 | } |
| 1206 | 1190 | ||
| 1207 | #endif | 1191 | #endif |
| @@ -1537,21 +1521,23 @@ mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx) | |||
| 1537 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 1521 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |
| 1538 | /** | 1522 | /** |
| 1539 | * mptscsih_TMHandler - Generic handler for SCSI Task Management. | 1523 | * mptscsih_TMHandler - Generic handler for SCSI Task Management. |
| 1540 | * Fall through to mpt_HardResetHandler if: not operational, too many | 1524 | * @hd: Pointer to MPT SCSI HOST structure |
| 1541 | * failed TM requests or handshake failure. | ||
| 1542 | * | ||
| 1543 | * @ioc: Pointer to MPT_ADAPTER structure | ||
| 1544 | * @type: Task Management type | 1525 | * @type: Task Management type |
| 1526 | * @channel: channel number for task management | ||
| 1545 | * @id: Logical Target ID for reset (if appropriate) | 1527 | * @id: Logical Target ID for reset (if appropriate) |
| 1546 | * @lun: Logical Unit for reset (if appropriate) | 1528 | * @lun: Logical Unit for reset (if appropriate) |
| 1547 | * @ctx2abort: Context for the task to be aborted (if appropriate) | 1529 | * @ctx2abort: Context for the task to be aborted (if appropriate) |
| 1530 | * @timeout: timeout for task management control | ||
| 1531 | * | ||
| 1532 | * Fall through to mpt_HardResetHandler if: not operational, too many | ||
| 1533 | * failed TM requests or handshake failure. | ||
| 1548 | * | 1534 | * |
| 1549 | * Remark: Currently invoked from a non-interrupt thread (_bh). | 1535 | * Remark: Currently invoked from a non-interrupt thread (_bh). |
| 1550 | * | 1536 | * |
| 1551 | * Remark: With old EH code, at most 1 SCSI TaskMgmt function per IOC | 1537 | * Remark: With old EH code, at most 1 SCSI TaskMgmt function per IOC |
| 1552 | * will be active. | 1538 | * will be active. |
| 1553 | * | 1539 | * |
| 1554 | * Returns 0 for SUCCESS, or FAILED. | 1540 | * Returns 0 for SUCCESS, or %FAILED. |
| 1555 | **/ | 1541 | **/ |
| 1556 | int | 1542 | int |
| 1557 | mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout) | 1543 | mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int ctx2abort, ulong timeout) |
| @@ -1650,9 +1636,11 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int c | |||
| 1650 | * mptscsih_IssueTaskMgmt - Generic send Task Management function. | 1636 | * mptscsih_IssueTaskMgmt - Generic send Task Management function. |
| 1651 | * @hd: Pointer to MPT_SCSI_HOST structure | 1637 | * @hd: Pointer to MPT_SCSI_HOST structure |
| 1652 | * @type: Task Management type | 1638 | * @type: Task Management type |
| 1639 | * @channel: channel number for task management | ||
| 1653 | * @id: Logical Target ID for reset (if appropriate) | 1640 | * @id: Logical Target ID for reset (if appropriate) |
| 1654 | * @lun: Logical Unit for reset (if appropriate) | 1641 | * @lun: Logical Unit for reset (if appropriate) |
| 1655 | * @ctx2abort: Context for the task to be aborted (if appropriate) | 1642 | * @ctx2abort: Context for the task to be aborted (if appropriate) |
| 1643 | * @timeout: timeout for task management control | ||
| 1656 | * | 1644 | * |
| 1657 | * Remark: _HardResetHandler can be invoked from an interrupt thread (timer) | 1645 | * Remark: _HardResetHandler can be invoked from an interrupt thread (timer) |
| 1658 | * or a non-interrupt thread. In the former, must not call schedule(). | 1646 | * or a non-interrupt thread. In the former, must not call schedule(). |
| @@ -2022,6 +2010,7 @@ mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd) | |||
| 2022 | /** | 2010 | /** |
| 2023 | * mptscsih_tm_wait_for_completion - wait for completion of TM task | 2011 | * mptscsih_tm_wait_for_completion - wait for completion of TM task |
| 2024 | * @hd: Pointer to MPT host structure. | 2012 | * @hd: Pointer to MPT host structure. |
| 2013 | * @timeout: timeout value | ||
| 2025 | * | 2014 | * |
| 2026 | * Returns {SUCCESS,FAILED}. | 2015 | * Returns {SUCCESS,FAILED}. |
| 2027 | */ | 2016 | */ |
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c index 85f21b54cb7d..d75f7ffbb02e 100644 --- a/drivers/message/fusion/mptspi.c +++ b/drivers/message/fusion/mptspi.c | |||
| @@ -96,14 +96,13 @@ static int mptspiTaskCtx = -1; | |||
| 96 | static int mptspiInternalCtx = -1; /* Used only for internal commands */ | 96 | static int mptspiInternalCtx = -1; /* Used only for internal commands */ |
| 97 | 97 | ||
| 98 | /** | 98 | /** |
| 99 | * mptspi_setTargetNegoParms - Update the target negotiation | 99 | * mptspi_setTargetNegoParms - Update the target negotiation parameters |
| 100 | * parameters based on the the Inquiry data, adapter capabilities, | ||
| 101 | * and NVRAM settings | ||
| 102 | * | ||
| 103 | * @hd: Pointer to a SCSI Host Structure | 100 | * @hd: Pointer to a SCSI Host Structure |
| 104 | * @vtarget: per target private data | 101 | * @target: per target private data |
| 105 | * @sdev: SCSI device | 102 | * @sdev: SCSI device |
| 106 | * | 103 | * |
| 104 | * Update the target negotiation parameters based on the the Inquiry | ||
| 105 | * data, adapter capabilities, and NVRAM settings. | ||
| 107 | **/ | 106 | **/ |
| 108 | static void | 107 | static void |
| 109 | mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target, | 108 | mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target, |
| @@ -234,7 +233,7 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target, | |||
| 234 | /** | 233 | /** |
| 235 | * mptspi_writeIOCPage4 - write IOC Page 4 | 234 | * mptspi_writeIOCPage4 - write IOC Page 4 |
| 236 | * @hd: Pointer to a SCSI Host Structure | 235 | * @hd: Pointer to a SCSI Host Structure |
| 237 | * @channel: | 236 | * @channel: channel number |
| 238 | * @id: write IOC Page4 for this ID & Bus | 237 | * @id: write IOC Page4 for this ID & Bus |
| 239 | * | 238 | * |
| 240 | * Return: -EAGAIN if unable to obtain a Message Frame | 239 | * Return: -EAGAIN if unable to obtain a Message Frame |
| @@ -446,7 +445,7 @@ static int mptspi_target_alloc(struct scsi_target *starget) | |||
| 446 | return 0; | 445 | return 0; |
| 447 | } | 446 | } |
| 448 | 447 | ||
| 449 | void | 448 | static void |
| 450 | mptspi_target_destroy(struct scsi_target *starget) | 449 | mptspi_target_destroy(struct scsi_target *starget) |
| 451 | { | 450 | { |
| 452 | if (starget->hostdata) | 451 | if (starget->hostdata) |
| @@ -677,7 +676,9 @@ static void mptspi_dv_device(struct _MPT_SCSI_HOST *hd, | |||
| 677 | return; | 676 | return; |
| 678 | } | 677 | } |
| 679 | 678 | ||
| 679 | hd->spi_pending |= (1 << sdev->id); | ||
| 680 | spi_dv_device(sdev); | 680 | spi_dv_device(sdev); |
| 681 | hd->spi_pending &= ~(1 << sdev->id); | ||
| 681 | 682 | ||
| 682 | if (sdev->channel == 1 && | 683 | if (sdev->channel == 1 && |
| 683 | mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0) | 684 | mptscsih_quiesce_raid(hd, 0, vtarget->channel, vtarget->id) < 0) |
| @@ -1203,11 +1204,27 @@ mptspi_dv_renegotiate_work(struct work_struct *work) | |||
| 1203 | container_of(work, struct work_queue_wrapper, work); | 1204 | container_of(work, struct work_queue_wrapper, work); |
| 1204 | struct _MPT_SCSI_HOST *hd = wqw->hd; | 1205 | struct _MPT_SCSI_HOST *hd = wqw->hd; |
| 1205 | struct scsi_device *sdev; | 1206 | struct scsi_device *sdev; |
| 1207 | struct scsi_target *starget; | ||
| 1208 | struct _CONFIG_PAGE_SCSI_DEVICE_1 pg1; | ||
| 1209 | u32 nego; | ||
| 1206 | 1210 | ||
| 1207 | kfree(wqw); | 1211 | kfree(wqw); |
| 1208 | 1212 | ||
| 1209 | shost_for_each_device(sdev, hd->ioc->sh) | 1213 | if (hd->spi_pending) { |
| 1210 | mptspi_dv_device(hd, sdev); | 1214 | shost_for_each_device(sdev, hd->ioc->sh) { |
| 1215 | if (hd->spi_pending & (1 << sdev->id)) | ||
| 1216 | continue; | ||
| 1217 | starget = scsi_target(sdev); | ||
| 1218 | nego = mptspi_getRP(starget); | ||
| 1219 | pg1.RequestedParameters = cpu_to_le32(nego); | ||
| 1220 | pg1.Reserved = 0; | ||
| 1221 | pg1.Configuration = 0; | ||
| 1222 | mptspi_write_spi_device_pg1(starget, &pg1); | ||
| 1223 | } | ||
| 1224 | } else { | ||
| 1225 | shost_for_each_device(sdev, hd->ioc->sh) | ||
| 1226 | mptspi_dv_device(hd, sdev); | ||
| 1227 | } | ||
| 1211 | } | 1228 | } |
| 1212 | 1229 | ||
| 1213 | static void | 1230 | static void |
| @@ -1453,6 +1470,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1453 | init_waitqueue_head(&hd->scandv_waitq); | 1470 | init_waitqueue_head(&hd->scandv_waitq); |
| 1454 | hd->scandv_wait_done = 0; | 1471 | hd->scandv_wait_done = 0; |
| 1455 | hd->last_queue_full = 0; | 1472 | hd->last_queue_full = 0; |
| 1473 | hd->spi_pending = 0; | ||
| 1456 | 1474 | ||
| 1457 | /* Some versions of the firmware don't support page 0; without | 1475 | /* Some versions of the firmware don't support page 0; without |
| 1458 | * that we can't get the parameters */ | 1476 | * that we can't get the parameters */ |
