]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
greybus: switch cport id used for sends
authorAlex Elder <elder@linaro.org>
Thu, 11 Dec 2014 22:48:38 +0000 (16:48 -0600)
committerGreg Kroah-Hartman <greg@kroah.com>
Fri, 12 Dec 2014 00:48:39 +0000 (19:48 -0500)
In talking with Perry today I learned that the CPort id expected to
supplied over the HSIC interface to the APB is different from the
way I understood it.

My understanding was that the CPort id to supply always specified
the CPort id on the other end of a connection.  However, Perry says
the mapping between local CPort id and remote CPort id (and device
id) is done by the host UniPro interface.

So whether sending or receiving data, the CPort id that the Greybus
code should supply to the AP Bridge is the one representing the AP
side of a connection.

This patch fixes this.  The receive side already used that CPort id;
it's only the sending code that needed to be changed.

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/operation.c

index f551907ced2dbfb027329f8ef7912b25e76e6c55..277699758973d7605924a8d71ca1169e989c94eb 100644 (file)
@@ -190,7 +190,7 @@ static struct urb *next_free_urb(struct es1_ap_dev *es1, gfp_t gfp_mask)
  * error otherwise.  If the caller wishes to cancel the in-flight
  * buffer, it must supply the returned cookie to the cancel routine.
  */
-static void *buffer_send(struct greybus_host_device *hd, u16 dest_cport_id,
+static void *buffer_send(struct greybus_host_device *hd, u16 cport_id,
                        void *buffer, size_t buffer_size, gfp_t gfp_mask)
 {
        struct es1_ap_dev *es1 = hd_to_es1(hd);
@@ -216,17 +216,16 @@ static void *buffer_send(struct greybus_host_device *hd, u16 dest_cport_id,
         * of where the data should be sent.  Do one last check of
         * the target CPort id before filling it in.
         */
-       if (dest_cport_id == CPORT_ID_BAD) {
+       if (cport_id == CPORT_ID_BAD) {
                pr_err("request to send inbound data buffer\n");
                return ERR_PTR(-EINVAL);
        }
-       if (dest_cport_id > (u16)U8_MAX) {
-               pr_err("dest_cport_id (%hd) is out of range for ES1\n",
-                       dest_cport_id);
+       if (cport_id > (u16)U8_MAX) {
+               pr_err("cport_id (%hd) is out of range for ES1\n", cport_id);
                return ERR_PTR(-EINVAL);
        }
        /* OK, the destination is fine; record it in the transfer buffer */
-       *transfer_buffer = dest_cport_id;
+       *transfer_buffer = cport_id;
 
        /* Find a free urb */
        urb = next_free_urb(es1, gfp_mask);
@@ -393,8 +392,8 @@ static void cport_in_callback(struct urb *urb)
        }
 
        /*
-        * The CPort number is the first byte of the data stream, the rest of
-        * the stream is "real" data
+        * Our CPort number is the first byte of the data stream,
+        * the rest of the stream is "real" data
         */
        data = urb->transfer_buffer;
        cport_id = (u16)data[0];
index 742eccc4b989fe8c8c5747caa950a7940656a7a7..6c815d29502cfcb1c2462a0f364c364a2742eff3 100644 (file)
@@ -167,13 +167,12 @@ static int gb_message_send(struct gb_message *message)
 {
        size_t message_size = sizeof(*message->header) + message->payload_size;
        struct gb_connection *connection = message->operation->connection;
-       u16 dest_cport_id = connection->interface_cport_id;
        int ret = 0;
        void *cookie;
 
        mutex_lock(&gb_message_mutex);
        cookie = connection->hd->driver->buffer_send(connection->hd,
-                                       dest_cport_id,
+                                       connection->hd_cport_id,
                                        message->header,
                                        message_size,
                                        GFP_KERNEL);