Re: [PATCH 3/4] staging: tidspbridge: remove gb bitmap implementation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Briefly I see the clean up of the code as well, which is not related
to the mentioned description.
I guess it would be better to split this patch at least to two.

On Fri, Oct 22, 2010 at 3:57 PM, Ionut Nicu <ionut.nicu@xxxxxxxxx> wrote:
> Replace the tidspbridge generic bitmap operations
> with the linux generic bitmap implementation.
>
> Signed-off-by: Ionut Nicu <ionut.nicu@xxxxxxxxxx>
> ---
> Âdrivers/staging/tidspbridge/Makefile        |  Â2 +-
> Âdrivers/staging/tidspbridge/gen/gb.c        | Â165 ------
> Âdrivers/staging/tidspbridge/include/dspbridge/gb.h | Â 79 ---
> Âdrivers/staging/tidspbridge/rmgr/node.c      Â| Â599 +++++++++-----------
> Â4 files changed, 274 insertions(+), 571 deletions(-)
> Âdelete mode 100644 drivers/staging/tidspbridge/gen/gb.c
> Âdelete mode 100644 drivers/staging/tidspbridge/include/dspbridge/gb.h
>
> diff --git a/drivers/staging/tidspbridge/Makefile b/drivers/staging/tidspbridge/Makefile
> index aaf397f..6080e7e 100644
> --- a/drivers/staging/tidspbridge/Makefile
> +++ b/drivers/staging/tidspbridge/Makefile
> @@ -1,6 +1,6 @@
> Âobj-$(CONFIG_TIDSPBRIDGE) Â Â Â+= bridgedriver.o
>
> -libgen = gen/gb.o gen/gh.o gen/uuidutil.o
> +libgen = gen/gh.o gen/uuidutil.o
> Âlibcore = core/chnl_sm.o core/msg_sm.o core/io_sm.o core/tiomap3430.o \
> Â Â Â Â Â Â Â Âcore/tiomap3430_pwr.o core/tiomap_io.o core/dsp-mmu.o \
> Â Â Â Â Â Â Â Âcore/ue_deh.o core/wdt.o core/dsp-clock.o core/sync.o
> diff --git a/drivers/staging/tidspbridge/gen/gb.c b/drivers/staging/tidspbridge/gen/gb.c
> deleted file mode 100644
> index 3c0e04c..0000000
> --- a/drivers/staging/tidspbridge/gen/gb.c
> +++ /dev/null
> @@ -1,165 +0,0 @@
> -/*
> - * gb.c
> - *
> - * DSP-BIOS Bridge driver support functions for TI OMAP processors.
> - *
> - * Generic bitmap operations.
> - *
> - * Copyright (C) 2005-2006 Texas Instruments, Inc.
> - *
> - * This package is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 as
> - * published by the Free Software Foundation.
> - *
> - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
> - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
> - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
> - */
> -
> -/* Â----------------------------------- DSP/BIOS Bridge */
> -#include <linux/types.h>
> -/* Â----------------------------------- This */
> -#include <dspbridge/gb.h>
> -
> -struct gb_t_map {
> - Â Â Â u32 len;
> - Â Â Â u32 wcnt;
> - Â Â Â u32 *words;
> -};
> -
> -/*
> - * Â======== gb_clear ========
> - * Âpurpose:
> - * Â Â ÂClears a bit in the bit map.
> - */
> -
> -void gb_clear(struct gb_t_map *map, u32 bitn)
> -{
> - Â Â Â u32 mask;
> -
> - Â Â Â mask = 1L << (bitn % BITS_PER_LONG);
> - Â Â Â map->words[bitn / BITS_PER_LONG] &= ~mask;
> -}
> -
> -/*
> - * Â======== gb_create ========
> - * Âpurpose:
> - * Â Â ÂCreates a bit map.
> - */
> -
> -struct gb_t_map *gb_create(u32 len)
> -{
> - Â Â Â struct gb_t_map *map;
> - Â Â Â u32 i;
> - Â Â Â map = kzalloc(sizeof(struct gb_t_map), GFP_KERNEL);
> - Â Â Â if (map != NULL) {
> - Â Â Â Â Â Â Â map->len = len;
> - Â Â Â Â Â Â Â map->wcnt = len / BITS_PER_LONG + 1;
> - Â Â Â Â Â Â Â map->words = kzalloc(map->wcnt * sizeof(u32), GFP_KERNEL);
> - Â Â Â Â Â Â Â if (map->words != NULL) {
> - Â Â Â Â Â Â Â Â Â Â Â for (i = 0; i < map->wcnt; i++)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â map->words[i] = 0L;
> -
> - Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â kfree(map);
> - Â Â Â Â Â Â Â Â Â Â Â map = NULL;
> - Â Â Â Â Â Â Â }
> - Â Â Â }
> -
> - Â Â Â return map;
> -}
> -
> -/*
> - * Â======== gb_delete ========
> - * Âpurpose:
> - * Â Â ÂFrees a bit map.
> - */
> -
> -void gb_delete(struct gb_t_map *map)
> -{
> - Â Â Â kfree(map->words);
> - Â Â Â kfree(map);
> -}
> -
> -/*
> - * Â======== gb_findandset ========
> - * Âpurpose:
> - * Â Â ÂFinds a free bit and sets it.
> - */
> -u32 gb_findandset(struct gb_t_map *map)
> -{
> - Â Â Â u32 bitn;
> -
> - Â Â Â bitn = gb_minclear(map);
> -
> - Â Â Â if (bitn != GB_NOBITS)
> - Â Â Â Â Â Â Â gb_set(map, bitn);
> -
> - Â Â Â return bitn;
> -}
> -
> -/*
> - * Â======== gb_minclear ========
> - * Âpurpose:
> - * Â Â Âreturns the location of the first unset bit in the bit map.
> - */
> -u32 gb_minclear(struct gb_t_map *map)
> -{
> - Â Â Â u32 bit_location = 0;
> - Â Â Â u32 bit_acc = 0;
> - Â Â Â u32 i;
> - Â Â Â u32 bit;
> - Â Â Â u32 *word;
> -
> - Â Â Â for (word = map->words, i = 0; i < map->wcnt; word++, i++) {
> - Â Â Â Â Â Â Â if (~*word) {
> - Â Â Â Â Â Â Â Â Â Â Â for (bit = 0; bit < BITS_PER_LONG; bit++, bit_acc++) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if (bit_acc == map->len)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â return GB_NOBITS;
> -
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â if (~*word & (1L << bit)) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â bit_location = i * BITS_PER_LONG + bit;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â return bit_location;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â }
> -
> - Â Â Â Â Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â bit_acc += BITS_PER_LONG;
> - Â Â Â Â Â Â Â }
> - Â Â Â }
> -
> - Â Â Â return GB_NOBITS;
> -}
> -
> -/*
> - * Â======== gb_set ========
> - * Âpurpose:
> - * Â Â ÂSets a bit in the bit map.
> - */
> -
> -void gb_set(struct gb_t_map *map, u32 bitn)
> -{
> - Â Â Â u32 mask;
> -
> - Â Â Â mask = 1L << (bitn % BITS_PER_LONG);
> - Â Â Â map->words[bitn / BITS_PER_LONG] |= mask;
> -}
> -
> -/*
> - * Â======== gb_test ========
> - * Âpurpose:
> - * Â Â ÂReturns true if the bit is set in the specified location.
> - */
> -
> -bool gb_test(struct gb_t_map *map, u32 bitn)
> -{
> - Â Â Â bool state;
> - Â Â Â u32 mask;
> - Â Â Â u32 word;
> -
> - Â Â Â mask = 1L << (bitn % BITS_PER_LONG);
> - Â Â Â word = map->words[bitn / BITS_PER_LONG];
> - Â Â Â state = word & mask ? true : false;
> -
> - Â Â Â return state;
> -}
> diff --git a/drivers/staging/tidspbridge/include/dspbridge/gb.h b/drivers/staging/tidspbridge/include/dspbridge/gb.h
> deleted file mode 100644
> index fda783a..0000000
> --- a/drivers/staging/tidspbridge/include/dspbridge/gb.h
> +++ /dev/null
> @@ -1,79 +0,0 @@
> -/*
> - * gb.h
> - *
> - * DSP-BIOS Bridge driver support functions for TI OMAP processors.
> - *
> - * Generic bitmap manager.
> - *
> - * Copyright (C) 2005-2006 Texas Instruments, Inc.
> - *
> - * This package is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 as
> - * published by the Free Software Foundation.
> - *
> - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
> - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
> - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
> - */
> -
> -#ifndef GB_
> -#define GB_
> -
> -#define GB_NOBITS (~0)
> -#include <dspbridge/host_os.h>
> -
> -struct gb_t_map;
> -
> -/*
> - * Â======== gb_clear ========
> - * ÂClear the bit in position bitn in the bitmap map. ÂBit positions are
> - * Âzero based.
> - */
> -
> -extern void gb_clear(struct gb_t_map *map, u32 bitn);
> -
> -/*
> - * Â======== gb_create ========
> - * ÂCreate a bit map with len bits. ÂInitially all bits are cleared.
> - */
> -
> -extern struct gb_t_map *gb_create(u32 len);
> -
> -/*
> - * Â======== gb_delete ========
> - * ÂDelete previously created bit map
> - */
> -
> -extern void gb_delete(struct gb_t_map *map);
> -
> -/*
> - * Â======== gb_findandset ========
> - * ÂFinds a clear bit, sets it, and returns the position
> - */
> -
> -extern u32 gb_findandset(struct gb_t_map *map);
> -
> -/*
> - * Â======== gb_minclear ========
> - * Âgb_minclear returns the minimum clear bit position. ÂIf no bit is
> - * Âclear, gb_minclear returns -1.
> - */
> -extern u32 gb_minclear(struct gb_t_map *map);
> -
> -/*
> - * Â======== gb_set ========
> - * ÂSet the bit in position bitn in the bitmap map. ÂBit positions are
> - * Âzero based.
> - */
> -
> -extern void gb_set(struct gb_t_map *map, u32 bitn);
> -
> -/*
> - * Â======== gb_test ========
> - * ÂReturns TRUE if the bit in position bitn is set in map; otherwise
> - * Âgb_test returns FALSE. ÂBit positions are zero based.
> - */
> -
> -extern bool gb_test(struct gb_t_map *map, u32 bitn);
> -
> -#endif /*GB_ */
> diff --git a/drivers/staging/tidspbridge/rmgr/node.c b/drivers/staging/tidspbridge/rmgr/node.c
> index a660247..9fa35de 100644
> --- a/drivers/staging/tidspbridge/rmgr/node.c
> +++ b/drivers/staging/tidspbridge/rmgr/node.c
> @@ -17,6 +17,7 @@
> Â*/
>
> Â#include <linux/types.h>
> +#include <linux/bitmap.h>
> Â/* Â----------------------------------- Host OS */
> Â#include <dspbridge/host_os.h>
>
> @@ -50,7 +51,6 @@
> Â#include <dspbridge/dspioctl.h>
>
> Â/* Â----------------------------------- Others */
> -#include <dspbridge/gb.h>
> Â#include <dspbridge/uuidutil.h>
>
> Â/* Â----------------------------------- This */
> @@ -131,11 +131,14 @@ struct node_mgr {
> Â Â Â Âstruct lst_list *node_list; Â Â /* List of all allocated nodes */
> Â Â Â Âu32 num_nodes; Â Â Â Â Â/* Number of nodes in node_list */
> Â Â Â Âu32 num_created; Â Â Â Â/* Number of nodes *created* on DSP */
> - Â Â Â struct gb_t_map *pipe_map; Â Â Â/* Pipe connection bit map */
> - Â Â Â struct gb_t_map *pipe_done_map; /* Pipes that are half free */
> - Â Â Â struct gb_t_map *chnl_map; Â Â Â/* Channel allocation bit map */
> - Â Â Â struct gb_t_map *dma_chnl_map; Â/* DMA Channel allocation bit map */
> - Â Â Â struct gb_t_map *zc_chnl_map; Â /* Zero-Copy Channel alloc bit map */
> + Â Â Â DECLARE_BITMAP(pipe_map, MAXPIPES); /* Pipe connection bitmap */
> + Â Â Â DECLARE_BITMAP(pipe_done_map, MAXPIPES); /* Pipes that are half free */
> + Â Â Â /* Channel allocation bitmap */
> + Â Â Â DECLARE_BITMAP(chnl_map, CHNL_MAXCHANNELS);
> + Â Â Â /* DMA Channel allocation bitmap */
> + Â Â Â DECLARE_BITMAP(dma_chnl_map, CHNL_MAXCHANNELS);
> + Â Â Â /* Zero-Copy Channel alloc bitmap */
> + Â Â Â DECLARE_BITMAP(zc_chnl_map, CHNL_MAXCHANNELS);
> Â Â Â Âstruct ntfy_object *ntfy_obj; Â /* Manages registered notifications */
> Â Â Â Âstruct mutex node_mgr_lock; Â Â /* For critical sections */
> Â Â Â Âu32 ul_fxn_addrs[NUMRMSFXNS]; Â /* RMS function addresses */
> @@ -814,73 +817,64 @@ int node_connect(struct node_object *node1, u32 stream1,
> Â Â Â Âchar *pstr_dev_name = NULL;
> Â Â Â Âenum node_type node1_type = NODE_TASK;
> Â Â Â Âenum node_type node2_type = NODE_TASK;
> + Â Â Â enum dsp_strmmode strm_mode;
> Â Â Â Âstruct node_strmdef *pstrm_def;
> Â Â Â Âstruct node_strmdef *input = NULL;
> Â Â Â Âstruct node_strmdef *output = NULL;
> Â Â Â Âstruct node_object *dev_node_obj;
> Â Â Â Âstruct node_object *hnode;
> Â Â Â Âstruct stream_chnl *pstream;
> - Â Â Â u32 pipe_id = GB_NOBITS;
> - Â Â Â u32 chnl_id = GB_NOBITS;
> + Â Â Â u32 pipe_id;
> + Â Â Â u32 chnl_id;
> Â Â Â Âs8 chnl_mode;
> Â Â Â Âu32 dw_length;
> Â Â Â Âint status = 0;
> Â Â Â ÂDBC_REQUIRE(refs > 0);
>
> - Â Â Â if ((node1 != (struct node_object *)DSP_HGPPNODE && !node1) ||
> - Â Â Â Â Â (node2 != (struct node_object *)DSP_HGPPNODE && !node2))
> - Â Â Â Â Â Â Â status = -EFAULT;
> + Â Â Â if (!node1 || !node2)
> + Â Â Â Â Â Â Â return -EFAULT;
>
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â /* The two nodes must be on the same processor */
> - Â Â Â Â Â Â Â if (node1 != (struct node_object *)DSP_HGPPNODE &&
> - Â Â Â Â Â Â Â Â Â node2 != (struct node_object *)DSP_HGPPNODE &&
> - Â Â Â Â Â Â Â Â Â node1->hnode_mgr != node2->hnode_mgr)
> - Â Â Â Â Â Â Â Â Â Â Â status = -EPERM;
> - Â Â Â Â Â Â Â /* Cannot connect a node to itself */
> - Â Â Â Â Â Â Â if (node1 == node2)
> - Â Â Â Â Â Â Â Â Â Â Â status = -EPERM;
> + Â Â Â /* The two nodes must be on the same processor */
> + Â Â Â if (node1 != (struct node_object *)DSP_HGPPNODE &&
> + Â Â Â Â Â Â Â Â Â Â Â node2 != (struct node_object *)DSP_HGPPNODE &&
> + Â Â Â Â Â Â Â Â Â Â Â node1->hnode_mgr != node2->hnode_mgr)
> + Â Â Â Â Â Â Â return -EPERM;
> +
> + Â Â Â /* Cannot connect a node to itself */
> + Â Â Â if (node1 == node2)
> + Â Â Â Â Â Â Â return -EPERM;
> +
> + Â Â Â /* node_get_type() will return NODE_GPP if hnode =
> + Â Â Â Â* DSP_HGPPNODE. */
> + Â Â Â node1_type = node_get_type(node1);
> + Â Â Â node2_type = node_get_type(node2);
> + Â Â Â /* Check stream indices ranges */
> + Â Â Â if ((node1_type != NODE_GPP && node1_type != NODE_DEVICE &&
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â stream1 >= MAX_OUTPUTS(node1)) ||
> + Â Â Â Â Â Â Â Â Â Â Â (node2_type != NODE_GPP && node2_type != NODE_DEVICE &&
> + Â Â Â Â Â Â Â Â Â Â Â Âstream2 >= MAX_INPUTS(node2)))
> + Â Â Â Â Â Â Â return -EINVAL;
>
> - Â Â Â }
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â /* node_get_type() will return NODE_GPP if hnode =
> - Â Â Â Â Â Â Â Â* DSP_HGPPNODE. */
> - Â Â Â Â Â Â Â node1_type = node_get_type(node1);
> - Â Â Â Â Â Â Â node2_type = node_get_type(node2);
> - Â Â Â Â Â Â Â /* Check stream indices ranges */
> - Â Â Â Â Â Â Â if ((node1_type != NODE_GPP && node1_type != NODE_DEVICE &&
> - Â Â Â Â Â Â Â Â Â Âstream1 >= MAX_OUTPUTS(node1)) || (node2_type != NODE_GPP
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â && node2_type !=
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â NODE_DEVICE
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â && stream2 >=
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â MAX_INPUTS(node2)))
> - Â Â Â Â Â Â Â Â Â Â Â status = -EINVAL;
> - Â Â Â }
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â /*
> - Â Â Â Â Â Â Â Â* ÂOnly the following types of connections are allowed:
> - Â Â Â Â Â Â Â Â* Â Â Âtask/dais socket < == > task/dais socket
> - Â Â Â Â Â Â Â Â* Â Â Âtask/dais socket < == > device
> - Â Â Â Â Â Â Â Â* Â Â Âtask/dais socket < == > GPP
> - Â Â Â Â Â Â Â Â*
> - Â Â Â Â Â Â Â Â* Âie, no message nodes, and at least one task or dais
> - Â Â Â Â Â Â Â Â* Âsocket node.
> - Â Â Â Â Â Â Â Â*/
> - Â Â Â Â Â Â Â if (node1_type == NODE_MESSAGE || node2_type == NODE_MESSAGE ||
> - Â Â Â Â Â Â Â Â Â (node1_type != NODE_TASK && node1_type != NODE_DAISSOCKET &&
> - Â Â Â Â Â Â Â Â Â Ânode2_type != NODE_TASK && node2_type != NODE_DAISSOCKET))
> - Â Â Â Â Â Â Â Â Â Â Â status = -EPERM;
> - Â Â Â }
> + Â Â Â /*
> + Â Â Â Â* ÂOnly the following types of connections are allowed:
> + Â Â Â Â* Â Â Âtask/dais socket < == > task/dais socket
> + Â Â Â Â* Â Â Âtask/dais socket < == > device
> + Â Â Â Â* Â Â Âtask/dais socket < == > GPP
> + Â Â Â Â*
> + Â Â Â Â* Âie, no message nodes, and at least one task or dais
> + Â Â Â Â* Âsocket node.
> + Â Â Â Â*/
> + Â Â Â if (node1_type == NODE_MESSAGE || node2_type == NODE_MESSAGE ||
> + Â Â Â Â Â Â Â Â Â Â Â (node1_type != NODE_TASK &&
> + Â Â Â Â Â Â Â Â Â Â Â Ânode1_type != NODE_DAISSOCKET &&
> + Â Â Â Â Â Â Â Â Â Â Â Ânode2_type != NODE_TASK &&
> + Â Â Â Â Â Â Â Â Â Â Â Ânode2_type != NODE_DAISSOCKET))
> + Â Â Â Â Â Â Â return -EPERM;
> Â Â Â Â/*
> Â Â Â Â * Check stream mode. Default is STRMMODE_PROCCOPY.
> Â Â Â Â */
> - Â Â Â if (!status && pattrs) {
> - Â Â Â Â Â Â Â if (pattrs->strm_mode != STRMMODE_PROCCOPY)
> - Â Â Â Â Â Â Â Â Â Â Â status = -EPERM; Â Â Â Â/* illegal stream mode */
> -
> - Â Â Â }
> - Â Â Â if (status)
> - Â Â Â Â Â Â Â goto func_end;
> + Â Â Â if (pattrs && pattrs->strm_mode != STRMMODE_PROCCOPY)
> + Â Â Â Â Â Â Â return -EPERM; Â/* illegal stream mode */
>
> Â Â Â Âif (node1_type != NODE_GPP) {
> Â Â Â Â Â Â Â Âhnode_mgr = node1->hnode_mgr;
> @@ -888,155 +882,143 @@ int node_connect(struct node_object *node1, u32 stream1,
> Â Â Â Â Â Â Â ÂDBC_ASSERT(node2 != (struct node_object *)DSP_HGPPNODE);
> Â Â Â Â Â Â Â Âhnode_mgr = node2->hnode_mgr;
> Â Â Â Â}
> +
> Â Â Â Â/* Enter critical section */
> Â Â Â Âmutex_lock(&hnode_mgr->node_mgr_lock);
>
> Â Â Â Â/* Nodes must be in the allocated state */
> - Â Â Â if (node1_type != NODE_GPP && node_get_state(node1) != NODE_ALLOCATED)
> + Â Â Â if (node1_type != NODE_GPP &&
> + Â Â Â Â Â Â Â Â Â Â Â node_get_state(node1) != NODE_ALLOCATED) {
> Â Â Â Â Â Â Â Âstatus = -EBADR;
> + Â Â Â Â Â Â Â goto out_unlock;
> + Â Â Â }
>
> - Â Â Â if (node2_type != NODE_GPP && node_get_state(node2) != NODE_ALLOCATED)
> + Â Â Â if (node2_type != NODE_GPP &&
> + Â Â Â Â Â Â Â Â Â Â Â node_get_state(node2) != NODE_ALLOCATED) {
> Â Â Â Â Â Â Â Âstatus = -EBADR;
> + Â Â Â Â Â Â Â goto out_unlock;
> + Â Â Â }
>
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â /* ÂCheck that stream indices for task and dais socket nodes
> - Â Â Â Â Â Â Â Â* Âare not already be used. (Device nodes checked later) */
> - Â Â Â Â Â Â Â if (node1_type == NODE_TASK || node1_type == NODE_DAISSOCKET) {
> - Â Â Â Â Â Â Â Â Â Â Â output =
> - Â Â Â Â Â Â Â Â Â Â Â Â Â &(node1->create_args.asa.
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â task_arg_obj.strm_out_def[stream1]);
> - Â Â Â Â Â Â Â Â Â Â Â if (output->sz_device != NULL)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â status = -EISCONN;
> -
> + Â Â Â /* ÂCheck that stream indices for task and dais socket nodes
> + Â Â Â Â* Âare not already be used. (Device nodes checked later) */
> + Â Â Â if (node1_type == NODE_TASK || node1_type == NODE_DAISSOCKET) {
> + Â Â Â Â Â Â Â output = &(node1->create_args.asa.
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â task_arg_obj.strm_out_def[stream1]);
> + Â Â Â Â Â Â Â if (output->sz_device != NULL) {
> + Â Â Â Â Â Â Â Â Â Â Â status = -EISCONN;
> + Â Â Â Â Â Â Â Â Â Â Â goto out_unlock;
> Â Â Â Â Â Â Â Â}
> - Â Â Â Â Â Â Â if (node2_type == NODE_TASK || node2_type == NODE_DAISSOCKET) {
> - Â Â Â Â Â Â Â Â Â Â Â input =
> - Â Â Â Â Â Â Â Â Â Â Â Â Â &(node2->create_args.asa.
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â task_arg_obj.strm_in_def[stream2]);
> - Â Â Â Â Â Â Â Â Â Â Â if (input->sz_device != NULL)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â status = -EISCONN;
>
> + Â Â Â }
> + Â Â Â if (node2_type == NODE_TASK || node2_type == NODE_DAISSOCKET) {
> + Â Â Â Â Â Â Â input = &(node2->create_args.asa.
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â task_arg_obj.strm_in_def[stream2]);
> + Â Â Â Â Â Â Â if (input->sz_device != NULL) {
> + Â Â Â Â Â Â Â Â Â Â Â status = -EISCONN;
> + Â Â Â Â Â Â Â Â Â Â Â goto out_unlock;
> Â Â Â Â Â Â Â Â}
> +
> Â Â Â Â}
> Â Â Â Â/* Connecting two task nodes? */
> - Â Â Â if (!status && ((node1_type == NODE_TASK ||
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Ânode1_type == NODE_DAISSOCKET)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â && (node2_type == NODE_TASK
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â || node2_type == NODE_DAISSOCKET))) {
> + Â Â Â if (((node1_type == NODE_TASK || node1_type == NODE_DAISSOCKET) &&
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (node2_type == NODE_TASK ||
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Ânode2_type == NODE_DAISSOCKET))) {
> Â Â Â Â Â Â Â Â/* Find available pipe */
> - Â Â Â Â Â Â Â pipe_id = gb_findandset(hnode_mgr->pipe_map);
> - Â Â Â Â Â Â Â if (pipe_id == GB_NOBITS) {
> + Â Â Â Â Â Â Â pipe_id = find_first_zero_bit(hnode_mgr->pipe_map, MAXPIPES);
> + Â Â Â Â Â Â Â if (pipe_id == MAXPIPES) {
> Â Â Â Â Â Â Â Â Â Â Â Âstatus = -ECONNREFUSED;
> - Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â node1->outputs[stream1].type = NODECONNECT;
> - Â Â Â Â Â Â Â Â Â Â Â node2->inputs[stream2].type = NODECONNECT;
> - Â Â Â Â Â Â Â Â Â Â Â node1->outputs[stream1].dev_id = pipe_id;
> - Â Â Â Â Â Â Â Â Â Â Â node2->inputs[stream2].dev_id = pipe_id;
> - Â Â Â Â Â Â Â Â Â Â Â output->sz_device = kzalloc(PIPENAMELEN + 1,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â GFP_KERNEL);
> - Â Â Â Â Â Â Â Â Â Â Â input->sz_device = kzalloc(PIPENAMELEN + 1, GFP_KERNEL);
> - Â Â Â Â Â Â Â Â Â Â Â if (output->sz_device == NULL ||
> - Â Â Â Â Â Â Â Â Â Â Â Â Â input->sz_device == NULL) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â /* Undo the connection */
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â kfree(output->sz_device);
> -
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â kfree(input->sz_device);
> -
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â output->sz_device = NULL;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â input->sz_device = NULL;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->pipe_map, pipe_id);
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â status = -ENOMEM;
> - Â Â Â Â Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â /* Copy "/dbpipe<pipId>" name to device names */
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sprintf(output->sz_device, "%s%d",
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â PIPEPREFIX, pipe_id);
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â strcpy(input->sz_device, output->sz_device);
> - Â Â Â Â Â Â Â Â Â Â Â }
> + Â Â Â Â Â Â Â Â Â Â Â goto out_unlock;
> + Â Â Â Â Â Â Â }
> + Â Â Â Â Â Â Â set_bit(pipe_id, hnode_mgr->pipe_map);
> + Â Â Â Â Â Â Â node1->outputs[stream1].type = NODECONNECT;
> + Â Â Â Â Â Â Â node2->inputs[stream2].type = NODECONNECT;
> + Â Â Â Â Â Â Â node1->outputs[stream1].dev_id = pipe_id;
> + Â Â Â Â Â Â Â node2->inputs[stream2].dev_id = pipe_id;
> + Â Â Â Â Â Â Â output->sz_device = kzalloc(PIPENAMELEN + 1, GFP_KERNEL);
> + Â Â Â Â Â Â Â input->sz_device = kzalloc(PIPENAMELEN + 1, GFP_KERNEL);
> + Â Â Â Â Â Â Â if (output->sz_device == NULL || input->sz_device == NULL) {
> + Â Â Â Â Â Â Â Â Â Â Â /* Undo the connection */
> + Â Â Â Â Â Â Â Â Â Â Â kfree(output->sz_device);
> + Â Â Â Â Â Â Â Â Â Â Â kfree(input->sz_device);
> + Â Â Â Â Â Â Â Â Â Â Â output->sz_device = NULL;
> + Â Â Â Â Â Â Â Â Â Â Â input->sz_device = NULL;
> + Â Â Â Â Â Â Â Â Â Â Â clear_bit(pipe_id, hnode_mgr->pipe_map);
> + Â Â Â Â Â Â Â Â Â Â Â status = -ENOMEM;
> + Â Â Â Â Â Â Â Â Â Â Â goto out_unlock;
> Â Â Â Â Â Â Â Â}
> + Â Â Â Â Â Â Â /* Copy "/dbpipe<pipId>" name to device names */
> + Â Â Â Â Â Â Â sprintf(output->sz_device, "%s%d", PIPEPREFIX, pipe_id);
> + Â Â Â Â Â Â Â strcpy(input->sz_device, output->sz_device);
> Â Â Â Â}
> Â Â Â Â/* Connecting task node to host? */
> - Â Â Â if (!status && (node1_type == NODE_GPP ||
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â node2_type == NODE_GPP)) {
> - Â Â Â Â Â Â Â if (node1_type == NODE_GPP) {
> - Â Â Â Â Â Â Â Â Â Â Â chnl_mode = CHNL_MODETODSP;
> - Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â DBC_ASSERT(node2_type == NODE_GPP);
> - Â Â Â Â Â Â Â Â Â Â Â chnl_mode = CHNL_MODEFROMDSP;
> + Â Â Â if ((node1_type == NODE_GPP || node2_type == NODE_GPP)) {
> + Â Â Â Â Â Â Â pstr_dev_name = kzalloc(HOSTNAMELEN + 1, GFP_KERNEL);
> + Â Â Â Â Â Â Â if (!pstr_dev_name) {
> + Â Â Â Â Â Â Â Â Â Â Â status = -ENOMEM;
> + Â Â Â Â Â Â Â Â Â Â Â goto out_unlock;
> Â Â Â Â Â Â Â Â}
> +
> + Â Â Â Â Â Â Â DBC_ASSERT((node1_type == NODE_GPP) ||
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (node2_type == NODE_GPP));
> +
> + Â Â Â Â Â Â Â chnl_mode = (node1_type == NODE_GPP) ?
> + Â Â Â Â Â Â Â Â Â Â Â CHNL_MODETODSP : CHNL_MODEFROMDSP;
> +
> Â Â Â Â Â Â Â Â/* ÂReserve a channel id. We need to put the name "/host<id>"
> Â Â Â Â Â Â Â Â * Âin the node's create_args, but the host
> Â Â Â Â Â Â Â Â * Âside channel will not be opened until DSPStream_Open is
> Â Â Â Â Â Â Â Â * Âcalled for this node. */
> - Â Â Â Â Â Â Â if (pattrs) {
> - Â Â Â Â Â Â Â Â Â Â Â if (pattrs->strm_mode == STRMMODE_RDMA) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â chnl_id =
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â gb_findandset(hnode_mgr->dma_chnl_map);
> + Â Â Â Â Â Â Â strm_mode = pattrs ? pattrs->strm_mode : STRMMODE_PROCCOPY;
> + Â Â Â Â Â Â Â switch (strm_mode) {
> + Â Â Â Â Â Â Â case STRMMODE_RDMA:
> + Â Â Â Â Â Â Â Â Â Â Â chnl_id = find_first_zero_bit(hnode_mgr->dma_chnl_map,
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â CHNL_MAXCHANNELS);
> + Â Â Â Â Â Â Â Â Â Â Â if (chnl_id < CHNL_MAXCHANNELS) {
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â set_bit(chnl_id, hnode_mgr->dma_chnl_map);
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â/* dma chans are 2nd transport chnl set
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â * ids(e.g. 16-31) */
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (chnl_id != GB_NOBITS) ?
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (chnl_id =
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âchnl_id +
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âhnode_mgr->ul_num_chnls) : chnl_id;
> - Â Â Â Â Â Â Â Â Â Â Â } else if (pattrs->strm_mode == STRMMODE_ZEROCOPY) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â chnl_id = gb_findandset(hnode_mgr->zc_chnl_map);
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â chnl_id = chnl_id + hnode_mgr->ul_num_chnls;
> + Â Â Â Â Â Â Â Â Â Â Â }
> + Â Â Â Â Â Â Â Â Â Â Â break;
> + Â Â Â Â Â Â Â case STRMMODE_ZEROCOPY:
> + Â Â Â Â Â Â Â Â Â Â Â chnl_id = find_first_zero_bit(hnode_mgr->zc_chnl_map,
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â CHNL_MAXCHANNELS);
> + Â Â Â Â Â Â Â Â Â Â Â if (chnl_id < CHNL_MAXCHANNELS) {
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â set_bit(chnl_id, hnode_mgr->zc_chnl_map);
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â/* zero-copy chans are 3nd transport set
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â * (e.g. 32-47) */
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (chnl_id != GB_NOBITS) ? (chnl_id = chnl_id +
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (2 *
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âhnode_mgr->
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âul_num_chnls))
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â : chnl_id;
> - Â Â Â Â Â Â Â Â Â Â Â } else { Â Â Â Â/* must be PROCCOPY */
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â DBC_ASSERT(pattrs->strm_mode ==
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂSTRMMODE_PROCCOPY);
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â chnl_id = gb_findandset(hnode_mgr->chnl_map);
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â /* e.g. 0-15 */
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â chnl_id = chnl_id +
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (2 * hnode_mgr->ul_num_chnls);
> Â Â Â Â Â Â Â Â Â Â Â Â}
> - Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â /* default to PROCCOPY */
> - Â Â Â Â Â Â Â Â Â Â Â chnl_id = gb_findandset(hnode_mgr->chnl_map);
> + Â Â Â Â Â Â Â Â Â Â Â break;
> + Â Â Â Â Â Â Â case STRMMODE_PROCCOPY:
> + Â Â Â Â Â Â Â Â Â Â Â chnl_id = find_first_zero_bit(hnode_mgr->chnl_map,
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â CHNL_MAXCHANNELS);
> + Â Â Â Â Â Â Â Â Â Â Â if (chnl_id < CHNL_MAXCHANNELS)
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â set_bit(chnl_id, hnode_mgr->chnl_map);
> + Â Â Â Â Â Â Â Â Â Â Â break;
> + Â Â Â Â Â Â Â default:
> + Â Â Â Â Â Â Â Â Â Â Â status = -EINVAL;
> + Â Â Â Â Â Â Â Â Â Â Â goto out_unlock;
> Â Â Â Â Â Â Â Â}
> - Â Â Â Â Â Â Â if (chnl_id == GB_NOBITS) {
> + Â Â Â Â Â Â Â if (chnl_id == CHNL_MAXCHANNELS) {
> Â Â Â Â Â Â Â Â Â Â Â Âstatus = -ECONNREFUSED;
> - Â Â Â Â Â Â Â Â Â Â Â goto func_cont2;
> + Â Â Â Â Â Â Â Â Â Â Â goto out_unlock;
> Â Â Â Â Â Â Â Â}
> - Â Â Â Â Â Â Â pstr_dev_name = kzalloc(HOSTNAMELEN + 1, GFP_KERNEL);
> - Â Â Â Â Â Â Â if (pstr_dev_name != NULL)
> - Â Â Â Â Â Â Â Â Â Â Â goto func_cont2;
> -
> - Â Â Â Â Â Â Â if (pattrs) {
> - Â Â Â Â Â Â Â Â Â Â Â if (pattrs->strm_mode == STRMMODE_RDMA) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->dma_chnl_map, chnl_id -
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âhnode_mgr->ul_num_chnls);
> - Â Â Â Â Â Â Â Â Â Â Â } else if (pattrs->strm_mode == STRMMODE_ZEROCOPY) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->zc_chnl_map, chnl_id -
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â(2 * hnode_mgr->ul_num_chnls));
> - Â Â Â Â Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â DBC_ASSERT(pattrs->strm_mode ==
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ÂSTRMMODE_PROCCOPY);
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->chnl_map, chnl_id);
> - Â Â Â Â Â Â Â Â Â Â Â }
> +
> + Â Â Â Â Â Â Â if (node1 == (struct node_object *)DSP_HGPPNODE) {
> + Â Â Â Â Â Â Â Â Â Â Â node2->inputs[stream2].type = HOSTCONNECT;
> + Â Â Â Â Â Â Â Â Â Â Â node2->inputs[stream2].dev_id = chnl_id;
> + Â Â Â Â Â Â Â Â Â Â Â input->sz_device = pstr_dev_name;
> Â Â Â Â Â Â Â Â} else {
> - Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->chnl_map, chnl_id);
> - Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â status = -ENOMEM;
> -func_cont2:
> - Â Â Â Â Â Â Â if (!status) {
> - Â Â Â Â Â Â Â Â Â Â Â if (node1 == (struct node_object *)DSP_HGPPNODE) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â node2->inputs[stream2].type = HOSTCONNECT;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â node2->inputs[stream2].dev_id = chnl_id;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â input->sz_device = pstr_dev_name;
> - Â Â Â Â Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â node1->outputs[stream1].type = HOSTCONNECT;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â node1->outputs[stream1].dev_id = chnl_id;
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â output->sz_device = pstr_dev_name;
> - Â Â Â Â Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â Â Â Â Â sprintf(pstr_dev_name, "%s%d", HOSTPREFIX, chnl_id);
> + Â Â Â Â Â Â Â Â Â Â Â node1->outputs[stream1].type = HOSTCONNECT;
> + Â Â Â Â Â Â Â Â Â Â Â node1->outputs[stream1].dev_id = chnl_id;
> + Â Â Â Â Â Â Â Â Â Â Â output->sz_device = pstr_dev_name;
> Â Â Â Â Â Â Â Â}
> + Â Â Â Â Â Â Â sprintf(pstr_dev_name, "%s%d", HOSTPREFIX, chnl_id);
> Â Â Â Â}
> Â Â Â Â/* Connecting task node to device node? */
> - Â Â Â if (!status && ((node1_type == NODE_DEVICE) ||
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (node2_type == NODE_DEVICE))) {
> + Â Â Â if (((node1_type == NODE_DEVICE) || (node2_type == NODE_DEVICE))) {
> Â Â Â Â Â Â Â Âif (node2_type == NODE_DEVICE) {
> Â Â Â Â Â Â Â Â Â Â Â Â/* node1 == > device */
> Â Â Â Â Â Â Â Â Â Â Â Âdev_node_obj = node2;
> @@ -1053,60 +1035,57 @@ func_cont2:
> Â Â Â Â Â Â Â Â/* Set up create args */
> Â Â Â Â Â Â Â Âpstream->type = DEVICECONNECT;
> Â Â Â Â Â Â Â Âdw_length = strlen(dev_node_obj->pstr_dev_name);
> - Â Â Â Â Â Â Â if (conn_param != NULL) {
> + Â Â Â Â Â Â Â if (conn_param != NULL)
> Â Â Â Â Â Â Â Â Â Â Â Âpstrm_def->sz_device = kzalloc(dw_length + 1 +
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â conn_param->cb_data,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â GFP_KERNEL);
> - Â Â Â Â Â Â Â } else {
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â conn_param->cb_data,
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â GFP_KERNEL);
> Â Â Â Â Â Â Â Â Â Â Â Âpstrm_def->sz_device = kzalloc(dw_length + 1,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â GFP_KERNEL);
> - Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â if (pstrm_def->sz_device == NULL) {
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â GFP_KERNEL);
> + Â Â Â Â Â Â Â if (!pstrm_def->sz_device) {
> Â Â Â Â Â Â Â Â Â Â Â Âstatus = -ENOMEM;
> - Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â /* Copy device name */
> - Â Â Â Â Â Â Â Â Â Â Â strncpy(pstrm_def->sz_device,
> + Â Â Â Â Â Â Â Â Â Â Â goto out_unlock;
> + Â Â Â Â Â Â Â }
> + Â Â Â Â Â Â Â /* Copy device name */
> + Â Â Â Â Â Â Â strncpy(pstrm_def->sz_device,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âdev_node_obj->pstr_dev_name, dw_length);
> - Â Â Â Â Â Â Â Â Â Â Â if (conn_param != NULL) {
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â strncat(pstrm_def->sz_device,
> + Â Â Â Â Â Â Â if (conn_param != NULL)
> + Â Â Â Â Â Â Â Â Â Â Â strncat(pstrm_def->sz_device,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â(char *)conn_param->node_data,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â(u32) conn_param->cb_data);
> - Â Â Â Â Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â Â Â Â Â dev_node_obj->device_owner = hnode;
> - Â Â Â Â Â Â Â }
> + Â Â Â Â Â Â Â dev_node_obj->device_owner = hnode;
> Â Â Â Â}
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â /* Fill in create args */
> - Â Â Â Â Â Â Â if (node1_type == NODE_TASK || node1_type == NODE_DAISSOCKET) {
> - Â Â Â Â Â Â Â Â Â Â Â node1->create_args.asa.task_arg_obj.num_outputs++;
> - Â Â Â Â Â Â Â Â Â Â Â fill_stream_def(node1, output, pattrs);
> - Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â if (node2_type == NODE_TASK || node2_type == NODE_DAISSOCKET) {
> - Â Â Â Â Â Â Â Â Â Â Â node2->create_args.asa.task_arg_obj.num_inputs++;
> - Â Â Â Â Â Â Â Â Â Â Â fill_stream_def(node2, input, pattrs);
> - Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â /* Update node1 and node2 stream_connect */
> - Â Â Â Â Â Â Â if (node1_type != NODE_GPP && node1_type != NODE_DEVICE) {
> - Â Â Â Â Â Â Â Â Â Â Â node1->num_outputs++;
> - Â Â Â Â Â Â Â Â Â Â Â if (stream1 > node1->max_output_index)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â node1->max_output_index = stream1;
> + Â Â Â /* Fill in create args */
> + Â Â Â if (node1_type == NODE_TASK || node1_type == NODE_DAISSOCKET) {
> + Â Â Â Â Â Â Â node1->create_args.asa.task_arg_obj.num_outputs++;
> + Â Â Â Â Â Â Â fill_stream_def(node1, output, pattrs);
> + Â Â Â }
> + Â Â Â if (node2_type == NODE_TASK || node2_type == NODE_DAISSOCKET) {
> + Â Â Â Â Â Â Â node2->create_args.asa.task_arg_obj.num_inputs++;
> + Â Â Â Â Â Â Â fill_stream_def(node2, input, pattrs);
> + Â Â Â }
> + Â Â Â /* Update node1 and node2 stream_connect */
> + Â Â Â if (node1_type != NODE_GPP && node1_type != NODE_DEVICE) {
> + Â Â Â Â Â Â Â node1->num_outputs++;
> + Â Â Â Â Â Â Â if (stream1 > node1->max_output_index)
> + Â Â Â Â Â Â Â Â Â Â Â node1->max_output_index = stream1;
>
> - Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â if (node2_type != NODE_GPP && node2_type != NODE_DEVICE) {
> - Â Â Â Â Â Â Â Â Â Â Â node2->num_inputs++;
> - Â Â Â Â Â Â Â Â Â Â Â if (stream2 > node2->max_input_index)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â node2->max_input_index = stream2;
> + Â Â Â }
> + Â Â Â if (node2_type != NODE_GPP && node2_type != NODE_DEVICE) {
> + Â Â Â Â Â Â Â node2->num_inputs++;
> + Â Â Â Â Â Â Â if (stream2 > node2->max_input_index)
> + Â Â Â Â Â Â Â Â Â Â Â node2->max_input_index = stream2;
>
> - Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â fill_stream_connect(node1, node2, stream1, stream2);
> Â Â Â Â}
> + Â Â Â fill_stream_connect(node1, node2, stream1, stream2);
> Â Â Â Â/* end of sync_enter_cs */
> Â Â Â Â/* Exit critical section */
> +out_unlock:
> + Â Â Â if (status && pstr_dev_name)
> + Â Â Â Â Â Â Â kfree(pstr_dev_name);
> Â Â Â Âmutex_unlock(&hnode_mgr->node_mgr_lock);
> -func_end:
> Â Â Â Âdev_dbg(bridge, "%s: node1: %p stream1: %d node2: %p stream2: %d"
> - Â Â Â Â Â Â Â "pattrs: %p status: 0x%x\n", __func__, node1,
> - Â Â Â Â Â Â Â stream1, node2, stream2, pattrs, status);
> + Â Â Â Â Â Â Â Â Â Â Â "pattrs: %p status: 0x%x\n", __func__, node1,
> + Â Â Â Â Â Â Â Â Â Â Â stream1, node2, stream2, pattrs, status);
> Â Â Â Âreturn status;
> Â}
>
> @@ -1284,6 +1263,7 @@ int node_create_mgr(struct node_mgr **node_man,
> Â Â Â Âstruct nldr_attrs nldr_attrs_obj;
> Â Â Â Âint status = 0;
> Â Â Â Âu8 dev_type;
> +
> Â Â Â ÂDBC_REQUIRE(refs > 0);
> Â Â Â ÂDBC_REQUIRE(node_man != NULL);
> Â Â Â ÂDBC_REQUIRE(hdev_obj != NULL);
> @@ -1291,113 +1271,95 @@ int node_create_mgr(struct node_mgr **node_man,
> Â Â Â Â*node_man = NULL;
> Â Â Â Â/* Allocate Node manager object */
> Â Â Â Ânode_mgr_obj = kzalloc(sizeof(struct node_mgr), GFP_KERNEL);
> - Â Â Â if (node_mgr_obj) {
> - Â Â Â Â Â Â Â node_mgr_obj->hdev_obj = hdev_obj;
> - Â Â Â Â Â Â Â node_mgr_obj->node_list = kzalloc(sizeof(struct lst_list),
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â GFP_KERNEL);
> - Â Â Â Â Â Â Â node_mgr_obj->pipe_map = gb_create(MAXPIPES);
> - Â Â Â Â Â Â Â node_mgr_obj->pipe_done_map = gb_create(MAXPIPES);
> - Â Â Â Â Â Â Â if (node_mgr_obj->node_list == NULL
> - Â Â Â Â Â Â Â Â Â || node_mgr_obj->pipe_map == NULL
> - Â Â Â Â Â Â Â Â Â || node_mgr_obj->pipe_done_map == NULL) {
> - Â Â Â Â Â Â Â Â Â Â Â status = -ENOMEM;
> - Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â INIT_LIST_HEAD(&node_mgr_obj->node_list->head);
> - Â Â Â Â Â Â Â Â Â Â Â node_mgr_obj->ntfy_obj = kmalloc(
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â sizeof(struct ntfy_object), GFP_KERNEL);
> - Â Â Â Â Â Â Â Â Â Â Â if (node_mgr_obj->ntfy_obj)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ntfy_init(node_mgr_obj->ntfy_obj);
> - Â Â Â Â Â Â Â Â Â Â Â else
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â status = -ENOMEM;
> - Â Â Â Â Â Â Â }
> - Â Â Â Â Â Â Â node_mgr_obj->num_created = 0;
> - Â Â Â } else {
> + Â Â Â if (unlikely(node_mgr_obj == NULL))
> + Â Â Â Â Â Â Â return -ENOMEM;
> +
> + Â Â Â node_mgr_obj->hdev_obj = hdev_obj;
> + Â Â Â node_mgr_obj->node_list = kzalloc(sizeof(struct lst_list), GFP_KERNEL);
> + Â Â Â if (unlikely(node_mgr_obj->node_list == NULL)) {
> Â Â Â Â Â Â Â Âstatus = -ENOMEM;
> + Â Â Â Â Â Â Â goto out_err;
> Â Â Â Â}
> - Â Â Â /* get devNodeType */
> - Â Â Â if (!status)
> - Â Â Â Â Â Â Â status = dev_get_dev_type(hdev_obj, &dev_type);
> +
> + Â Â Â node_mgr_obj->ntfy_obj = kmalloc(sizeof(struct ntfy_object),
> + Â Â Â Â Â Â Â Â Â Â Â GFP_KERNEL);
> + Â Â Â if (unlikely(node_mgr_obj->ntfy_obj == NULL)) {
> + Â Â Â Â Â Â Â status = -ENOMEM;
> + Â Â Â Â Â Â Â goto out_err;
> + Â Â Â }
> + Â Â Â ntfy_init(node_mgr_obj->ntfy_obj);
> +
> + Â Â Â INIT_LIST_HEAD(&node_mgr_obj->node_list->head);
> +
> + Â Â Â dev_get_dev_type(hdev_obj, &dev_type);
>
> Â Â Â Â/* Create the DCD Manager */
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â status =
> - Â Â Â Â Â Â Â Â Â dcd_create_manager(sz_zl_file, &node_mgr_obj->hdcd_mgr);
> - Â Â Â Â Â Â Â if (!status)
> - Â Â Â Â Â Â Â Â Â Â Â status = get_proc_props(node_mgr_obj, hdev_obj);
> + Â Â Â status = dcd_create_manager(sz_zl_file, &node_mgr_obj->hdcd_mgr);
> + Â Â Â if (unlikely(status != 0))
> + Â Â Â Â Â Â Â goto out_err;
> +
> + Â Â Â status = get_proc_props(node_mgr_obj, hdev_obj);
> + Â Â Â if (unlikely(status != 0))
> + Â Â Â Â Â Â Â goto out_err;
>
> - Â Â Â }
> Â Â Â Â/* Create NODE Dispatcher */
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â disp_attr_obj.ul_chnl_offset = node_mgr_obj->ul_chnl_offset;
> - Â Â Â Â Â Â Â disp_attr_obj.ul_chnl_buf_size = node_mgr_obj->ul_chnl_buf_size;
> - Â Â Â Â Â Â Â disp_attr_obj.proc_family = node_mgr_obj->proc_family;
> - Â Â Â Â Â Â Â disp_attr_obj.proc_type = node_mgr_obj->proc_type;
> - Â Â Â Â Â Â Â status =
> - Â Â Â Â Â Â Â Â Â disp_create(&node_mgr_obj->disp_obj, hdev_obj,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â &disp_attr_obj);
> - Â Â Â }
> + Â Â Â disp_attr_obj.ul_chnl_offset = node_mgr_obj->ul_chnl_offset;
> + Â Â Â disp_attr_obj.ul_chnl_buf_size = node_mgr_obj->ul_chnl_buf_size;
> + Â Â Â disp_attr_obj.proc_family = node_mgr_obj->proc_family;
> + Â Â Â disp_attr_obj.proc_type = node_mgr_obj->proc_type;
> +
> + Â Â Â status = disp_create(&node_mgr_obj->disp_obj, hdev_obj, &disp_attr_obj);
> + Â Â Â if (unlikely(status != 0))
> + Â Â Â Â Â Â Â goto out_err;
> +
> Â Â Â Â/* Create a STRM Manager */
> - Â Â Â if (!status)
> - Â Â Â Â Â Â Â status = strm_create(&node_mgr_obj->strm_mgr_obj, hdev_obj);
> + Â Â Â status = strm_create(&node_mgr_obj->strm_mgr_obj, hdev_obj);
> + Â Â Â if (unlikely(status != 0))
> + Â Â Â Â Â Â Â goto out_err;
>
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â dev_get_intf_fxns(hdev_obj, &node_mgr_obj->intf_fxns);
> - Â Â Â Â Â Â Â /* Get msg_ctrl queue manager */
> - Â Â Â Â Â Â Â dev_get_msg_mgr(hdev_obj, &node_mgr_obj->msg_mgr_obj);
> - Â Â Â Â Â Â Â mutex_init(&node_mgr_obj->node_mgr_lock);
> - Â Â Â Â Â Â Â node_mgr_obj->chnl_map = gb_create(node_mgr_obj->ul_num_chnls);
> - Â Â Â Â Â Â Â /* dma chnl map. ul_num_chnls is # per transport */
> - Â Â Â Â Â Â Â node_mgr_obj->dma_chnl_map =
> - Â Â Â Â Â Â Â Â Â gb_create(node_mgr_obj->ul_num_chnls);
> - Â Â Â Â Â Â Â node_mgr_obj->zc_chnl_map =
> - Â Â Â Â Â Â Â Â Â gb_create(node_mgr_obj->ul_num_chnls);
> - Â Â Â Â Â Â Â if ((node_mgr_obj->chnl_map == NULL)
> - Â Â Â Â Â Â Â Â Â || (node_mgr_obj->dma_chnl_map == NULL)
> - Â Â Â Â Â Â Â Â Â || (node_mgr_obj->zc_chnl_map == NULL)) {
> - Â Â Â Â Â Â Â Â Â Â Â status = -ENOMEM;
> - Â Â Â Â Â Â Â } else {
> - Â Â Â Â Â Â Â Â Â Â Â /* Block out reserved channels */
> - Â Â Â Â Â Â Â Â Â Â Â for (i = 0; i < node_mgr_obj->ul_chnl_offset; i++)
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â gb_set(node_mgr_obj->chnl_map, i);
> -
> - Â Â Â Â Â Â Â Â Â Â Â /* Block out channels reserved for RMS */
> - Â Â Â Â Â Â Â Â Â Â Â gb_set(node_mgr_obj->chnl_map,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Ânode_mgr_obj->ul_chnl_offset);
> - Â Â Â Â Â Â Â Â Â Â Â gb_set(node_mgr_obj->chnl_map,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Ânode_mgr_obj->ul_chnl_offset + 1);
> - Â Â Â Â Â Â Â }
> - Â Â Â }
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â /* NO RM Server on the IVA */
> - Â Â Â Â Â Â Â if (dev_type != IVA_UNIT) {
> - Â Â Â Â Â Â Â Â Â Â Â /* Get addresses of any RMS functions loaded */
> - Â Â Â Â Â Â Â Â Â Â Â status = get_rms_fxns(node_mgr_obj);
> - Â Â Â Â Â Â Â }
> + Â Â Â dev_get_intf_fxns(hdev_obj, &node_mgr_obj->intf_fxns);
> + Â Â Â /* Get msg_ctrl queue manager */
> + Â Â Â dev_get_msg_mgr(hdev_obj, &node_mgr_obj->msg_mgr_obj);
> + Â Â Â mutex_init(&node_mgr_obj->node_mgr_lock);
> +
> + Â Â Â /* Block out reserved channels */
> + Â Â Â for (i = 0; i < node_mgr_obj->ul_chnl_offset; i++)
> + Â Â Â Â Â Â Â set_bit(i, node_mgr_obj->chnl_map);
> +
> + Â Â Â /* Block out channels reserved for RMS */
> + Â Â Â set_bit(node_mgr_obj->ul_chnl_offset, node_mgr_obj->chnl_map);
> + Â Â Â set_bit(node_mgr_obj->ul_chnl_offset + 1, node_mgr_obj->chnl_map);
> +
> + Â Â Â /* NO RM Server on the IVA */
> + Â Â Â if (dev_type != IVA_UNIT) {
> + Â Â Â Â Â Â Â /* Get addresses of any RMS functions loaded */
> + Â Â Â Â Â Â Â status = get_rms_fxns(node_mgr_obj);
> Â Â Â Â}
> + Â Â Â if (unlikely(status != 0))
> + Â Â Â Â Â Â Â goto out_err;
>
> Â Â Â Â/* Get loader functions and create loader */
> - Â Â Â if (!status)
> - Â Â Â Â Â Â Â node_mgr_obj->nldr_fxns = nldr_fxns; Â Â/* Dyn loader funcs */
> + Â Â Â node_mgr_obj->nldr_fxns = nldr_fxns; Â Â/* Dyn loader funcs */
>
> - Â Â Â if (!status) {
> - Â Â Â Â Â Â Â nldr_attrs_obj.pfn_ovly = ovly;
> - Â Â Â Â Â Â Â nldr_attrs_obj.pfn_write = mem_write;
> - Â Â Â Â Â Â Â nldr_attrs_obj.us_dsp_word_size = node_mgr_obj->udsp_word_size;
> - Â Â Â Â Â Â Â nldr_attrs_obj.us_dsp_mau_size = node_mgr_obj->udsp_mau_size;
> - Â Â Â Â Â Â Â node_mgr_obj->loader_init = node_mgr_obj->nldr_fxns.pfn_init();
> - Â Â Â Â Â Â Â status =
> - Â Â Â Â Â Â Â Â Â node_mgr_obj->nldr_fxns.pfn_create(&node_mgr_obj->nldr_obj,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Âhdev_obj,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â&nldr_attrs_obj);
> - Â Â Â }
> - Â Â Â if (!status)
> - Â Â Â Â Â Â Â *node_man = node_mgr_obj;
> - Â Â Â else
> - Â Â Â Â Â Â Â delete_node_mgr(node_mgr_obj);
> + Â Â Â nldr_attrs_obj.pfn_ovly = ovly;
> + Â Â Â nldr_attrs_obj.pfn_write = mem_write;
> + Â Â Â nldr_attrs_obj.us_dsp_word_size = node_mgr_obj->udsp_word_size;
> + Â Â Â nldr_attrs_obj.us_dsp_mau_size = node_mgr_obj->udsp_mau_size;
> + Â Â Â node_mgr_obj->loader_init = node_mgr_obj->nldr_fxns.pfn_init();
> + Â Â Â status = node_mgr_obj->nldr_fxns.pfn_create(&node_mgr_obj->nldr_obj,
> + Â Â Â Â Â Â Â Â Â Â Â hdev_obj,
> + Â Â Â Â Â Â Â Â Â Â Â &nldr_attrs_obj);
> + Â Â Â if (unlikely(status != 0))
> + Â Â Â Â Â Â Â goto out_err;
> +
> + Â Â Â *node_man = node_mgr_obj;
>
> Â Â Â ÂDBC_ENSURE((status && *node_man == NULL) || (!status && *node_man));
>
> Â Â Â Âreturn status;
> +out_err:
> + Â Â Â delete_node_mgr(node_mgr_obj);
> + Â Â Â return status;
> Â}
>
> Â/*
> @@ -2613,21 +2575,6 @@ static void delete_node_mgr(struct node_mgr *hnode_mgr)
> Â Â Â Â Â Â Â Â Â Â Â Âkfree(hnode_mgr->ntfy_obj);
> Â Â Â Â Â Â Â Â}
>
> - Â Â Â Â Â Â Â if (hnode_mgr->pipe_map)
> - Â Â Â Â Â Â Â Â Â Â Â gb_delete(hnode_mgr->pipe_map);
> -
> - Â Â Â Â Â Â Â if (hnode_mgr->pipe_done_map)
> - Â Â Â Â Â Â Â Â Â Â Â gb_delete(hnode_mgr->pipe_done_map);
> -
> - Â Â Â Â Â Â Â if (hnode_mgr->chnl_map)
> - Â Â Â Â Â Â Â Â Â Â Â gb_delete(hnode_mgr->chnl_map);
> -
> - Â Â Â Â Â Â Â if (hnode_mgr->dma_chnl_map)
> - Â Â Â Â Â Â Â Â Â Â Â gb_delete(hnode_mgr->dma_chnl_map);
> -
> - Â Â Â Â Â Â Â if (hnode_mgr->zc_chnl_map)
> - Â Â Â Â Â Â Â Â Â Â Â gb_delete(hnode_mgr->zc_chnl_map);
> -
> Â Â Â Â Â Â Â Âif (hnode_mgr->disp_obj)
> Â Â Â Â Â Â Â Â Â Â Â Âdisp_delete(hnode_mgr->disp_obj);
>
> @@ -2742,25 +2689,25 @@ static void free_stream(struct node_mgr *hnode_mgr, struct stream_chnl stream)
> Â{
> Â Â Â Â/* Free up the pipe id unless other node has not yet been deleted. */
> Â Â Â Âif (stream.type == NODECONNECT) {
> - Â Â Â Â Â Â Â if (gb_test(hnode_mgr->pipe_done_map, stream.dev_id)) {
> + Â Â Â Â Â Â Â if (test_bit(stream.dev_id, hnode_mgr->pipe_done_map)) {
> Â Â Â Â Â Â Â Â Â Â Â Â/* The other node has already been deleted */
> - Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->pipe_done_map, stream.dev_id);
> - Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->pipe_map, stream.dev_id);
> + Â Â Â Â Â Â Â Â Â Â Â clear_bit(stream.dev_id, hnode_mgr->pipe_done_map);
> + Â Â Â Â Â Â Â Â Â Â Â clear_bit(stream.dev_id, hnode_mgr->pipe_map);
> Â Â Â Â Â Â Â Â} else {
> Â Â Â Â Â Â Â Â Â Â Â Â/* The other node has not been deleted yet */
> - Â Â Â Â Â Â Â Â Â Â Â gb_set(hnode_mgr->pipe_done_map, stream.dev_id);
> + Â Â Â Â Â Â Â Â Â Â Â set_bit(stream.dev_id, hnode_mgr->pipe_done_map);
> Â Â Â Â Â Â Â Â}
> Â Â Â Â} else if (stream.type == HOSTCONNECT) {
> Â Â Â Â Â Â Â Âif (stream.dev_id < hnode_mgr->ul_num_chnls) {
> - Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->chnl_map, stream.dev_id);
> + Â Â Â Â Â Â Â Â Â Â Â clear_bit(stream.dev_id, hnode_mgr->chnl_map);
> Â Â Â Â Â Â Â Â} else if (stream.dev_id < (2 * hnode_mgr->ul_num_chnls)) {
> Â Â Â Â Â Â Â Â Â Â Â Â/* dsp-dma */
> - Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->dma_chnl_map, stream.dev_id -
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â(1 * hnode_mgr->ul_num_chnls));
> + Â Â Â Â Â Â Â Â Â Â Â clear_bit(stream.dev_id - (1 * hnode_mgr->ul_num_chnls),
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â hnode_mgr->dma_chnl_map);
> Â Â Â Â Â Â Â Â} else if (stream.dev_id < (3 * hnode_mgr->ul_num_chnls)) {
> Â Â Â Â Â Â Â Â Â Â Â Â/* zero-copy */
> - Â Â Â Â Â Â Â Â Â Â Â gb_clear(hnode_mgr->zc_chnl_map, stream.dev_id -
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â(2 * hnode_mgr->ul_num_chnls));
> + Â Â Â Â Â Â Â Â Â Â Â clear_bit(stream.dev_id - (2 * hnode_mgr->ul_num_chnls),
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â hnode_mgr->zc_chnl_map);
> Â Â Â Â Â Â Â Â}
> Â Â Â Â}
> Â}
> --
> 1.7.2.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at Âhttp://vger.kernel.org/majordomo-info.html
>



-- 
With Best Regards,
Andy Shevchenko
ÿô.nlj·Ÿ®‰­†+%ŠË±é¥Šwÿº{.nlj·¥Š{±þ‰š§ø¡Ü}©ž²ÆzÚj:+v‰¨þø®w¥þŠàÞ¨è&¢)ß«a¶Úÿûz¹ÞúŽŠÝjÿŠwèf



[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux