nr_node
if (xc->xd->cur_node >= xc->xd->nr_node) {
xd->nr_node = nr;
xd->nr_node = sg_len;
unsigned int nr_node;
struct uniphier_xdmac_desc_node nodes[] __counted_by(nr_node);
static __inline__ void nr_node_put(struct nr_node *nr_node)
if (refcount_dec_and_test(&nr_node->refcount)) {
kfree(nr_node);
static __inline__ void nr_node_lock(struct nr_node *nr_node)
nr_node_hold(nr_node);
spin_lock_bh(&nr_node->node_lock);
static __inline__ void nr_node_unlock(struct nr_node *nr_node)
spin_unlock_bh(&nr_node->node_lock);
nr_node_put(nr_node);
struct nr_node *nr_node;
nr_node = nr_node_get(nr);
struct nr_node *nr_nodet;
if (quality == 0 && nr_neigh != NULL && nr_node != NULL) {
nr_node_put(nr_node);
if (nr_node)
nr_node_put(nr_node);
if (nr_node)
nr_node_put(nr_node);
if (nr_node == NULL) {
if ((nr_node = kmalloc(sizeof(*nr_node), GFP_ATOMIC)) == NULL) {
nr_node->callsign = *nr;
strscpy(nr_node->mnemonic, mnemonic);
nr_node->which = 0;
nr_node->count = 1;
refcount_set(&nr_node->refcount, 1);
spin_lock_init(&nr_node->node_lock);
nr_node->routes[0].quality = quality;
nr_node->routes[0].obs_count = obs_count;
nr_node->routes[0].neighbour = nr_neigh;
hlist_add_head(&nr_node->node_node, &nr_node_list);
nr_node_lock(nr_node);
strscpy(nr_node->mnemonic, mnemonic);
for (found = 0, i = 0; i < nr_node->count; i++) {
if (nr_node->routes[i].neighbour == nr_neigh) {
nr_node->routes[i].quality = quality;
nr_node->routes[i].obs_count = obs_count;
if (nr_node->count < 3) {
nr_node->routes[2] = nr_node->routes[1];
nr_node->routes[1] = nr_node->routes[0];
nr_node->routes[0].quality = quality;
nr_node->routes[0].obs_count = obs_count;
nr_node->routes[0].neighbour = nr_neigh;
nr_node->which++;
nr_node->count++;
if (quality > nr_node->routes[2].quality) {
nr_node->routes[2].neighbour->count--;
nr_neigh_put(nr_node->routes[2].neighbour);
if (nr_node->routes[2].neighbour->count == 0 && !nr_node->routes[2].neighbour->locked)
nr_remove_neigh(nr_node->routes[2].neighbour);
nr_node->routes[2].quality = quality;
nr_node->routes[2].obs_count = obs_count;
nr_node->routes[2].neighbour = nr_neigh;
switch (nr_node->count) {
re_sort_routes(nr_node, 0, 1);
re_sort_routes(nr_node, 1, 2);
re_sort_routes(nr_node, 0, 1);
for (i = 0; i < nr_node->count; i++) {
if (nr_node->routes[i].neighbour == nr_neigh) {
if (i < nr_node->which)
nr_node->which = i;
nr_node_unlock(nr_node);
nr_node_put(nr_node);
static void nr_remove_node_locked(struct nr_node *nr_node)
hlist_del_init(&nr_node->node_node);
nr_node_put(nr_node);
struct nr_node *nr_node;
nr_node = nr_node_get(callsign);
if (nr_node == NULL)
nr_node_put(nr_node);
nr_node_lock(nr_node);
for (i = 0; i < nr_node->count; i++) {
if (nr_node->routes[i].neighbour == nr_neigh) {
nr_node->count--;
if (nr_node->count == 0) {
nr_remove_node_locked(nr_node);
nr_node->routes[0] = nr_node->routes[1];
nr_node->routes[1] = nr_node->routes[2];
nr_node_put(nr_node);
nr_node_unlock(nr_node);
nr_node_unlock(nr_node);
nr_node_put(nr_node);
static struct nr_node *nr_node_get(ax25_address *callsign)
struct nr_node *s;
struct nr_node *found = NULL;
struct nr_node *nr_node;
nr_node_for_each(nr_node, &nr_node_list)
if (ax25cmp(callsign, &nr_node->callsign) == 0) {
struct nr_node *t;
nr_node_hold(nr_node);
found = nr_node;
struct nr_node *nr_node = NULL;
nr_node_for_each(nr_node, &nr_node_list) {
nr_node_lock(nr_node);
if (nr_node->which < nr_node->count &&
nr_node->routes[nr_node->which].neighbour == nr_neigh)
nr_node->which++;
nr_node_unlock(nr_node);
struct nr_node *nr_node;
nr_node = nr_node_get(nr_dest);
if (nr_node == NULL)
nr_node_lock(nr_node);
if (nr_node->which >= nr_node->count) {
nr_node_unlock(nr_node);
nr_node_put(nr_node);
nr_neigh = nr_node->routes[nr_node->which].neighbour;
nr_node_unlock(nr_node);
nr_node_put(nr_node);
static void re_sort_routes(struct nr_node *nr_node, int x, int y)
nr_node_unlock(nr_node);
nr_node_put(nr_node);
if (nr_node->routes[y].quality > nr_node->routes[x].quality) {
nr_node_unlock(nr_node);
if (nr_node->which == x)
nr_node_put(nr_node);
nr_node->which = y;
else if (nr_node->which == y)
nr_node->which = x;
struct nr_node *nr_node = hlist_entry(v, struct nr_node,
nr_node_lock(nr_node);
ax2asc(buf, &nr_node->callsign),
(nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic,
nr_node->which + 1,
nr_node->count);
for (i = 0; i < nr_node->count; i++) {
nr_node->routes[i].quality,
swap(nr_node->routes[x], nr_node->routes[y]);
nr_node->routes[i].obs_count,
nr_node->routes[i].neighbour->number);
nr_node_unlock(nr_node);
struct nr_node *t = NULL;