1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#include <linux/kernel.h>
32#include <linux/jiffies.h>
33#include <linux/errno.h>
34#include <linux/slab.h>
35#include <linux/tty.h>
36#include <linux/tty_driver.h>
37#include <linux/tty_flip.h>
38#include <linux/module.h>
39#include <linux/spinlock.h>
40#include <linux/uaccess.h>
41#include <linux/usb.h>
42#include <linux/usb/serial.h>
43#include <linux/usb/ezusb.h>
44
45#define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu"
46#define DRIVER_DESC "Keyspan USB to Serial Converter Driver"
47
48
49static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port);
50static void keyspan_close(struct usb_serial_port *port);
51static void keyspan_dtr_rts(struct usb_serial_port *port, int on);
52static int keyspan_startup(struct usb_serial *serial);
53static void keyspan_disconnect(struct usb_serial *serial);
54static void keyspan_release(struct usb_serial *serial);
55static int keyspan_port_probe(struct usb_serial_port *port);
56static int keyspan_port_remove(struct usb_serial_port *port);
57static int keyspan_write_room(struct tty_struct *tty);
58static int keyspan_write(struct tty_struct *tty, struct usb_serial_port *port,
59 const unsigned char *buf, int count);
60static void keyspan_send_setup(struct usb_serial_port *port, int reset_port);
61static void keyspan_set_termios(struct tty_struct *tty,
62 struct usb_serial_port *port,
63 struct ktermios *old);
64static void keyspan_break_ctl(struct tty_struct *tty, int break_state);
65static int keyspan_tiocmget(struct tty_struct *tty);
66static int keyspan_tiocmset(struct tty_struct *tty, unsigned int set,
67 unsigned int clear);
68static int keyspan_fake_startup(struct usb_serial *serial);
69
70static int keyspan_usa19_calc_baud(struct usb_serial_port *port,
71 u32 baud_rate, u32 baudclk,
72 u8 *rate_hi, u8 *rate_low,
73 u8 *prescaler, int portnum);
74static int keyspan_usa19w_calc_baud(struct usb_serial_port *port,
75 u32 baud_rate, u32 baudclk,
76 u8 *rate_hi, u8 *rate_low,
77 u8 *prescaler, int portnum);
78static int keyspan_usa28_calc_baud(struct usb_serial_port *port,
79 u32 baud_rate, u32 baudclk,
80 u8 *rate_hi, u8 *rate_low,
81 u8 *prescaler, int portnum);
82static int keyspan_usa19hs_calc_baud(struct usb_serial_port *port,
83 u32 baud_rate, u32 baudclk,
84 u8 *rate_hi, u8 *rate_low,
85 u8 *prescaler, int portnum);
86
87static int keyspan_usa28_send_setup(struct usb_serial *serial,
88 struct usb_serial_port *port,
89 int reset_port);
90static int keyspan_usa26_send_setup(struct usb_serial *serial,
91 struct usb_serial_port *port,
92 int reset_port);
93static int keyspan_usa49_send_setup(struct usb_serial *serial,
94 struct usb_serial_port *port,
95 int reset_port);
96static int keyspan_usa90_send_setup(struct usb_serial *serial,
97 struct usb_serial_port *port,
98 int reset_port);
99static int keyspan_usa67_send_setup(struct usb_serial *serial,
100 struct usb_serial_port *port,
101 int reset_port);
102
103
104#define KEYSPAN_INVALID_BAUD_RATE (-1)
105#define KEYSPAN_BAUD_RATE_OK (0)
106#define KEYSPAN_USA18X_BAUDCLK (12000000L)
107#define KEYSPAN_USA19_BAUDCLK (12000000L)
108#define KEYSPAN_USA19W_BAUDCLK (24000000L)
109#define KEYSPAN_USA19HS_BAUDCLK (14769231L)
110#define KEYSPAN_USA28_BAUDCLK (1843200L)
111#define KEYSPAN_USA28X_BAUDCLK (12000000L)
112#define KEYSPAN_USA49W_BAUDCLK (48000000L)
113
114
115#define KEYSPAN_MAX_NUM_PORTS (4)
116#define KEYSPAN_MAX_FLIPS (2)
117
118
119
120
121
122#define KEYSPAN_VENDOR_ID (0x06cd)
123
124
125#define keyspan_usa18x_pre_product_id 0x0105
126#define keyspan_usa19_pre_product_id 0x0103
127#define keyspan_usa19qi_pre_product_id 0x010b
128#define keyspan_mpr_pre_product_id 0x011b
129#define keyspan_usa19qw_pre_product_id 0x0118
130#define keyspan_usa19w_pre_product_id 0x0106
131#define keyspan_usa28_pre_product_id 0x0101
132#define keyspan_usa28x_pre_product_id 0x0102
133#define keyspan_usa28xa_pre_product_id 0x0114
134#define keyspan_usa28xb_pre_product_id 0x0113
135#define keyspan_usa49w_pre_product_id 0x0109
136#define keyspan_usa49wlc_pre_product_id 0x011a
137
138
139
140
141
142
143#define keyspan_usa18x_product_id 0x0112
144#define keyspan_usa19_product_id 0x0107
145#define keyspan_usa19qi_product_id 0x010c
146#define keyspan_usa19hs_product_id 0x0121
147#define keyspan_mpr_product_id 0x011c
148#define keyspan_usa19qw_product_id 0x0119
149#define keyspan_usa19w_product_id 0x0108
150#define keyspan_usa28_product_id 0x010f
151#define keyspan_usa28x_product_id 0x0110
152#define keyspan_usa28xa_product_id 0x0115
153#define keyspan_usa28xb_product_id 0x0110
154#define keyspan_usa28xg_product_id 0x0135
155#define keyspan_usa49w_product_id 0x010a
156#define keyspan_usa49wlc_product_id 0x012a
157#define keyspan_usa49wg_product_id 0x0131
158
159struct keyspan_device_details {
160
161 int product_id;
162
163 enum {msg_usa26, msg_usa28, msg_usa49, msg_usa90, msg_usa67} msg_format;
164
165
166 int num_ports;
167
168
169 int indat_endp_flip;
170
171
172 int outdat_endp_flip;
173
174
175
176
177
178 int indat_endpoints[KEYSPAN_MAX_NUM_PORTS];
179
180
181 int outdat_endpoints[KEYSPAN_MAX_NUM_PORTS];
182
183
184 int inack_endpoints[KEYSPAN_MAX_NUM_PORTS];
185
186
187 int outcont_endpoints[KEYSPAN_MAX_NUM_PORTS];
188
189
190 int instat_endpoint;
191
192
193 int indat_endpoint;
194
195
196 int glocont_endpoint;
197
198 int (*calculate_baud_rate)(struct usb_serial_port *port,
199 u32 baud_rate, u32 baudclk,
200 u8 *rate_hi, u8 *rate_low, u8 *prescaler,
201 int portnum);
202 u32 baudclk;
203};
204
205
206
207
208
209
210static const struct keyspan_device_details usa18x_device_details = {
211 .product_id = keyspan_usa18x_product_id,
212 .msg_format = msg_usa26,
213 .num_ports = 1,
214 .indat_endp_flip = 0,
215 .outdat_endp_flip = 1,
216 .indat_endpoints = {0x81},
217 .outdat_endpoints = {0x01},
218 .inack_endpoints = {0x85},
219 .outcont_endpoints = {0x05},
220 .instat_endpoint = 0x87,
221 .indat_endpoint = -1,
222 .glocont_endpoint = 0x07,
223 .calculate_baud_rate = keyspan_usa19w_calc_baud,
224 .baudclk = KEYSPAN_USA18X_BAUDCLK,
225};
226
227static const struct keyspan_device_details usa19_device_details = {
228 .product_id = keyspan_usa19_product_id,
229 .msg_format = msg_usa28,
230 .num_ports = 1,
231 .indat_endp_flip = 1,
232 .outdat_endp_flip = 1,
233 .indat_endpoints = {0x81},
234 .outdat_endpoints = {0x01},
235 .inack_endpoints = {0x83},
236 .outcont_endpoints = {0x03},
237 .instat_endpoint = 0x84,
238 .indat_endpoint = -1,
239 .glocont_endpoint = -1,
240 .calculate_baud_rate = keyspan_usa19_calc_baud,
241 .baudclk = KEYSPAN_USA19_BAUDCLK,
242};
243
244static const struct keyspan_device_details usa19qi_device_details = {
245 .product_id = keyspan_usa19qi_product_id,
246 .msg_format = msg_usa28,
247 .num_ports = 1,
248 .indat_endp_flip = 1,
249 .outdat_endp_flip = 1,
250 .indat_endpoints = {0x81},
251 .outdat_endpoints = {0x01},
252 .inack_endpoints = {0x83},
253 .outcont_endpoints = {0x03},
254 .instat_endpoint = 0x84,
255 .indat_endpoint = -1,
256 .glocont_endpoint = -1,
257 .calculate_baud_rate = keyspan_usa28_calc_baud,
258 .baudclk = KEYSPAN_USA19_BAUDCLK,
259};
260
261static const struct keyspan_device_details mpr_device_details = {
262 .product_id = keyspan_mpr_product_id,
263 .msg_format = msg_usa28,
264 .num_ports = 1,
265 .indat_endp_flip = 1,
266 .outdat_endp_flip = 1,
267 .indat_endpoints = {0x81},
268 .outdat_endpoints = {0x01},
269 .inack_endpoints = {0x83},
270 .outcont_endpoints = {0x03},
271 .instat_endpoint = 0x84,
272 .indat_endpoint = -1,
273 .glocont_endpoint = -1,
274 .calculate_baud_rate = keyspan_usa28_calc_baud,
275 .baudclk = KEYSPAN_USA19_BAUDCLK,
276};
277
278static const struct keyspan_device_details usa19qw_device_details = {
279 .product_id = keyspan_usa19qw_product_id,
280 .msg_format = msg_usa26,
281 .num_ports = 1,
282 .indat_endp_flip = 0,
283 .outdat_endp_flip = 1,
284 .indat_endpoints = {0x81},
285 .outdat_endpoints = {0x01},
286 .inack_endpoints = {0x85},
287 .outcont_endpoints = {0x05},
288 .instat_endpoint = 0x87,
289 .indat_endpoint = -1,
290 .glocont_endpoint = 0x07,
291 .calculate_baud_rate = keyspan_usa19w_calc_baud,
292 .baudclk = KEYSPAN_USA19W_BAUDCLK,
293};
294
295static const struct keyspan_device_details usa19w_device_details = {
296 .product_id = keyspan_usa19w_product_id,
297 .msg_format = msg_usa26,
298 .num_ports = 1,
299 .indat_endp_flip = 0,
300 .outdat_endp_flip = 1,
301 .indat_endpoints = {0x81},
302 .outdat_endpoints = {0x01},
303 .inack_endpoints = {0x85},
304 .outcont_endpoints = {0x05},
305 .instat_endpoint = 0x87,
306 .indat_endpoint = -1,
307 .glocont_endpoint = 0x07,
308 .calculate_baud_rate = keyspan_usa19w_calc_baud,
309 .baudclk = KEYSPAN_USA19W_BAUDCLK,
310};
311
312static const struct keyspan_device_details usa19hs_device_details = {
313 .product_id = keyspan_usa19hs_product_id,
314 .msg_format = msg_usa90,
315 .num_ports = 1,
316 .indat_endp_flip = 0,
317 .outdat_endp_flip = 0,
318 .indat_endpoints = {0x81},
319 .outdat_endpoints = {0x01},
320 .inack_endpoints = {-1},
321 .outcont_endpoints = {0x02},
322 .instat_endpoint = 0x82,
323 .indat_endpoint = -1,
324 .glocont_endpoint = -1,
325 .calculate_baud_rate = keyspan_usa19hs_calc_baud,
326 .baudclk = KEYSPAN_USA19HS_BAUDCLK,
327};
328
329static const struct keyspan_device_details usa28_device_details = {
330 .product_id = keyspan_usa28_product_id,
331 .msg_format = msg_usa28,
332 .num_ports = 2,
333 .indat_endp_flip = 1,
334 .outdat_endp_flip = 1,
335 .indat_endpoints = {0x81, 0x83},
336 .outdat_endpoints = {0x01, 0x03},
337 .inack_endpoints = {0x85, 0x86},
338 .outcont_endpoints = {0x05, 0x06},
339 .instat_endpoint = 0x87,
340 .indat_endpoint = -1,
341 .glocont_endpoint = 0x07,
342 .calculate_baud_rate = keyspan_usa28_calc_baud,
343 .baudclk = KEYSPAN_USA28_BAUDCLK,
344};
345
346static const struct keyspan_device_details usa28x_device_details = {
347 .product_id = keyspan_usa28x_product_id,
348 .msg_format = msg_usa26,
349 .num_ports = 2,
350 .indat_endp_flip = 0,
351 .outdat_endp_flip = 1,
352 .indat_endpoints = {0x81, 0x83},
353 .outdat_endpoints = {0x01, 0x03},
354 .inack_endpoints = {0x85, 0x86},
355 .outcont_endpoints = {0x05, 0x06},
356 .instat_endpoint = 0x87,
357 .indat_endpoint = -1,
358 .glocont_endpoint = 0x07,
359 .calculate_baud_rate = keyspan_usa19w_calc_baud,
360 .baudclk = KEYSPAN_USA28X_BAUDCLK,
361};
362
363static const struct keyspan_device_details usa28xa_device_details = {
364 .product_id = keyspan_usa28xa_product_id,
365 .msg_format = msg_usa26,
366 .num_ports = 2,
367 .indat_endp_flip = 0,
368 .outdat_endp_flip = 1,
369 .indat_endpoints = {0x81, 0x83},
370 .outdat_endpoints = {0x01, 0x03},
371 .inack_endpoints = {0x85, 0x86},
372 .outcont_endpoints = {0x05, 0x06},
373 .instat_endpoint = 0x87,
374 .indat_endpoint = -1,
375 .glocont_endpoint = 0x07,
376 .calculate_baud_rate = keyspan_usa19w_calc_baud,
377 .baudclk = KEYSPAN_USA28X_BAUDCLK,
378};
379
380static const struct keyspan_device_details usa28xg_device_details = {
381 .product_id = keyspan_usa28xg_product_id,
382 .msg_format = msg_usa67,
383 .num_ports = 2,
384 .indat_endp_flip = 0,
385 .outdat_endp_flip = 0,
386 .indat_endpoints = {0x84, 0x88},
387 .outdat_endpoints = {0x02, 0x06},
388 .inack_endpoints = {-1, -1},
389 .outcont_endpoints = {-1, -1},
390 .instat_endpoint = 0x81,
391 .indat_endpoint = -1,
392 .glocont_endpoint = 0x01,
393 .calculate_baud_rate = keyspan_usa19w_calc_baud,
394 .baudclk = KEYSPAN_USA28X_BAUDCLK,
395};
396
397
398
399
400
401static const struct keyspan_device_details usa49w_device_details = {
402 .product_id = keyspan_usa49w_product_id,
403 .msg_format = msg_usa49,
404 .num_ports = 4,
405 .indat_endp_flip = 0,
406 .outdat_endp_flip = 0,
407 .indat_endpoints = {0x81, 0x82, 0x83, 0x84},
408 .outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
409 .inack_endpoints = {-1, -1, -1, -1},
410 .outcont_endpoints = {-1, -1, -1, -1},
411 .instat_endpoint = 0x87,
412 .indat_endpoint = -1,
413 .glocont_endpoint = 0x07,
414 .calculate_baud_rate = keyspan_usa19w_calc_baud,
415 .baudclk = KEYSPAN_USA49W_BAUDCLK,
416};
417
418static const struct keyspan_device_details usa49wlc_device_details = {
419 .product_id = keyspan_usa49wlc_product_id,
420 .msg_format = msg_usa49,
421 .num_ports = 4,
422 .indat_endp_flip = 0,
423 .outdat_endp_flip = 0,
424 .indat_endpoints = {0x81, 0x82, 0x83, 0x84},
425 .outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
426 .inack_endpoints = {-1, -1, -1, -1},
427 .outcont_endpoints = {-1, -1, -1, -1},
428 .instat_endpoint = 0x87,
429 .indat_endpoint = -1,
430 .glocont_endpoint = 0x07,
431 .calculate_baud_rate = keyspan_usa19w_calc_baud,
432 .baudclk = KEYSPAN_USA19W_BAUDCLK,
433};
434
435static const struct keyspan_device_details usa49wg_device_details = {
436 .product_id = keyspan_usa49wg_product_id,
437 .msg_format = msg_usa49,
438 .num_ports = 4,
439 .indat_endp_flip = 0,
440 .outdat_endp_flip = 0,
441 .indat_endpoints = {-1, -1, -1, -1},
442 .outdat_endpoints = {0x01, 0x02, 0x04, 0x06},
443 .inack_endpoints = {-1, -1, -1, -1},
444 .outcont_endpoints = {-1, -1, -1, -1},
445 .instat_endpoint = 0x81,
446 .indat_endpoint = 0x88,
447 .glocont_endpoint = 0x00,
448 .calculate_baud_rate = keyspan_usa19w_calc_baud,
449 .baudclk = KEYSPAN_USA19W_BAUDCLK,
450};
451
452static const struct keyspan_device_details *keyspan_devices[] = {
453 &usa18x_device_details,
454 &usa19_device_details,
455 &usa19qi_device_details,
456 &mpr_device_details,
457 &usa19qw_device_details,
458 &usa19w_device_details,
459 &usa19hs_device_details,
460 &usa28_device_details,
461 &usa28x_device_details,
462 &usa28xa_device_details,
463 &usa28xg_device_details,
464
465 &usa49w_device_details,
466 &usa49wlc_device_details,
467 &usa49wg_device_details,
468 NULL,
469};
470
471static const struct usb_device_id keyspan_ids_combined[] = {
472 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
473 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
474 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
475 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
476 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
477 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
478 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
479 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
480 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
481 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
482 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
483 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
484 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
485 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
486 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
487 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
488 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
489 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
490 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
491 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
492 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
493 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
494 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
495 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id)},
496 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
497 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wg_product_id)},
498 { }
499};
500
501MODULE_DEVICE_TABLE(usb, keyspan_ids_combined);
502
503
504static const struct usb_device_id keyspan_pre_ids[] = {
505 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
506 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
507 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
508 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
509 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
510 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
511 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
512 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
513 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
514 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
515 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
516 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
517 { }
518};
519
520static const struct usb_device_id keyspan_1port_ids[] = {
521 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
522 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
523 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
524 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
525 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
526 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
527 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
528 { }
529};
530
531static const struct usb_device_id keyspan_2port_ids[] = {
532 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
533 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
534 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
535 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
536 { }
537};
538
539static const struct usb_device_id keyspan_4port_ids[] = {
540 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id) },
541 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
542 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wg_product_id)},
543 { }
544};
545
546#define INSTAT_BUFLEN 32
547#define GLOCONT_BUFLEN 64
548#define INDAT49W_BUFLEN 512
549#define IN_BUFLEN 64
550#define OUT_BUFLEN 64
551#define INACK_BUFLEN 1
552#define OUTCONT_BUFLEN 64
553
554
555struct keyspan_serial_private {
556 const struct keyspan_device_details *device_details;
557
558 struct urb *instat_urb;
559 char *instat_buf;
560
561
562
563 struct urb *indat_urb;
564 char *indat_buf;
565
566
567 struct urb *glocont_urb;
568 char *glocont_buf;
569 char *ctrl_buf;
570};
571
572struct keyspan_port_private {
573
574 int in_flip;
575 int out_flip;
576
577
578
579
580 const struct keyspan_device_details *device_details;
581
582
583 struct urb *in_urbs[2];
584 char *in_buffer[2];
585
586 struct urb *out_urbs[2];
587 char *out_buffer[2];
588
589
590 struct urb *inack_urb;
591 char *inack_buffer;
592
593
594 struct urb *outcont_urb;
595 char *outcont_buffer;
596
597
598 int baud;
599 int old_baud;
600 unsigned int cflag;
601 unsigned int old_cflag;
602 enum {flow_none, flow_cts, flow_xon} flow_control;
603 int rts_state;
604 int dtr_state;
605 int cts_state;
606 int dsr_state;
607 int dcd_state;
608 int ri_state;
609 int break_on;
610
611 unsigned long tx_start_time[2];
612 int resend_cont;
613};
614
615
616
617
618
619#include "keyspan_usa26msg.h"
620#include "keyspan_usa28msg.h"
621#include "keyspan_usa49msg.h"
622#include "keyspan_usa90msg.h"
623#include "keyspan_usa67msg.h"
624
625
626static void keyspan_break_ctl(struct tty_struct *tty, int break_state)
627{
628 struct usb_serial_port *port = tty->driver_data;
629 struct keyspan_port_private *p_priv;
630
631 p_priv = usb_get_serial_port_data(port);
632
633 if (break_state == -1)
634 p_priv->break_on = 1;
635 else
636 p_priv->break_on = 0;
637
638 keyspan_send_setup(port, 0);
639}
640
641
642static void keyspan_set_termios(struct tty_struct *tty,
643 struct usb_serial_port *port, struct ktermios *old_termios)
644{
645 int baud_rate, device_port;
646 struct keyspan_port_private *p_priv;
647 const struct keyspan_device_details *d_details;
648 unsigned int cflag;
649
650 p_priv = usb_get_serial_port_data(port);
651 d_details = p_priv->device_details;
652 cflag = tty->termios.c_cflag;
653 device_port = port->port_number;
654
655
656
657 baud_rate = tty_get_baud_rate(tty);
658
659 if (d_details->calculate_baud_rate(port, baud_rate, d_details->baudclk,
660 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
661
662
663 p_priv->baud = baud_rate;
664 } else
665 baud_rate = tty_termios_baud_rate(old_termios);
666
667 tty_encode_baud_rate(tty, baud_rate, baud_rate);
668
669 p_priv->cflag = cflag;
670 p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none;
671
672
673 tty->termios.c_cflag &= ~CMSPAR;
674
675 keyspan_send_setup(port, 0);
676}
677
678static int keyspan_tiocmget(struct tty_struct *tty)
679{
680 struct usb_serial_port *port = tty->driver_data;
681 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
682 unsigned int value;
683
684 value = ((p_priv->rts_state) ? TIOCM_RTS : 0) |
685 ((p_priv->dtr_state) ? TIOCM_DTR : 0) |
686 ((p_priv->cts_state) ? TIOCM_CTS : 0) |
687 ((p_priv->dsr_state) ? TIOCM_DSR : 0) |
688 ((p_priv->dcd_state) ? TIOCM_CAR : 0) |
689 ((p_priv->ri_state) ? TIOCM_RNG : 0);
690
691 return value;
692}
693
694static int keyspan_tiocmset(struct tty_struct *tty,
695 unsigned int set, unsigned int clear)
696{
697 struct usb_serial_port *port = tty->driver_data;
698 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
699
700 if (set & TIOCM_RTS)
701 p_priv->rts_state = 1;
702 if (set & TIOCM_DTR)
703 p_priv->dtr_state = 1;
704 if (clear & TIOCM_RTS)
705 p_priv->rts_state = 0;
706 if (clear & TIOCM_DTR)
707 p_priv->dtr_state = 0;
708 keyspan_send_setup(port, 0);
709 return 0;
710}
711
712
713
714static int keyspan_write(struct tty_struct *tty,
715 struct usb_serial_port *port, const unsigned char *buf, int count)
716{
717 struct keyspan_port_private *p_priv;
718 const struct keyspan_device_details *d_details;
719 int flip;
720 int left, todo;
721 struct urb *this_urb;
722 int err, maxDataLen, dataOffset;
723
724 p_priv = usb_get_serial_port_data(port);
725 d_details = p_priv->device_details;
726
727 if (d_details->msg_format == msg_usa90) {
728 maxDataLen = 64;
729 dataOffset = 0;
730 } else {
731 maxDataLen = 63;
732 dataOffset = 1;
733 }
734
735 dev_dbg(&port->dev, "%s - %d chars, flip=%d\n", __func__, count,
736 p_priv->out_flip);
737
738 for (left = count; left > 0; left -= todo) {
739 todo = left;
740 if (todo > maxDataLen)
741 todo = maxDataLen;
742
743 flip = p_priv->out_flip;
744
745
746 this_urb = p_priv->out_urbs[flip];
747 if (this_urb == NULL) {
748
749 dev_dbg(&port->dev, "%s - no output urb :(\n", __func__);
750 return count;
751 }
752
753 dev_dbg(&port->dev, "%s - endpoint %x flip %d\n",
754 __func__, usb_pipeendpoint(this_urb->pipe), flip);
755
756 if (this_urb->status == -EINPROGRESS) {
757 if (time_before(jiffies,
758 p_priv->tx_start_time[flip] + 10 * HZ))
759 break;
760 usb_unlink_urb(this_urb);
761 break;
762 }
763
764
765
766 ((char *)this_urb->transfer_buffer)[0] = 0;
767
768 memcpy(this_urb->transfer_buffer + dataOffset, buf, todo);
769 buf += todo;
770
771
772 this_urb->transfer_buffer_length = todo + dataOffset;
773
774 err = usb_submit_urb(this_urb, GFP_ATOMIC);
775 if (err != 0)
776 dev_dbg(&port->dev, "usb_submit_urb(write bulk) failed (%d)\n", err);
777 p_priv->tx_start_time[flip] = jiffies;
778
779
780
781 p_priv->out_flip = (flip + 1) & d_details->outdat_endp_flip;
782 }
783
784 return count - left;
785}
786
787static void usa26_indat_callback(struct urb *urb)
788{
789 int i, err;
790 int endpoint;
791 struct usb_serial_port *port;
792 unsigned char *data = urb->transfer_buffer;
793 int status = urb->status;
794
795 endpoint = usb_pipeendpoint(urb->pipe);
796
797 if (status) {
798 dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
799 __func__, status, endpoint);
800 return;
801 }
802
803 port = urb->context;
804 if (urb->actual_length) {
805
806 if ((data[0] & 0x80) == 0) {
807
808
809 if (data[0] & RXERROR_OVERRUN) {
810 tty_insert_flip_char(&port->port, 0,
811 TTY_OVERRUN);
812 }
813 for (i = 1; i < urb->actual_length ; ++i)
814 tty_insert_flip_char(&port->port, data[i],
815 TTY_NORMAL);
816 } else {
817
818 dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
819 for (i = 0; i + 1 < urb->actual_length; i += 2) {
820 int stat = data[i];
821 int flag = TTY_NORMAL;
822
823 if (stat & RXERROR_OVERRUN) {
824 tty_insert_flip_char(&port->port, 0,
825 TTY_OVERRUN);
826 }
827
828 if (stat & RXERROR_PARITY)
829 flag = TTY_PARITY;
830 else if (stat & RXERROR_FRAMING)
831 flag = TTY_FRAME;
832
833 tty_insert_flip_char(&port->port, data[i+1],
834 flag);
835 }
836 }
837 tty_flip_buffer_push(&port->port);
838 }
839
840
841 err = usb_submit_urb(urb, GFP_ATOMIC);
842 if (err != 0)
843 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
844}
845
846
847static void usa2x_outdat_callback(struct urb *urb)
848{
849 struct usb_serial_port *port;
850 struct keyspan_port_private *p_priv;
851
852 port = urb->context;
853 p_priv = usb_get_serial_port_data(port);
854 dev_dbg(&port->dev, "%s - urb %d\n", __func__, urb == p_priv->out_urbs[1]);
855
856 usb_serial_port_softint(port);
857}
858
859static void usa26_inack_callback(struct urb *urb)
860{
861}
862
863static void usa26_outcont_callback(struct urb *urb)
864{
865 struct usb_serial_port *port;
866 struct keyspan_port_private *p_priv;
867
868 port = urb->context;
869 p_priv = usb_get_serial_port_data(port);
870
871 if (p_priv->resend_cont) {
872 dev_dbg(&port->dev, "%s - sending setup\n", __func__);
873 keyspan_usa26_send_setup(port->serial, port,
874 p_priv->resend_cont - 1);
875 }
876}
877
878static void usa26_instat_callback(struct urb *urb)
879{
880 unsigned char *data = urb->transfer_buffer;
881 struct keyspan_usa26_portStatusMessage *msg;
882 struct usb_serial *serial;
883 struct usb_serial_port *port;
884 struct keyspan_port_private *p_priv;
885 int old_dcd_state, err;
886 int status = urb->status;
887
888 serial = urb->context;
889
890 if (status) {
891 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
892 __func__, status);
893 return;
894 }
895 if (urb->actual_length != 9) {
896 dev_dbg(&urb->dev->dev, "%s - %d byte report??\n", __func__, urb->actual_length);
897 goto exit;
898 }
899
900 msg = (struct keyspan_usa26_portStatusMessage *)data;
901
902
903 if (msg->port >= serial->num_ports) {
904 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);
905 goto exit;
906 }
907 port = serial->port[msg->port];
908 p_priv = usb_get_serial_port_data(port);
909 if (!p_priv)
910 goto resubmit;
911
912
913 old_dcd_state = p_priv->dcd_state;
914 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
915 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
916 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
917 p_priv->ri_state = ((msg->ri) ? 1 : 0);
918
919 if (old_dcd_state != p_priv->dcd_state)
920 tty_port_tty_hangup(&port->port, true);
921resubmit:
922
923 err = usb_submit_urb(urb, GFP_ATOMIC);
924 if (err != 0)
925 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
926exit: ;
927}
928
929static void usa26_glocont_callback(struct urb *urb)
930{
931}
932
933
934static void usa28_indat_callback(struct urb *urb)
935{
936 int err;
937 struct usb_serial_port *port;
938 unsigned char *data;
939 struct keyspan_port_private *p_priv;
940 int status = urb->status;
941
942 port = urb->context;
943 p_priv = usb_get_serial_port_data(port);
944 data = urb->transfer_buffer;
945
946 if (urb != p_priv->in_urbs[p_priv->in_flip])
947 return;
948
949 do {
950 if (status) {
951 dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
952 __func__, status, usb_pipeendpoint(urb->pipe));
953 return;
954 }
955
956 port = urb->context;
957 p_priv = usb_get_serial_port_data(port);
958 data = urb->transfer_buffer;
959
960 if (urb->actual_length) {
961 tty_insert_flip_string(&port->port, data,
962 urb->actual_length);
963 tty_flip_buffer_push(&port->port);
964 }
965
966
967 err = usb_submit_urb(urb, GFP_ATOMIC);
968 if (err != 0)
969 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n",
970 __func__, err);
971 p_priv->in_flip ^= 1;
972
973 urb = p_priv->in_urbs[p_priv->in_flip];
974 } while (urb->status != -EINPROGRESS);
975}
976
977static void usa28_inack_callback(struct urb *urb)
978{
979}
980
981static void usa28_outcont_callback(struct urb *urb)
982{
983 struct usb_serial_port *port;
984 struct keyspan_port_private *p_priv;
985
986 port = urb->context;
987 p_priv = usb_get_serial_port_data(port);
988
989 if (p_priv->resend_cont) {
990 dev_dbg(&port->dev, "%s - sending setup\n", __func__);
991 keyspan_usa28_send_setup(port->serial, port,
992 p_priv->resend_cont - 1);
993 }
994}
995
996static void usa28_instat_callback(struct urb *urb)
997{
998 int err;
999 unsigned char *data = urb->transfer_buffer;
1000 struct keyspan_usa28_portStatusMessage *msg;
1001 struct usb_serial *serial;
1002 struct usb_serial_port *port;
1003 struct keyspan_port_private *p_priv;
1004 int old_dcd_state;
1005 int status = urb->status;
1006
1007 serial = urb->context;
1008
1009 if (status) {
1010 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
1011 __func__, status);
1012 return;
1013 }
1014
1015 if (urb->actual_length != sizeof(struct keyspan_usa28_portStatusMessage)) {
1016 dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);
1017 goto exit;
1018 }
1019
1020 msg = (struct keyspan_usa28_portStatusMessage *)data;
1021
1022
1023 if (msg->port >= serial->num_ports) {
1024 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);
1025 goto exit;
1026 }
1027 port = serial->port[msg->port];
1028 p_priv = usb_get_serial_port_data(port);
1029 if (!p_priv)
1030 goto resubmit;
1031
1032
1033 old_dcd_state = p_priv->dcd_state;
1034 p_priv->cts_state = ((msg->cts) ? 1 : 0);
1035 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
1036 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1037 p_priv->ri_state = ((msg->ri) ? 1 : 0);
1038
1039 if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
1040 tty_port_tty_hangup(&port->port, true);
1041resubmit:
1042
1043 err = usb_submit_urb(urb, GFP_ATOMIC);
1044 if (err != 0)
1045 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1046exit: ;
1047}
1048
1049static void usa28_glocont_callback(struct urb *urb)
1050{
1051}
1052
1053
1054static void usa49_glocont_callback(struct urb *urb)
1055{
1056 struct usb_serial *serial;
1057 struct usb_serial_port *port;
1058 struct keyspan_port_private *p_priv;
1059 int i;
1060
1061 serial = urb->context;
1062 for (i = 0; i < serial->num_ports; ++i) {
1063 port = serial->port[i];
1064 p_priv = usb_get_serial_port_data(port);
1065
1066 if (p_priv->resend_cont) {
1067 dev_dbg(&port->dev, "%s - sending setup\n", __func__);
1068 keyspan_usa49_send_setup(serial, port,
1069 p_priv->resend_cont - 1);
1070 break;
1071 }
1072 }
1073}
1074
1075
1076
1077static void usa49_instat_callback(struct urb *urb)
1078{
1079 int err;
1080 unsigned char *data = urb->transfer_buffer;
1081 struct keyspan_usa49_portStatusMessage *msg;
1082 struct usb_serial *serial;
1083 struct usb_serial_port *port;
1084 struct keyspan_port_private *p_priv;
1085 int old_dcd_state;
1086 int status = urb->status;
1087
1088 serial = urb->context;
1089
1090 if (status) {
1091 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
1092 __func__, status);
1093 return;
1094 }
1095
1096 if (urb->actual_length !=
1097 sizeof(struct keyspan_usa49_portStatusMessage)) {
1098 dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);
1099 goto exit;
1100 }
1101
1102 msg = (struct keyspan_usa49_portStatusMessage *)data;
1103
1104
1105 if (msg->portNumber >= serial->num_ports) {
1106 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n",
1107 __func__, msg->portNumber);
1108 goto exit;
1109 }
1110 port = serial->port[msg->portNumber];
1111 p_priv = usb_get_serial_port_data(port);
1112 if (!p_priv)
1113 goto resubmit;
1114
1115
1116 old_dcd_state = p_priv->dcd_state;
1117 p_priv->cts_state = ((msg->cts) ? 1 : 0);
1118 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
1119 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1120 p_priv->ri_state = ((msg->ri) ? 1 : 0);
1121
1122 if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
1123 tty_port_tty_hangup(&port->port, true);
1124resubmit:
1125
1126 err = usb_submit_urb(urb, GFP_ATOMIC);
1127 if (err != 0)
1128 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1129exit: ;
1130}
1131
1132static void usa49_inack_callback(struct urb *urb)
1133{
1134}
1135
1136static void usa49_indat_callback(struct urb *urb)
1137{
1138 int i, err;
1139 int endpoint;
1140 struct usb_serial_port *port;
1141 unsigned char *data = urb->transfer_buffer;
1142 int status = urb->status;
1143
1144 endpoint = usb_pipeendpoint(urb->pipe);
1145
1146 if (status) {
1147 dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
1148 __func__, status, endpoint);
1149 return;
1150 }
1151
1152 port = urb->context;
1153 if (urb->actual_length) {
1154
1155 if ((data[0] & 0x80) == 0) {
1156
1157 tty_insert_flip_string(&port->port, data + 1,
1158 urb->actual_length - 1);
1159 } else {
1160
1161 for (i = 0; i + 1 < urb->actual_length; i += 2) {
1162 int stat = data[i];
1163 int flag = TTY_NORMAL;
1164
1165 if (stat & RXERROR_OVERRUN) {
1166 tty_insert_flip_char(&port->port, 0,
1167 TTY_OVERRUN);
1168 }
1169
1170 if (stat & RXERROR_PARITY)
1171 flag = TTY_PARITY;
1172 else if (stat & RXERROR_FRAMING)
1173 flag = TTY_FRAME;
1174
1175 tty_insert_flip_char(&port->port, data[i+1],
1176 flag);
1177 }
1178 }
1179 tty_flip_buffer_push(&port->port);
1180 }
1181
1182
1183 err = usb_submit_urb(urb, GFP_ATOMIC);
1184 if (err != 0)
1185 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1186}
1187
1188static void usa49wg_indat_callback(struct urb *urb)
1189{
1190 int i, len, x, err;
1191 struct usb_serial *serial;
1192 struct usb_serial_port *port;
1193 unsigned char *data = urb->transfer_buffer;
1194 int status = urb->status;
1195
1196 serial = urb->context;
1197
1198 if (status) {
1199 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
1200 __func__, status);
1201 return;
1202 }
1203
1204
1205 i = 0;
1206 len = 0;
1207
1208 while (i < urb->actual_length) {
1209
1210
1211 if (data[i] >= serial->num_ports) {
1212 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n",
1213 __func__, data[i]);
1214 return;
1215 }
1216 port = serial->port[data[i++]];
1217 len = data[i++];
1218
1219
1220 if ((data[i] & 0x80) == 0) {
1221
1222 i++;
1223 for (x = 1; x < len && i < urb->actual_length; ++x)
1224 tty_insert_flip_char(&port->port,
1225 data[i++], 0);
1226 } else {
1227
1228
1229
1230 for (x = 0; x + 1 < len &&
1231 i + 1 < urb->actual_length; x += 2) {
1232 int stat = data[i];
1233 int flag = TTY_NORMAL;
1234
1235 if (stat & RXERROR_OVERRUN) {
1236 tty_insert_flip_char(&port->port, 0,
1237 TTY_OVERRUN);
1238 }
1239
1240 if (stat & RXERROR_PARITY)
1241 flag = TTY_PARITY;
1242 else if (stat & RXERROR_FRAMING)
1243 flag = TTY_FRAME;
1244
1245 tty_insert_flip_char(&port->port, data[i+1],
1246 flag);
1247 i += 2;
1248 }
1249 }
1250 tty_flip_buffer_push(&port->port);
1251 }
1252
1253
1254 err = usb_submit_urb(urb, GFP_ATOMIC);
1255 if (err != 0)
1256 dev_dbg(&urb->dev->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1257}
1258
1259
1260static void usa49_outcont_callback(struct urb *urb)
1261{
1262}
1263
1264static void usa90_indat_callback(struct urb *urb)
1265{
1266 int i, err;
1267 int endpoint;
1268 struct usb_serial_port *port;
1269 struct keyspan_port_private *p_priv;
1270 unsigned char *data = urb->transfer_buffer;
1271 int status = urb->status;
1272
1273 endpoint = usb_pipeendpoint(urb->pipe);
1274
1275 if (status) {
1276 dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
1277 __func__, status, endpoint);
1278 return;
1279 }
1280
1281 port = urb->context;
1282 p_priv = usb_get_serial_port_data(port);
1283
1284 if (urb->actual_length) {
1285
1286
1287
1288 if (p_priv->baud > 57600)
1289 tty_insert_flip_string(&port->port, data,
1290 urb->actual_length);
1291 else {
1292
1293 if ((data[0] & 0x80) == 0) {
1294
1295
1296 if (data[0] & RXERROR_OVERRUN) {
1297 tty_insert_flip_char(&port->port, 0,
1298 TTY_OVERRUN);
1299 }
1300 for (i = 1; i < urb->actual_length ; ++i)
1301 tty_insert_flip_char(&port->port,
1302 data[i], TTY_NORMAL);
1303 } else {
1304
1305 dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
1306 for (i = 0; i + 1 < urb->actual_length; i += 2) {
1307 int stat = data[i];
1308 int flag = TTY_NORMAL;
1309
1310 if (stat & RXERROR_OVERRUN) {
1311 tty_insert_flip_char(
1312 &port->port, 0,
1313 TTY_OVERRUN);
1314 }
1315
1316 if (stat & RXERROR_PARITY)
1317 flag = TTY_PARITY;
1318 else if (stat & RXERROR_FRAMING)
1319 flag = TTY_FRAME;
1320
1321 tty_insert_flip_char(&port->port,
1322 data[i+1], flag);
1323 }
1324 }
1325 }
1326 tty_flip_buffer_push(&port->port);
1327 }
1328
1329
1330 err = usb_submit_urb(urb, GFP_ATOMIC);
1331 if (err != 0)
1332 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1333}
1334
1335
1336static void usa90_instat_callback(struct urb *urb)
1337{
1338 unsigned char *data = urb->transfer_buffer;
1339 struct keyspan_usa90_portStatusMessage *msg;
1340 struct usb_serial *serial;
1341 struct usb_serial_port *port;
1342 struct keyspan_port_private *p_priv;
1343 int old_dcd_state, err;
1344 int status = urb->status;
1345
1346 serial = urb->context;
1347
1348 if (status) {
1349 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
1350 __func__, status);
1351 return;
1352 }
1353 if (urb->actual_length < 14) {
1354 dev_dbg(&urb->dev->dev, "%s - %d byte report??\n", __func__, urb->actual_length);
1355 goto exit;
1356 }
1357
1358 msg = (struct keyspan_usa90_portStatusMessage *)data;
1359
1360
1361
1362 port = serial->port[0];
1363 p_priv = usb_get_serial_port_data(port);
1364 if (!p_priv)
1365 goto resubmit;
1366
1367
1368 old_dcd_state = p_priv->dcd_state;
1369 p_priv->cts_state = ((msg->cts) ? 1 : 0);
1370 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
1371 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1372 p_priv->ri_state = ((msg->ri) ? 1 : 0);
1373
1374 if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
1375 tty_port_tty_hangup(&port->port, true);
1376resubmit:
1377
1378 err = usb_submit_urb(urb, GFP_ATOMIC);
1379 if (err != 0)
1380 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1381exit:
1382 ;
1383}
1384
1385static void usa90_outcont_callback(struct urb *urb)
1386{
1387 struct usb_serial_port *port;
1388 struct keyspan_port_private *p_priv;
1389
1390 port = urb->context;
1391 p_priv = usb_get_serial_port_data(port);
1392
1393 if (p_priv->resend_cont) {
1394 dev_dbg(&urb->dev->dev, "%s - sending setup\n", __func__);
1395 keyspan_usa90_send_setup(port->serial, port,
1396 p_priv->resend_cont - 1);
1397 }
1398}
1399
1400
1401static void usa67_instat_callback(struct urb *urb)
1402{
1403 int err;
1404 unsigned char *data = urb->transfer_buffer;
1405 struct keyspan_usa67_portStatusMessage *msg;
1406 struct usb_serial *serial;
1407 struct usb_serial_port *port;
1408 struct keyspan_port_private *p_priv;
1409 int old_dcd_state;
1410 int status = urb->status;
1411
1412 serial = urb->context;
1413
1414 if (status) {
1415 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
1416 __func__, status);
1417 return;
1418 }
1419
1420 if (urb->actual_length !=
1421 sizeof(struct keyspan_usa67_portStatusMessage)) {
1422 dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);
1423 return;
1424 }
1425
1426
1427
1428 msg = (struct keyspan_usa67_portStatusMessage *)data;
1429
1430
1431 if (msg->port >= serial->num_ports) {
1432 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);
1433 return;
1434 }
1435
1436 port = serial->port[msg->port];
1437 p_priv = usb_get_serial_port_data(port);
1438 if (!p_priv)
1439 goto resubmit;
1440
1441
1442 old_dcd_state = p_priv->dcd_state;
1443 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
1444 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
1445
1446 if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
1447 tty_port_tty_hangup(&port->port, true);
1448resubmit:
1449
1450 err = usb_submit_urb(urb, GFP_ATOMIC);
1451 if (err != 0)
1452 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1453}
1454
1455static void usa67_glocont_callback(struct urb *urb)
1456{
1457 struct usb_serial *serial;
1458 struct usb_serial_port *port;
1459 struct keyspan_port_private *p_priv;
1460 int i;
1461
1462 serial = urb->context;
1463 for (i = 0; i < serial->num_ports; ++i) {
1464 port = serial->port[i];
1465 p_priv = usb_get_serial_port_data(port);
1466
1467 if (p_priv->resend_cont) {
1468 dev_dbg(&port->dev, "%s - sending setup\n", __func__);
1469 keyspan_usa67_send_setup(serial, port,
1470 p_priv->resend_cont - 1);
1471 break;
1472 }
1473 }
1474}
1475
1476static int keyspan_write_room(struct tty_struct *tty)
1477{
1478 struct usb_serial_port *port = tty->driver_data;
1479 struct keyspan_port_private *p_priv;
1480 const struct keyspan_device_details *d_details;
1481 int flip;
1482 int data_len;
1483 struct urb *this_urb;
1484
1485 p_priv = usb_get_serial_port_data(port);
1486 d_details = p_priv->device_details;
1487
1488
1489 if (d_details->msg_format == msg_usa90)
1490 data_len = 64;
1491 else
1492 data_len = 63;
1493
1494 flip = p_priv->out_flip;
1495
1496
1497 this_urb = p_priv->out_urbs[flip];
1498 if (this_urb != NULL) {
1499 if (this_urb->status != -EINPROGRESS)
1500 return data_len;
1501 flip = (flip + 1) & d_details->outdat_endp_flip;
1502 this_urb = p_priv->out_urbs[flip];
1503 if (this_urb != NULL) {
1504 if (this_urb->status != -EINPROGRESS)
1505 return data_len;
1506 }
1507 }
1508 return 0;
1509}
1510
1511
1512static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)
1513{
1514 struct keyspan_port_private *p_priv;
1515 const struct keyspan_device_details *d_details;
1516 int i, err;
1517 int baud_rate, device_port;
1518 struct urb *urb;
1519 unsigned int cflag = 0;
1520
1521 p_priv = usb_get_serial_port_data(port);
1522 d_details = p_priv->device_details;
1523
1524
1525 p_priv->rts_state = 1;
1526 p_priv->dtr_state = 1;
1527 p_priv->baud = 9600;
1528
1529
1530 p_priv->old_baud = 0;
1531 p_priv->old_cflag = 0;
1532
1533 p_priv->out_flip = 0;
1534 p_priv->in_flip = 0;
1535
1536
1537 for (i = 0; i < 2; i++) {
1538 urb = p_priv->in_urbs[i];
1539 if (urb == NULL)
1540 continue;
1541
1542
1543
1544 usb_clear_halt(urb->dev, urb->pipe);
1545 err = usb_submit_urb(urb, GFP_KERNEL);
1546 if (err != 0)
1547 dev_dbg(&port->dev, "%s - submit urb %d failed (%d)\n", __func__, i, err);
1548 }
1549
1550
1551 for (i = 0; i < 2; i++) {
1552 urb = p_priv->out_urbs[i];
1553 if (urb == NULL)
1554 continue;
1555
1556
1557 }
1558
1559
1560
1561
1562 device_port = port->port_number;
1563 if (tty) {
1564 cflag = tty->termios.c_cflag;
1565
1566
1567 baud_rate = tty_get_baud_rate(tty);
1568
1569 if (baud_rate >= 0
1570 && d_details->calculate_baud_rate(port, baud_rate, d_details->baudclk,
1571 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
1572 p_priv->baud = baud_rate;
1573 }
1574 }
1575
1576 p_priv->cflag = cflag;
1577 p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none;
1578
1579 keyspan_send_setup(port, 1);
1580
1581
1582
1583 return 0;
1584}
1585
1586static void keyspan_dtr_rts(struct usb_serial_port *port, int on)
1587{
1588 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
1589
1590 p_priv->rts_state = on;
1591 p_priv->dtr_state = on;
1592 keyspan_send_setup(port, 0);
1593}
1594
1595static void keyspan_close(struct usb_serial_port *port)
1596{
1597 int i;
1598 struct keyspan_port_private *p_priv;
1599
1600 p_priv = usb_get_serial_port_data(port);
1601
1602 p_priv->rts_state = 0;
1603 p_priv->dtr_state = 0;
1604
1605 keyspan_send_setup(port, 2);
1606
1607 mdelay(100);
1608
1609 p_priv->out_flip = 0;
1610 p_priv->in_flip = 0;
1611
1612 usb_kill_urb(p_priv->inack_urb);
1613 for (i = 0; i < 2; i++) {
1614 usb_kill_urb(p_priv->in_urbs[i]);
1615 usb_kill_urb(p_priv->out_urbs[i]);
1616 }
1617}
1618
1619
1620static int keyspan_fake_startup(struct usb_serial *serial)
1621{
1622 char *fw_name;
1623
1624 dev_dbg(&serial->dev->dev, "Keyspan startup version %04x product %04x\n",
1625 le16_to_cpu(serial->dev->descriptor.bcdDevice),
1626 le16_to_cpu(serial->dev->descriptor.idProduct));
1627
1628 if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000)
1629 != 0x8000) {
1630 dev_dbg(&serial->dev->dev, "Firmware already loaded. Quitting.\n");
1631 return 1;
1632 }
1633
1634
1635 switch (le16_to_cpu(serial->dev->descriptor.idProduct)) {
1636 case keyspan_usa28_pre_product_id:
1637 fw_name = "keyspan/usa28.fw";
1638 break;
1639
1640 case keyspan_usa28x_pre_product_id:
1641 fw_name = "keyspan/usa28x.fw";
1642 break;
1643
1644 case keyspan_usa28xa_pre_product_id:
1645 fw_name = "keyspan/usa28xa.fw";
1646 break;
1647
1648 case keyspan_usa28xb_pre_product_id:
1649 fw_name = "keyspan/usa28xb.fw";
1650 break;
1651
1652 case keyspan_usa19_pre_product_id:
1653 fw_name = "keyspan/usa19.fw";
1654 break;
1655
1656 case keyspan_usa19qi_pre_product_id:
1657 fw_name = "keyspan/usa19qi.fw";
1658 break;
1659
1660 case keyspan_mpr_pre_product_id:
1661 fw_name = "keyspan/mpr.fw";
1662 break;
1663
1664 case keyspan_usa19qw_pre_product_id:
1665 fw_name = "keyspan/usa19qw.fw";
1666 break;
1667
1668 case keyspan_usa18x_pre_product_id:
1669 fw_name = "keyspan/usa18x.fw";
1670 break;
1671
1672 case keyspan_usa19w_pre_product_id:
1673 fw_name = "keyspan/usa19w.fw";
1674 break;
1675
1676 case keyspan_usa49w_pre_product_id:
1677 fw_name = "keyspan/usa49w.fw";
1678 break;
1679
1680 case keyspan_usa49wlc_pre_product_id:
1681 fw_name = "keyspan/usa49wlc.fw";
1682 break;
1683
1684 default:
1685 dev_err(&serial->dev->dev, "Unknown product ID (%04x)\n",
1686 le16_to_cpu(serial->dev->descriptor.idProduct));
1687 return 1;
1688 }
1689
1690 dev_dbg(&serial->dev->dev, "Uploading Keyspan %s firmware.\n", fw_name);
1691
1692 if (ezusb_fx1_ihex_firmware_download(serial->dev, fw_name) < 0) {
1693 dev_err(&serial->dev->dev, "failed to load firmware \"%s\"\n",
1694 fw_name);
1695 return -ENOENT;
1696 }
1697
1698
1699
1700
1701
1702 return 1;
1703}
1704
1705
1706static struct usb_endpoint_descriptor const *find_ep(struct usb_serial const *serial,
1707 int endpoint)
1708{
1709 struct usb_host_interface *iface_desc;
1710 struct usb_endpoint_descriptor *ep;
1711 int i;
1712
1713 iface_desc = serial->interface->cur_altsetting;
1714 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1715 ep = &iface_desc->endpoint[i].desc;
1716 if (ep->bEndpointAddress == endpoint)
1717 return ep;
1718 }
1719 dev_warn(&serial->interface->dev, "found no endpoint descriptor for endpoint %x\n",
1720 endpoint);
1721 return NULL;
1722}
1723
1724static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint,
1725 int dir, void *ctx, char *buf, int len,
1726 void (*callback)(struct urb *))
1727{
1728 struct urb *urb;
1729 struct usb_endpoint_descriptor const *ep_desc;
1730 char const *ep_type_name;
1731
1732 if (endpoint == -1)
1733 return NULL;
1734
1735 dev_dbg(&serial->interface->dev, "%s - alloc for endpoint %x\n",
1736 __func__, endpoint);
1737 urb = usb_alloc_urb(0, GFP_KERNEL);
1738 if (!urb)
1739 return NULL;
1740
1741 if (endpoint == 0) {
1742
1743 return urb;
1744 }
1745
1746 ep_desc = find_ep(serial, endpoint);
1747 if (!ep_desc) {
1748
1749 return urb;
1750 }
1751 if (usb_endpoint_xfer_int(ep_desc)) {
1752 ep_type_name = "INT";
1753 usb_fill_int_urb(urb, serial->dev,
1754 usb_sndintpipe(serial->dev, endpoint) | dir,
1755 buf, len, callback, ctx,
1756 ep_desc->bInterval);
1757 } else if (usb_endpoint_xfer_bulk(ep_desc)) {
1758 ep_type_name = "BULK";
1759 usb_fill_bulk_urb(urb, serial->dev,
1760 usb_sndbulkpipe(serial->dev, endpoint) | dir,
1761 buf, len, callback, ctx);
1762 } else {
1763 dev_warn(&serial->interface->dev,
1764 "unsupported endpoint type %x\n",
1765 usb_endpoint_type(ep_desc));
1766 usb_free_urb(urb);
1767 return NULL;
1768 }
1769
1770 dev_dbg(&serial->interface->dev, "%s - using urb %p for %s endpoint %x\n",
1771 __func__, urb, ep_type_name, endpoint);
1772 return urb;
1773}
1774
1775static struct callbacks {
1776 void (*instat_callback)(struct urb *);
1777 void (*glocont_callback)(struct urb *);
1778 void (*indat_callback)(struct urb *);
1779 void (*outdat_callback)(struct urb *);
1780 void (*inack_callback)(struct urb *);
1781 void (*outcont_callback)(struct urb *);
1782} keyspan_callbacks[] = {
1783 {
1784
1785 .instat_callback = usa26_instat_callback,
1786 .glocont_callback = usa26_glocont_callback,
1787 .indat_callback = usa26_indat_callback,
1788 .outdat_callback = usa2x_outdat_callback,
1789 .inack_callback = usa26_inack_callback,
1790 .outcont_callback = usa26_outcont_callback,
1791 }, {
1792
1793 .instat_callback = usa28_instat_callback,
1794 .glocont_callback = usa28_glocont_callback,
1795 .indat_callback = usa28_indat_callback,
1796 .outdat_callback = usa2x_outdat_callback,
1797 .inack_callback = usa28_inack_callback,
1798 .outcont_callback = usa28_outcont_callback,
1799 }, {
1800
1801 .instat_callback = usa49_instat_callback,
1802 .glocont_callback = usa49_glocont_callback,
1803 .indat_callback = usa49_indat_callback,
1804 .outdat_callback = usa2x_outdat_callback,
1805 .inack_callback = usa49_inack_callback,
1806 .outcont_callback = usa49_outcont_callback,
1807 }, {
1808
1809 .instat_callback = usa90_instat_callback,
1810 .glocont_callback = usa28_glocont_callback,
1811 .indat_callback = usa90_indat_callback,
1812 .outdat_callback = usa2x_outdat_callback,
1813 .inack_callback = usa28_inack_callback,
1814 .outcont_callback = usa90_outcont_callback,
1815 }, {
1816
1817 .instat_callback = usa67_instat_callback,
1818 .glocont_callback = usa67_glocont_callback,
1819 .indat_callback = usa26_indat_callback,
1820 .outdat_callback = usa2x_outdat_callback,
1821 .inack_callback = usa26_inack_callback,
1822 .outcont_callback = usa26_outcont_callback,
1823 }
1824};
1825
1826
1827
1828static void keyspan_setup_urbs(struct usb_serial *serial)
1829{
1830 struct keyspan_serial_private *s_priv;
1831 const struct keyspan_device_details *d_details;
1832 struct callbacks *cback;
1833
1834 s_priv = usb_get_serial_data(serial);
1835 d_details = s_priv->device_details;
1836
1837
1838 cback = &keyspan_callbacks[d_details->msg_format];
1839
1840
1841
1842 s_priv->instat_urb = keyspan_setup_urb
1843 (serial, d_details->instat_endpoint, USB_DIR_IN,
1844 serial, s_priv->instat_buf, INSTAT_BUFLEN,
1845 cback->instat_callback);
1846
1847 s_priv->indat_urb = keyspan_setup_urb
1848 (serial, d_details->indat_endpoint, USB_DIR_IN,
1849 serial, s_priv->indat_buf, INDAT49W_BUFLEN,
1850 usa49wg_indat_callback);
1851
1852 s_priv->glocont_urb = keyspan_setup_urb
1853 (serial, d_details->glocont_endpoint, USB_DIR_OUT,
1854 serial, s_priv->glocont_buf, GLOCONT_BUFLEN,
1855 cback->glocont_callback);
1856}
1857
1858
1859static int keyspan_usa19_calc_baud(struct usb_serial_port *port,
1860 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1861 u8 *rate_low, u8 *prescaler, int portnum)
1862{
1863 u32 b16,
1864 div,
1865 cnt;
1866
1867 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1868
1869
1870 b16 = baud_rate * 16L;
1871 if (b16 == 0)
1872 return KEYSPAN_INVALID_BAUD_RATE;
1873
1874
1875 if (baud_rate > 57600)
1876 return KEYSPAN_INVALID_BAUD_RATE;
1877
1878
1879 div = baudclk / b16;
1880 if (div == 0)
1881 return KEYSPAN_INVALID_BAUD_RATE;
1882 else
1883 cnt = 0 - div;
1884
1885 if (div > 0xffff)
1886 return KEYSPAN_INVALID_BAUD_RATE;
1887
1888
1889 if (rate_low)
1890 *rate_low = (u8) (cnt & 0xff);
1891 if (rate_hi)
1892 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1893 if (rate_low && rate_hi)
1894 dev_dbg(&port->dev, "%s - %d %02x %02x.\n",
1895 __func__, baud_rate, *rate_hi, *rate_low);
1896 return KEYSPAN_BAUD_RATE_OK;
1897}
1898
1899
1900static int keyspan_usa19hs_calc_baud(struct usb_serial_port *port,
1901 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1902 u8 *rate_low, u8 *prescaler, int portnum)
1903{
1904 u32 b16,
1905 div;
1906
1907 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1908
1909
1910 b16 = baud_rate * 16L;
1911 if (b16 == 0)
1912 return KEYSPAN_INVALID_BAUD_RATE;
1913
1914
1915 div = baudclk / b16;
1916 if (div == 0)
1917 return KEYSPAN_INVALID_BAUD_RATE;
1918
1919 if (div > 0xffff)
1920 return KEYSPAN_INVALID_BAUD_RATE;
1921
1922
1923 if (rate_low)
1924 *rate_low = (u8) (div & 0xff);
1925
1926 if (rate_hi)
1927 *rate_hi = (u8) ((div >> 8) & 0xff);
1928
1929 if (rate_low && rate_hi)
1930 dev_dbg(&port->dev, "%s - %d %02x %02x.\n",
1931 __func__, baud_rate, *rate_hi, *rate_low);
1932
1933 return KEYSPAN_BAUD_RATE_OK;
1934}
1935
1936static int keyspan_usa19w_calc_baud(struct usb_serial_port *port,
1937 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1938 u8 *rate_low, u8 *prescaler, int portnum)
1939{
1940 u32 b16,
1941 clk,
1942 div,
1943 res,
1944 diff,
1945 smallest_diff;
1946 u8 best_prescaler;
1947 int i;
1948
1949 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1950
1951
1952 b16 = baud_rate * 16L;
1953 if (b16 == 0)
1954 return KEYSPAN_INVALID_BAUD_RATE;
1955
1956
1957
1958
1959
1960 smallest_diff = 0xffffffff;
1961
1962
1963 best_prescaler = 0;
1964
1965 for (i = 8; i <= 0xff; ++i) {
1966 clk = (baudclk * 8) / (u32) i;
1967
1968 div = clk / b16;
1969 if (div == 0)
1970 continue;
1971
1972 res = clk / div;
1973 diff = (res > b16) ? (res-b16) : (b16-res);
1974
1975 if (diff < smallest_diff) {
1976 best_prescaler = i;
1977 smallest_diff = diff;
1978 }
1979 }
1980
1981 if (best_prescaler == 0)
1982 return KEYSPAN_INVALID_BAUD_RATE;
1983
1984 clk = (baudclk * 8) / (u32) best_prescaler;
1985 div = clk / b16;
1986
1987
1988 if (rate_low)
1989 *rate_low = (u8) (div & 0xff);
1990 if (rate_hi)
1991 *rate_hi = (u8) ((div >> 8) & 0xff);
1992 if (prescaler) {
1993 *prescaler = best_prescaler;
1994
1995 }
1996 return KEYSPAN_BAUD_RATE_OK;
1997}
1998
1999
2000static int keyspan_usa28_calc_baud(struct usb_serial_port *port,
2001 u32 baud_rate, u32 baudclk, u8 *rate_hi,
2002 u8 *rate_low, u8 *prescaler, int portnum)
2003{
2004 u32 b16,
2005 div,
2006 cnt;
2007
2008 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
2009
2010
2011 b16 = baud_rate * 16L;
2012 if (b16 == 0)
2013 return KEYSPAN_INVALID_BAUD_RATE;
2014
2015
2016 div = KEYSPAN_USA28_BAUDCLK / b16;
2017 if (div == 0)
2018 return KEYSPAN_INVALID_BAUD_RATE;
2019 else
2020 cnt = 0 - div;
2021
2022
2023
2024 if (portnum == 0) {
2025 if (div > 0xffff)
2026 return KEYSPAN_INVALID_BAUD_RATE;
2027 } else {
2028 if (portnum == 1) {
2029 if (div > 0xff)
2030 return KEYSPAN_INVALID_BAUD_RATE;
2031 } else
2032 return KEYSPAN_INVALID_BAUD_RATE;
2033 }
2034
2035
2036
2037 if (rate_low)
2038 *rate_low = (u8) (cnt & 0xff);
2039 if (rate_hi)
2040 *rate_hi = (u8) ((cnt >> 8) & 0xff);
2041 dev_dbg(&port->dev, "%s - %d OK.\n", __func__, baud_rate);
2042 return KEYSPAN_BAUD_RATE_OK;
2043}
2044
2045static int keyspan_usa26_send_setup(struct usb_serial *serial,
2046 struct usb_serial_port *port,
2047 int reset_port)
2048{
2049 struct keyspan_usa26_portControlMessage msg;
2050 struct keyspan_serial_private *s_priv;
2051 struct keyspan_port_private *p_priv;
2052 const struct keyspan_device_details *d_details;
2053 struct urb *this_urb;
2054 int device_port, err;
2055
2056 dev_dbg(&port->dev, "%s reset=%d\n", __func__, reset_port);
2057
2058 s_priv = usb_get_serial_data(serial);
2059 p_priv = usb_get_serial_port_data(port);
2060 d_details = s_priv->device_details;
2061 device_port = port->port_number;
2062
2063 this_urb = p_priv->outcont_urb;
2064
2065
2066 if (this_urb == NULL) {
2067 dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);
2068 return -1;
2069 }
2070
2071 dev_dbg(&port->dev, "%s - endpoint %x\n",
2072 __func__, usb_pipeendpoint(this_urb->pipe));
2073
2074
2075
2076 if ((reset_port + 1) > p_priv->resend_cont)
2077 p_priv->resend_cont = reset_port + 1;
2078 if (this_urb->status == -EINPROGRESS) {
2079
2080 mdelay(5);
2081 return -1;
2082 }
2083
2084 memset(&msg, 0, sizeof(struct keyspan_usa26_portControlMessage));
2085
2086
2087 if (p_priv->old_baud != p_priv->baud) {
2088 p_priv->old_baud = p_priv->baud;
2089 msg.setClocking = 0xff;
2090 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2091 &msg.baudHi, &msg.baudLo, &msg.prescaler,
2092 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2093 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2094 __func__, p_priv->baud);
2095 msg.baudLo = 0;
2096 msg.baudHi = 125;
2097 msg.prescaler = 10;
2098 }
2099 msg.setPrescaler = 0xff;
2100 }
2101
2102 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2103 switch (p_priv->cflag & CSIZE) {
2104 case CS5:
2105 msg.lcr |= USA_DATABITS_5;
2106 break;
2107 case CS6:
2108 msg.lcr |= USA_DATABITS_6;
2109 break;
2110 case CS7:
2111 msg.lcr |= USA_DATABITS_7;
2112 break;
2113 case CS8:
2114 msg.lcr |= USA_DATABITS_8;
2115 break;
2116 }
2117 if (p_priv->cflag & PARENB) {
2118
2119 msg.lcr |= (p_priv->cflag & PARODD) ?
2120 USA_PARITY_ODD : USA_PARITY_EVEN;
2121 }
2122 msg.setLcr = 0xff;
2123
2124 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2125 msg.xonFlowControl = 0;
2126 msg.setFlowControl = 0xff;
2127 msg.forwardingLength = 16;
2128 msg.xonChar = 17;
2129 msg.xoffChar = 19;
2130
2131
2132 if (reset_port == 1) {
2133 msg._txOn = 1;
2134 msg._txOff = 0;
2135 msg.txFlush = 0;
2136 msg.txBreak = 0;
2137 msg.rxOn = 1;
2138 msg.rxOff = 0;
2139 msg.rxFlush = 1;
2140 msg.rxForward = 0;
2141 msg.returnStatus = 0;
2142 msg.resetDataToggle = 0xff;
2143 }
2144
2145
2146 else if (reset_port == 2) {
2147 msg._txOn = 0;
2148 msg._txOff = 1;
2149 msg.txFlush = 0;
2150 msg.txBreak = 0;
2151 msg.rxOn = 0;
2152 msg.rxOff = 1;
2153 msg.rxFlush = 1;
2154 msg.rxForward = 0;
2155 msg.returnStatus = 0;
2156 msg.resetDataToggle = 0;
2157 }
2158
2159
2160 else {
2161 msg._txOn = (!p_priv->break_on);
2162 msg._txOff = 0;
2163 msg.txFlush = 0;
2164 msg.txBreak = (p_priv->break_on);
2165 msg.rxOn = 0;
2166 msg.rxOff = 0;
2167 msg.rxFlush = 0;
2168 msg.rxForward = 0;
2169 msg.returnStatus = 0;
2170 msg.resetDataToggle = 0x0;
2171 }
2172
2173
2174 msg.setTxTriState_setRts = 0xff;
2175 msg.txTriState_rts = p_priv->rts_state;
2176
2177 msg.setHskoa_setDtr = 0xff;
2178 msg.hskoa_dtr = p_priv->dtr_state;
2179
2180 p_priv->resend_cont = 0;
2181 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2182
2183
2184 this_urb->transfer_buffer_length = sizeof(msg);
2185
2186 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2187 if (err != 0)
2188 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
2189 return 0;
2190}
2191
2192static int keyspan_usa28_send_setup(struct usb_serial *serial,
2193 struct usb_serial_port *port,
2194 int reset_port)
2195{
2196 struct keyspan_usa28_portControlMessage msg;
2197 struct keyspan_serial_private *s_priv;
2198 struct keyspan_port_private *p_priv;
2199 const struct keyspan_device_details *d_details;
2200 struct urb *this_urb;
2201 int device_port, err;
2202
2203 s_priv = usb_get_serial_data(serial);
2204 p_priv = usb_get_serial_port_data(port);
2205 d_details = s_priv->device_details;
2206 device_port = port->port_number;
2207
2208
2209 this_urb = p_priv->outcont_urb;
2210 if (this_urb == NULL) {
2211 dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);
2212 return -1;
2213 }
2214
2215
2216
2217 if ((reset_port + 1) > p_priv->resend_cont)
2218 p_priv->resend_cont = reset_port + 1;
2219 if (this_urb->status == -EINPROGRESS) {
2220 dev_dbg(&port->dev, "%s already writing\n", __func__);
2221 mdelay(5);
2222 return -1;
2223 }
2224
2225 memset(&msg, 0, sizeof(struct keyspan_usa28_portControlMessage));
2226
2227 msg.setBaudRate = 1;
2228 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2229 &msg.baudHi, &msg.baudLo, NULL,
2230 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2231 dev_dbg(&port->dev, "%s - Invalid baud rate requested %d.\n",
2232 __func__, p_priv->baud);
2233 msg.baudLo = 0xff;
2234 msg.baudHi = 0xb2;
2235 }
2236
2237
2238 msg.parity = 0;
2239
2240 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2241 msg.xonFlowControl = 0;
2242
2243
2244 msg.rts = p_priv->rts_state;
2245 msg.dtr = p_priv->dtr_state;
2246
2247 msg.forwardingLength = 16;
2248 msg.forwardMs = 10;
2249 msg.breakThreshold = 45;
2250 msg.xonChar = 17;
2251 msg.xoffChar = 19;
2252
2253
2254
2255
2256 if (reset_port == 1) {
2257 msg._txOn = 1;
2258 msg._txOff = 0;
2259 msg.txFlush = 0;
2260 msg.txForceXoff = 0;
2261 msg.txBreak = 0;
2262 msg.rxOn = 1;
2263 msg.rxOff = 0;
2264 msg.rxFlush = 1;
2265 msg.rxForward = 0;
2266 msg.returnStatus = 0;
2267 msg.resetDataToggle = 0xff;
2268 }
2269
2270 else if (reset_port == 2) {
2271 msg._txOn = 0;
2272 msg._txOff = 1;
2273 msg.txFlush = 0;
2274 msg.txForceXoff = 0;
2275 msg.txBreak = 0;
2276 msg.rxOn = 0;
2277 msg.rxOff = 1;
2278 msg.rxFlush = 1;
2279 msg.rxForward = 0;
2280 msg.returnStatus = 0;
2281 msg.resetDataToggle = 0;
2282 }
2283
2284 else {
2285 msg._txOn = (!p_priv->break_on);
2286 msg._txOff = 0;
2287 msg.txFlush = 0;
2288 msg.txForceXoff = 0;
2289 msg.txBreak = (p_priv->break_on);
2290 msg.rxOn = 0;
2291 msg.rxOff = 0;
2292 msg.rxFlush = 0;
2293 msg.rxForward = 0;
2294 msg.returnStatus = 0;
2295 msg.resetDataToggle = 0x0;
2296 }
2297
2298 p_priv->resend_cont = 0;
2299 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2300
2301
2302 this_urb->transfer_buffer_length = sizeof(msg);
2303
2304 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2305 if (err != 0)
2306 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed\n", __func__);
2307
2308 return 0;
2309}
2310
2311static int keyspan_usa49_send_setup(struct usb_serial *serial,
2312 struct usb_serial_port *port,
2313 int reset_port)
2314{
2315 struct keyspan_usa49_portControlMessage msg;
2316 struct usb_ctrlrequest *dr = NULL;
2317 struct keyspan_serial_private *s_priv;
2318 struct keyspan_port_private *p_priv;
2319 const struct keyspan_device_details *d_details;
2320 struct urb *this_urb;
2321 int err, device_port;
2322
2323 s_priv = usb_get_serial_data(serial);
2324 p_priv = usb_get_serial_port_data(port);
2325 d_details = s_priv->device_details;
2326
2327 this_urb = s_priv->glocont_urb;
2328
2329
2330 device_port = port->port_number;
2331
2332
2333 if (this_urb == NULL) {
2334 dev_dbg(&port->dev, "%s - oops no urb for port.\n", __func__);
2335 return -1;
2336 }
2337
2338 dev_dbg(&port->dev, "%s - endpoint %x (%d)\n",
2339 __func__, usb_pipeendpoint(this_urb->pipe), device_port);
2340
2341
2342
2343 if ((reset_port + 1) > p_priv->resend_cont)
2344 p_priv->resend_cont = reset_port + 1;
2345
2346 if (this_urb->status == -EINPROGRESS) {
2347
2348 mdelay(5);
2349 return -1;
2350 }
2351
2352 memset(&msg, 0, sizeof(struct keyspan_usa49_portControlMessage));
2353
2354 msg.portNumber = device_port;
2355
2356
2357 if (p_priv->old_baud != p_priv->baud) {
2358 p_priv->old_baud = p_priv->baud;
2359 msg.setClocking = 0xff;
2360 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2361 &msg.baudHi, &msg.baudLo, &msg.prescaler,
2362 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2363 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2364 __func__, p_priv->baud);
2365 msg.baudLo = 0;
2366 msg.baudHi = 125;
2367 msg.prescaler = 10;
2368 }
2369
2370 }
2371
2372 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2373 switch (p_priv->cflag & CSIZE) {
2374 case CS5:
2375 msg.lcr |= USA_DATABITS_5;
2376 break;
2377 case CS6:
2378 msg.lcr |= USA_DATABITS_6;
2379 break;
2380 case CS7:
2381 msg.lcr |= USA_DATABITS_7;
2382 break;
2383 case CS8:
2384 msg.lcr |= USA_DATABITS_8;
2385 break;
2386 }
2387 if (p_priv->cflag & PARENB) {
2388
2389 msg.lcr |= (p_priv->cflag & PARODD) ?
2390 USA_PARITY_ODD : USA_PARITY_EVEN;
2391 }
2392 msg.setLcr = 0xff;
2393
2394 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2395 msg.xonFlowControl = 0;
2396 msg.setFlowControl = 0xff;
2397
2398 msg.forwardingLength = 16;
2399 msg.xonChar = 17;
2400 msg.xoffChar = 19;
2401
2402
2403 if (reset_port == 1) {
2404 msg._txOn = 1;
2405 msg._txOff = 0;
2406 msg.txFlush = 0;
2407 msg.txBreak = 0;
2408 msg.rxOn = 1;
2409 msg.rxOff = 0;
2410 msg.rxFlush = 1;
2411 msg.rxForward = 0;
2412 msg.returnStatus = 0;
2413 msg.resetDataToggle = 0xff;
2414 msg.enablePort = 1;
2415 msg.disablePort = 0;
2416 }
2417
2418 else if (reset_port == 2) {
2419 msg._txOn = 0;
2420 msg._txOff = 1;
2421 msg.txFlush = 0;
2422 msg.txBreak = 0;
2423 msg.rxOn = 0;
2424 msg.rxOff = 1;
2425 msg.rxFlush = 1;
2426 msg.rxForward = 0;
2427 msg.returnStatus = 0;
2428 msg.resetDataToggle = 0;
2429 msg.enablePort = 0;
2430 msg.disablePort = 1;
2431 }
2432
2433 else {
2434 msg._txOn = (!p_priv->break_on);
2435 msg._txOff = 0;
2436 msg.txFlush = 0;
2437 msg.txBreak = (p_priv->break_on);
2438 msg.rxOn = 0;
2439 msg.rxOff = 0;
2440 msg.rxFlush = 0;
2441 msg.rxForward = 0;
2442 msg.returnStatus = 0;
2443 msg.resetDataToggle = 0x0;
2444 msg.enablePort = 0;
2445 msg.disablePort = 0;
2446 }
2447
2448
2449 msg.setRts = 0xff;
2450 msg.rts = p_priv->rts_state;
2451
2452 msg.setDtr = 0xff;
2453 msg.dtr = p_priv->dtr_state;
2454
2455 p_priv->resend_cont = 0;
2456
2457
2458
2459
2460 if (d_details->product_id == keyspan_usa49wg_product_id) {
2461 dr = (void *)(s_priv->ctrl_buf);
2462 dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT;
2463 dr->bRequest = 0xB0;
2464 dr->wValue = 0;
2465 dr->wIndex = 0;
2466 dr->wLength = cpu_to_le16(sizeof(msg));
2467
2468 memcpy(s_priv->glocont_buf, &msg, sizeof(msg));
2469
2470 usb_fill_control_urb(this_urb, serial->dev,
2471 usb_sndctrlpipe(serial->dev, 0),
2472 (unsigned char *)dr, s_priv->glocont_buf,
2473 sizeof(msg), usa49_glocont_callback, serial);
2474
2475 } else {
2476 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2477
2478
2479 this_urb->transfer_buffer_length = sizeof(msg);
2480 }
2481 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2482 if (err != 0)
2483 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
2484
2485 return 0;
2486}
2487
2488static int keyspan_usa90_send_setup(struct usb_serial *serial,
2489 struct usb_serial_port *port,
2490 int reset_port)
2491{
2492 struct keyspan_usa90_portControlMessage msg;
2493 struct keyspan_serial_private *s_priv;
2494 struct keyspan_port_private *p_priv;
2495 const struct keyspan_device_details *d_details;
2496 struct urb *this_urb;
2497 int err;
2498 u8 prescaler;
2499
2500 s_priv = usb_get_serial_data(serial);
2501 p_priv = usb_get_serial_port_data(port);
2502 d_details = s_priv->device_details;
2503
2504
2505 this_urb = p_priv->outcont_urb;
2506 if (this_urb == NULL) {
2507 dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);
2508 return -1;
2509 }
2510
2511
2512
2513 if ((reset_port + 1) > p_priv->resend_cont)
2514 p_priv->resend_cont = reset_port + 1;
2515 if (this_urb->status == -EINPROGRESS) {
2516 dev_dbg(&port->dev, "%s already writing\n", __func__);
2517 mdelay(5);
2518 return -1;
2519 }
2520
2521 memset(&msg, 0, sizeof(struct keyspan_usa90_portControlMessage));
2522
2523
2524 if (p_priv->old_baud != p_priv->baud) {
2525 p_priv->old_baud = p_priv->baud;
2526 msg.setClocking = 0x01;
2527 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2528 &msg.baudHi, &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE) {
2529 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2530 __func__, p_priv->baud);
2531 p_priv->baud = 9600;
2532 d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2533 &msg.baudHi, &msg.baudLo, &prescaler, 0);
2534 }
2535 msg.setRxMode = 1;
2536 msg.setTxMode = 1;
2537 }
2538
2539
2540 if (p_priv->baud > 57600) {
2541 msg.rxMode = RXMODE_DMA;
2542 msg.txMode = TXMODE_DMA;
2543 } else {
2544 msg.rxMode = RXMODE_BYHAND;
2545 msg.txMode = TXMODE_BYHAND;
2546 }
2547
2548 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2549 switch (p_priv->cflag & CSIZE) {
2550 case CS5:
2551 msg.lcr |= USA_DATABITS_5;
2552 break;
2553 case CS6:
2554 msg.lcr |= USA_DATABITS_6;
2555 break;
2556 case CS7:
2557 msg.lcr |= USA_DATABITS_7;
2558 break;
2559 case CS8:
2560 msg.lcr |= USA_DATABITS_8;
2561 break;
2562 }
2563 if (p_priv->cflag & PARENB) {
2564
2565 msg.lcr |= (p_priv->cflag & PARODD) ?
2566 USA_PARITY_ODD : USA_PARITY_EVEN;
2567 }
2568 if (p_priv->old_cflag != p_priv->cflag) {
2569 p_priv->old_cflag = p_priv->cflag;
2570 msg.setLcr = 0x01;
2571 }
2572
2573 if (p_priv->flow_control == flow_cts)
2574 msg.txFlowControl = TXFLOW_CTS;
2575 msg.setTxFlowControl = 0x01;
2576 msg.setRxFlowControl = 0x01;
2577
2578 msg.rxForwardingLength = 16;
2579 msg.rxForwardingTimeout = 16;
2580 msg.txAckSetting = 0;
2581 msg.xonChar = 17;
2582 msg.xoffChar = 19;
2583
2584
2585 if (reset_port == 1) {
2586 msg.portEnabled = 1;
2587 msg.rxFlush = 1;
2588 msg.txBreak = (p_priv->break_on);
2589 }
2590
2591 else if (reset_port == 2)
2592 msg.portEnabled = 0;
2593
2594 else {
2595 msg.portEnabled = 1;
2596 msg.txBreak = (p_priv->break_on);
2597 }
2598
2599
2600 msg.setRts = 0x01;
2601 msg.rts = p_priv->rts_state;
2602
2603 msg.setDtr = 0x01;
2604 msg.dtr = p_priv->dtr_state;
2605
2606 p_priv->resend_cont = 0;
2607 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2608
2609
2610 this_urb->transfer_buffer_length = sizeof(msg);
2611
2612 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2613 if (err != 0)
2614 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
2615 return 0;
2616}
2617
2618static int keyspan_usa67_send_setup(struct usb_serial *serial,
2619 struct usb_serial_port *port,
2620 int reset_port)
2621{
2622 struct keyspan_usa67_portControlMessage msg;
2623 struct keyspan_serial_private *s_priv;
2624 struct keyspan_port_private *p_priv;
2625 const struct keyspan_device_details *d_details;
2626 struct urb *this_urb;
2627 int err, device_port;
2628
2629 s_priv = usb_get_serial_data(serial);
2630 p_priv = usb_get_serial_port_data(port);
2631 d_details = s_priv->device_details;
2632
2633 this_urb = s_priv->glocont_urb;
2634
2635
2636 device_port = port->port_number;
2637
2638
2639 if (this_urb == NULL) {
2640 dev_dbg(&port->dev, "%s - oops no urb for port.\n", __func__);
2641 return -1;
2642 }
2643
2644
2645
2646 if ((reset_port + 1) > p_priv->resend_cont)
2647 p_priv->resend_cont = reset_port + 1;
2648 if (this_urb->status == -EINPROGRESS) {
2649
2650 mdelay(5);
2651 return -1;
2652 }
2653
2654 memset(&msg, 0, sizeof(struct keyspan_usa67_portControlMessage));
2655
2656 msg.port = device_port;
2657
2658
2659 if (p_priv->old_baud != p_priv->baud) {
2660 p_priv->old_baud = p_priv->baud;
2661 msg.setClocking = 0xff;
2662 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2663 &msg.baudHi, &msg.baudLo, &msg.prescaler,
2664 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2665 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2666 __func__, p_priv->baud);
2667 msg.baudLo = 0;
2668 msg.baudHi = 125;
2669 msg.prescaler = 10;
2670 }
2671 msg.setPrescaler = 0xff;
2672 }
2673
2674 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2675 switch (p_priv->cflag & CSIZE) {
2676 case CS5:
2677 msg.lcr |= USA_DATABITS_5;
2678 break;
2679 case CS6:
2680 msg.lcr |= USA_DATABITS_6;
2681 break;
2682 case CS7:
2683 msg.lcr |= USA_DATABITS_7;
2684 break;
2685 case CS8:
2686 msg.lcr |= USA_DATABITS_8;
2687 break;
2688 }
2689 if (p_priv->cflag & PARENB) {
2690
2691 msg.lcr |= (p_priv->cflag & PARODD) ?
2692 USA_PARITY_ODD : USA_PARITY_EVEN;
2693 }
2694 msg.setLcr = 0xff;
2695
2696 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2697 msg.xonFlowControl = 0;
2698 msg.setFlowControl = 0xff;
2699 msg.forwardingLength = 16;
2700 msg.xonChar = 17;
2701 msg.xoffChar = 19;
2702
2703 if (reset_port == 1) {
2704
2705 msg._txOn = 1;
2706 msg._txOff = 0;
2707 msg.txFlush = 0;
2708 msg.txBreak = 0;
2709 msg.rxOn = 1;
2710 msg.rxOff = 0;
2711 msg.rxFlush = 1;
2712 msg.rxForward = 0;
2713 msg.returnStatus = 0;
2714 msg.resetDataToggle = 0xff;
2715 } else if (reset_port == 2) {
2716
2717 msg._txOn = 0;
2718 msg._txOff = 1;
2719 msg.txFlush = 0;
2720 msg.txBreak = 0;
2721 msg.rxOn = 0;
2722 msg.rxOff = 1;
2723 msg.rxFlush = 1;
2724 msg.rxForward = 0;
2725 msg.returnStatus = 0;
2726 msg.resetDataToggle = 0;
2727 } else {
2728
2729 msg._txOn = (!p_priv->break_on);
2730 msg._txOff = 0;
2731 msg.txFlush = 0;
2732 msg.txBreak = (p_priv->break_on);
2733 msg.rxOn = 0;
2734 msg.rxOff = 0;
2735 msg.rxFlush = 0;
2736 msg.rxForward = 0;
2737 msg.returnStatus = 0;
2738 msg.resetDataToggle = 0x0;
2739 }
2740
2741
2742 msg.setTxTriState_setRts = 0xff;
2743 msg.txTriState_rts = p_priv->rts_state;
2744
2745 msg.setHskoa_setDtr = 0xff;
2746 msg.hskoa_dtr = p_priv->dtr_state;
2747
2748 p_priv->resend_cont = 0;
2749
2750 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2751
2752
2753 this_urb->transfer_buffer_length = sizeof(msg);
2754
2755 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2756 if (err != 0)
2757 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
2758 return 0;
2759}
2760
2761static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
2762{
2763 struct usb_serial *serial = port->serial;
2764 struct keyspan_serial_private *s_priv;
2765 const struct keyspan_device_details *d_details;
2766
2767 s_priv = usb_get_serial_data(serial);
2768 d_details = s_priv->device_details;
2769
2770 switch (d_details->msg_format) {
2771 case msg_usa26:
2772 keyspan_usa26_send_setup(serial, port, reset_port);
2773 break;
2774 case msg_usa28:
2775 keyspan_usa28_send_setup(serial, port, reset_port);
2776 break;
2777 case msg_usa49:
2778 keyspan_usa49_send_setup(serial, port, reset_port);
2779 break;
2780 case msg_usa90:
2781 keyspan_usa90_send_setup(serial, port, reset_port);
2782 break;
2783 case msg_usa67:
2784 keyspan_usa67_send_setup(serial, port, reset_port);
2785 break;
2786 }
2787}
2788
2789
2790
2791
2792static int keyspan_startup(struct usb_serial *serial)
2793{
2794 int i, err;
2795 struct keyspan_serial_private *s_priv;
2796 const struct keyspan_device_details *d_details;
2797
2798 for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)
2799 if (d_details->product_id ==
2800 le16_to_cpu(serial->dev->descriptor.idProduct))
2801 break;
2802 if (d_details == NULL) {
2803 dev_err(&serial->dev->dev, "%s - unknown product id %x\n",
2804 __func__, le16_to_cpu(serial->dev->descriptor.idProduct));
2805 return -ENODEV;
2806 }
2807
2808
2809 s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL);
2810 if (!s_priv)
2811 return -ENOMEM;
2812
2813 s_priv->instat_buf = kzalloc(INSTAT_BUFLEN, GFP_KERNEL);
2814 if (!s_priv->instat_buf)
2815 goto err_instat_buf;
2816
2817 s_priv->indat_buf = kzalloc(INDAT49W_BUFLEN, GFP_KERNEL);
2818 if (!s_priv->indat_buf)
2819 goto err_indat_buf;
2820
2821 s_priv->glocont_buf = kzalloc(GLOCONT_BUFLEN, GFP_KERNEL);
2822 if (!s_priv->glocont_buf)
2823 goto err_glocont_buf;
2824
2825 s_priv->ctrl_buf = kzalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
2826 if (!s_priv->ctrl_buf)
2827 goto err_ctrl_buf;
2828
2829 s_priv->device_details = d_details;
2830 usb_set_serial_data(serial, s_priv);
2831
2832 keyspan_setup_urbs(serial);
2833
2834 if (s_priv->instat_urb != NULL) {
2835 err = usb_submit_urb(s_priv->instat_urb, GFP_KERNEL);
2836 if (err != 0)
2837 dev_dbg(&serial->dev->dev, "%s - submit instat urb failed %d\n", __func__, err);
2838 }
2839 if (s_priv->indat_urb != NULL) {
2840 err = usb_submit_urb(s_priv->indat_urb, GFP_KERNEL);
2841 if (err != 0)
2842 dev_dbg(&serial->dev->dev, "%s - submit indat urb failed %d\n", __func__, err);
2843 }
2844
2845 return 0;
2846
2847err_ctrl_buf:
2848 kfree(s_priv->glocont_buf);
2849err_glocont_buf:
2850 kfree(s_priv->indat_buf);
2851err_indat_buf:
2852 kfree(s_priv->instat_buf);
2853err_instat_buf:
2854 kfree(s_priv);
2855
2856 return -ENOMEM;
2857}
2858
2859static void keyspan_disconnect(struct usb_serial *serial)
2860{
2861 struct keyspan_serial_private *s_priv;
2862
2863 s_priv = usb_get_serial_data(serial);
2864
2865 usb_kill_urb(s_priv->instat_urb);
2866 usb_kill_urb(s_priv->glocont_urb);
2867 usb_kill_urb(s_priv->indat_urb);
2868}
2869
2870static void keyspan_release(struct usb_serial *serial)
2871{
2872 struct keyspan_serial_private *s_priv;
2873
2874 s_priv = usb_get_serial_data(serial);
2875
2876
2877 usb_kill_urb(s_priv->instat_urb);
2878 usb_kill_urb(s_priv->indat_urb);
2879
2880 usb_free_urb(s_priv->instat_urb);
2881 usb_free_urb(s_priv->indat_urb);
2882 usb_free_urb(s_priv->glocont_urb);
2883
2884 kfree(s_priv->ctrl_buf);
2885 kfree(s_priv->glocont_buf);
2886 kfree(s_priv->indat_buf);
2887 kfree(s_priv->instat_buf);
2888
2889 kfree(s_priv);
2890}
2891
2892static int keyspan_port_probe(struct usb_serial_port *port)
2893{
2894 struct usb_serial *serial = port->serial;
2895 struct keyspan_serial_private *s_priv;
2896 struct keyspan_port_private *p_priv;
2897 const struct keyspan_device_details *d_details;
2898 struct callbacks *cback;
2899 int endp;
2900 int port_num;
2901 int i;
2902
2903 s_priv = usb_get_serial_data(serial);
2904 d_details = s_priv->device_details;
2905
2906 p_priv = kzalloc(sizeof(*p_priv), GFP_KERNEL);
2907 if (!p_priv)
2908 return -ENOMEM;
2909
2910 for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i) {
2911 p_priv->in_buffer[i] = kzalloc(IN_BUFLEN, GFP_KERNEL);
2912 if (!p_priv->in_buffer[i])
2913 goto err_in_buffer;
2914 }
2915
2916 for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i) {
2917 p_priv->out_buffer[i] = kzalloc(OUT_BUFLEN, GFP_KERNEL);
2918 if (!p_priv->out_buffer[i])
2919 goto err_out_buffer;
2920 }
2921
2922 p_priv->inack_buffer = kzalloc(INACK_BUFLEN, GFP_KERNEL);
2923 if (!p_priv->inack_buffer)
2924 goto err_inack_buffer;
2925
2926 p_priv->outcont_buffer = kzalloc(OUTCONT_BUFLEN, GFP_KERNEL);
2927 if (!p_priv->outcont_buffer)
2928 goto err_outcont_buffer;
2929
2930 p_priv->device_details = d_details;
2931
2932
2933 cback = &keyspan_callbacks[d_details->msg_format];
2934
2935 port_num = port->port_number;
2936
2937
2938 endp = d_details->indat_endpoints[port_num];
2939 for (i = 0; i <= d_details->indat_endp_flip; ++i, ++endp) {
2940 p_priv->in_urbs[i] = keyspan_setup_urb(serial, endp,
2941 USB_DIR_IN, port,
2942 p_priv->in_buffer[i],
2943 IN_BUFLEN,
2944 cback->indat_callback);
2945 }
2946
2947 endp = d_details->outdat_endpoints[port_num];
2948 for (i = 0; i <= d_details->outdat_endp_flip; ++i, ++endp) {
2949 p_priv->out_urbs[i] = keyspan_setup_urb(serial, endp,
2950 USB_DIR_OUT, port,
2951 p_priv->out_buffer[i],
2952 OUT_BUFLEN,
2953 cback->outdat_callback);
2954 }
2955
2956 p_priv->inack_urb = keyspan_setup_urb(serial,
2957 d_details->inack_endpoints[port_num],
2958 USB_DIR_IN, port,
2959 p_priv->inack_buffer,
2960 INACK_BUFLEN,
2961 cback->inack_callback);
2962
2963 p_priv->outcont_urb = keyspan_setup_urb(serial,
2964 d_details->outcont_endpoints[port_num],
2965 USB_DIR_OUT, port,
2966 p_priv->outcont_buffer,
2967 OUTCONT_BUFLEN,
2968 cback->outcont_callback);
2969
2970 usb_set_serial_port_data(port, p_priv);
2971
2972 return 0;
2973
2974err_outcont_buffer:
2975 kfree(p_priv->inack_buffer);
2976err_inack_buffer:
2977 for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i)
2978 kfree(p_priv->out_buffer[i]);
2979err_out_buffer:
2980 for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i)
2981 kfree(p_priv->in_buffer[i]);
2982err_in_buffer:
2983 kfree(p_priv);
2984
2985 return -ENOMEM;
2986}
2987
2988static int keyspan_port_remove(struct usb_serial_port *port)
2989{
2990 struct keyspan_port_private *p_priv;
2991 int i;
2992
2993 p_priv = usb_get_serial_port_data(port);
2994
2995 usb_kill_urb(p_priv->inack_urb);
2996 usb_kill_urb(p_priv->outcont_urb);
2997 for (i = 0; i < 2; i++) {
2998 usb_kill_urb(p_priv->in_urbs[i]);
2999 usb_kill_urb(p_priv->out_urbs[i]);
3000 }
3001
3002 usb_free_urb(p_priv->inack_urb);
3003 usb_free_urb(p_priv->outcont_urb);
3004 for (i = 0; i < 2; i++) {
3005 usb_free_urb(p_priv->in_urbs[i]);
3006 usb_free_urb(p_priv->out_urbs[i]);
3007 }
3008
3009 kfree(p_priv->outcont_buffer);
3010 kfree(p_priv->inack_buffer);
3011 for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i)
3012 kfree(p_priv->out_buffer[i]);
3013 for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i)
3014 kfree(p_priv->in_buffer[i]);
3015
3016 kfree(p_priv);
3017
3018 return 0;
3019}
3020
3021
3022static struct usb_serial_driver keyspan_pre_device = {
3023 .driver = {
3024 .owner = THIS_MODULE,
3025 .name = "keyspan_no_firm",
3026 },
3027 .description = "Keyspan - (without firmware)",
3028 .id_table = keyspan_pre_ids,
3029 .num_ports = 1,
3030 .attach = keyspan_fake_startup,
3031};
3032
3033static struct usb_serial_driver keyspan_1port_device = {
3034 .driver = {
3035 .owner = THIS_MODULE,
3036 .name = "keyspan_1",
3037 },
3038 .description = "Keyspan 1 port adapter",
3039 .id_table = keyspan_1port_ids,
3040 .num_ports = 1,
3041 .open = keyspan_open,
3042 .close = keyspan_close,
3043 .dtr_rts = keyspan_dtr_rts,
3044 .write = keyspan_write,
3045 .write_room = keyspan_write_room,
3046 .set_termios = keyspan_set_termios,
3047 .break_ctl = keyspan_break_ctl,
3048 .tiocmget = keyspan_tiocmget,
3049 .tiocmset = keyspan_tiocmset,
3050 .attach = keyspan_startup,
3051 .disconnect = keyspan_disconnect,
3052 .release = keyspan_release,
3053 .port_probe = keyspan_port_probe,
3054 .port_remove = keyspan_port_remove,
3055};
3056
3057static struct usb_serial_driver keyspan_2port_device = {
3058 .driver = {
3059 .owner = THIS_MODULE,
3060 .name = "keyspan_2",
3061 },
3062 .description = "Keyspan 2 port adapter",
3063 .id_table = keyspan_2port_ids,
3064 .num_ports = 2,
3065 .open = keyspan_open,
3066 .close = keyspan_close,
3067 .dtr_rts = keyspan_dtr_rts,
3068 .write = keyspan_write,
3069 .write_room = keyspan_write_room,
3070 .set_termios = keyspan_set_termios,
3071 .break_ctl = keyspan_break_ctl,
3072 .tiocmget = keyspan_tiocmget,
3073 .tiocmset = keyspan_tiocmset,
3074 .attach = keyspan_startup,
3075 .disconnect = keyspan_disconnect,
3076 .release = keyspan_release,
3077 .port_probe = keyspan_port_probe,
3078 .port_remove = keyspan_port_remove,
3079};
3080
3081static struct usb_serial_driver keyspan_4port_device = {
3082 .driver = {
3083 .owner = THIS_MODULE,
3084 .name = "keyspan_4",
3085 },
3086 .description = "Keyspan 4 port adapter",
3087 .id_table = keyspan_4port_ids,
3088 .num_ports = 4,
3089 .open = keyspan_open,
3090 .close = keyspan_close,
3091 .dtr_rts = keyspan_dtr_rts,
3092 .write = keyspan_write,
3093 .write_room = keyspan_write_room,
3094 .set_termios = keyspan_set_termios,
3095 .break_ctl = keyspan_break_ctl,
3096 .tiocmget = keyspan_tiocmget,
3097 .tiocmset = keyspan_tiocmset,
3098 .attach = keyspan_startup,
3099 .disconnect = keyspan_disconnect,
3100 .release = keyspan_release,
3101 .port_probe = keyspan_port_probe,
3102 .port_remove = keyspan_port_remove,
3103};
3104
3105static struct usb_serial_driver * const serial_drivers[] = {
3106 &keyspan_pre_device, &keyspan_1port_device,
3107 &keyspan_2port_device, &keyspan_4port_device, NULL
3108};
3109
3110module_usb_serial_driver(serial_drivers, keyspan_ids_combined);
3111
3112MODULE_AUTHOR(DRIVER_AUTHOR);
3113MODULE_DESCRIPTION(DRIVER_DESC);
3114MODULE_LICENSE("GPL");
3115
3116MODULE_FIRMWARE("keyspan/usa28.fw");
3117MODULE_FIRMWARE("keyspan/usa28x.fw");
3118MODULE_FIRMWARE("keyspan/usa28xa.fw");
3119MODULE_FIRMWARE("keyspan/usa28xb.fw");
3120MODULE_FIRMWARE("keyspan/usa19.fw");
3121MODULE_FIRMWARE("keyspan/usa19qi.fw");
3122MODULE_FIRMWARE("keyspan/mpr.fw");
3123MODULE_FIRMWARE("keyspan/usa19qw.fw");
3124MODULE_FIRMWARE("keyspan/usa18x.fw");
3125MODULE_FIRMWARE("keyspan/usa19w.fw");
3126MODULE_FIRMWARE("keyspan/usa49w.fw");
3127MODULE_FIRMWARE("keyspan/usa49wlc.fw");
3128