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 <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
diff --git a/drivers/staging/greybus/es1-ap-usb.c b/drivers/staging/greybus/es1-ap-usb.c
index 7698463..e24012a 100644
--- a/drivers/staging/greybus/es1-ap-usb.c
+++ b/drivers/staging/greybus/es1-ap-usb.c
@@ -205,7 +205,7 @@
 
 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 @@
 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 1b6a31d..6f8873af 100644
--- a/drivers/staging/greybus/gbuf.c
+++ b/drivers/staging/greybus/gbuf.c
@@ -34,12 +34,11 @@
  * 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 @@
 		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 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 @@
 
 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 b817c76..c86eb25 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_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 24e0a52..c0161a2 100644
--- a/drivers/staging/greybus/operation.c
+++ b/drivers/staging/greybus/operation.c
@@ -200,6 +200,7 @@
 					     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 @@
 		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;