scsi: mpt3sas: Update persistent trigger pages from sysfs interface
authorSuganath Prabu S <suganath-prabu.subramani@broadcom.com>
Mon, 27 Dec 2021 05:30:55 +0000 (11:00 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 5 Jan 2022 05:31:39 +0000 (00:31 -0500)
Store sysfs-provided trigger values into the corresponding persistent
trigger pages. Otherwise trigger entries are not persistent across system
reboots.

Link: https://lore.kernel.org/r/20211227053055.289537-1-suganath-prabu.subramani@broadcom.com
Signed-off-by: Suganath Prabu S <suganath-prabu.subramani@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpt3sas/mpt3sas_base.h
drivers/scsi/mpt3sas/mpt3sas_ctl.c

index a0af986633d2a016a2ccdb1b4d83a5dbe4f631b4..949e98d523e2836425286373cdb19c61c8e16dff 100644 (file)
@@ -77,8 +77,8 @@
 #define MPT3SAS_DRIVER_NAME            "mpt3sas"
 #define MPT3SAS_AUTHOR "Avago Technologies <MPT-FusionLinux.pdl@avagotech.com>"
 #define MPT3SAS_DESCRIPTION    "LSI MPT Fusion SAS 3.0 Device Driver"
-#define MPT3SAS_DRIVER_VERSION         "39.100.00.00"
-#define MPT3SAS_MAJOR_VERSION          39
+#define MPT3SAS_DRIVER_VERSION         "40.100.00.00"
+#define MPT3SAS_MAJOR_VERSION          40
 #define MPT3SAS_MINOR_VERSION          100
 #define MPT3SAS_BUILD_VERSION          0
 #define MPT3SAS_RELEASE_VERSION        00
index 05b6c6a073c34b42a698efa0e64e8b14a32c567b..d92ca140d298c221292dbcca60e1245ae27c2db4 100644 (file)
@@ -3533,11 +3533,31 @@ diag_trigger_master_store(struct device *cdev,
 {
        struct Scsi_Host *shost = class_to_shost(cdev);
        struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
+       struct SL_WH_MASTER_TRIGGER_T *master_tg;
        unsigned long flags;
        ssize_t rc;
+       bool set = 1;
 
-       spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
        rc = min(sizeof(struct SL_WH_MASTER_TRIGGER_T), count);
+
+       if (ioc->supports_trigger_pages) {
+               master_tg = kzalloc(sizeof(struct SL_WH_MASTER_TRIGGER_T),
+                   GFP_KERNEL);
+               if (!master_tg)
+                       return -ENOMEM;
+
+               memcpy(master_tg, buf, rc);
+               if (!master_tg->MasterData)
+                       set = 0;
+               if (mpt3sas_config_update_driver_trigger_pg1(ioc, master_tg,
+                   set)) {
+                       kfree(master_tg);
+                       return -EFAULT;
+               }
+               kfree(master_tg);
+       }
+
+       spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
        memset(&ioc->diag_trigger_master, 0,
            sizeof(struct SL_WH_MASTER_TRIGGER_T));
        memcpy(&ioc->diag_trigger_master, buf, rc);
@@ -3589,11 +3609,31 @@ diag_trigger_event_store(struct device *cdev,
 {
        struct Scsi_Host *shost = class_to_shost(cdev);
        struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
+       struct SL_WH_EVENT_TRIGGERS_T *event_tg;
        unsigned long flags;
        ssize_t sz;
+       bool set = 1;
 
-       spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
        sz = min(sizeof(struct SL_WH_EVENT_TRIGGERS_T), count);
+       if (ioc->supports_trigger_pages) {
+               event_tg = kzalloc(sizeof(struct SL_WH_EVENT_TRIGGERS_T),
+                   GFP_KERNEL);
+               if (!event_tg)
+                       return -ENOMEM;
+
+               memcpy(event_tg, buf, sz);
+               if (!event_tg->ValidEntries)
+                       set = 0;
+               if (mpt3sas_config_update_driver_trigger_pg2(ioc, event_tg,
+                   set)) {
+                       kfree(event_tg);
+                       return -EFAULT;
+               }
+               kfree(event_tg);
+       }
+
+       spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
+
        memset(&ioc->diag_trigger_event, 0,
            sizeof(struct SL_WH_EVENT_TRIGGERS_T));
        memcpy(&ioc->diag_trigger_event, buf, sz);
@@ -3644,11 +3684,31 @@ diag_trigger_scsi_store(struct device *cdev,
 {
        struct Scsi_Host *shost = class_to_shost(cdev);
        struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
+       struct SL_WH_SCSI_TRIGGERS_T *scsi_tg;
        unsigned long flags;
        ssize_t sz;
+       bool set = 1;
+
+       sz = min(sizeof(struct SL_WH_SCSI_TRIGGERS_T), count);
+       if (ioc->supports_trigger_pages) {
+               scsi_tg = kzalloc(sizeof(struct SL_WH_SCSI_TRIGGERS_T),
+                   GFP_KERNEL);
+               if (!scsi_tg)
+                       return -ENOMEM;
+
+               memcpy(scsi_tg, buf, sz);
+               if (!scsi_tg->ValidEntries)
+                       set = 0;
+               if (mpt3sas_config_update_driver_trigger_pg3(ioc, scsi_tg,
+                   set)) {
+                       kfree(scsi_tg);
+                       return -EFAULT;
+               }
+               kfree(scsi_tg);
+       }
 
        spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
-       sz = min(sizeof(ioc->diag_trigger_scsi), count);
+
        memset(&ioc->diag_trigger_scsi, 0, sizeof(ioc->diag_trigger_scsi));
        memcpy(&ioc->diag_trigger_scsi, buf, sz);
        if (ioc->diag_trigger_scsi.ValidEntries > NUM_VALID_ENTRIES)
@@ -3698,11 +3758,30 @@ diag_trigger_mpi_store(struct device *cdev,
 {
        struct Scsi_Host *shost = class_to_shost(cdev);
        struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
+       struct SL_WH_MPI_TRIGGERS_T *mpi_tg;
        unsigned long flags;
        ssize_t sz;
+       bool set = 1;
 
-       spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
        sz = min(sizeof(struct SL_WH_MPI_TRIGGERS_T), count);
+       if (ioc->supports_trigger_pages) {
+               mpi_tg = kzalloc(sizeof(struct SL_WH_MPI_TRIGGERS_T),
+                   GFP_KERNEL);
+               if (!mpi_tg)
+                       return -ENOMEM;
+
+               memcpy(mpi_tg, buf, sz);
+               if (!mpi_tg->ValidEntries)
+                       set = 0;
+               if (mpt3sas_config_update_driver_trigger_pg4(ioc, mpi_tg,
+                   set)) {
+                       kfree(mpi_tg);
+                       return -EFAULT;
+               }
+               kfree(mpi_tg);
+       }
+
+       spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
        memset(&ioc->diag_trigger_mpi, 0,
            sizeof(ioc->diag_trigger_mpi));
        memcpy(&ioc->diag_trigger_mpi, buf, sz);