Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Suganath Prabu S and committed by
Martin K. Petersen
9211faa3 81d3f500

+85 -6
+2 -2
drivers/scsi/mpt3sas/mpt3sas_base.h
··· 77 77 #define MPT3SAS_DRIVER_NAME "mpt3sas" 78 78 #define MPT3SAS_AUTHOR "Avago Technologies <MPT-FusionLinux.pdl@avagotech.com>" 79 79 #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 82 82 #define MPT3SAS_MINOR_VERSION 100 83 83 #define MPT3SAS_BUILD_VERSION 0 84 84 #define MPT3SAS_RELEASE_VERSION 00
+83 -4
drivers/scsi/mpt3sas/mpt3sas_ctl.c
··· 3533 3533 { 3534 3534 struct Scsi_Host *shost = class_to_shost(cdev); 3535 3535 struct MPT3SAS_ADAPTER *ioc = shost_priv(shost); 3536 + struct SL_WH_MASTER_TRIGGER_T *master_tg; 3536 3537 unsigned long flags; 3537 3538 ssize_t rc; 3539 + bool set = 1; 3540 + 3541 + 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 + } 3538 3559 3539 3560 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); 3540 - rc = min(sizeof(struct SL_WH_MASTER_TRIGGER_T), count); 3541 3561 memset(&ioc->diag_trigger_master, 0, 3542 3562 sizeof(struct SL_WH_MASTER_TRIGGER_T)); 3543 3563 memcpy(&ioc->diag_trigger_master, buf, rc); ··· 3609 3589 { 3610 3590 struct Scsi_Host *shost = class_to_shost(cdev); 3611 3591 struct MPT3SAS_ADAPTER *ioc = shost_priv(shost); 3592 + struct SL_WH_EVENT_TRIGGERS_T *event_tg; 3612 3593 unsigned long flags; 3613 3594 ssize_t sz; 3595 + bool set = 1; 3596 + 3597 + sz = min(sizeof(struct SL_WH_EVENT_TRIGGERS_T), count); 3598 + if (ioc->supports_trigger_pages) { 3599 + event_tg = kzalloc(sizeof(struct SL_WH_EVENT_TRIGGERS_T), 3600 + GFP_KERNEL); 3601 + if (!event_tg) 3602 + return -ENOMEM; 3603 + 3604 + memcpy(event_tg, buf, sz); 3605 + if (!event_tg->ValidEntries) 3606 + set = 0; 3607 + if (mpt3sas_config_update_driver_trigger_pg2(ioc, event_tg, 3608 + set)) { 3609 + kfree(event_tg); 3610 + return -EFAULT; 3611 + } 3612 + kfree(event_tg); 3613 + } 3614 3614 3615 3615 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); 3616 - sz = min(sizeof(struct SL_WH_EVENT_TRIGGERS_T), count); 3616 + 3617 3617 memset(&ioc->diag_trigger_event, 0, 3618 3618 sizeof(struct SL_WH_EVENT_TRIGGERS_T)); 3619 3619 memcpy(&ioc->diag_trigger_event, buf, sz); ··· 3684 3644 { 3685 3645 struct Scsi_Host *shost = class_to_shost(cdev); 3686 3646 struct MPT3SAS_ADAPTER *ioc = shost_priv(shost); 3647 + struct SL_WH_SCSI_TRIGGERS_T *scsi_tg; 3687 3648 unsigned long flags; 3688 3649 ssize_t sz; 3650 + bool set = 1; 3651 + 3652 + sz = min(sizeof(struct SL_WH_SCSI_TRIGGERS_T), count); 3653 + if (ioc->supports_trigger_pages) { 3654 + scsi_tg = kzalloc(sizeof(struct SL_WH_SCSI_TRIGGERS_T), 3655 + GFP_KERNEL); 3656 + if (!scsi_tg) 3657 + return -ENOMEM; 3658 + 3659 + memcpy(scsi_tg, buf, sz); 3660 + if (!scsi_tg->ValidEntries) 3661 + set = 0; 3662 + if (mpt3sas_config_update_driver_trigger_pg3(ioc, scsi_tg, 3663 + set)) { 3664 + kfree(scsi_tg); 3665 + return -EFAULT; 3666 + } 3667 + kfree(scsi_tg); 3668 + } 3689 3669 3690 3670 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); 3691 - sz = min(sizeof(ioc->diag_trigger_scsi), count); 3671 + 3692 3672 memset(&ioc->diag_trigger_scsi, 0, sizeof(ioc->diag_trigger_scsi)); 3693 3673 memcpy(&ioc->diag_trigger_scsi, buf, sz); 3694 3674 if (ioc->diag_trigger_scsi.ValidEntries > NUM_VALID_ENTRIES) ··· 3758 3698 { 3759 3699 struct Scsi_Host *shost = class_to_shost(cdev); 3760 3700 struct MPT3SAS_ADAPTER *ioc = shost_priv(shost); 3701 + struct SL_WH_MPI_TRIGGERS_T *mpi_tg; 3761 3702 unsigned long flags; 3762 3703 ssize_t sz; 3704 + bool set = 1; 3705 + 3706 + sz = min(sizeof(struct SL_WH_MPI_TRIGGERS_T), count); 3707 + if (ioc->supports_trigger_pages) { 3708 + mpi_tg = kzalloc(sizeof(struct SL_WH_MPI_TRIGGERS_T), 3709 + GFP_KERNEL); 3710 + if (!mpi_tg) 3711 + return -ENOMEM; 3712 + 3713 + memcpy(mpi_tg, buf, sz); 3714 + if (!mpi_tg->ValidEntries) 3715 + set = 0; 3716 + if (mpt3sas_config_update_driver_trigger_pg4(ioc, mpi_tg, 3717 + set)) { 3718 + kfree(mpi_tg); 3719 + return -EFAULT; 3720 + } 3721 + kfree(mpi_tg); 3722 + } 3763 3723 3764 3724 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); 3765 - sz = min(sizeof(struct SL_WH_MPI_TRIGGERS_T), count); 3766 3725 memset(&ioc->diag_trigger_mpi, 0, 3767 3726 sizeof(ioc->diag_trigger_mpi)); 3768 3727 memcpy(&ioc->diag_trigger_mpi, buf, sz);