]> Pileus Git - ~andy/linux/blobdiff - drivers/s390/crypto/zcrypt_cex2a.c
[S390] zcrypt: use definitions for cex3
[~andy/linux] / drivers / s390 / crypto / zcrypt_cex2a.c
index d25b6dfed2e06426474216bada0f8c7c5e0056e1..a90b76079fa9b3847273c29a4486bf1b59ef9a8b 100644 (file)
 
 #define CEX2A_MIN_MOD_SIZE       1     /*    8 bits    */
 #define CEX2A_MAX_MOD_SIZE     256     /* 2048 bits    */
+#define CEX3A_MIN_MOD_SIZE     CEX2A_MIN_MOD_SIZE
+#define CEX3A_MAX_MOD_SIZE     CEX2A_MAX_MOD_SIZE
 
 #define CEX2A_SPEED_RATING     970
+#define CEX3A_SPEED_RATING     1100
 
 #define CEX2A_MAX_MESSAGE_SIZE 0x390   /* sizeof(struct type50_crb2_msg)    */
 #define CEX2A_MAX_RESPONSE_SIZE 0x110  /* max outputdatalength + type80_hdr */
 
+#define CEX3A_MAX_MESSAGE_SIZE CEX2A_MAX_MESSAGE_SIZE
+#define CEX3A_MAX_RESPONSE_SIZE        CEX2A_MAX_RESPONSE_SIZE
+
 #define CEX2A_CLEANUP_TIME     (15*HZ)
+#define CEX3A_CLEANUP_TIME     CEX2A_CLEANUP_TIME
 
 static struct ap_device_id zcrypt_cex2a_ids[] = {
        { AP_DEVICE(AP_DEVICE_TYPE_CEX2A) },
@@ -375,31 +382,45 @@ static struct zcrypt_ops zcrypt_cex2a_ops = {
  */
 static int zcrypt_cex2a_probe(struct ap_device *ap_dev)
 {
-       struct zcrypt_device *zdev;
-       int rc;
-
-       zdev = zcrypt_device_alloc(CEX2A_MAX_RESPONSE_SIZE);
-       if (!zdev)
-               return -ENOMEM;
-       zdev->ap_dev = ap_dev;
-       zdev->ops = &zcrypt_cex2a_ops;
-       zdev->online = 1;
-       zdev->user_space_type = ZCRYPT_CEX2A;
-       zdev->type_string = "CEX2A";
-       zdev->min_mod_size = CEX2A_MIN_MOD_SIZE;
-       zdev->max_mod_size = CEX2A_MAX_MOD_SIZE;
-       zdev->short_crt = 1;
-       zdev->speed_rating = CEX2A_SPEED_RATING;
-       ap_dev->reply = &zdev->reply;
-       ap_dev->private = zdev;
-       rc = zcrypt_device_register(zdev);
-       if (rc)
-               goto out_free;
-       return 0;
-
-out_free:
-       ap_dev->private = NULL;
-       zcrypt_device_free(zdev);
+       struct zcrypt_device *zdev = NULL;
+       int rc = 0;
+
+       switch (ap_dev->device_type) {
+       case AP_DEVICE_TYPE_CEX2A:
+               zdev = zcrypt_device_alloc(CEX2A_MAX_RESPONSE_SIZE);
+               if (!zdev)
+                       return -ENOMEM;
+               zdev->user_space_type = ZCRYPT_CEX2A;
+               zdev->type_string = "CEX2A";
+               zdev->min_mod_size = CEX2A_MIN_MOD_SIZE;
+               zdev->max_mod_size = CEX2A_MAX_MOD_SIZE;
+               zdev->short_crt = 1;
+               zdev->speed_rating = CEX2A_SPEED_RATING;
+               break;
+       case AP_DEVICE_TYPE_CEX3A:
+               zdev = zcrypt_device_alloc(CEX3A_MAX_RESPONSE_SIZE);
+               if (!zdev)
+                       return -ENOMEM;
+               zdev->user_space_type = ZCRYPT_CEX3A;
+               zdev->type_string = "CEX3A";
+               zdev->min_mod_size = CEX3A_MIN_MOD_SIZE;
+               zdev->max_mod_size = CEX3A_MAX_MOD_SIZE;
+               zdev->short_crt = 1;
+               zdev->speed_rating = CEX3A_SPEED_RATING;
+               break;
+       }
+       if (zdev != NULL) {
+               zdev->ap_dev = ap_dev;
+               zdev->ops = &zcrypt_cex2a_ops;
+               zdev->online = 1;
+               ap_dev->reply = &zdev->reply;
+               ap_dev->private = zdev;
+               rc = zcrypt_device_register(zdev);
+       }
+       if (rc) {
+               ap_dev->private = NULL;
+               zcrypt_device_free(zdev);
+       }
        return rc;
 }