]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
greybus: reserve host cport id 0
authorAlex Elder <elder@linaro.org>
Sat, 13 Jun 2015 16:02:10 +0000 (11:02 -0500)
committerGreg Kroah-Hartman <gregkh@google.com>
Mon, 15 Jun 2015 23:49:00 +0000 (16:49 -0700)
For ES1 and ES2, we use pad bytes in an operation message header to
encode the CPort ID used for transferring the message.  The pad
bytes should otherwise be zero, and we ensure this as the message
is passed to or from the upper layer.

If host-side CPort ID 0 is used, we have no way of knowing whether
the CPort field has been "packed" into the header.

To allow detection of this, reserve host CPort id 0.  Update
cport_id_valid() to treat 0 as invalid.

(CPort ID 0 is reserved by one of the UniPro standards.  We'll
assume for now that we never use it for Greybus.)

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/core.c
drivers/staging/greybus/greybus.h

index d4fffecb1abc6a0d945a4685b64dab3a13ddd103..bc9c1ebf79832ff113a6ed3c951c5068650e7c8b 100644 (file)
@@ -170,6 +170,7 @@ struct greybus_host_device *greybus_create_hd(struct greybus_host_driver *driver
                                              size_t buffer_size_max)
 {
        struct greybus_host_device *hd;
+       int ret;
 
        /*
         * Validate that the driver implements all of the callbacks
@@ -200,12 +201,19 @@ struct greybus_host_device *greybus_create_hd(struct greybus_host_driver *driver
        if (!hd)
                return ERR_PTR(-ENOMEM);
 
+       ida_init(&hd->cport_id_map);
+       /* Reserve CPort id 0 */
+       ret = ida_simple_get(&hd->cport_id_map, 0, 1, GFP_KERNEL);
+       if (ret < 0) {
+               kfree(hd);
+               return ERR_PTR(ret);
+       }
+
        kref_init(&hd->kref);
        hd->parent = parent;
        hd->driver = driver;
        INIT_LIST_HEAD(&hd->interfaces);
        INIT_LIST_HEAD(&hd->connections);
-       ida_init(&hd->cport_id_map);
        hd->buffer_size_max = buffer_size_max;
 
        return hd;
index 5c6f9607cf73dc28ee273bea594aaea099ae3842..d727dea6847ef67427e405299e54f30081c2dc9d 100644 (file)
@@ -198,7 +198,7 @@ static inline int is_gb_connection(const struct device *dev)
 
 static inline bool cport_id_valid(u16 cport_id)
 {
-       return cport_id != CPORT_ID_BAD && cport_id <= CPORT_ID_MAX;
+       return cport_id && cport_id != CPORT_ID_BAD && cport_id <= CPORT_ID_MAX;
 }
 
 #endif /* __KERNEL__ */