Skip to content

Commit 9211faa

Browse files
suganathprabu0512martinkpetersen
authored andcommitted
scsi: mpt3sas: Update persistent trigger pages from sysfs interface
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>
1 parent 81d3f50 commit 9211faa

2 files changed

Lines changed: 85 additions & 6 deletions

File tree

drivers/scsi/mpt3sas/mpt3sas_base.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@
7777
#define MPT3SAS_DRIVER_NAME "mpt3sas"
7878
#define MPT3SAS_AUTHOR "Avago Technologies <MPT-FusionLinux.pdl@avagotech.com>"
7979
#define MPT3SAS_DESCRIPTION "LSI MPT Fusion SAS 3.0 Device Driver"
80-
#define MPT3SAS_DRIVER_VERSION "39.100.00.00"
81-
#define MPT3SAS_MAJOR_VERSION 39
80+
#define MPT3SAS_DRIVER_VERSION "40.100.00.00"
81+
#define MPT3SAS_MAJOR_VERSION 40
8282
#define MPT3SAS_MINOR_VERSION 100
8383
#define MPT3SAS_BUILD_VERSION 0
8484
#define MPT3SAS_RELEASE_VERSION 00

drivers/scsi/mpt3sas/mpt3sas_ctl.c

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3533,11 +3533,31 @@ diag_trigger_master_store(struct device *cdev,
35333533
{
35343534
struct Scsi_Host *shost = class_to_shost(cdev);
35353535
struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
3536+
struct SL_WH_MASTER_TRIGGER_T *master_tg;
35363537
unsigned long flags;
35373538
ssize_t rc;
3539+
bool set = 1;
35383540

3539-
spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
35403541
rc = min(sizeof(struct SL_WH_MASTER_TRIGGER_T), count);
3542+
3543+
if (ioc->supports_trigger_pages) {
3544+
master_tg = kzalloc(sizeof(struct SL_WH_MASTER_TRIGGER_T),
3545+
GFP_KERNEL);
3546+
if (!master_tg)
3547+
return -ENOMEM;
3548+
3549+
memcpy(master_tg, buf, rc);
3550+
if (!master_tg->MasterData)
3551+
set = 0;
3552+
if (mpt3sas_config_update_driver_trigger_pg1(ioc, master_tg,
3553+
set)) {
3554+
kfree(master_tg);
3555+
return -EFAULT;
3556+
}
3557+
kfree(master_tg);
3558+
}
3559+
3560+
spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
35413561
memset(&ioc->diag_trigger_master, 0,
35423562
sizeof(struct SL_WH_MASTER_TRIGGER_T));
35433563
memcpy(&ioc->diag_trigger_master, buf, rc);
@@ -3589,11 +3609,31 @@ diag_trigger_event_store(struct device *cdev,
35893609
{
35903610
struct Scsi_Host *shost = class_to_shost(cdev);
35913611
struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
3612+
struct SL_WH_EVENT_TRIGGERS_T *event_tg;
35923613
unsigned long flags;
35933614
ssize_t sz;
3615+
bool set = 1;
35943616

3595-
spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
35963617
sz = min(sizeof(struct SL_WH_EVENT_TRIGGERS_T), count);
3618+
if (ioc->supports_trigger_pages) {
3619+
event_tg = kzalloc(sizeof(struct SL_WH_EVENT_TRIGGERS_T),
3620+
GFP_KERNEL);
3621+
if (!event_tg)
3622+
return -ENOMEM;
3623+
3624+
memcpy(event_tg, buf, sz);
3625+
if (!event_tg->ValidEntries)
3626+
set = 0;
3627+
if (mpt3sas_config_update_driver_trigger_pg2(ioc, event_tg,
3628+
set)) {
3629+
kfree(event_tg);
3630+
return -EFAULT;
3631+
}
3632+
kfree(event_tg);
3633+
}
3634+
3635+
spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
3636+
35973637
memset(&ioc->diag_trigger_event, 0,
35983638
sizeof(struct SL_WH_EVENT_TRIGGERS_T));
35993639
memcpy(&ioc->diag_trigger_event, buf, sz);
@@ -3644,11 +3684,31 @@ diag_trigger_scsi_store(struct device *cdev,
36443684
{
36453685
struct Scsi_Host *shost = class_to_shost(cdev);
36463686
struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
3687+
struct SL_WH_SCSI_TRIGGERS_T *scsi_tg;
36473688
unsigned long flags;
36483689
ssize_t sz;
3690+
bool set = 1;
3691+
3692+
sz = min(sizeof(struct SL_WH_SCSI_TRIGGERS_T), count);
3693+
if (ioc->supports_trigger_pages) {
3694+
scsi_tg = kzalloc(sizeof(struct SL_WH_SCSI_TRIGGERS_T),
3695+
GFP_KERNEL);
3696+
if (!scsi_tg)
3697+
return -ENOMEM;
3698+
3699+
memcpy(scsi_tg, buf, sz);
3700+
if (!scsi_tg->ValidEntries)
3701+
set = 0;
3702+
if (mpt3sas_config_update_driver_trigger_pg3(ioc, scsi_tg,
3703+
set)) {
3704+
kfree(scsi_tg);
3705+
return -EFAULT;
3706+
}
3707+
kfree(scsi_tg);
3708+
}
36493709

36503710
spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
3651-
sz = min(sizeof(ioc->diag_trigger_scsi), count);
3711+
36523712
memset(&ioc->diag_trigger_scsi, 0, sizeof(ioc->diag_trigger_scsi));
36533713
memcpy(&ioc->diag_trigger_scsi, buf, sz);
36543714
if (ioc->diag_trigger_scsi.ValidEntries > NUM_VALID_ENTRIES)
@@ -3698,11 +3758,30 @@ diag_trigger_mpi_store(struct device *cdev,
36983758
{
36993759
struct Scsi_Host *shost = class_to_shost(cdev);
37003760
struct MPT3SAS_ADAPTER *ioc = shost_priv(shost);
3761+
struct SL_WH_MPI_TRIGGERS_T *mpi_tg;
37013762
unsigned long flags;
37023763
ssize_t sz;
3764+
bool set = 1;
37033765

3704-
spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
37053766
sz = min(sizeof(struct SL_WH_MPI_TRIGGERS_T), count);
3767+
if (ioc->supports_trigger_pages) {
3768+
mpi_tg = kzalloc(sizeof(struct SL_WH_MPI_TRIGGERS_T),
3769+
GFP_KERNEL);
3770+
if (!mpi_tg)
3771+
return -ENOMEM;
3772+
3773+
memcpy(mpi_tg, buf, sz);
3774+
if (!mpi_tg->ValidEntries)
3775+
set = 0;
3776+
if (mpt3sas_config_update_driver_trigger_pg4(ioc, mpi_tg,
3777+
set)) {
3778+
kfree(mpi_tg);
3779+
return -EFAULT;
3780+
}
3781+
kfree(mpi_tg);
3782+
}
3783+
3784+
spin_lock_irqsave(&ioc->diag_trigger_lock, flags);
37063785
memset(&ioc->diag_trigger_mpi, 0,
37073786
sizeof(ioc->diag_trigger_mpi));
37083787
memcpy(&ioc->diag_trigger_mpi, buf, sz);

0 commit comments

Comments
 (0)