Merge branch 'pcmcia-next' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo...
[linux-2.6-microblaze.git] / drivers / scsi / pm8001 / pm8001_sas.c
index d1e9dba..a98d449 100644 (file)
@@ -158,7 +158,6 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
        int rc = 0, phy_id = sas_phy->id;
        struct pm8001_hba_info *pm8001_ha = NULL;
        struct sas_phy_linkrates *rates;
-       struct sas_ha_struct *sas_ha;
        struct pm8001_phy *phy;
        DECLARE_COMPLETION_ONSTACK(completion);
        unsigned long flags;
@@ -207,19 +206,17 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
                if (pm8001_ha->chip_id != chip_8001) {
                        if (pm8001_ha->phy[phy_id].phy_state ==
                                PHY_STATE_LINK_UP_SPCV) {
-                               sas_ha = pm8001_ha->sas;
                                sas_phy_disconnected(&phy->sas_phy);
-                               sas_ha->notify_phy_event(&phy->sas_phy,
-                                       PHYE_LOSS_OF_SIGNAL);
+                               sas_notify_phy_event(&phy->sas_phy,
+                                       PHYE_LOSS_OF_SIGNAL, GFP_KERNEL);
                                phy->phy_attached = 0;
                        }
                } else {
                        if (pm8001_ha->phy[phy_id].phy_state ==
                                PHY_STATE_LINK_UP_SPC) {
-                               sas_ha = pm8001_ha->sas;
                                sas_phy_disconnected(&phy->sas_phy);
-                               sas_ha->notify_phy_event(&phy->sas_phy,
-                                       PHYE_LOSS_OF_SIGNAL);
+                               sas_notify_phy_event(&phy->sas_phy,
+                                       PHYE_LOSS_OF_SIGNAL, GFP_KERNEL);
                                phy->phy_attached = 0;
                        }
                }
@@ -1183,12 +1180,21 @@ int pm8001_abort_task(struct sas_task *task)
        int rc = TMF_RESP_FUNC_FAILED, ret;
        u32 phy_id;
        struct sas_task_slow slow_task;
+
        if (unlikely(!task || !task->lldd_task || !task->dev))
                return TMF_RESP_FUNC_FAILED;
+
        dev = task->dev;
        pm8001_dev = dev->lldd_dev;
        pm8001_ha = pm8001_find_ha_by_dev(dev);
        phy_id = pm8001_dev->attached_phy;
+
+       if (PM8001_CHIP_DISP->fatal_errors(pm8001_ha)) {
+               // If the controller is seeing fatal errors
+               // abort task will not get a response from the controller
+               return TMF_RESP_FUNC_FAILED;
+       }
+
        ret = pm8001_find_tag(task, &tag);
        if (ret == 0) {
                pm8001_info(pm8001_ha, "no tag for task:%p\n", task);
@@ -1344,4 +1350,3 @@ int pm8001_clear_task_set(struct domain_device *dev, u8 *lun)
        tmf_task.tmf = TMF_CLEAR_TASK_SET;
        return pm8001_issue_ssp_tmf(dev, lun, &tmf_task);
 }
-