From ba99346828089d3833a5c31106b60b3a8cddb91d Mon Sep 17 00:00:00 2001 From: Alex Elder Date: Mon, 17 Nov 2014 08:08:43 -0600 Subject: [PATCH] greybus: record the host device in a gbuf 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 Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/es1-ap-usb.c | 4 ++-- drivers/staging/greybus/gbuf.c | 16 +++++----------- drivers/staging/greybus/greybus.h | 4 ++-- drivers/staging/greybus/operation.c | 6 ++++-- 4 files changed, 13 insertions(+), 17 deletions(-) diff --git a/drivers/staging/greybus/es1-ap-usb.c b/drivers/staging/greybus/es1-ap-usb.c index 7698463ffa89..e24012a9b6db 100644 --- a/drivers/staging/greybus/es1-ap-usb.c +++ b/drivers/staging/greybus/es1-ap-usb.c @@ -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; diff --git a/drivers/staging/greybus/gbuf.c b/drivers/staging/greybus/gbuf.c index 1b6a31d43a4f..6f8873af09e0 100644 --- a/drivers/staging/greybus/gbuf.c +++ b/drivers/staging/greybus/gbuf.c @@ -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, diff --git a/drivers/staging/greybus/greybus.h b/drivers/staging/greybus/greybus.h index b817c7615516..c86eb25dd38d 100644 --- a/drivers/staging/greybus/greybus.h +++ b/drivers/staging/greybus/greybus.h @@ -121,7 +121,7 @@ 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); diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c index 24e0a525821a..c0161a2c8cee 100644 --- a/drivers/staging/greybus/operation.c +++ b/drivers/staging/greybus/operation.c @@ -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; -- 2.39.2