aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorKashyap, Desai <kashyap.desai@lsi.com>2009-08-07 10:05:18 -0400
committerJames Bottomley <James.Bottomley@suse.de>2009-08-13 17:26:35 -0400
commit62727a7ba43c0abf2673e3877079c136a9721792 (patch)
tree7c7d3bef3c07d3defd4f7271a1bea9c74a40b3d5 /drivers
parent20f5895d55d9281830bfb7819c5c5b70b05297a6 (diff)
[SCSI] mpt2sas: Raid 10 Value is showing as Raid 1E in /va/log/messages
When a volume is activated, the driver will recieve a pair of ir config change events to remove the foreign volume, then add the native. In the process of the removal event, the hidden raid componet is removed from the parent.When the disks is added back, the adding of the port fails becuase there is no instance of the device in its parent. To fix this issue, the driver needs to call mpt2sas_transport_update_links() prior to calling _scsih_add_device. In addition, we added sanity checks on volume add and removal to ignore events for foreign volumes. Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_scsih.c90
1 files changed, 64 insertions, 26 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
index 918445e1e65f..22a95421e367 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c
@@ -4258,12 +4258,6 @@ _scsih_sas_volume_add(struct MPT2SAS_ADAPTER *ioc,
4258 u16 handle = le16_to_cpu(element->VolDevHandle); 4258 u16 handle = le16_to_cpu(element->VolDevHandle);
4259 int rc; 4259 int rc;
4260 4260
4261#if 0 /* RAID_HACKS */
4262 if (le32_to_cpu(event_data->Flags) &
4263 MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
4264 return;
4265#endif
4266
4267 mpt2sas_config_get_volume_wwid(ioc, handle, &wwid); 4261 mpt2sas_config_get_volume_wwid(ioc, handle, &wwid);
4268 if (!wwid) { 4262 if (!wwid) {
4269 printk(MPT2SAS_ERR_FMT 4263 printk(MPT2SAS_ERR_FMT
@@ -4318,12 +4312,6 @@ _scsih_sas_volume_delete(struct MPT2SAS_ADAPTER *ioc,
4318 unsigned long flags; 4312 unsigned long flags;
4319 struct MPT2SAS_TARGET *sas_target_priv_data; 4313 struct MPT2SAS_TARGET *sas_target_priv_data;
4320 4314
4321#if 0 /* RAID_HACKS */
4322 if (le32_to_cpu(event_data->Flags) &
4323 MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG)
4324 return;
4325#endif
4326
4327 spin_lock_irqsave(&ioc->raid_device_lock, flags); 4315 spin_lock_irqsave(&ioc->raid_device_lock, flags);
4328 raid_device = _scsih_raid_device_find_by_handle(ioc, handle); 4316 raid_device = _scsih_raid_device_find_by_handle(ioc, handle);
4329 spin_unlock_irqrestore(&ioc->raid_device_lock, flags); 4317 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
@@ -4436,14 +4424,38 @@ _scsih_sas_pd_add(struct MPT2SAS_ADAPTER *ioc,
4436 struct _sas_device *sas_device; 4424 struct _sas_device *sas_device;
4437 unsigned long flags; 4425 unsigned long flags;
4438 u16 handle = le16_to_cpu(element->PhysDiskDevHandle); 4426 u16 handle = le16_to_cpu(element->PhysDiskDevHandle);
4427 Mpi2ConfigReply_t mpi_reply;
4428 Mpi2SasDevicePage0_t sas_device_pg0;
4429 u32 ioc_status;
4439 4430
4440 spin_lock_irqsave(&ioc->sas_device_lock, flags); 4431 spin_lock_irqsave(&ioc->sas_device_lock, flags);
4441 sas_device = _scsih_sas_device_find_by_handle(ioc, handle); 4432 sas_device = _scsih_sas_device_find_by_handle(ioc, handle);
4442 spin_unlock_irqrestore(&ioc->sas_device_lock, flags); 4433 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
4443 if (sas_device) 4434 if (sas_device) {
4444 sas_device->hidden_raid_component = 1; 4435 sas_device->hidden_raid_component = 1;
4445 else 4436 return;
4446 _scsih_add_device(ioc, handle, 0, 1); 4437 }
4438
4439 if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply, &sas_device_pg0,
4440 MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle))) {
4441 printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
4442 ioc->name, __FILE__, __LINE__, __func__);
4443 return;
4444 }
4445
4446 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
4447 MPI2_IOCSTATUS_MASK;
4448 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
4449 printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
4450 ioc->name, __FILE__, __LINE__, __func__);
4451 return;
4452 }
4453
4454 _scsih_link_change(ioc,
4455 le16_to_cpu(sas_device_pg0.ParentDevHandle),
4456 handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
4457
4458 _scsih_add_device(ioc, handle, 0, 1);
4447} 4459}
4448 4460
4449#ifdef CONFIG_SCSI_MPT2SAS_LOGGING 4461#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
@@ -4543,12 +4555,15 @@ _scsih_sas_ir_config_change_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
4543{ 4555{
4544 Mpi2EventIrConfigElement_t *element; 4556 Mpi2EventIrConfigElement_t *element;
4545 int i; 4557 int i;
4558 u8 foreign_config;
4546 4559
4547#ifdef CONFIG_SCSI_MPT2SAS_LOGGING 4560#ifdef CONFIG_SCSI_MPT2SAS_LOGGING
4548 if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK) 4561 if (ioc->logging_level & MPT_DEBUG_EVENT_WORK_TASK)
4549 _scsih_sas_ir_config_change_event_debug(ioc, event_data); 4562 _scsih_sas_ir_config_change_event_debug(ioc, event_data);
4550 4563
4551#endif 4564#endif
4565 foreign_config = (le32_to_cpu(event_data->Flags) &
4566 MPI2_EVENT_IR_CHANGE_FLAGS_FOREIGN_CONFIG) ? 1 : 0;
4552 4567
4553 element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0]; 4568 element = (Mpi2EventIrConfigElement_t *)&event_data->ConfigElement[0];
4554 for (i = 0; i < event_data->NumElements; i++, element++) { 4569 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,
4556 switch (element->ReasonCode) { 4571 switch (element->ReasonCode) {
4557 case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED: 4572 case MPI2_EVENT_IR_CHANGE_RC_VOLUME_CREATED:
4558 case MPI2_EVENT_IR_CHANGE_RC_ADDED: 4573 case MPI2_EVENT_IR_CHANGE_RC_ADDED:
4559 _scsih_sas_volume_add(ioc, element); 4574 if (!foreign_config)
4575 _scsih_sas_volume_add(ioc, element);
4560 break; 4576 break;
4561 case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED: 4577 case MPI2_EVENT_IR_CHANGE_RC_VOLUME_DELETED:
4562 case MPI2_EVENT_IR_CHANGE_RC_REMOVED: 4578 case MPI2_EVENT_IR_CHANGE_RC_REMOVED:
4563 _scsih_sas_volume_delete(ioc, element); 4579 if (!foreign_config)
4580 _scsih_sas_volume_delete(ioc, element);
4564 break; 4581 break;
4565 case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED: 4582 case MPI2_EVENT_IR_CHANGE_RC_PD_CREATED:
4566 _scsih_sas_pd_hide(ioc, element); 4583 _scsih_sas_pd_hide(ioc, element);
@@ -4679,6 +4696,9 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
4679 u32 state; 4696 u32 state;
4680 struct _sas_device *sas_device; 4697 struct _sas_device *sas_device;
4681 unsigned long flags; 4698 unsigned long flags;
4699 Mpi2ConfigReply_t mpi_reply;
4700 Mpi2SasDevicePage0_t sas_device_pg0;
4701 u32 ioc_status;
4682 4702
4683 if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED) 4703 if (event_data->ReasonCode != MPI2_EVENT_IR_PHYSDISK_RC_STATE_CHANGED)
4684 return; 4704 return;
@@ -4695,22 +4715,40 @@ _scsih_sas_ir_physical_disk_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
4695 spin_unlock_irqrestore(&ioc->sas_device_lock, flags); 4715 spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
4696 4716
4697 switch (state) { 4717 switch (state) {
4698#if 0
4699 case MPI2_RAID_PD_STATE_OFFLINE:
4700 if (sas_device)
4701 _scsih_remove_device(ioc, handle);
4702 break;
4703#endif
4704 case MPI2_RAID_PD_STATE_ONLINE: 4718 case MPI2_RAID_PD_STATE_ONLINE:
4705 case MPI2_RAID_PD_STATE_DEGRADED: 4719 case MPI2_RAID_PD_STATE_DEGRADED:
4706 case MPI2_RAID_PD_STATE_REBUILDING: 4720 case MPI2_RAID_PD_STATE_REBUILDING:
4707 case MPI2_RAID_PD_STATE_OPTIMAL: 4721 case MPI2_RAID_PD_STATE_OPTIMAL:
4708 if (sas_device) 4722 if (sas_device) {
4709 sas_device->hidden_raid_component = 1; 4723 sas_device->hidden_raid_component = 1;
4710 else 4724 return;
4711 _scsih_add_device(ioc, handle, 0, 1); 4725 }
4726
4727 if ((mpt2sas_config_get_sas_device_pg0(ioc, &mpi_reply,
4728 &sas_device_pg0, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
4729 handle))) {
4730 printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
4731 ioc->name, __FILE__, __LINE__, __func__);
4732 return;
4733 }
4734
4735 ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
4736 MPI2_IOCSTATUS_MASK;
4737 if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
4738 printk(MPT2SAS_ERR_FMT "failure at %s:%d/%s()!\n",
4739 ioc->name, __FILE__, __LINE__, __func__);
4740 return;
4741 }
4742
4743 _scsih_link_change(ioc,
4744 le16_to_cpu(sas_device_pg0.ParentDevHandle),
4745 handle, sas_device_pg0.PhyNum, MPI2_SAS_NEG_LINK_RATE_1_5);
4746
4747 _scsih_add_device(ioc, handle, 0, 1);
4748
4712 break; 4749 break;
4713 4750
4751 case MPI2_RAID_PD_STATE_OFFLINE:
4714 case MPI2_RAID_PD_STATE_NOT_CONFIGURED: 4752 case MPI2_RAID_PD_STATE_NOT_CONFIGURED:
4715 case MPI2_RAID_PD_STATE_NOT_COMPATIBLE: 4753 case MPI2_RAID_PD_STATE_NOT_COMPATIBLE:
4716 case MPI2_RAID_PD_STATE_HOT_SPARE: 4754 case MPI2_RAID_PD_STATE_HOT_SPARE: