s390/ap: move receive callback to message struct
authorHolger Dengler <hd@linux.vnet.ibm.com>
Wed, 16 May 2012 12:08:22 +0000 (14:08 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 16 May 2012 12:42:52 +0000 (14:42 +0200)
Move the receive callback from zdev_driver to ap_message structure to
get a more flexible asynchronous ap message handling.

Signed-off-by: Holger Dengler <hd@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/crypto/ap_bus.c
drivers/s390/crypto/ap_bus.h
drivers/s390/crypto/zcrypt_cex2a.c
drivers/s390/crypto/zcrypt_pcica.c
drivers/s390/crypto/zcrypt_pcicc.c
drivers/s390/crypto/zcrypt_pcixcc.c

index 7e9a72eb2fe0f023b6510cd1170ba0d3b36030da..cd2103c1d9155ccaf8d381fcf048fe742cc55e2b 100644 (file)
@@ -836,12 +836,12 @@ static void __ap_flush_queue(struct ap_device *ap_dev)
        list_for_each_entry_safe(ap_msg, next, &ap_dev->pendingq, list) {
                list_del_init(&ap_msg->list);
                ap_dev->pendingq_count--;
-               ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
+               ap_msg->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
        }
        list_for_each_entry_safe(ap_msg, next, &ap_dev->requestq, list) {
                list_del_init(&ap_msg->list);
                ap_dev->requestq_count--;
-               ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
+               ap_msg->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
        }
 }
 
@@ -1329,7 +1329,7 @@ static int ap_poll_read(struct ap_device *ap_dev, unsigned long *flags)
                                continue;
                        list_del_init(&ap_msg->list);
                        ap_dev->pendingq_count--;
-                       ap_dev->drv->receive(ap_dev, ap_msg, ap_dev->reply);
+                       ap_msg->receive(ap_dev, ap_msg, ap_dev->reply);
                        break;
                }
                if (ap_dev->queue_count > 0)
@@ -1450,10 +1450,10 @@ static int __ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_ms
                        return -EBUSY;
                case AP_RESPONSE_REQ_FAC_NOT_INST:
                case AP_RESPONSE_MESSAGE_TOO_BIG:
-                       ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-EINVAL));
+                       ap_msg->receive(ap_dev, ap_msg, ERR_PTR(-EINVAL));
                        return -EINVAL;
                default:        /* Device is gone. */
-                       ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
+                       ap_msg->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
                        return -ENODEV;
                }
        } else {
@@ -1471,6 +1471,10 @@ void ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg)
        unsigned long flags;
        int rc;
 
+       /* For asynchronous message handling a valid receive-callback
+        * is required. */
+       BUG_ON(!ap_msg->receive);
+
        spin_lock_bh(&ap_dev->lock);
        if (!ap_dev->unregistered) {
                /* Make room on the queue by polling for finished requests. */
@@ -1482,7 +1486,7 @@ void ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg)
                if (rc == -ENODEV)
                        ap_dev->unregistered = 1;
        } else {
-               ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
+               ap_msg->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV));
                rc = -ENODEV;
        }
        spin_unlock_bh(&ap_dev->lock);
index d960a6309eecb375aef76de97c1dd1860375ec2b..726fc65809d84a3d2437327496ded59c5d4e81e9 100644 (file)
@@ -136,9 +136,6 @@ struct ap_driver {
 
        int (*probe)(struct ap_device *);
        void (*remove)(struct ap_device *);
-       /* receive is called from tasklet context */
-       void (*receive)(struct ap_device *, struct ap_message *,
-                       struct ap_message *);
        int request_timeout;            /* request timeout in jiffies */
 };
 
@@ -183,6 +180,9 @@ struct ap_message {
 
        void *private;                  /* ap driver private pointer. */
        unsigned int special:1;         /* Used for special commands. */
+       /* receive is called from tasklet context */
+       void (*receive)(struct ap_device *, struct ap_message *,
+                       struct ap_message *);
 };
 
 #define AP_DEVICE(dt)                                  \
@@ -199,6 +199,7 @@ static inline void ap_init_message(struct ap_message *ap_msg)
        ap_msg->psmid = 0;
        ap_msg->length = 0;
        ap_msg->special = 0;
