[S390] ap: toleration support for ap device type 10
[linux-2.6.git] / drivers / s390 / crypto / ap_bus.h
index 446378b..d960a63 100644 (file)
@@ -5,6 +5,8 @@
  * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
  *           Martin Schwidefsky <schwidefsky@de.ibm.com>
  *           Ralph Wuerthner <rwuerthn@de.ibm.com>
+ *           Felix Beck <felix.beck@de.ibm.com>
+ *           Holger Dengler <hd@linux.vnet.ibm.com>
  *
  * Adjunct processor bus header file.
  *
@@ -67,10 +69,30 @@ struct ap_queue_status {
        unsigned int queue_empty        : 1;
        unsigned int replies_waiting    : 1;
        unsigned int queue_full         : 1;
-       unsigned int pad1               : 5;
+       unsigned int pad1               : 4;
+       unsigned int int_enabled        : 1;
        unsigned int response_code      : 8;
        unsigned int pad2               : 16;
-};
+} __packed;
+
+#define AP_QUEUE_STATUS_INVALID \
+               { 1, 1, 1, 0xF, 1, 0xFF, 0xFFFF }
+
+static inline
+int ap_queue_status_invalid_test(struct ap_queue_status *status)
+{
+       struct ap_queue_status invalid = AP_QUEUE_STATUS_INVALID;
+       return !(memcmp(status, &invalid, sizeof(struct ap_queue_status)));
+}
+
+#define MAX_AP_FACILITY 31
+
+static inline int test_ap_facility(unsigned int function, unsigned int nr)
+{
+       if (nr > MAX_AP_FACILITY)
+               return 0;
+       return function & (unsigned int)(0x80000000 >> nr);
+}
 
 #define AP_RESPONSE_NORMAL             0x00
 #define AP_RESPONSE_Q_NOT_AVAIL                0x01
@@ -78,11 +100,14 @@ struct ap_queue_status {
 #define AP_RESPONSE_DECONFIGURED       0x03
 #define AP_RESPONSE_CHECKSTOPPED       0x04
 #define AP_RESPONSE_BUSY               0x05
+#define AP_RESPONSE_INVALID_ADDRESS    0x06
+#define AP_RESPONSE_OTHERWISE_CHANGED  0x07
 #define AP_RESPONSE_Q_FULL             0x10
 #define AP_RESPONSE_NO_PENDING_REPLY   0x10
 #define AP_RESPONSE_INDEX_TOO_BIG      0x11
 #define AP_RESPONSE_NO_FIRST_PART      0x13
 #define AP_RESPONSE_MESSAGE_TOO_BIG    0x15
+#define AP_RESPONSE_REQ_FAC_NOT_INST   0x16
 
 /*
  * Known device types
@@ -92,8 +117,8 @@ struct ap_queue_status {
 #define AP_DEVICE_TYPE_PCIXCC  5
 #define AP_DEVICE_TYPE_CEX2A   6
 #define AP_DEVICE_TYPE_CEX2C   7
-#define AP_DEVICE_TYPE_CEX2A2  8
-#define AP_DEVICE_TYPE_CEX2C2  9
+#define AP_DEVICE_TYPE_CEX3A   8
+#define AP_DEVICE_TYPE_CEX3C   9
 
 /*
  * AP reset flag states
@@ -157,12 +182,25 @@ struct ap_message {
        size_t length;                  /* Message length. */
 
        void *private;                  /* ap driver private pointer. */
+       unsigned int special:1;         /* Used for special commands. */
 };
 
 #define AP_DEVICE(dt)                                  \
        .dev_type=(dt),                                 \
        .match_flags=AP_DEVICE_ID_MATCH_DEVICE_TYPE,
 
+/**
+ * ap_init_message() - Initialize ap_message.
+ * Initialize a message before using. Otherwise this might result in
+ * unexpected behaviour.
+ */
+static inline void ap_init_message(struct ap_message *ap_msg)
+{
+       ap_msg->psmid = 0;
+       ap_msg->length = 0;
+       ap_msg->special = 0;
+}
+
 /*
  * Note: don't use ap_send/ap_recv after using ap_queue_message
  * for the first time. Otherwise the ap message queue will get
@@ -178,4 +216,6 @@ void ap_flush_queue(struct ap_device *ap_dev);
 int ap_module_init(void);
 void ap_module_exit(void);
 
+int ap_4096_commands_available(ap_qid_t qid);
+
 #endif /* _AP_BUS_H_ */