1
2#ifndef _FIREWIRE_FWSERIAL_H
3#define _FIREWIRE_FWSERIAL_H
4
5#include <linux/kernel.h>
6#include <linux/tty.h>
7#include <linux/tty_driver.h>
8#include <linux/tty_flip.h>
9#include <linux/list.h>
10#include <linux/firewire.h>
11#include <linux/firewire-constants.h>
12#include <linux/spinlock.h>
13#include <linux/rcupdate.h>
14#include <linux/mutex.h>
15#include <linux/serial.h>
16#include <linux/serial_reg.h>
17#include <linux/module.h>
18#include <linux/seq_file.h>
19#include <linux/debugfs.h>
20
21#include "dma_fifo.h"
22
23#ifdef FWTTY_PROFILING
24#define DISTRIBUTION_MAX_SIZE 8192
25#define DISTRIBUTION_MAX_INDEX (ilog2(DISTRIBUTION_MAX_SIZE) + 1)
26static inline void fwtty_profile_data(unsigned int stat[], unsigned int val)
27{
28 int n = (val) ? min(ilog2(val) + 1, DISTRIBUTION_MAX_INDEX) : 0;
29 ++stat[n];
30}
31#else
32#define DISTRIBUTION_MAX_INDEX 0
33#define fwtty_profile_data(st, n)
34#endif
35
36
37struct virt_plug_params {
38 __be32 status_hi;
39 __be32 status_lo;
40 __be32 fifo_hi;
41 __be32 fifo_lo;
42 __be32 fifo_len;
43};
44
45struct peer_work_params {
46 union {
47 struct virt_plug_params plug_req;
48 };
49};
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76struct fwtty_peer {
77 struct fw_unit *unit;
78 struct fw_serial *serial;
79 u64 guid;
80 int generation;
81 int node_id;
82 unsigned int speed;
83 int max_payload;
84 u64 mgmt_addr;
85
86
87 u64 status_addr;
88 u64 fifo_addr;
89 int fifo_len;
90
91 struct list_head list;
92 struct rcu_head rcu;
93
94 spinlock_t lock;
95 work_func_t workfn;
96 struct work_struct work;
97 struct peer_work_params work_params;
98 struct timer_list timer;
99 int state;
100 struct delayed_work connect;
101 int connect_retries;
102
103 struct fwtty_port *port;
104};
105
106#define to_peer(ptr, field) (container_of(ptr, struct fwtty_peer, field))
107
108
109enum fwtty_peer_state {
110 FWPS_GONE,
111 FWPS_NOT_ATTACHED,
112 FWPS_ATTACHED,
113 FWPS_PLUG_PENDING,
114 FWPS_PLUG_RESPONDING,
115 FWPS_UNPLUG_PENDING,
116 FWPS_UNPLUG_RESPONDING,
117
118 FWPS_NO_MGMT_ADDR = -1,
119};
120
121#define CONNECT_RETRY_DELAY HZ
122#define MAX_CONNECT_RETRIES 10
123
124
125static inline void peer_set_state(struct fwtty_peer *peer, int new)
126{
127 peer->state = new;
128}
129
130static inline struct fwtty_port *peer_revert_state(struct fwtty_peer *peer)
131{
132 struct fwtty_port *port = peer->port;
133
134 peer->port = NULL;
135 peer_set_state(peer, FWPS_NOT_ATTACHED);
136 return port;
137}
138
139struct fwserial_mgmt_pkt {
140 struct {
141 __be16 len;
142 __be16 code;
143 } hdr;
144 union {
145 struct virt_plug_params plug_req;
146 struct virt_plug_params plug_rsp;
147 };
148} __packed;
149
150
151#define FWSC_RSP_OK 0x0000
152#define FWSC_RSP_NACK 0x8000
153#define FWSC_CODE_MASK 0x0fff
154
155#define FWSC_VIRT_CABLE_PLUG 1
156#define FWSC_VIRT_CABLE_UNPLUG 2
157#define FWSC_VIRT_CABLE_PLUG_RSP 3
158#define FWSC_VIRT_CABLE_UNPLUG_RSP 4
159
160
161#define VIRT_CABLE_PLUG_TIMEOUT (60 * HZ)
162
163struct stats {
164 unsigned int xchars;
165 unsigned int dropped;
166 unsigned int tx_stall;
167 unsigned int fifo_errs;
168 unsigned int sent;
169 unsigned int lost;
170 unsigned int throttled;
171 unsigned int reads[DISTRIBUTION_MAX_INDEX + 1];
172 unsigned int writes[DISTRIBUTION_MAX_INDEX + 1];
173 unsigned int txns[DISTRIBUTION_MAX_INDEX + 1];
174 unsigned int unthrottle[DISTRIBUTION_MAX_INDEX + 1];
175};
176
177struct fwconsole_ops {
178 void (*notify)(int code, void *data);
179 void (*stats)(struct stats *stats, void *data);
180 void (*proc_show)(struct seq_file *m, void *data);
181};
182
183
184#define FWCON_NOTIFY_ATTACH 1
185#define FWCON_NOTIFY_DETACH 2
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238struct fwtty_port {
239 struct tty_port port;
240 struct device *device;
241 unsigned int index;
242 struct fw_serial *serial;
243 struct fw_address_handler rx_handler;
244
245 struct fwconsole_ops *fwcon_ops;
246 void *con_data;
247
248 wait_queue_head_t wait_tx;
249 struct delayed_work emit_breaks;
250 unsigned int cps;
251 unsigned long break_last;
252
253 struct work_struct hangup;
254
255 unsigned int mstatus;
256
257 spinlock_t lock;
258 unsigned int mctrl;
259 struct delayed_work drain;
260 struct dma_fifo tx_fifo;
261 int max_payload;
262 unsigned int status_mask;
263 unsigned int ignore_mask;
264 unsigned int break_ctl:1,
265 write_only:1,
266 overrun:1,
267 loopback:1;
268 unsigned long flags;
269
270 struct fwtty_peer __rcu *peer;
271
272 struct async_icount icount;
273 struct stats stats;
274};
275
276#define to_port(ptr, field) (container_of(ptr, struct fwtty_port, field))
277
278
279#define IN_TX 0
280#define STOP_TX 1
281
282
283#define OOB_RX_THROTTLE 0x00010000
284#define MCTRL_RSRVD 0x000e0000
285#define OOB_TX_THROTTLE 0x00100000
286#define MSTATUS_RSRVD 0x00e00000
287
288#define MCTRL_MASK (TIOCM_DTR | TIOCM_RTS | TIOCM_OUT1 | TIOCM_OUT2 | \
289 TIOCM_LOOP | OOB_RX_THROTTLE | MCTRL_RSRVD)
290
291
292
293#define FREQ_BREAKS (HZ / 50)
294
295
296#define MAX_CARD_PORTS CONFIG_FWTTY_MAX_CARD_PORTS
297#define MAX_TOTAL_PORTS CONFIG_FWTTY_MAX_TOTAL_PORTS
298
299
300#define FWTTY_PORT_TXFIFO_LEN 4096
301#define FWTTY_PORT_MAX_PEND_DMA 8
302#define DRAIN_THRESHOLD 1024
303#define MAX_ASYNC_PAYLOAD 4096
304#define WRITER_MINIMUM 128
305
306#define HIGH_WATERMARK 32768
307
308
309
310
311
312#define FWTTY_PORT_RXFIFO_LEN MAX_ASYNC_PAYLOAD
313
314
315
316
317
318
319
320
321
322
323
324struct fw_serial {
325 struct fw_card *card;
326 struct kref kref;
327
328 struct dentry *debugfs;
329 struct fwtty_peer *self;
330
331 struct list_head list;
332 struct list_head peer_list;
333
334 struct fwtty_port *ports[MAX_CARD_PORTS];
335};
336
337#define to_serial(ptr, field) (container_of(ptr, struct fw_serial, field))
338
339#define TTY_DEV_NAME "fwtty"
340static const char tty_dev_name[] = TTY_DEV_NAME;
341static const char loop_dev_name[] = "fwloop";
342
343extern struct tty_driver *fwtty_driver;
344
345
346
347
348
349
350
351
352
353static inline int link_speed_to_max_payload(unsigned int speed)
354{
355
356 return min(512 << speed, 4096);
357}
358
359#endif
360