lkml.org 
[lkml]   [2020]   [Jul]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 01/15] scsi: megaraid_sas: use generic power management
    Date
    With legacy PM hooks, it was the responsibility of a driver to manage PCI
    states and also the device's power state. The generic approach is to let
    the PCI core handle the work.

    PCI core passes "struct device*" as an argument to the .suspend() and
    .resume() callbacks. As the .suspend() work with "struct instance*",
    extract it from "struct device*" using dev_get_drv_data().

    Driver was also using PCI helper functions like pci_save/restore_state(),
    pci_disable/enable_device(), pci_set_power_state() and pci_enable_wake().
    They should not be invoked by the driver.

    Compile-tested only.

    Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
    ---
    drivers/scsi/megaraid/megaraid_sas_base.c | 61 ++++++-----------------
    1 file changed, 16 insertions(+), 45 deletions(-)

    diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
    index 00668335c2af..4a6ee7778977 100644
    --- a/drivers/scsi/megaraid/megaraid_sas_base.c
    +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
    @@ -7539,25 +7539,21 @@ static void megasas_shutdown_controller(struct megasas_instance *instance,
    megasas_return_cmd(instance, cmd);
    }

    -#ifdef CONFIG_PM
    /**
    * megasas_suspend - driver suspend entry point
    - * @pdev: PCI device structure
    - * @state: PCI power state to suspend routine
    + * @dev: Device structure
    */
    -static int
    -megasas_suspend(struct pci_dev *pdev, pm_message_t state)
    +static int __maybe_unused
    +megasas_suspend(struct device *dev)
    {
    - struct megasas_instance *instance;
    -
    - instance = pci_get_drvdata(pdev);
    + struct megasas_instance *instance = dev_get_drvdata(dev);

    if (!instance)
    return 0;

    instance->unload = 1;

    - dev_info(&pdev->dev, "%s is called\n", __func__);
    + dev_info(dev, "%s is called\n", __func__);

    /* Shutdown SR-IOV heartbeat timer */
    if (instance->requestorId && !instance->skip_heartbeat_timer_del)
    @@ -7579,7 +7575,7 @@ megasas_suspend(struct pci_dev *pdev, pm_message_t state)

    tasklet_kill(&instance->isr_tasklet);

    - pci_set_drvdata(instance->pdev, instance);
    + dev_set_drvdata(dev, instance);
    instance->instancet->disable_intr(instance);

    megasas_destroy_irqs(instance);
    @@ -7587,48 +7583,28 @@ megasas_suspend(struct pci_dev *pdev, pm_message_t state)
    if (instance->msix_vectors)
    pci_free_irq_vectors(instance->pdev);

    - pci_save_state(pdev);
    - pci_disable_device(pdev);
    -
    - pci_set_power_state(pdev, pci_choose_state(pdev, state));
    -
    return 0;
    }

    /**
    * megasas_resume- driver resume entry point
    - * @pdev: PCI device structure
    + * @dev: Device structure
    */
    -static int
    -megasas_resume(struct pci_dev *pdev)
    +static int __maybe_unused
    +megasas_resume(struct device *dev)
    {
    int rval;
    struct Scsi_Host *host;
    - struct megasas_instance *instance;
    + struct megasas_instance *instance = dev_get_drvdata(dev);
    u32 status_reg;

    - instance = pci_get_drvdata(pdev);
    -
    if (!instance)
    return 0;

    host = instance->host;
    - pci_set_power_state(pdev, PCI_D0);
    - pci_enable_wake(pdev, PCI_D0, 0);
    - pci_restore_state(pdev);
    + device_wakeup_disable(dev);

    - dev_info(&pdev->dev, "%s is called\n", __func__);
    - /*
    - * PCI prepping: enable device set bus mastering and dma mask
    - */
    - rval = pci_enable_device_mem(pdev);
    -
    - if (rval) {
    - dev_err(&pdev->dev, "Enable device failed\n");
    - return rval;
    - }
    -
    - pci_set_master(pdev);
    + dev_info(dev, "%s is called\n", __func__);

    /*
    * We expect the FW state to be READY
    @@ -7754,14 +7730,8 @@ megasas_resume(struct pci_dev *pdev)
    fail_set_dma_mask:
    fail_ready_state:

    - pci_disable_device(pdev);
    -
    return -ENODEV;
    }
    -#else
    -#define megasas_suspend NULL
    -#define megasas_resume NULL
    -#endif

    static inline int
    megasas_wait_for_adapter_operational(struct megasas_instance *instance)
    @@ -7931,7 +7901,7 @@ static void megasas_detach_one(struct pci_dev *pdev)

    /**
    * megasas_shutdown - Shutdown entry point
    - * @device: Generic device structure
    + * @pdev: PCI device structure
    */
    static void megasas_shutdown(struct pci_dev *pdev)
    {
    @@ -8508,6 +8478,8 @@ static const struct file_operations megasas_mgmt_fops = {
    .llseek = noop_llseek,
    };

    +static SIMPLE_DEV_PM_OPS(megasas_pm_ops, megasas_suspend, megasas_resume);
    +
    /*
    * PCI hotplug support registration structure
    */
    @@ -8517,8 +8489,7 @@ static struct pci_driver megasas_pci_driver = {
    .id_table = megasas_pci_table,
    .probe = megasas_probe_one,
    .remove = megasas_detach_one,
    - .suspend = megasas_suspend,
    - .resume = megasas_resume,
    + .driver.pm = &megasas_pm_ops,
    .shutdown = megasas_shutdown,
    };

    --
    2.27.0
    \
     
     \ /
      Last update: 2020-07-20 15:37    [W:3.932 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site