]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
greybus: allocate space without gbufs
authorAlex Elder <elder@linaro.org>
Tue, 18 Nov 2014 19:26:42 +0000 (13:26 -0600)
committerGreg Kroah-Hartman <greg@kroah.com>
Tue, 18 Nov 2014 20:48:53 +0000 (12:48 -0800)
This begins the transition to buffer allocation that does not rely
on the gbuf construct.

The host driver allocation routine will return a pointer to the
buffer to be used, and the caller will be responsible for keeping
track of that pointer, as well as the requested buffer size.

Rename the allocation method to reflect it's no longer tied to a
gbuf.

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

index 588e62412fd3a391fdf82a701f769c75b9a57c2d..ab50e2d6f817fb24647e7edd96c9d4ee569b480d 100644 (file)
@@ -169,7 +169,7 @@ struct greybus_host_device *greybus_create_hd(struct greybus_host_driver *driver
         * Validate that the driver implements all of the callbacks
         * so that we don't have to every time we make them.
         */
-       if ((!driver->alloc_gbuf_data) ||
+       if ((!driver->buffer_alloc) ||
            (!driver->free_gbuf_data) ||
            (!driver->submit_svc) ||
            (!driver->submit_gbuf) ||
index a92f8934928a078bad1f343cff64d92e2190b260..98ab05d9ceadb808cd8a7adf5460a9b5cf7c8cc6 100644 (file)
@@ -85,21 +85,12 @@ static inline struct es1_ap_dev *hd_to_es1(struct greybus_host_device *hd)
 static void cport_out_callback(struct urb *urb);
 
 /*
- * Allocate the actual buffer for this gbuf and device and cport
- *
- * We are responsible for setting the following fields in a struct gbuf:
- *     void *hcpriv;
- *     void *transfer_buffer;
- *     u32 transfer_buffer_length;
+ * Allocate a buffer to be sent via UniPro.
  */
-static int alloc_gbuf_data(struct gbuf *gbuf, unsigned int size,
-                               gfp_t gfp_mask)
+static void *buffer_alloc(unsigned int size, gfp_t gfp_mask)
 {
        u8 *buffer;
 
-       if (gbuf->transfer_buffer)
-               return -EALREADY;
-
        if (size > ES1_GBUF_MSG_SIZE) {
                pr_err("guf was asked to be bigger than %ld!\n",
                       ES1_GBUF_MSG_SIZE);
@@ -117,14 +108,10 @@ static int alloc_gbuf_data(struct gbuf *gbuf, unsigned int size,
         * XXX Do we need to indicate the destination device id too?
         */
        buffer = kzalloc(GB_BUFFER_ALIGN + size, gfp_mask);
-       if (!buffer)
-               return -ENOMEM;
-       buffer += GB_BUFFER_ALIGN;
+       if (buffer)
+               buffer += GB_BUFFER_ALIGN;
 
-       gbuf->transfer_buffer = buffer;
-       gbuf->transfer_buffer_length = size;
-
-       return 0;
+       return buffer;
 }
 
 /* Free the memory we allocated with a gbuf */
@@ -252,7 +239,7 @@ static void kill_gbuf(struct gbuf *gbuf)
 
 static struct greybus_host_driver es1_driver = {
        .hd_priv_size           = sizeof(struct es1_ap_dev),
-       .alloc_gbuf_data        = alloc_gbuf_data,
+       .buffer_alloc           = buffer_alloc,
        .free_gbuf_data         = free_gbuf_data,
        .submit_svc             = submit_svc,
        .submit_gbuf            = submit_gbuf,
index fa8065156192245824030b14cb9ed7fdf649fc8b..82ab1e6973d2ce6596e8177b77d666cdc3e63082 100644 (file)
@@ -79,8 +79,7 @@ struct gbuf;
 struct greybus_host_driver {
        size_t  hd_priv_size;
 
-       int (*alloc_gbuf_data)(struct gbuf *gbuf, unsigned int size,
-                                       gfp_t gfp_mask);
+       void *(*buffer_alloc)(unsigned int size, gfp_t gfp_mask);
        void (*free_gbuf_data)(struct gbuf *gbuf);
        int (*submit_svc)(struct svc_msg *svc_msg,
                            struct greybus_host_device *hd);
index b5cd9a234fb6ede6e6fb9f709463a17be4560a71..e3669a7a7901acceca0be1a74b72766402f0cd67 100644 (file)
@@ -222,7 +222,6 @@ static int gb_operation_message_init(struct gb_operation *operation,
        struct gbuf *gbuf;
        gfp_t gfp_flags = request && !outbound ? GFP_ATOMIC : GFP_KERNEL;
        u16 dest_cport_id;
-       int ret;
 
        if (size > GB_OPERATION_MESSAGE_SIZE_MAX)
                return -E2BIG;
@@ -241,9 +240,10 @@ static int gb_operation_message_init(struct gb_operation *operation,
        else
                dest_cport_id = CPORT_ID_BAD;
 
-       ret = hd->driver->alloc_gbuf_data(gbuf, size, gfp_flags);
-       if (ret)
-               return ret;
+       gbuf->transfer_buffer = hd->driver->buffer_alloc(size, gfp_flags);
+       if (!gbuf->transfer_buffer)
+               return -ENOMEM;
+       gbuf->transfer_buffer_length = size;
        gbuf->hd = hd;
        gbuf->dest_cport_id = dest_cport_id;
        gbuf->status = -EBADR;  /* Initial value--means "never set" */