@@ -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