v2.4.8 -> v2.4.8.1
[opensuse:kernel.git] / drivers / ieee1394 / hosts.h
1 #ifndef _IEEE1394_HOSTS_H
2 #define _IEEE1394_HOSTS_H
3
4 #include <linux/wait.h>
5 #include <linux/tqueue.h>
6 #include <asm/semaphore.h>
7
8 #include "ieee1394_types.h"
9 #include "csr.h"
10
11
12 struct hpsb_packet;
13
14 struct hpsb_host {
15 /* private fields (hosts, do not use them) */
16         struct hpsb_host *next;
17
18         atomic_t generation;
19
20         struct list_head pending_packets;
21         spinlock_t pending_pkt_lock;
22         struct tq_struct timeout_tq;
23
24         /* A bitmask where a set bit means that this tlabel is in use.
25          * FIXME - should be handled per node instead of per bus. */
26         u32 tlabel_pool[2];
27         struct semaphore tlabel_count;
28         spinlock_t tlabel_lock;
29
30         int reset_retries;
31         quadlet_t *topology_map;
32         u8 *speed_map;
33         struct csr_control csr;
34
35         unsigned char iso_listen_count[64];
36
37 /* readonly fields for hosts */
38         struct hpsb_host_template *template;
39
40         int node_count; /* number of identified nodes on this bus */
41         int selfid_count; /* total number of SelfIDs received */
42
43         nodeid_t node_id; /* node ID of this host */
44         nodeid_t irm_id; /* ID of this bus' isochronous resource manager */
45         nodeid_t busmgr_id; /* ID of this bus' bus manager */
46
47         unsigned initialized:1; /* initialized and usable */
48         unsigned in_bus_reset:1; /* in bus reset / SelfID stage */
49         unsigned attempt_root:1; /* attempt to become root during next reset */
50
51         /* this nodes' duties on the bus */
52         unsigned is_root:1;
53         unsigned is_cycmst:1;
54         unsigned is_irm:1;
55         unsigned is_busmgr:1;
56
57 /* fields readable and writeable by the hosts */
58
59         void *hostdata;
60         struct pci_dev *pdev;
61         int embedded_hostdata[0];
62 };
63
64
65
66 enum devctl_cmd {
67         /* Host is requested to reset its bus and cancel all outstanding async
68          * requests.  If arg == 1, it shall also attempt to become root on the
69          * bus.  Return void. */
70         RESET_BUS,
71
72         /* Arg is void, return value is the hardware cycle counter value. */
73         GET_CYCLE_COUNTER,
74
75         /* Set the hardware cycle counter to the value in arg, return void.
76          * FIXME - setting is probably not required. */
77         SET_CYCLE_COUNTER,
78
79         /* Configure hardware for new bus ID in arg, return void. */
80         SET_BUS_ID,
81
82         /* If arg true, start sending cycle start packets, stop if arg == 0.
83          * Return void. */
84         ACT_CYCLE_MASTER,
85
86         /* Cancel all outstanding async requests without resetting the bus.
87          * Return void. */
88         CANCEL_REQUESTS,
89
90         /* Decrease module usage count if arg == 0, increase otherwise.  Return
91          * void. */
92         MODIFY_USAGE,
93
94         /* Start or stop receiving isochronous channel in arg.  Return void.
95          * This acts as an optimization hint, hosts are not required not to
96          * listen on unrequested channels. */
97         ISO_LISTEN_CHANNEL,
98         ISO_UNLISTEN_CHANNEL
99 };
100
101 enum reset_types {
102         /* 166 microsecond reset -- only type of reset available on
103            non-1394a capable IEEE 1394 controllers */
104         LONG_RESET,
105
106         /* Short (arbitrated) reset -- only available on 1394a capable
107            IEEE 1394 capable controllers */
108         SHORT_RESET
109 };
110
111 struct hpsb_host_template {
112         struct hpsb_host_template *next;
113
114         struct hpsb_host *hosts;
115         int number_of_hosts;
116
117         /* fields above will be ignored and overwritten after registering */
118
119         /* This should be the name of the driver (single word) and must not be
120          * NULL. */
121         const char *name;
122
123         /* This function shall detect all available adapters of this type and
124          * call hpsb_get_host for each one.  The initialize_host function will
125          * be called to actually set up these adapters.  The number of detected
126          * adapters or zero if there are none must be returned.
127          */
128         int (*detect_hosts) (struct hpsb_host_template *template);
129
130         /* After detecting and registering hosts, this function will be called
131          * for every registered host.  It shall set up the host to be fully
132          * functional for bus operations and return 0 for failure.
133          */
134         int (*initialize_host) (struct hpsb_host *host);
135
136         /* To unload modules, this function is provided.  It shall free all
137          * resources this host is using (if host is not NULL) or free all
138          * resources globally allocated by the driver (if host is NULL).
139          */
140         void (*release_host) (struct hpsb_host *host); 
141
142         /* This function must store a pointer to the configuration ROM into the
143          * location referenced to by pointer and return the size of the ROM. It
144          * may not fail.  If any allocation is required, it must be done
145          * earlier.
146          */
147         size_t (*get_rom) (struct hpsb_host *host, const quadlet_t **pointer);
148
149         /* This function shall implement packet transmission based on
150          * packet->type.  It shall CRC both parts of the packet (unless
151          * packet->type == raw) and do byte-swapping as necessary or instruct
152          * the hardware to do so.  It can return immediately after the packet
153          * was queued for sending.  After sending, hpsb_sent_packet() has to be
154          * called.  Return 0 for failure.
155          * NOTE: The function must be callable in interrupt context.
156          */
157         int (*transmit_packet) (struct hpsb_host *host, 
158                                 struct hpsb_packet *packet);
159
160         /* This function requests miscellanous services from the driver, see
161          * above for command codes and expected actions.  Return -1 for unknown
162          * command, though that should never happen.
163          */
164         int (*devctl) (struct hpsb_host *host, enum devctl_cmd command, int arg);
165
166         /* This function is mainly to redirect local CSR reads/locks to the iso
167          * management registers (bus manager id, bandwidth available, channels
168          * available) to the hardware registers in OHCI.  reg is 0,1,2,3 for bus
169          * mgr, bwdth avail, ch avail hi, ch avail lo respectively (the same ids
170          * as OHCI uses).  data and compare are the new data and expected data
171          * respectively, return value is the old value.
172          */
173         quadlet_t (*hw_csr_reg) (struct hpsb_host *host, int reg,
174                                  quadlet_t data, quadlet_t compare);
175 };
176
177
178
179 /* mid level internal use */
180 void register_builtin_lowlevels(void);
181
182 /* high level internal use */
183 struct hpsb_highlevel;
184 void hl_all_hosts(struct hpsb_highlevel *hl, int init);
185
186 /* 
187  * These functions are for lowlevel (host) driver use.
188  */
189 int hpsb_register_lowlevel(struct hpsb_host_template *tmpl);
190 void hpsb_unregister_lowlevel(struct hpsb_host_template *tmpl);
191
192 /*
193  * Get a initialized host structure with hostdata_size bytes allocated in
194  * embedded_hostdata for free usage.  Returns NULL for failure.  
195  */
196 struct hpsb_host *hpsb_get_host(struct hpsb_host_template *tmpl, 
197                                 size_t hostdata_size);
198
199 /*
200  * Increase / decrease host usage counter.  Increase function will return true
201  * only if successful (host still existed).  Decrease function expects host to
202  * exist.
203  */
204 int hpsb_inc_host_usage(struct hpsb_host *host);
205 void hpsb_dec_host_usage(struct hpsb_host *host);
206
207 #endif /* _IEEE1394_HOSTS_H */