|
@@ -4258,12 +4258,6 @@ _scsih_sas_volume_add(struct MPT2SAS_ADAPTER *ioc,
|
|
u16 handle = le16_to_cpu(element->VolDevHandle);
|
|
u16 handle = le16_to_cpu(element->VolDevHandle);
|
|
int rc;
|
|
int rc;
|
|
|
|
|
|
-#if 0 /* RAID_HACKS */
|
|
|
|
- if (le32_to_cpu(event_data->Flags) &
|
|
|
|
- MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
|
|
|
|
- return;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
mpt2sas_config_get_volume_wwid(ioc, handle, &wwid);
|
|
mpt2sas_config_get_volume_wwid(ioc, handle, &wwid);
|
|
if (!wwid) {
|
|
if (!wwid) {
|
|
printk(MPT2SAS_ERR_FMT
|
|
printk(MPT2SAS_ERR_FMT
|
|
@@ -4318,12 +4312,6 @@ _scsih_sas_volume_delete(struct MPT2SAS_ADAPTER *ioc,
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
struct MPT2SAS_TARGET *sas_target_priv_data;
|
|
struct MPT2SAS_TARGET *sas_target_priv_data;
|
|
|
|
|
|
-#if 0 /* RAID_HACKS */
|
|
|
|
- if (le32_to_cpu(event_data->Flags) &
|
|
|
|
- MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
|
|
|
|
- return;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
spin_lock_irqsave(&ioc->raid_device_lock, flags);
|
|
spin_lock_irqsave(&ioc->raid_device_lock, flags);
|
|
raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
|
|
raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
|
|
spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
|
|
spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
|
|
@@ -4436,14 +4424,38 @@ _scsih_sas_pd_add(struct MPT2SAS_ADAPTER *ioc,
|
|
struct _sas_device *sas_device;
|
|
struct _sas_device *sas_device;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
|
|
u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
|
|
|
|
+ Mpi2ConfigReply_t mpi_reply;
|
|
|
|
+ Mpi2SasDevicePage0_t sas_device_pg0;
|
|
|
|
+ u32 ioc_status;
|
|
|
|
|
|
spin_lock_irqsave(&ioc->sas_device_lock, flags);
|
|
spin_lock_irqsave(&ioc->sas_device_lock, flags);
|
|
sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
|
|
sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
|
|
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
|
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
|
- if (sas_device)
|
|
|
|
|
|
+ if (sas_device) {
|
|
sas_device->hidden_raid_component = 1;
|
|
sas_device->hidden_raid_component = 1;
|
|
- else
|
|
|
|
- _scsih_add_device(ioc, handle, 0, 1);
|
|
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
|
|
|
|
+ MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
|
|
|
|
+ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
|
|
|
+ ioc->name, __FILE__, __LINE__, __func__);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
|
|
|
|
+ MPI2_IOCSTATUS_MASK;
|
|
|
|
+ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
|
|
|
|
+ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
|
|
|
+ ioc->name, __FILE__, __LINE__, __func__);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ _scsih_link_change(ioc,
|
|
|
|
+ le16_to_cpu(sas_device_pg0.ParentDevHandle),
|
|
|
|
+ handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
|
|
|
|
+
|
|
|
|
+ _scsih_add_device(ioc, handle, 0, 1);
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
|
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
|
@@ -4543,12 +4555,15 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|
{
|
|
{
|
|
Mpi2EventIrConfigElement_t *element;
|
|
Mpi2EventIrConfigElement_t *element;
|
|
int i;
|
|
int i;
|
|
|
|
+ u8 foreign_config;
|
|
|
|
|
|
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
|
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
|
|
if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
|
|
if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
|
|
_scsih_sas_ir_config_change_event_debug(ioc, event_data);
|
|
_scsih_sas_ir_config_change_event_debug(ioc, event_data);
|
|
|
|
|
|
#endif
|
|
#endif
|
|
|
|
+ foreign_config = (le32_to_cpu(event_data->Flags) &
|
|
|
|
+ MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0;
|
|
|
|
|
|
element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
|
|
element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
|
|
for (i = 0; i < event_data->NumElements; i++, element++) {
|
|
for (i = 0; i < event_data->NumElements; i++, element++) {
|
|
@@ -4556,11 +4571,13 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|
switch (element->ReasonCode) {
|
|
switch (element->ReasonCode) {
|
|
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
|
|
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
|
|
case MPI2_EVENT_IR_CHANGE_RC_ADDED:
|
|
case MPI2_EVENT_IR_CHANGE_RC_ADDED:
|
|
- _scsih_sas_volume_add(ioc, element);
|
|
|
|
|
|
+ if (!foreign_config)
|
|
|
|
+ _scsih_sas_volume_add(ioc, element);
|
|
break;
|
|
break;
|
|
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
|
|
case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
|
|
case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
|
|
case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
|
|
- _scsih_sas_volume_delete(ioc, element);
|
|
|
|
|
|
+ if (!foreign_config)
|
|
|
|
+ _scsih_sas_volume_delete(ioc, element);
|
|
break;
|
|
break;
|
|
case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
|
|
case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
|
|
_scsih_sas_pd_hide(ioc, element);
|
|
_scsih_sas_pd_hide(ioc, element);
|
|
@@ -4679,6 +4696,9 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|
u32 state;
|
|
u32 state;
|
|
struct _sas_device *sas_device;
|
|
struct _sas_device *sas_device;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
+ Mpi2ConfigReply_t mpi_reply;
|
|
|
|
+ Mpi2SasDevicePage0_t sas_device_pg0;
|
|
|
|
+ u32 ioc_status;
|
|
|
|
|
|
if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED)
|
|
if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED)
|
|
return;
|
|
return;
|
|
@@ -4695,22 +4715,40 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
|
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
|
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
|
|
|
|
|
switch (state) {
|
|
switch (state) {
|
|
-#if 0
|
|
|
|
- case MPI2_RAID_PD_STATE_OFFLINE:
|
|
|
|
- if (sas_device)
|
|
|
|
- _scsih_remove_device(ioc, handle);
|
|
|
|
- break;
|
|
|
|
-#endif
|
|
|
|
case MPI2_RAID_PD_STATE_ONLINE:
|
|
case MPI2_RAID_PD_STATE_ONLINE:
|
|
case MPI2_RAID_PD_STATE_DEGRADED:
|
|
case MPI2_RAID_PD_STATE_DEGRADED:
|
|
case MPI2_RAID_PD_STATE_REBUILDING:
|
|
case MPI2_RAID_PD_STATE_REBUILDING:
|
|
case MPI2_RAID_PD_STATE_OPTIMAL:
|
|
case MPI2_RAID_PD_STATE_OPTIMAL:
|
|
- if (sas_device)
|
|
|
|
|
|
+ if (sas_device) {
|
|
sas_device->hidden_raid_component = 1;
|
|
sas_device->hidden_raid_component = 1;
|
|
- else
|
|
|
|
- _scsih_add_device(ioc, handle, 0, 1);
|
|
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply,
|
|
|
|
+ &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
|
|
|
|
+ handle))) {
|
|
|
|
+ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
|
|
|
+ ioc->name, __FILE__, __LINE__, __func__);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
|
|
|
|
+ MPI2_IOCSTATUS_MASK;
|
|
|
|
+ if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
|
|
|
|
+ printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
|
|
|
|
+ ioc->name, __FILE__, __LINE__, __func__);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ _scsih_link_change(ioc,
|
|
|
|
+ le16_to_cpu(sas_device_pg0.ParentDevHandle),
|
|
|
|
+ handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
|
|
|
|
+
|
|
|
|
+ _scsih_add_device(ioc, handle, 0, 1);
|
|
|
|
+
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case MPI2_RAID_PD_STATE_OFFLINE:
|
|
case MPI2_RAID_PD_STATE_NOT_CONFIGURED:
|
|
case MPI2_RAID_PD_STATE_NOT_CONFIGURED:
|
|
case MPI2_RAID_PD_STATE_NOT_COMPATIBLE:
|
|
case MPI2_RAID_PD_STATE_NOT_COMPATIBLE:
|
|
case MPI2_RAID_PD_STATE_HOT_SPARE:
|
|
case MPI2_RAID_PD_STATE_HOT_SPARE:
|