firewire: Implement topology map and fix a couple of loopback bugs.
[safe/jmp/linux-2.6] / drivers / firewire / fw-topology.h
1 /*                                              -*- c-basic-offset: 8 -*-
2  *
3  * fw-topology.h -- Incremental bus scan, based on bus topology
4  *
5  * Copyright (C) 2003-2006 Kristian Hoegsberg <krh@bitplanet.net>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software Foundation,
19  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */
21
22 #ifndef __fw_topology_h
23 #define __fw_topology_h
24
25 enum {
26         FW_TOPOLOGY_A =         0x01,
27         FW_TOPOLOGY_B =         0x02,
28         FW_TOPOLOGY_MIXED =     0x03,
29 };
30
31 enum {
32         FW_NODE_CREATED =   0x00,
33         FW_NODE_UPDATED =   0x01,
34         FW_NODE_DESTROYED = 0x02,
35         FW_NODE_LINK_ON =   0x03,
36         FW_NODE_LINK_OFF =  0x04,
37 };
38
39 struct fw_port {
40         struct fw_node *node;
41         unsigned speed : 3; /* S100, S200, ... S3200 */
42 };
43
44 struct fw_node {
45         u16 node_id;
46         u8 color;
47         u8 port_count;
48         unsigned link_on : 1;
49         unsigned initiated_reset : 1;
50         unsigned b_path : 1;
51         u8 phy_speed : 3; /* As in the self ID packet. */
52         u8 max_speed : 5; /* Minimum of all phy-speeds and port speeds on
53                            * the path from the local node to this node. */
54         u8 max_depth : 4; /* Maximum depth to any leaf node */
55         u8 max_hops : 4;  /* Max hops in this sub tree */
56         atomic_t ref_count;
57
58         /* For serializing node topology into a list. */
59         struct list_head link;
60
61         /* Upper layer specific data. */
62         void *data;
63
64         struct fw_port ports[0];
65 };
66
67 static inline struct fw_node *
68 fw_node(struct list_head *l)
69 {
70         return list_entry (l, struct fw_node, link);
71 }
72
73 static inline struct fw_node *
74 fw_node_get(struct fw_node *node)
75 {
76         atomic_inc(&node->ref_count);
77
78         return node;
79 }
80
81 static inline void
82 fw_node_put(struct fw_node *node)
83 {
84         if (atomic_dec_and_test(&node->ref_count))
85                 kfree(node);
86 }
87
88 void
89 fw_destroy_nodes(struct fw_card *card);
90
91 u16
92 crc16_itu_t(const u32 *buffer, size_t length);
93
94 #endif /* __fw_topology_h */