]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
mpt3sas: Handle active cable exception event
authorChaitra P B <chaitra.basappa@broadcom.com>
Fri, 6 May 2016 08:59:27 +0000 (14:29 +0530)
committerChuck Anderson <chuck.anderson@oracle.com>
Wed, 13 Jul 2016 07:36:43 +0000 (00:36 -0700)
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>
Orabug: 22529571
(cherry picked from commit a470a51cd6481373cdf2b5934b1b9f7853688de9)
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpt3sas/mpt3sas_base.c
drivers/scsi/mpt3sas/mpt3sas_scsih.c

index 326c152d0f54db2b7d555668e20ac54da720f52c..6519176bf061a539dfe8b33bacc222c12d954b5d 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;