greybus: define the invalid operation type symbolically
authorAlex Elder <elder@linaro.org>
Tue, 2 Dec 2014 23:25:11 +0000 (17:25 -0600)
committerGreg Kroah-Hartman <greg@kroah.com>
Tue, 2 Dec 2014 23:41:20 +0000 (15:41 -0800)
Use a symbolic constant (rather than just "0") to represent an
explicitly invalid operation type.  The protocols have all reserved
that value for that purpose--this just makes it explicit in the core
code (since we now leverage its existence).  Fix the code so it uses
the new symbolic value.

Define it in "operation.h" for all to see.  Move the common
definition of the GB_OPERATION_TYPE_RESPONSE flag mask there
as well.

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/operation.c
drivers/staging/greybus/operation.h

index d3ba658..b2ebbe4 100644 (file)
 
 #include "greybus.h"
 
-/*
- * The top bit of the type in an operation message header indicates
- * whether the message is a request (bit clear) or response (bit set)
- */
-#define GB_OPERATION_TYPE_RESPONSE     0x80
-
 #define OPERATION_TIMEOUT_DEFAULT      1000    /* milliseconds */
 
 /*
@@ -329,7 +323,7 @@ static void gb_operation_message_init(struct greybus_host_device *hd,
         * 0x00.  Such buffers will be overwritten by arriving data
         * so there's no need to initialize the message header.
         */
-       if (type) {
+       if (type != GB_OPERATION_TYPE_INVALID) {
                /*
                 * For a request, the operation id gets filled in
                 * when the message is sent.  For a response, it
@@ -527,8 +521,17 @@ gb_operation_create_common(struct gb_connection *connection, u8 type,
 {
        struct greybus_host_device *hd = connection->hd;
        struct gb_operation *operation;
-       gfp_t gfp_flags = type ? GFP_KERNEL : GFP_ATOMIC;
+       gfp_t gfp_flags;
 
+       /*
+        * An incoming request will pass an invalid operation type,
+        * because the header will get overwritten anyway.  These
+        * occur in interrupt context, so we must use GFP_ATOMIC.
+        */
+       if (type == GB_OPERATION_TYPE_INVALID)
+               gfp_flags = GFP_ATOMIC;
+       else
+               gfp_flags = GFP_KERNEL;
        operation = kmem_cache_zalloc(gb_operation_cache, gfp_flags);
        if (!operation)
                return NULL;
@@ -541,7 +544,7 @@ gb_operation_create_common(struct gb_connection *connection, u8 type,
        operation->request->operation = operation;
 
        /* Allocate the response buffer for outgoing operations */
-       if (type)
+       if (type != GB_OPERATION_TYPE_INVALID)
                if (!gb_operation_response_alloc(operation, response_size))
                        goto err_request;
        operation->errno = -EBADR;  /* Initial value--means "never set" */
@@ -578,7 +581,7 @@ struct gb_operation *gb_operation_create(struct gb_connection *connection,
                                        u8 type, size_t request_size,
                                        size_t response_size)
 {
-       if (WARN_ON_ONCE(!type))
+       if (WARN_ON_ONCE(type == GB_OPERATION_TYPE_INVALID))
                return NULL;
        if (WARN_ON_ONCE(type & GB_OPERATION_TYPE_RESPONSE))
                type &= ~GB_OPERATION_TYPE_RESPONSE;
@@ -593,7 +596,9 @@ gb_operation_create_incoming(struct gb_connection *connection, u16 id,
 {
        struct gb_operation *operation;
 
-       operation = gb_operation_create_common(connection, 0, request_size, 0);
+       operation = gb_operation_create_common(connection,
+                                       GB_OPERATION_TYPE_INVALID,
+                                       request_size, 0);
        if (operation) {
                operation->id = id;
                memcpy(operation->request->header, data, request_size);
index c60decb..40b2e7d 100644 (file)
 
 struct gb_operation;
 
+/*
+ * No protocol may define an operation that has numeric value 0x00.
+ * It is reserved as an explicitly invalid value.
+ */
+#define GB_OPERATION_TYPE_INVALID      ((u8)0x00)
+
+/*
+ * The top bit of the type in an operation message header indicates
+ * whether the message is a request (bit clear) or response (bit set)
+ */
+#define GB_OPERATION_TYPE_RESPONSE     ((u8)0x80)
+
 enum gb_operation_result {
        GB_OP_SUCCESS           = 0x00,
        GB_OP_INTERRUPTED       = 0x01,