s390/ap: remove power management code from ap bus and drivers
authorHarald Freudenberger <freude@linux.ibm.com>
Tue, 24 Mar 2020 16:30:39 +0000 (17:30 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Fri, 27 Mar 2020 09:22:47 +0000 (10:22 +0100)
The s390 power management support has been removed. So the
api registration and the suspend and resume callbacks and
all the code related to this for the ap bus and the ap drivers
is removed with this patch.

Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
drivers/s390/crypto/ap_bus.c
drivers/s390/crypto/ap_bus.h
drivers/s390/crypto/ap_queue.c
drivers/s390/crypto/zcrypt_cex2a.c
drivers/s390/crypto/zcrypt_cex2c.c
drivers/s390/crypto/zcrypt_cex4.c

index c413211..3506444 100644 (file)
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/err.h>
+#include <linux/freezer.h>
 #include <linux/interrupt.h>
 #include <linux/workqueue.h>
 #include <linux/slab.h>
 #include <linux/notifier.h>
 #include <linux/kthread.h>
 #include <linux/mutex.h>
-#include <linux/suspend.h>
 #include <asm/airq.h>
 #include <linux/atomic.h>
 #include <asm/isc.h>
@@ -103,16 +103,9 @@ static struct hrtimer ap_poll_timer;
  */
 static unsigned long long poll_timeout = 250000;
 
-/* Suspend flag */
-static int ap_suspend_flag;
 /* Maximum domain id */
 static int ap_max_domain_id;
-/*
- * Flag to check if domain was set through module parameter domain=. This is
- * important when supsend and resume is done in a z/VM environment where the
- * domain might change.
- */
-static int user_set_domain;
+
 static struct bus_type ap_bus_type;
 
 /* Adapter interrupt definitions */
@@ -386,8 +379,6 @@ void ap_request_timeout(struct timer_list *t)
 {
        struct ap_queue *aq = from_timer(aq, t, timeout);
 
-       if (ap_suspend_flag)
-               return;
        spin_lock_bh(&aq->lock);
        ap_wait(ap_sm_event(aq, AP_EVENT_TIMEOUT));
        spin_unlock_bh(&aq->lock);
@@ -401,8 +392,7 @@ void ap_request_timeout(struct timer_list *t)
  */
 static enum hrtimer_restart ap_poll_timeout(struct hrtimer *unused)
 {
-       if (!ap_suspend_flag)
-               tasklet_schedule(&ap_tasklet);
+       tasklet_schedule(&ap_tasklet);
        return HRTIMER_NORESTART;
 }
 
@@ -413,8 +403,7 @@ static enum hrtimer_restart ap_poll_timeout(struct hrtimer *unused)
 static void ap_interrupt_handler(struct airq_struct *airq, bool floating)
 {
        inc_irq_stat(IRQIO_APB);
-       if (!ap_suspend_flag)
-               tasklet_schedule(&ap_tasklet);
+       tasklet_schedule(&ap_tasklet);
 }
 
 /**
@@ -486,7 +475,7 @@ static int ap_poll_thread(void *data)
        while (!kthread_should_stop()) {
                add_wait_queue(&ap_poll_wait, &wait);
                set_current_state(TASK_INTERRUPTIBLE);
-               if (ap_suspend_flag || !ap_pending_requests()) {
+               if (!ap_pending_requests()) {
                        schedule();
                        try_to_freeze();
                }
@@ -587,33 +576,6 @@ static int ap_uevent(struct device *dev, struct kobj_uevent_env *env)
        return retval;
 }
 
-static void ap_bus_suspend(void)
-{
-       AP_DBF(DBF_DEBUG, "%s running\n", __func__);
-
-       ap_suspend_flag = 1;
-       /*
-        * Disable scanning for devices, thus we do not want to scan
-        * for them after removing.
-        */
-       flush_work(&ap_scan_work);
-       tasklet_disable(&ap_tasklet);
-}
-
-static int __ap_card_devices_unregister(struct device *dev, void *dummy)
-{
-       if (is_card_dev(dev))
-               device_unregister(dev);
-       return 0;
-}
-
-static int __ap_queue_devices_unregister(struct device *dev, void *dummy)
-{
-       if (is_queue_dev(dev))
-               device_unregister(dev);
-       return 0;
-}
-
 static int __ap_queue_devices_with_id_unregister(struct device *dev, void *data)
 {
        if (is_queue_dev(dev) &&
@@ -622,60 +584,6 @@ static int __ap_queue_devices_with_id_unregister(struct device *dev, void *data)
        return 0;
 }
 
-static void ap_bus_resume(void)
-{
-       int rc;
-
-       AP_DBF(DBF_DEBUG, "%s running\n", __func__);
-
-       /* remove all queue devices */
-       bus_for_each_dev(&ap_bus_type, NULL, NULL,
-                        __ap_queue_devices_unregister);
-       /* remove all card devices */
-       bus_for_each_dev(&ap_bus_type, NULL, NULL,
-                        __ap_card_devices_unregister);
-
-       /* Reset thin interrupt setting */
-       if (ap_interrupts_available() && !ap_using_interrupts()) {
-               rc = register_adapter_interrupt(&ap_airq);
-               ap_airq_flag = (rc == 0);
-       }
-       if (!ap_interrupts_available() && ap_using_interrupts()) {
-               unregister_adapter_interrupt(&ap_airq);
-               ap_airq_flag = 0;
-       }
-       /* Reset domain */
-       if (!user_set_domain)
-               ap_domain_index = -1;
-       /* Get things going again */
-       ap_suspend_flag = 0;
-       if (ap_airq_flag)
-               xchg(ap_airq.lsi_ptr, 0);
-       tasklet_enable(&ap_tasklet);
-       queue_work(system_long_wq, &ap_scan_work);
-}
-
-static int ap_power_event(struct notifier_block *this, unsigned long event,
-                         void *ptr)
-{
-       switch (event) {
-       case PM_HIBERNATION_PREPARE:
-       case PM_SUSPEND_PREPARE:
-               ap_bus_suspend();
-               break;
-       case PM_POST_HIBERNATION:
-       case PM_POST_SUSPEND:
-               ap_bus_resume();
-               break;
-       default:
-               break;
-       }
-       return NOTIFY_DONE;
-}
-static struct notifier_block ap_power_notifier = {
-       .notifier_call = ap_power_event,
-};
-
 static struct bus_type ap_bus_type = {
        .name = "ap",
        .match = &ap_bus_match,
@@ -852,8 +760,6 @@ EXPORT_SYMBOL(ap_driver_unregister);
 
 void ap_bus_force_rescan(void)
 {
-       if (ap_suspend_flag)
-               return;
        /* processing a asynchronous bus rescan */
        del_timer(&ap_config_timer);
        queue_work(system_long_wq, &ap_scan_work);
@@ -1546,8 +1452,6 @@ static void ap_scan_bus(struct work_struct *unused)
 
 static void ap_config_timeout(struct timer_list *unused)
 {
-       if (ap_suspend_flag)
-               return;
        queue_work(system_long_wq, &ap_scan_work);
 }
 
@@ -1620,11 +1524,6 @@ static int __init ap_module_init(void)
                        ap_domain_index);
                ap_domain_index = -1;
        }
-       /* In resume callback we need to know if the user had set the domain.
-        * If so, we can not just reset it.
-        */
-       if (ap_domain_index >= 0)
-               user_set_domain = 1;
 
        if (ap_interrupts_available()) {
                rc = register_adapter_interrupt(&ap_airq);
@@ -1667,17 +1566,11 @@ static int __init ap_module_init(void)
                        goto out_work;
        }
 
-       rc = register_pm_notifier(&ap_power_notifier);
-       if (rc)
-               goto out_pm;
-
        queue_work(system_long_wq, &ap_scan_work);
        initialised = true;
 
        return 0;
 
-out_pm:
-       ap_poll_thread_stop();
 out_work:
        hrtimer_cancel(&ap_poll_timer);
        root_device_unregister(ap_root_device);
index 4348fdf..8e8e37b 100644 (file)
@@ -91,7 +91,6 @@ enum ap_state {
        AP_STATE_IDLE,
        AP_STATE_WORKING,
        AP_STATE_QUEUE_FULL,
-       AP_STATE_SUSPEND_WAIT,
        AP_STATE_REMOVE,        /* about to be removed from driver */
        AP_STATE_UNBOUND,       /* momentary not bound to a driver */
        AP_STATE_BORKED,        /* broken */
@@ -136,8 +135,6 @@ struct ap_driver {
 
        int (*probe)(struct ap_device *);
        void (*remove)(struct ap_device *);
-       void (*suspend)(struct ap_device *);
-       void (*resume)(struct ap_device *);
 };
 
 #define to_ap_drv(x) container_of((x), struct ap_driver, driver)
@@ -259,8 +256,6 @@ void ap_queue_init_reply(struct ap_queue *aq, struct ap_message *ap_msg);
 struct ap_queue *ap_queue_create(ap_qid_t qid, int device_type);
 void ap_queue_prepare_remove(struct ap_queue *aq);
 void ap_queue_remove(struct ap_queue *aq);
-void ap_queue_suspend(struct ap_device *ap_dev);
-void ap_queue_resume(struct ap_device *ap_dev);
 void ap_queue_init_state(struct ap_queue *aq);
 
 struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type,
index 9cb997c..0eaf1d0 100644 (file)
@@ -201,31 +201,6 @@ static enum ap_wait ap_sm_read(struct ap_queue *aq)
 }
 
 /**
- * ap_sm_suspend_read(): Receive pending reply messages from an AP queue
- * without changing the device state in between. In suspend mode we don't
- * allow sending new requests, therefore just fetch pending replies.
- * @aq: pointer to the AP queue
- *
- * Returns AP_WAIT_NONE or AP_WAIT_AGAIN
- */
-static enum ap_wait ap_sm_suspend_read(struct ap_queue *aq)
-{
-       struct ap_queue_status status;
-
-       if (!aq->reply)
-               return AP_WAIT_NONE;
-       status = ap_sm_recv(aq);
-       switch (status.response_code) {
-       case AP_RESPONSE_NORMAL:
-               if (aq->queue_count > 0)
-                       return AP_WAIT_AGAIN;
-               fallthrough;
-       default:
-               return AP_WAIT_NONE;
-       }
-}
-
-/**
  * ap_sm_write(): Send messages from the request queue to an AP queue.
  * @aq: pointer to the AP queue
  *
@@ -417,10 +392,6 @@ static ap_func_t *ap_jumptable[NR_AP_STATES][NR_AP_EVENTS] = {
                [AP_EVENT_POLL] = ap_sm_read,
                [AP_EVENT_TIMEOUT] = ap_sm_reset,
        },
-       [AP_STATE_SUSPEND_WAIT] = {
-               [AP_EVENT_POLL] = ap_sm_suspend_read,
-               [AP_EVENT_TIMEOUT] = ap_sm_nop,
-       },
        [AP_STATE_REMOVE] = {
                [AP_EVENT_POLL] = ap_sm_nop,
                [AP_EVENT_TIMEOUT] = ap_sm_nop,
@@ -450,28 +421,6 @@ enum ap_wait ap_sm_event_loop(struct ap_queue *aq, enum ap_event event)
 }
 
 /*
- * Power management for queue devices
- */
-void ap_queue_suspend(struct ap_device *ap_dev)
-{
-       struct ap_queue *aq = to_ap_queue(&ap_dev->device);
-
-       /* Poll on the device until all requests are finished. */
-       spin_lock_bh(&aq->lock);
-       aq->state = AP_STATE_SUSPEND_WAIT;
-       while (ap_sm_event(aq, AP_EVENT_POLL) != AP_WAIT_NONE)
-               ;
-       aq->state = AP_STATE_BORKED;
-       spin_unlock_bh(&aq->lock);
-}
-EXPORT_SYMBOL(ap_queue_suspend);
-
-void ap_queue_resume(struct ap_device *ap_dev)
-{
-}
-EXPORT_SYMBOL(ap_queue_resume);
-
-/*
  * AP queue related attributes.
  */
 static ssize_t request_count_show(struct device *dev,
index 7cbb384..b447f3e 100644 (file)
@@ -204,8 +204,6 @@ static void zcrypt_cex2a_queue_remove(struct ap_device *ap_dev)
 static struct ap_driver zcrypt_cex2a_queue_driver = {
        .probe = zcrypt_cex2a_queue_probe,
        .remove = zcrypt_cex2a_queue_remove,
-       .suspend = ap_queue_suspend,
-       .resume = ap_queue_resume,
        .ids = zcrypt_cex2a_queue_ids,
        .flags = AP_DRIVER_FLAG_DEFAULT,
 };
index c78c0d1..2664401 100644 (file)
@@ -260,8 +260,6 @@ static void zcrypt_cex2c_queue_remove(struct ap_device *ap_dev)
 static struct ap_driver zcrypt_cex2c_queue_driver = {
        .probe = zcrypt_cex2c_queue_probe,
        .remove = zcrypt_cex2c_queue_remove,
-       .suspend = ap_queue_suspend,
-       .resume = ap_queue_resume,
        .ids = zcrypt_cex2c_queue_ids,
        .flags = AP_DRIVER_FLAG_DEFAULT,
 };
index 8cfb1e2..cdaa834 100644 (file)
@@ -656,8 +656,6 @@ static void zcrypt_cex4_queue_remove(struct ap_device *ap_dev)
 static struct ap_driver zcrypt_cex4_queue_driver = {
        .probe = zcrypt_cex4_queue_probe,
        .remove = zcrypt_cex4_queue_remove,
-       .suspend = ap_queue_suspend,
-       .resume = ap_queue_resume,
        .ids = zcrypt_cex4_queue_ids,
        .flags = AP_DRIVER_FLAG_DEFAULT,
 };