]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
greybus: record the host device in a gbuf
authorAlex Elder <elder@linaro.org>
Mon, 17 Nov 2014 14:08:43 +0000 (08:08 -0600)
committerGreg Kroah-Hartman <greg@kroah.com>
Mon, 17 Nov 2014 18:41:19 +0000 (10:41 -0800)
The only thing we now use the gbuf->operation pointer for is
to get access to its connection's host device.

Record the host device pointer directly in the gbuf, rather
than keeping a pointer to the operation.

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

index 7698463ffa896aebe84df60a48a3c34e0372d471..e24012a9b6dbe23ef41e90ad7bd9174bca6ff3bb 100644 (file)
@@ -205,7 +205,7 @@ static struct urb *next_free_urb(struct es1_ap_dev *es1, gfp_t gfp_mask)
 
 static int submit_gbuf(struct gbuf *gbuf, gfp_t gfp_mask)
 {
-       struct greybus_host_device *hd = gbuf->operation->connection->hd;
+       struct greybus_host_device *hd = gbuf->hd;
        struct es1_ap_dev *es1 = hd_to_es1(hd);
        struct usb_device *udev = es1->usb_dev;
        int retval;
@@ -391,7 +391,7 @@ exit:
 static void cport_out_callback(struct urb *urb)
 {
        struct gbuf *gbuf = urb->context;
-       struct es1_ap_dev *es1 = hd_to_es1(gbuf->operation->connection->hd);
+       struct es1_ap_dev *es1 = hd_to_es1(gbuf->hd);
        unsigned long flags;
        int i;
 
index 1b6a31d43a4fecb8b57856703f1fa8ff2930291a..6f8873af09e0bbf1747725fd6b860f7227b165ea 100644 (file)
@@ -34,12 +34,11 @@ static struct kmem_cache *gbuf_head_cache;
  * that the driver can then fill up with the data to be sent out.  Curse
  * hardware designers for this issue...
  */
-struct gbuf *greybus_alloc_gbuf(struct gb_operation *operation,
+struct gbuf *greybus_alloc_gbuf(struct greybus_host_device *hd,
                                u16 dest_cport_id,
                                unsigned int size,
                                gfp_t gfp_mask)
 {
-       struct greybus_host_device *hd = operation->connection->hd;
        struct gbuf *gbuf;
        int retval;
 
@@ -48,7 +47,7 @@ struct gbuf *greybus_alloc_gbuf(struct gb_operation *operation,
                return NULL;
 
        kref_init(&gbuf->kref);
-       gbuf->operation = operation;
+       gbuf->hd = hd;
        gbuf->dest_cport_id = dest_cport_id;
        gbuf->status = -EBADR;  /* Initial value--means "never set" */
 
@@ -68,9 +67,8 @@ static DEFINE_MUTEX(gbuf_mutex);
 static void free_gbuf(struct kref *kref)
 {
        struct gbuf *gbuf = container_of(kref, struct gbuf, kref);
-       struct greybus_host_device *hd = gbuf->operation->connection->hd;
 
-       hd->driver->free_gbuf_data(gbuf);
+       gbuf->hd->driver->free_gbuf_data(gbuf);
 
        kmem_cache_free(gbuf_head_cache, gbuf);
        mutex_unlock(&gbuf_mutex);
@@ -94,21 +92,17 @@ EXPORT_SYMBOL_GPL(greybus_get_gbuf);
 
 int greybus_submit_gbuf(struct gbuf *gbuf, gfp_t gfp_mask)
 {
-       struct greybus_host_device *hd = gbuf->operation->connection->hd;
-
        gbuf->status = -EINPROGRESS;
 
-       return hd->driver->submit_gbuf(gbuf, gfp_mask);
+       return gbuf->hd->driver->submit_gbuf(gbuf, gfp_mask);
 }
 
 void greybus_kill_gbuf(struct gbuf *gbuf)
 {
-       struct greybus_host_device *hd = gbuf->operation->connection->hd;
-
        if (gbuf->status != -EINPROGRESS)
                return;
 
-       hd->driver->kill_gbuf(gbuf);
+       gbuf->hd->driver->kill_gbuf(gbuf);
 }
 
 void greybus_cport_in(struct greybus_host_device *hd, u16 cport_id,
index b817c7615516c0dcc4374877ceaacc38a2b032af..c86eb25dd38d76aff2862d9cd1c893668108e5f9 100644 (file)
 struct gbuf {
        struct kref kref;
 
-       struct gb_operation *operation;
+       struct greybus_host_device *hd;
        u16 dest_cport_id;              /* Destination CPort id */
        int status;
 
@@ -181,7 +181,7 @@ void greybus_remove_hd(struct greybus_host_device *hd);
 void greybus_cport_in(struct greybus_host_device *hd, u16 cport_id,
                        u8 *data, size_t length);
 
-struct gbuf *greybus_alloc_gbuf(struct gb_operation *operation,
+struct gbuf *greybus_alloc_gbuf(struct greybus_host_device *hd,
                                u16 dest_cport_id, unsigned int size,
                                gfp_t gfp_mask);
 void greybus_free_gbuf(struct gbuf *gbuf);
index 24e0a525821a0dd22fc18f938c38722000f91c46..c0161a2c8cee32d2b2e1f310924498b0ef4fe788 100644 (file)
@@ -200,6 +200,7 @@ static struct gbuf *gb_operation_gbuf_create(struct gb_operation *operation,
                                             u8 type, size_t size,
                                             bool data_out)
 {
+       struct gb_connection *connection = operation->connection;
        struct gb_operation_msg_hdr *header;
        struct gbuf *gbuf;
        gfp_t gfp_flags = data_out ? GFP_KERNEL : GFP_ATOMIC;
@@ -209,11 +210,12 @@ static struct gbuf *gb_operation_gbuf_create(struct gb_operation *operation,
                return NULL;    /* Message too big */
 
        if (data_out)
-               dest_cport_id = operation->connection->interface_cport_id;
+               dest_cport_id = connection->interface_cport_id;
        else
                dest_cport_id = CPORT_ID_BAD;
        size += sizeof(*header);
-       gbuf = greybus_alloc_gbuf(operation, dest_cport_id, size, gfp_flags);
+       gbuf = greybus_alloc_gbuf(connection->hd, dest_cport_id,
+                                       size, gfp_flags);
        if (!gbuf)
                return NULL;