|
@@ -39,13 +39,20 @@
|
|
|
|
|
|
#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;
|
|
|
}
|
|
|
|