mpt3sas: Handle active cable exception event
authorChaitra P B <chaitra.basappa@broadcom.com>
Fri, 6 May 2016 08:59:27 +0000 (14:29 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 11 May 2016 20:11:26 +0000 (16:11 -0400)
In-order to handle this 'MPI2_EVENT_ACTIVE_CABLE_EXCEPTION' event,
driver need to follow below steps,
1. Unmask the 'MPI2_EVENT_ACTIVE_CABLE_EXCEPTION' event,
so that FW can notify this event to host driver.
2. After receiving this event, add this event to AEN event queue,
for notifying this event to applications.
3. Then Print below message in kernel logs if the event data's reason
code is zero,
"Currently an active cable with ReceptacleID <ID_Value> cannot be powered
and devices connected to this active cable will not be seen. This active
cable requires <PowerValue_in_mW> of power"

This event is only for Intruder/Cutlass HBAs.

Signed-off-by: Chaitra P B <chaitra.basappa@broadcom.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpt3sas/mpt3sas_base.c
drivers/scsi/mpt3sas/mpt3sas_scsih.c

index 93d7c28f81622e818e6664279d22acb2b5385cdf..b7f4e664f5f38ff6ed68bffeb48ed1d3b9eac0b0 100644 (file)
@@ -655,6 +655,9 @@ _base_display_event_data(struct MPT3SAS_ADAPTER *ioc,
        case MPI2_EVENT_TEMP_THRESHOLD:
                desc = "Temperature Threshold";
                break;
+       case MPI2_EVENT_ACTIVE_CABLE_EXCEPTION:
+               desc = "Active cable exception";
+               break;
        }
 
        if (!desc)
@@ -5424,6 +5427,8 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
        _base_unmask_events(ioc, MPI2_EVENT_IR_OPERATION_STATUS);
        _base_unmask_events(ioc, MPI2_EVENT_LOG_ENTRY_ADDED);
        _base_unmask_events(ioc, MPI2_EVENT_TEMP_THRESHOLD);
+       if (ioc->hba_mpi_version_belonged == MPI26_VERSION)
+               _base_unmask_events(ioc, MPI2_EVENT_ACTIVE_CABLE_EXCEPTION);
 
        r = _base_make_ioc_operational(ioc, CAN_SLEEP);
        if (r)
index f2139e5604a30ac758e1885489dea33c4dda84d4..4f2500b24c59e3f52b18fd1a8cb2e627fa820186 100644 (file)
@@ -7848,6 +7848,7 @@ mpt3sas_scsih_event_callback(struct MPT3SAS_ADAPTER *ioc, u8 msix_index,
        Mpi2EventNotificationReply_t *mpi_reply;
        u16 event;
        u16 sz;
+       Mpi26EventDataActiveCableExcept_t *ActiveCableEventData;
 
        /* events turned off due to host reset or driver unloading */
        if (ioc->remove_host || ioc->pci_error_recovery)
@@ -7960,6 +7961,18 @@ mpt3sas_scsih_event_callback(struct MPT3SAS_ADAPTER *ioc, u8 msix_index,
                        (Mpi2EventDataTemperature_t *)
                        mpi_reply->EventData);
                break;
+       case MPI2_EVENT_ACTIVE_CABLE_EXCEPTION:
+               ActiveCableEventData =
+                   (Mpi26EventDataActiveCableExcept_t *) mpi_reply->EventData;
+               if (ActiveCableEventData->ReasonCode ==
+                               MPI26_EVENT_ACTIVE_CABLE_INSUFFICIENT_POWER)
+                       pr_info(MPT3SAS_FMT "Currently an active cable with ReceptacleID %d",
+                           ioc->name, ActiveCableEventData->ReceptacleID);
+                       pr_info("cannot be powered and devices connected to this active cable");
+                       pr_info("will not be seen. This active cable");
+                       pr_info("requires %d mW of power",
+                           ActiveCableEventData->ActiveCablePowerRequirement);
+               break;
 
        default: /* ignore the rest */
                return 1;