diff options
Diffstat (limited to 'drivers/message/fusion/mptsas.c')
| -rw-r--r-- | drivers/message/fusion/mptsas.c | 99 |
1 files changed, 71 insertions, 28 deletions
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index e9716b10acea..af6ec553ff7c 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
| @@ -91,6 +91,7 @@ enum mptsas_hotplug_action { | |||
| 91 | MPTSAS_DEL_DEVICE, | 91 | MPTSAS_DEL_DEVICE, |
| 92 | MPTSAS_ADD_RAID, | 92 | MPTSAS_ADD_RAID, |
| 93 | MPTSAS_DEL_RAID, | 93 | MPTSAS_DEL_RAID, |
| 94 | MPTSAS_IGNORE_EVENT, | ||
| 94 | }; | 95 | }; |
| 95 | 96 | ||
| 96 | struct mptsas_hotplug_event { | 97 | struct mptsas_hotplug_event { |
| @@ -298,6 +299,26 @@ mptsas_find_portinfo_by_handle(MPT_ADAPTER *ioc, u16 handle) | |||
| 298 | return rc; | 299 | return rc; |
| 299 | } | 300 | } |
| 300 | 301 | ||
| 302 | /* | ||
| 303 | * Returns true if there is a scsi end device | ||
| 304 | */ | ||
| 305 | static inline int | ||
| 306 | mptsas_is_end_device(struct mptsas_devinfo * attached) | ||
| 307 | { | ||
| 308 | if ((attached->handle) && | ||
| 309 | (attached->device_info & | ||
| 310 | MPI_SAS_DEVICE_INFO_END_DEVICE) && | ||
| 311 | ((attached->device_info & | ||
| 312 | MPI_SAS_DEVICE_INFO_SSP_TARGET) | | ||
| 313 | (attached->device_info & | ||
| 314 | MPI_SAS_DEVICE_INFO_STP_TARGET) | | ||
| 315 | (attached->device_info & | ||
| 316 | MPI_SAS_DEVICE_INFO_SATA_DEVICE))) | ||
| 317 | return 1; | ||
| 318 | else | ||
| 319 | return 0; | ||
| 320 | } | ||
| 321 | |||
| 301 | static int | 322 | static int |
| 302 | mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure, | 323 | mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure, |
| 303 | u32 form, u32 form_specific) | 324 | u32 form, u32 form_specific) |
| @@ -872,7 +893,11 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info, | |||
| 872 | SasDevicePage0_t *buffer; | 893 | SasDevicePage0_t *buffer; |
| 873 | dma_addr_t dma_handle; | 894 | dma_addr_t dma_handle; |
| 874 | __le64 sas_address; | 895 | __le64 sas_address; |
| 875 | int error; | 896 | int error=0; |
| 897 | |||
| 898 | if (ioc->sas_discovery_runtime && | ||
| 899 | mptsas_is_end_device(device_info)) | ||
| 900 | goto out; | ||
| 876 | 901 | ||
| 877 | hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION; | 902 | hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION; |
| 878 | hdr.ExtPageLength = 0; | 903 | hdr.ExtPageLength = 0; |
| @@ -1009,7 +1034,11 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, | |||
| 1009 | CONFIGPARMS cfg; | 1034 | CONFIGPARMS cfg; |
| 1010 | SasExpanderPage1_t *buffer; | 1035 | SasExpanderPage1_t *buffer; |
| 1011 | dma_addr_t dma_handle; | 1036 | dma_addr_t dma_handle; |
| 1012 | int error; | 1037 | int error=0; |
| 1038 | |||
| 1039 | if (ioc->sas_discovery_runtime && | ||
| 1040 | mptsas_is_end_device(&phy_info->attached)) | ||
| 1041 | goto out; | ||
| 1013 | 1042 | ||
| 1014 | hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION; | 1043 | hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION; |
| 1015 | hdr.ExtPageLength = 0; | 1044 | hdr.ExtPageLength = 0; |
| @@ -1068,26 +1097,6 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, | |||
| 1068 | return error; | 1097 | return error; |
| 1069 | } | 1098 | } |
| 1070 | 1099 | ||
| 1071 | /* | ||
| 1072 | * Returns true if there is a scsi end device | ||
| 1073 | */ | ||
| 1074 | static inline int | ||
| 1075 | mptsas_is_end_device(struct mptsas_devinfo * attached) | ||
| 1076 | { | ||
| 1077 | if ((attached->handle) && | ||
| 1078 | (attached->device_info & | ||
| 1079 | MPI_SAS_DEVICE_INFO_END_DEVICE) && | ||
| 1080 | ((attached->device_info & | ||
| 1081 | MPI_SAS_DEVICE_INFO_SSP_TARGET) | | ||
| 1082 | (attached->device_info & | ||
| 1083 | MPI_SAS_DEVICE_INFO_STP_TARGET) | | ||
| 1084 | (attached->device_info & | ||
| 1085 | MPI_SAS_DEVICE_INFO_SATA_DEVICE))) | ||
| 1086 | return 1; | ||
| 1087 | else | ||
| 1088 | return 0; | ||
| 1089 | } | ||
| 1090 | |||
| 1091 | static void | 1100 | static void |
| 1092 | mptsas_parse_device_info(struct sas_identify *identify, | 1101 | mptsas_parse_device_info(struct sas_identify *identify, |
| 1093 | struct mptsas_devinfo *device_info) | 1102 | struct mptsas_devinfo *device_info) |
| @@ -1737,6 +1746,9 @@ mptsas_hotplug_work(void *arg) | |||
| 1737 | break; | 1746 | break; |
| 1738 | case MPTSAS_ADD_DEVICE: | 1747 | case MPTSAS_ADD_DEVICE: |
| 1739 | 1748 | ||
| 1749 | if (ev->phys_disk_num_valid) | ||
| 1750 | mpt_findImVolumes(ioc); | ||
| 1751 | |||
| 1740 | /* | 1752 | /* |
| 1741 | * Refresh sas device pg0 data | 1753 | * Refresh sas device pg0 data |
| 1742 | */ | 1754 | */ |
| @@ -1868,6 +1880,9 @@ mptsas_hotplug_work(void *arg) | |||
| 1868 | scsi_device_put(sdev); | 1880 | scsi_device_put(sdev); |
| 1869 | mpt_findImVolumes(ioc); | 1881 | mpt_findImVolumes(ioc); |
| 1870 | break; | 1882 | break; |
| 1883 | case MPTSAS_IGNORE_EVENT: | ||
| 1884 | default: | ||
| 1885 | break; | ||
| 1871 | } | 1886 | } |
| 1872 | 1887 | ||
| 1873 | kfree(ev); | 1888 | kfree(ev); |
| @@ -1940,7 +1955,8 @@ mptscsih_send_raid_event(MPT_ADAPTER *ioc, | |||
| 1940 | EVENT_DATA_RAID *raid_event_data) | 1955 | EVENT_DATA_RAID *raid_event_data) |
| 1941 | { | 1956 | { |
| 1942 | struct mptsas_hotplug_event *ev; | 1957 | struct mptsas_hotplug_event *ev; |
| 1943 | RAID_VOL0_STATUS * volumeStatus; | 1958 | int status = le32_to_cpu(raid_event_data->SettingsStatus); |
| 1959 | int state = (status >> 8) & 0xff; | ||
| 1944 | 1960 | ||
| 1945 | if (ioc->bus_type != SAS) | 1961 | if (ioc->bus_type != SAS) |
| 1946 | return; | 1962 | return; |
| @@ -1955,6 +1971,7 @@ mptscsih_send_raid_event(MPT_ADAPTER *ioc, | |||
| 1955 | INIT_WORK(&ev->work, mptsas_hotplug_work, ev); | 1971 | INIT_WORK(&ev->work, mptsas_hotplug_work, ev); |
| 1956 | ev->ioc = ioc; | 1972 | ev->ioc = ioc; |
| 1957 | ev->id = raid_event_data->VolumeID; | 1973 | ev->id = raid_event_data->VolumeID; |
| 1974 | ev->event_type = MPTSAS_IGNORE_EVENT; | ||
| 1958 | 1975 | ||
| 1959 | switch (raid_event_data->ReasonCode) { | 1976 | switch (raid_event_data->ReasonCode) { |
| 1960 | case MPI_EVENT_RAID_RC_PHYSDISK_DELETED: | 1977 | case MPI_EVENT_RAID_RC_PHYSDISK_DELETED: |
| @@ -1966,6 +1983,25 @@ mptscsih_send_raid_event(MPT_ADAPTER *ioc, | |||
| 1966 | ev->phys_disk_num = raid_event_data->PhysDiskNum; | 1983 | ev->phys_disk_num = raid_event_data->PhysDiskNum; |
| 1967 | ev->event_type = MPTSAS_DEL_DEVICE; | 1984 | ev->event_type = MPTSAS_DEL_DEVICE; |
| 1968 | break; | 1985 | break; |
| 1986 | case MPI_EVENT_RAID_RC_PHYSDISK_STATUS_CHANGED: | ||
| 1987 | switch (state) { | ||
| 1988 | case MPI_PD_STATE_ONLINE: | ||
| 1989 | ioc->raid_data.isRaid = 1; | ||
| 1990 | ev->phys_disk_num_valid = 1; | ||
| 1991 | ev->phys_disk_num = raid_event_data->PhysDiskNum; | ||
| 1992 | ev->event_type = MPTSAS_ADD_DEVICE; | ||
| 1993 | break; | ||
| 1994 | case MPI_PD_STATE_MISSING: | ||
| 1995 | case MPI_PD_STATE_NOT_COMPATIBLE: | ||
| 1996 | case MPI_PD_STATE_OFFLINE_AT_HOST_REQUEST: | ||
| 1997 | case MPI_PD_STATE_FAILED_AT_HOST_REQUEST: | ||
| 1998 | case MPI_PD_STATE_OFFLINE_FOR_ANOTHER_REASON: | ||
| 1999 | ev->event_type = MPTSAS_DEL_DEVICE; | ||
| 2000 | break; | ||
| 2001 | default: | ||
| 2002 | break; | ||
| 2003 | } | ||
| 2004 | break; | ||
| 1969 | case MPI_EVENT_RAID_RC_VOLUME_DELETED: | 2005 | case MPI_EVENT_RAID_RC_VOLUME_DELETED: |
| 1970 | ev->event_type = MPTSAS_DEL_RAID; | 2006 | ev->event_type = MPTSAS_DEL_RAID; |
| 1971 | break; | 2007 | break; |
| @@ -1973,11 +2009,18 @@ mptscsih_send_raid_event(MPT_ADAPTER *ioc, | |||
| 1973 | ev->event_type = MPTSAS_ADD_RAID; | 2009 | ev->event_type = MPTSAS_ADD_RAID; |
| 1974 | break; | 2010 | break; |
| 1975 | case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED: | 2011 | case MPI_EVENT_RAID_RC_VOLUME_STATUS_CHANGED: |
| 1976 | volumeStatus = (RAID_VOL0_STATUS *) & | 2012 | switch (state) { |
| 1977 | raid_event_data->SettingsStatus; | 2013 | case MPI_RAIDVOL0_STATUS_STATE_FAILED: |
| 1978 | ev->event_type = (volumeStatus->State == | 2014 | case MPI_RAIDVOL0_STATUS_STATE_MISSING: |
| 1979 | MPI_RAIDVOL0_STATUS_STATE_FAILED) ? | 2015 | ev->event_type = MPTSAS_DEL_RAID; |
| 1980 | MPTSAS_DEL_RAID : MPTSAS_ADD_RAID; | 2016 | break; |
| 2017 | case MPI_RAIDVOL0_STATUS_STATE_OPTIMAL: | ||
| 2018 | case MPI_RAIDVOL0_STATUS_STATE_DEGRADED: | ||
| 2019 | ev->event_type = MPTSAS_ADD_RAID; | ||
| 2020 | break; | ||
| 2021 | default: | ||
| 2022 | break; | ||
| 2023 | } | ||
| 1981 | break; | 2024 | break; |
| 1982 | default: | 2025 | default: |
| 1983 | break; | 2026 | break; |