+       ap_msg->receive = NULL;
 }
 
 /*
index 08428672816665627dbaa2f2d696e9d93dc7b2ac..46812440425acca842b3d5837e81481cfd526bfc 100644 (file)
@@ -77,7 +77,6 @@ static void zcrypt_cex2a_receive(struct ap_device *, struct ap_message *,
 static struct ap_driver zcrypt_cex2a_driver = {
        .probe = zcrypt_cex2a_probe,
        .remove = zcrypt_cex2a_remove,
-       .receive = zcrypt_cex2a_receive,
        .ids = zcrypt_cex2a_ids,
        .request_timeout = CEX2A_CLEANUP_TIME,
 };
@@ -349,6 +348,7 @@ static long zcrypt_cex2a_modexpo(struct zcrypt_device *zdev,
                ap_msg.message = kmalloc(CEX3A_MAX_MESSAGE_SIZE, GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_cex2a_receive;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
        ap_msg.private = &work;
@@ -390,6 +390,7 @@ static long zcrypt_cex2a_modexpo_crt(struct zcrypt_device *zdev,
                ap_msg.message = kmalloc(CEX3A_MAX_MESSAGE_SIZE, GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_cex2a_receive;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
        ap_msg.private = &work;
index 0effca925451156379c6f0f73d56b7b68206d131..ad7951c21b794dff585eec537bd01c87b395ed23 100644 (file)
@@ -67,7 +67,6 @@ static void zcrypt_pcica_receive(struct ap_device *, struct ap_message *,
 static struct ap_driver zcrypt_pcica_driver = {
        .probe = zcrypt_pcica_probe,
        .remove = zcrypt_pcica_remove,
-       .receive = zcrypt_pcica_receive,
        .ids = zcrypt_pcica_ids,
        .request_timeout = PCICA_CLEANUP_TIME,
 };
@@ -284,6 +283,7 @@ static long zcrypt_pcica_modexpo(struct zcrypt_device *zdev,
        ap_msg.message = kmalloc(PCICA_MAX_MESSAGE_SIZE, GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_pcica_receive;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
        ap_msg.private = &work;
@@ -322,6 +322,7 @@ static long zcrypt_pcica_modexpo_crt(struct zcrypt_device *zdev,
        ap_msg.message = kmalloc(PCICA_MAX_MESSAGE_SIZE, GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_pcica_receive;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
        ap_msg.private = &work;
index f9523c0cc8d2a4b0bd303b244026c53d0efcca5a..e5dd335fda53b3e46f36faed6d49e717ce5765ee 100644 (file)
@@ -79,7 +79,6 @@ static void zcrypt_pcicc_receive(struct ap_device *, struct ap_message *,
 static struct ap_driver zcrypt_pcicc_driver = {
        .probe = zcrypt_pcicc_probe,
        .remove = zcrypt_pcicc_remove,
-       .receive = zcrypt_pcicc_receive,
        .ids = zcrypt_pcicc_ids,
        .request_timeout = PCICC_CLEANUP_TIME,
 };
@@ -488,6 +487,7 @@ static long zcrypt_pcicc_modexpo(struct zcrypt_device *zdev,
        ap_msg.message = (void *) get_zeroed_page(GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_pcicc_receive;
        ap_msg.length = PAGE_SIZE;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
@@ -527,6 +527,7 @@ static long zcrypt_pcicc_modexpo_crt(struct zcrypt_device *zdev,
        ap_msg.message = (void *) get_zeroed_page(GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_pcicc_receive;
        ap_msg.length = PAGE_SIZE;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
index cf1cbd4747f4d1f234695bc27bd147c32ee4f5b8..f7cc43401816d503e33ec3fb75b628c60b9ad400 100644 (file)
@@ -89,7 +89,6 @@ static void zcrypt_pcixcc_receive(struct ap_device *, struct ap_message *,
 static struct ap_driver zcrypt_pcixcc_driver = {
        .probe = zcrypt_pcixcc_probe,
        .remove = zcrypt_pcixcc_remove,
-       .receive = zcrypt_pcixcc_receive,
        .ids = zcrypt_pcixcc_ids,
        .request_timeout = PCIXCC_CLEANUP_TIME,
 };
@@ -698,6 +697,7 @@ static long zcrypt_pcixcc_modexpo(struct zcrypt_device *zdev,
        ap_msg.message = (void *) get_zeroed_page(GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_pcixcc_receive;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
        ap_msg.private = &resp_type;
@@ -738,6 +738,7 @@ static long zcrypt_pcixcc_modexpo_crt(struct zcrypt_device *zdev,
        ap_msg.message = (void *) get_zeroed_page(GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_pcixcc_receive;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
        ap_msg.private = &resp_type;
@@ -778,6 +779,7 @@ static long zcrypt_pcixcc_send_cprb(struct zcrypt_device *zdev,
        ap_msg.message = kmalloc(PCIXCC_MAX_XCRB_MESSAGE_SIZE, GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_pcixcc_receive;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
        ap_msg.private = &resp_type;
@@ -818,6 +820,7 @@ static long zcrypt_pcixcc_rng(struct zcrypt_device *zdev,
        ap_msg.message = kmalloc(PCIXCC_MAX_XCRB_MESSAGE_SIZE, GFP_KERNEL);
        if (!ap_msg.message)
                return -ENOMEM;
+       ap_msg.receive = zcrypt_pcixcc_receive;
        ap_msg.psmid = (((unsigned long long) current->pid) << 32) +
                                atomic_inc_return(&zcrypt_step);
        ap_msg.private = &resp_type;