Merge branch 'master' of /home/davem/src/GIT/linux-2.6/
[linux-drm-fsl-dcu.git] / net / caif / cfmuxl.c
index 6fb9f9e96cf8a242cc3f3e5e299a54c231621f84..80c8d332b2586fb1a4a2ddacca97f20fba9047ae 100644 (file)
@@ -62,6 +62,7 @@ int cfmuxl_set_uplayer(struct cflayer *layr, struct cflayer *up, u8 linkid)
 {
        struct cfmuxl *muxl = container_obj(layr);
        spin_lock(&muxl->receive_lock);
+       cfsrvl_get(up);
        list_add(&up->node, &muxl->srvl_list);
        spin_unlock(&muxl->receive_lock);
        return 0;
@@ -172,8 +173,12 @@ struct cflayer *cfmuxl_remove_uplayer(struct cflayer *layr, u8 id)
        struct cfmuxl *muxl = container_obj(layr);
        spin_lock(&muxl->receive_lock);
        up = get_up(muxl, id);
+       if (up == NULL)
+               goto out;
        memset(muxl->up_cache, 0, sizeof(muxl->up_cache));
        list_del(&up->node);
+       cfsrvl_put(up);
+out:
        spin_unlock(&muxl->receive_lock);
        return up;
 }
@@ -203,8 +208,9 @@ static int cfmuxl_receive(struct cflayer *layr, struct cfpkt *pkt)
                 */
                return /* CFGLU_EPROT; */ 0;
        }
-
+       cfsrvl_get(up);
        ret = up->receive(up, pkt);
+       cfsrvl_put(up);
        return ret;
 }