0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include <linux/kernel.h>
0028 #include <linux/jiffies.h>
0029 #include <linux/errno.h>
0030 #include <linux/slab.h>
0031 #include <linux/tty.h>
0032 #include <linux/tty_driver.h>
0033 #include <linux/tty_flip.h>
0034 #include <linux/module.h>
0035 #include <linux/spinlock.h>
0036 #include <linux/uaccess.h>
0037 #include <linux/usb.h>
0038 #include <linux/usb/serial.h>
0039 #include <linux/usb/ezusb.h>
0040
0041 #define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu"
0042 #define DRIVER_DESC "Keyspan USB to Serial Converter Driver"
0043
0044 static void keyspan_send_setup(struct usb_serial_port *port, int reset_port);
0045
0046 static int keyspan_usa19_calc_baud(struct usb_serial_port *port,
0047 u32 baud_rate, u32 baudclk,
0048 u8 *rate_hi, u8 *rate_low,
0049 u8 *prescaler, int portnum);
0050 static int keyspan_usa19w_calc_baud(struct usb_serial_port *port,
0051 u32 baud_rate, u32 baudclk,
0052 u8 *rate_hi, u8 *rate_low,
0053 u8 *prescaler, int portnum);
0054 static int keyspan_usa28_calc_baud(struct usb_serial_port *port,
0055 u32 baud_rate, u32 baudclk,
0056 u8 *rate_hi, u8 *rate_low,
0057 u8 *prescaler, int portnum);
0058 static int keyspan_usa19hs_calc_baud(struct usb_serial_port *port,
0059 u32 baud_rate, u32 baudclk,
0060 u8 *rate_hi, u8 *rate_low,
0061 u8 *prescaler, int portnum);
0062
0063 static int keyspan_usa28_send_setup(struct usb_serial *serial,
0064 struct usb_serial_port *port,
0065 int reset_port);
0066 static int keyspan_usa26_send_setup(struct usb_serial *serial,
0067 struct usb_serial_port *port,
0068 int reset_port);
0069 static int keyspan_usa49_send_setup(struct usb_serial *serial,
0070 struct usb_serial_port *port,
0071 int reset_port);
0072 static int keyspan_usa90_send_setup(struct usb_serial *serial,
0073 struct usb_serial_port *port,
0074 int reset_port);
0075 static int keyspan_usa67_send_setup(struct usb_serial *serial,
0076 struct usb_serial_port *port,
0077 int reset_port);
0078
0079
0080 #define KEYSPAN_INVALID_BAUD_RATE (-1)
0081 #define KEYSPAN_BAUD_RATE_OK (0)
0082 #define KEYSPAN_USA18X_BAUDCLK (12000000L)
0083 #define KEYSPAN_USA19_BAUDCLK (12000000L)
0084 #define KEYSPAN_USA19W_BAUDCLK (24000000L)
0085 #define KEYSPAN_USA19HS_BAUDCLK (14769231L)
0086 #define KEYSPAN_USA28_BAUDCLK (1843200L)
0087 #define KEYSPAN_USA28X_BAUDCLK (12000000L)
0088 #define KEYSPAN_USA49W_BAUDCLK (48000000L)
0089
0090
0091 #define KEYSPAN_MAX_NUM_PORTS (4)
0092 #define KEYSPAN_MAX_FLIPS (2)
0093
0094
0095
0096
0097
0098 #define KEYSPAN_VENDOR_ID (0x06cd)
0099
0100
0101 #define keyspan_usa18x_pre_product_id 0x0105
0102 #define keyspan_usa19_pre_product_id 0x0103
0103 #define keyspan_usa19qi_pre_product_id 0x010b
0104 #define keyspan_mpr_pre_product_id 0x011b
0105 #define keyspan_usa19qw_pre_product_id 0x0118
0106 #define keyspan_usa19w_pre_product_id 0x0106
0107 #define keyspan_usa28_pre_product_id 0x0101
0108 #define keyspan_usa28x_pre_product_id 0x0102
0109 #define keyspan_usa28xa_pre_product_id 0x0114
0110 #define keyspan_usa28xb_pre_product_id 0x0113
0111 #define keyspan_usa49w_pre_product_id 0x0109
0112 #define keyspan_usa49wlc_pre_product_id 0x011a
0113
0114
0115
0116
0117
0118
0119 #define keyspan_usa18x_product_id 0x0112
0120 #define keyspan_usa19_product_id 0x0107
0121 #define keyspan_usa19qi_product_id 0x010c
0122 #define keyspan_usa19hs_product_id 0x0121
0123 #define keyspan_mpr_product_id 0x011c
0124 #define keyspan_usa19qw_product_id 0x0119
0125 #define keyspan_usa19w_product_id 0x0108
0126 #define keyspan_usa28_product_id 0x010f
0127 #define keyspan_usa28x_product_id 0x0110
0128 #define keyspan_usa28xa_product_id 0x0115
0129 #define keyspan_usa28xb_product_id 0x0110
0130 #define keyspan_usa28xg_product_id 0x0135
0131 #define keyspan_usa49w_product_id 0x010a
0132 #define keyspan_usa49wlc_product_id 0x012a
0133 #define keyspan_usa49wg_product_id 0x0131
0134
0135 struct keyspan_device_details {
0136
0137 int product_id;
0138
0139 enum {msg_usa26, msg_usa28, msg_usa49, msg_usa90, msg_usa67} msg_format;
0140
0141
0142 int num_ports;
0143
0144
0145 int indat_endp_flip;
0146
0147
0148 int outdat_endp_flip;
0149
0150
0151
0152
0153
0154 int indat_endpoints[KEYSPAN_MAX_NUM_PORTS];
0155
0156
0157 int outdat_endpoints[KEYSPAN_MAX_NUM_PORTS];
0158
0159
0160 int inack_endpoints[KEYSPAN_MAX_NUM_PORTS];
0161
0162
0163 int outcont_endpoints[KEYSPAN_MAX_NUM_PORTS];
0164
0165
0166 int instat_endpoint;
0167
0168
0169 int indat_endpoint;
0170
0171
0172 int glocont_endpoint;
0173
0174 int (*calculate_baud_rate)(struct usb_serial_port *port,
0175 u32 baud_rate, u32 baudclk,
0176 u8 *rate_hi, u8 *rate_low, u8 *prescaler,
0177 int portnum);
0178 u32 baudclk;
0179 };
0180
0181
0182
0183
0184
0185
0186 static const struct keyspan_device_details usa18x_device_details = {
0187 .product_id = keyspan_usa18x_product_id,
0188 .msg_format = msg_usa26,
0189 .num_ports = 1,
0190 .indat_endp_flip = 0,
0191 .outdat_endp_flip = 1,
0192 .indat_endpoints = {0x81},
0193 .outdat_endpoints = {0x01},
0194 .inack_endpoints = {0x85},
0195 .outcont_endpoints = {0x05},
0196 .instat_endpoint = 0x87,
0197 .indat_endpoint = -1,
0198 .glocont_endpoint = 0x07,
0199 .calculate_baud_rate = keyspan_usa19w_calc_baud,
0200 .baudclk = KEYSPAN_USA18X_BAUDCLK,
0201 };
0202
0203 static const struct keyspan_device_details usa19_device_details = {
0204 .product_id = keyspan_usa19_product_id,
0205 .msg_format = msg_usa28,
0206 .num_ports = 1,
0207 .indat_endp_flip = 1,
0208 .outdat_endp_flip = 1,
0209 .indat_endpoints = {0x81},
0210 .outdat_endpoints = {0x01},
0211 .inack_endpoints = {0x83},
0212 .outcont_endpoints = {0x03},
0213 .instat_endpoint = 0x84,
0214 .indat_endpoint = -1,
0215 .glocont_endpoint = -1,
0216 .calculate_baud_rate = keyspan_usa19_calc_baud,
0217 .baudclk = KEYSPAN_USA19_BAUDCLK,
0218 };
0219
0220 static const struct keyspan_device_details usa19qi_device_details = {
0221 .product_id = keyspan_usa19qi_product_id,
0222 .msg_format = msg_usa28,
0223 .num_ports = 1,
0224 .indat_endp_flip = 1,
0225 .outdat_endp_flip = 1,
0226 .indat_endpoints = {0x81},
0227 .outdat_endpoints = {0x01},
0228 .inack_endpoints = {0x83},
0229 .outcont_endpoints = {0x03},
0230 .instat_endpoint = 0x84,
0231 .indat_endpoint = -1,
0232 .glocont_endpoint = -1,
0233 .calculate_baud_rate = keyspan_usa28_calc_baud,
0234 .baudclk = KEYSPAN_USA19_BAUDCLK,
0235 };
0236
0237 static const struct keyspan_device_details mpr_device_details = {
0238 .product_id = keyspan_mpr_product_id,
0239 .msg_format = msg_usa28,
0240 .num_ports = 1,
0241 .indat_endp_flip = 1,
0242 .outdat_endp_flip = 1,
0243 .indat_endpoints = {0x81},
0244 .outdat_endpoints = {0x01},
0245 .inack_endpoints = {0x83},
0246 .outcont_endpoints = {0x03},
0247 .instat_endpoint = 0x84,
0248 .indat_endpoint = -1,
0249 .glocont_endpoint = -1,
0250 .calculate_baud_rate = keyspan_usa28_calc_baud,
0251 .baudclk = KEYSPAN_USA19_BAUDCLK,
0252 };
0253
0254 static const struct keyspan_device_details usa19qw_device_details = {
0255 .product_id = keyspan_usa19qw_product_id,
0256 .msg_format = msg_usa26,
0257 .num_ports = 1,
0258 .indat_endp_flip = 0,
0259 .outdat_endp_flip = 1,
0260 .indat_endpoints = {0x81},
0261 .outdat_endpoints = {0x01},
0262 .inack_endpoints = {0x85},
0263 .outcont_endpoints = {0x05},
0264 .instat_endpoint = 0x87,
0265 .indat_endpoint = -1,
0266 .glocont_endpoint = 0x07,
0267 .calculate_baud_rate = keyspan_usa19w_calc_baud,
0268 .baudclk = KEYSPAN_USA19W_BAUDCLK,
0269 };
0270
0271 static const struct keyspan_device_details usa19w_device_details = {
0272 .product_id = keyspan_usa19w_product_id,
0273 .msg_format = msg_usa26,
0274 .num_ports = 1,
0275 .indat_endp_flip = 0,
0276 .outdat_endp_flip = 1,
0277 .indat_endpoints = {0x81},
0278 .outdat_endpoints = {0x01},
0279 .inack_endpoints = {0x85},
0280 .outcont_endpoints = {0x05},
0281 .instat_endpoint = 0x87,
0282 .indat_endpoint = -1,
0283 .glocont_endpoint = 0x07,
0284 .calculate_baud_rate = keyspan_usa19w_calc_baud,
0285 .baudclk = KEYSPAN_USA19W_BAUDCLK,
0286 };
0287
0288 static const struct keyspan_device_details usa19hs_device_details = {
0289 .product_id = keyspan_usa19hs_product_id,
0290 .msg_format = msg_usa90,
0291 .num_ports = 1,
0292 .indat_endp_flip = 0,
0293 .outdat_endp_flip = 0,
0294 .indat_endpoints = {0x81},
0295 .outdat_endpoints = {0x01},
0296 .inack_endpoints = {-1},
0297 .outcont_endpoints = {0x02},
0298 .instat_endpoint = 0x82,
0299 .indat_endpoint = -1,
0300 .glocont_endpoint = -1,
0301 .calculate_baud_rate = keyspan_usa19hs_calc_baud,
0302 .baudclk = KEYSPAN_USA19HS_BAUDCLK,
0303 };
0304
0305 static const struct keyspan_device_details usa28_device_details = {
0306 .product_id = keyspan_usa28_product_id,
0307 .msg_format = msg_usa28,
0308 .num_ports = 2,
0309 .indat_endp_flip = 1,
0310 .outdat_endp_flip = 1,
0311 .indat_endpoints = {0x81, 0x83},
0312 .outdat_endpoints = {0x01, 0x03},
0313 .inack_endpoints = {0x85, 0x86},
0314 .outcont_endpoints = {0x05, 0x06},
0315 .instat_endpoint = 0x87,
0316 .indat_endpoint = -1,
0317 .glocont_endpoint = 0x07,
0318 .calculate_baud_rate = keyspan_usa28_calc_baud,
0319 .baudclk = KEYSPAN_USA28_BAUDCLK,
0320 };
0321
0322 static const struct keyspan_device_details usa28x_device_details = {
0323 .product_id = keyspan_usa28x_product_id,
0324 .msg_format = msg_usa26,
0325 .num_ports = 2,
0326 .indat_endp_flip = 0,
0327 .outdat_endp_flip = 1,
0328 .indat_endpoints = {0x81, 0x83},
0329 .outdat_endpoints = {0x01, 0x03},
0330 .inack_endpoints = {0x85, 0x86},
0331 .outcont_endpoints = {0x05, 0x06},
0332 .instat_endpoint = 0x87,
0333 .indat_endpoint = -1,
0334 .glocont_endpoint = 0x07,
0335 .calculate_baud_rate = keyspan_usa19w_calc_baud,
0336 .baudclk = KEYSPAN_USA28X_BAUDCLK,
0337 };
0338
0339 static const struct keyspan_device_details usa28xa_device_details = {
0340 .product_id = keyspan_usa28xa_product_id,
0341 .msg_format = msg_usa26,
0342 .num_ports = 2,
0343 .indat_endp_flip = 0,
0344 .outdat_endp_flip = 1,
0345 .indat_endpoints = {0x81, 0x83},
0346 .outdat_endpoints = {0x01, 0x03},
0347 .inack_endpoints = {0x85, 0x86},
0348 .outcont_endpoints = {0x05, 0x06},
0349 .instat_endpoint = 0x87,
0350 .indat_endpoint = -1,
0351 .glocont_endpoint = 0x07,
0352 .calculate_baud_rate = keyspan_usa19w_calc_baud,
0353 .baudclk = KEYSPAN_USA28X_BAUDCLK,
0354 };
0355
0356 static const struct keyspan_device_details usa28xg_device_details = {
0357 .product_id = keyspan_usa28xg_product_id,
0358 .msg_format = msg_usa67,
0359 .num_ports = 2,
0360 .indat_endp_flip = 0,
0361 .outdat_endp_flip = 0,
0362 .indat_endpoints = {0x84, 0x88},
0363 .outdat_endpoints = {0x02, 0x06},
0364 .inack_endpoints = {-1, -1},
0365 .outcont_endpoints = {-1, -1},
0366 .instat_endpoint = 0x81,
0367 .indat_endpoint = -1,
0368 .glocont_endpoint = 0x01,
0369 .calculate_baud_rate = keyspan_usa19w_calc_baud,
0370 .baudclk = KEYSPAN_USA28X_BAUDCLK,
0371 };
0372
0373
0374
0375
0376
0377 static const struct keyspan_device_details usa49w_device_details = {
0378 .product_id = keyspan_usa49w_product_id,
0379 .msg_format = msg_usa49,
0380 .num_ports = 4,
0381 .indat_endp_flip = 0,
0382 .outdat_endp_flip = 0,
0383 .indat_endpoints = {0x81, 0x82, 0x83, 0x84},
0384 .outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
0385 .inack_endpoints = {-1, -1, -1, -1},
0386 .outcont_endpoints = {-1, -1, -1, -1},
0387 .instat_endpoint = 0x87,
0388 .indat_endpoint = -1,
0389 .glocont_endpoint = 0x07,
0390 .calculate_baud_rate = keyspan_usa19w_calc_baud,
0391 .baudclk = KEYSPAN_USA49W_BAUDCLK,
0392 };
0393
0394 static const struct keyspan_device_details usa49wlc_device_details = {
0395 .product_id = keyspan_usa49wlc_product_id,
0396 .msg_format = msg_usa49,
0397 .num_ports = 4,
0398 .indat_endp_flip = 0,
0399 .outdat_endp_flip = 0,
0400 .indat_endpoints = {0x81, 0x82, 0x83, 0x84},
0401 .outdat_endpoints = {0x01, 0x02, 0x03, 0x04},
0402 .inack_endpoints = {-1, -1, -1, -1},
0403 .outcont_endpoints = {-1, -1, -1, -1},
0404 .instat_endpoint = 0x87,
0405 .indat_endpoint = -1,
0406 .glocont_endpoint = 0x07,
0407 .calculate_baud_rate = keyspan_usa19w_calc_baud,
0408 .baudclk = KEYSPAN_USA19W_BAUDCLK,
0409 };
0410
0411 static const struct keyspan_device_details usa49wg_device_details = {
0412 .product_id = keyspan_usa49wg_product_id,
0413 .msg_format = msg_usa49,
0414 .num_ports = 4,
0415 .indat_endp_flip = 0,
0416 .outdat_endp_flip = 0,
0417 .indat_endpoints = {-1, -1, -1, -1},
0418 .outdat_endpoints = {0x01, 0x02, 0x04, 0x06},
0419 .inack_endpoints = {-1, -1, -1, -1},
0420 .outcont_endpoints = {-1, -1, -1, -1},
0421 .instat_endpoint = 0x81,
0422 .indat_endpoint = 0x88,
0423 .glocont_endpoint = 0x00,
0424 .calculate_baud_rate = keyspan_usa19w_calc_baud,
0425 .baudclk = KEYSPAN_USA19W_BAUDCLK,
0426 };
0427
0428 static const struct keyspan_device_details *keyspan_devices[] = {
0429 &usa18x_device_details,
0430 &usa19_device_details,
0431 &usa19qi_device_details,
0432 &mpr_device_details,
0433 &usa19qw_device_details,
0434 &usa19w_device_details,
0435 &usa19hs_device_details,
0436 &usa28_device_details,
0437 &usa28x_device_details,
0438 &usa28xa_device_details,
0439 &usa28xg_device_details,
0440
0441 &usa49w_device_details,
0442 &usa49wlc_device_details,
0443 &usa49wg_device_details,
0444 NULL,
0445 };
0446
0447 static const struct usb_device_id keyspan_ids_combined[] = {
0448 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
0449 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
0450 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
0451 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
0452 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
0453 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
0454 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
0455 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
0456 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
0457 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
0458 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
0459 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
0460 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
0461 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
0462 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
0463 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
0464 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
0465 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
0466 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
0467 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
0468 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
0469 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
0470 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
0471 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id)},
0472 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
0473 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wg_product_id)},
0474 { }
0475 };
0476
0477 MODULE_DEVICE_TABLE(usb, keyspan_ids_combined);
0478
0479
0480 static const struct usb_device_id keyspan_pre_ids[] = {
0481 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_pre_product_id) },
0482 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_pre_product_id) },
0483 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_pre_product_id) },
0484 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_pre_product_id) },
0485 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_pre_product_id) },
0486 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_pre_product_id) },
0487 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_pre_product_id) },
0488 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_pre_product_id) },
0489 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_pre_product_id) },
0490 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xb_pre_product_id) },
0491 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_pre_product_id) },
0492 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_pre_product_id) },
0493 { }
0494 };
0495
0496 static const struct usb_device_id keyspan_1port_ids[] = {
0497 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa18x_product_id) },
0498 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19_product_id) },
0499 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qi_product_id) },
0500 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19qw_product_id) },
0501 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19w_product_id) },
0502 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa19hs_product_id) },
0503 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_mpr_product_id) },
0504 { }
0505 };
0506
0507 static const struct usb_device_id keyspan_2port_ids[] = {
0508 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28_product_id) },
0509 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28x_product_id) },
0510 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xa_product_id) },
0511 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa28xg_product_id) },
0512 { }
0513 };
0514
0515 static const struct usb_device_id keyspan_4port_ids[] = {
0516 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49w_product_id) },
0517 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wlc_product_id)},
0518 { USB_DEVICE(KEYSPAN_VENDOR_ID, keyspan_usa49wg_product_id)},
0519 { }
0520 };
0521
0522 #define INSTAT_BUFLEN 32
0523 #define GLOCONT_BUFLEN 64
0524 #define INDAT49W_BUFLEN 512
0525 #define IN_BUFLEN 64
0526 #define OUT_BUFLEN 64
0527 #define INACK_BUFLEN 1
0528 #define OUTCONT_BUFLEN 64
0529
0530
0531 struct keyspan_serial_private {
0532 const struct keyspan_device_details *device_details;
0533
0534 struct urb *instat_urb;
0535 char *instat_buf;
0536
0537
0538
0539 struct urb *indat_urb;
0540 char *indat_buf;
0541
0542
0543 struct urb *glocont_urb;
0544 char *glocont_buf;
0545 char *ctrl_buf;
0546 };
0547
0548 struct keyspan_port_private {
0549
0550 int in_flip;
0551 int out_flip;
0552
0553
0554
0555
0556 const struct keyspan_device_details *device_details;
0557
0558
0559 struct urb *in_urbs[2];
0560 char *in_buffer[2];
0561
0562 struct urb *out_urbs[2];
0563 char *out_buffer[2];
0564
0565
0566 struct urb *inack_urb;
0567 char *inack_buffer;
0568
0569
0570 struct urb *outcont_urb;
0571 char *outcont_buffer;
0572
0573
0574 int baud;
0575 int old_baud;
0576 unsigned int cflag;
0577 unsigned int old_cflag;
0578 enum {flow_none, flow_cts, flow_xon} flow_control;
0579 int rts_state;
0580 int dtr_state;
0581 int cts_state;
0582 int dsr_state;
0583 int dcd_state;
0584 int ri_state;
0585 int break_on;
0586
0587 unsigned long tx_start_time[2];
0588 int resend_cont;
0589 };
0590
0591
0592
0593
0594
0595 #include "keyspan_usa26msg.h"
0596 #include "keyspan_usa28msg.h"
0597 #include "keyspan_usa49msg.h"
0598 #include "keyspan_usa90msg.h"
0599 #include "keyspan_usa67msg.h"
0600
0601
0602 static void keyspan_break_ctl(struct tty_struct *tty, int break_state)
0603 {
0604 struct usb_serial_port *port = tty->driver_data;
0605 struct keyspan_port_private *p_priv;
0606
0607 p_priv = usb_get_serial_port_data(port);
0608
0609 if (break_state == -1)
0610 p_priv->break_on = 1;
0611 else
0612 p_priv->break_on = 0;
0613
0614 keyspan_send_setup(port, 0);
0615 }
0616
0617
0618 static void keyspan_set_termios(struct tty_struct *tty,
0619 struct usb_serial_port *port, struct ktermios *old_termios)
0620 {
0621 int baud_rate, device_port;
0622 struct keyspan_port_private *p_priv;
0623 const struct keyspan_device_details *d_details;
0624 unsigned int cflag;
0625
0626 p_priv = usb_get_serial_port_data(port);
0627 d_details = p_priv->device_details;
0628 cflag = tty->termios.c_cflag;
0629 device_port = port->port_number;
0630
0631
0632
0633 baud_rate = tty_get_baud_rate(tty);
0634
0635 if (d_details->calculate_baud_rate(port, baud_rate, d_details->baudclk,
0636 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
0637
0638
0639 p_priv->baud = baud_rate;
0640 } else
0641 baud_rate = tty_termios_baud_rate(old_termios);
0642
0643 tty_encode_baud_rate(tty, baud_rate, baud_rate);
0644
0645 p_priv->cflag = cflag;
0646 p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none;
0647
0648
0649 tty->termios.c_cflag &= ~CMSPAR;
0650
0651 keyspan_send_setup(port, 0);
0652 }
0653
0654 static int keyspan_tiocmget(struct tty_struct *tty)
0655 {
0656 struct usb_serial_port *port = tty->driver_data;
0657 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
0658 unsigned int value;
0659
0660 value = ((p_priv->rts_state) ? TIOCM_RTS : 0) |
0661 ((p_priv->dtr_state) ? TIOCM_DTR : 0) |
0662 ((p_priv->cts_state) ? TIOCM_CTS : 0) |
0663 ((p_priv->dsr_state) ? TIOCM_DSR : 0) |
0664 ((p_priv->dcd_state) ? TIOCM_CAR : 0) |
0665 ((p_priv->ri_state) ? TIOCM_RNG : 0);
0666
0667 return value;
0668 }
0669
0670 static int keyspan_tiocmset(struct tty_struct *tty,
0671 unsigned int set, unsigned int clear)
0672 {
0673 struct usb_serial_port *port = tty->driver_data;
0674 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
0675
0676 if (set & TIOCM_RTS)
0677 p_priv->rts_state = 1;
0678 if (set & TIOCM_DTR)
0679 p_priv->dtr_state = 1;
0680 if (clear & TIOCM_RTS)
0681 p_priv->rts_state = 0;
0682 if (clear & TIOCM_DTR)
0683 p_priv->dtr_state = 0;
0684 keyspan_send_setup(port, 0);
0685 return 0;
0686 }
0687
0688
0689
0690 static int keyspan_write(struct tty_struct *tty,
0691 struct usb_serial_port *port, const unsigned char *buf, int count)
0692 {
0693 struct keyspan_port_private *p_priv;
0694 const struct keyspan_device_details *d_details;
0695 int flip;
0696 int left, todo;
0697 struct urb *this_urb;
0698 int err, maxDataLen, dataOffset;
0699
0700 p_priv = usb_get_serial_port_data(port);
0701 d_details = p_priv->device_details;
0702
0703 if (d_details->msg_format == msg_usa90) {
0704 maxDataLen = 64;
0705 dataOffset = 0;
0706 } else {
0707 maxDataLen = 63;
0708 dataOffset = 1;
0709 }
0710
0711 dev_dbg(&port->dev, "%s - %d chars, flip=%d\n", __func__, count,
0712 p_priv->out_flip);
0713
0714 for (left = count; left > 0; left -= todo) {
0715 todo = left;
0716 if (todo > maxDataLen)
0717 todo = maxDataLen;
0718
0719 flip = p_priv->out_flip;
0720
0721
0722 this_urb = p_priv->out_urbs[flip];
0723 if (this_urb == NULL) {
0724
0725 dev_dbg(&port->dev, "%s - no output urb :(\n", __func__);
0726 return count;
0727 }
0728
0729 dev_dbg(&port->dev, "%s - endpoint %x flip %d\n",
0730 __func__, usb_pipeendpoint(this_urb->pipe), flip);
0731
0732 if (this_urb->status == -EINPROGRESS) {
0733 if (time_before(jiffies,
0734 p_priv->tx_start_time[flip] + 10 * HZ))
0735 break;
0736 usb_unlink_urb(this_urb);
0737 break;
0738 }
0739
0740
0741
0742 ((char *)this_urb->transfer_buffer)[0] = 0;
0743
0744 memcpy(this_urb->transfer_buffer + dataOffset, buf, todo);
0745 buf += todo;
0746
0747
0748 this_urb->transfer_buffer_length = todo + dataOffset;
0749
0750 err = usb_submit_urb(this_urb, GFP_ATOMIC);
0751 if (err != 0)
0752 dev_dbg(&port->dev, "usb_submit_urb(write bulk) failed (%d)\n", err);
0753 p_priv->tx_start_time[flip] = jiffies;
0754
0755
0756
0757 p_priv->out_flip = (flip + 1) & d_details->outdat_endp_flip;
0758 }
0759
0760 return count - left;
0761 }
0762
0763 static void usa26_indat_callback(struct urb *urb)
0764 {
0765 int i, err;
0766 int endpoint;
0767 struct usb_serial_port *port;
0768 unsigned char *data = urb->transfer_buffer;
0769 int status = urb->status;
0770
0771 endpoint = usb_pipeendpoint(urb->pipe);
0772
0773 if (status) {
0774 dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
0775 __func__, status, endpoint);
0776 return;
0777 }
0778
0779 port = urb->context;
0780 if (urb->actual_length) {
0781
0782 if ((data[0] & 0x80) == 0) {
0783
0784
0785 if (data[0] & RXERROR_OVERRUN) {
0786 tty_insert_flip_char(&port->port, 0,
0787 TTY_OVERRUN);
0788 }
0789 for (i = 1; i < urb->actual_length ; ++i)
0790 tty_insert_flip_char(&port->port, data[i],
0791 TTY_NORMAL);
0792 } else {
0793
0794 dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
0795 for (i = 0; i + 1 < urb->actual_length; i += 2) {
0796 int stat = data[i];
0797 int flag = TTY_NORMAL;
0798
0799 if (stat & RXERROR_OVERRUN) {
0800 tty_insert_flip_char(&port->port, 0,
0801 TTY_OVERRUN);
0802 }
0803
0804 if (stat & RXERROR_PARITY)
0805 flag = TTY_PARITY;
0806 else if (stat & RXERROR_FRAMING)
0807 flag = TTY_FRAME;
0808
0809 tty_insert_flip_char(&port->port, data[i+1],
0810 flag);
0811 }
0812 }
0813 tty_flip_buffer_push(&port->port);
0814 }
0815
0816
0817 err = usb_submit_urb(urb, GFP_ATOMIC);
0818 if (err != 0)
0819 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
0820 }
0821
0822
0823 static void usa2x_outdat_callback(struct urb *urb)
0824 {
0825 struct usb_serial_port *port;
0826 struct keyspan_port_private *p_priv;
0827
0828 port = urb->context;
0829 p_priv = usb_get_serial_port_data(port);
0830 dev_dbg(&port->dev, "%s - urb %d\n", __func__, urb == p_priv->out_urbs[1]);
0831
0832 usb_serial_port_softint(port);
0833 }
0834
0835 static void usa26_inack_callback(struct urb *urb)
0836 {
0837 }
0838
0839 static void usa26_outcont_callback(struct urb *urb)
0840 {
0841 struct usb_serial_port *port;
0842 struct keyspan_port_private *p_priv;
0843
0844 port = urb->context;
0845 p_priv = usb_get_serial_port_data(port);
0846
0847 if (p_priv->resend_cont) {
0848 dev_dbg(&port->dev, "%s - sending setup\n", __func__);
0849 keyspan_usa26_send_setup(port->serial, port,
0850 p_priv->resend_cont - 1);
0851 }
0852 }
0853
0854 static void usa26_instat_callback(struct urb *urb)
0855 {
0856 unsigned char *data = urb->transfer_buffer;
0857 struct keyspan_usa26_portStatusMessage *msg;
0858 struct usb_serial *serial;
0859 struct usb_serial_port *port;
0860 struct keyspan_port_private *p_priv;
0861 int old_dcd_state, err;
0862 int status = urb->status;
0863
0864 serial = urb->context;
0865
0866 if (status) {
0867 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
0868 __func__, status);
0869 return;
0870 }
0871 if (urb->actual_length != 9) {
0872 dev_dbg(&urb->dev->dev, "%s - %d byte report??\n", __func__, urb->actual_length);
0873 goto exit;
0874 }
0875
0876 msg = (struct keyspan_usa26_portStatusMessage *)data;
0877
0878
0879 if (msg->port >= serial->num_ports) {
0880 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);
0881 goto exit;
0882 }
0883 port = serial->port[msg->port];
0884 p_priv = usb_get_serial_port_data(port);
0885 if (!p_priv)
0886 goto resubmit;
0887
0888
0889 old_dcd_state = p_priv->dcd_state;
0890 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
0891 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
0892 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
0893 p_priv->ri_state = ((msg->ri) ? 1 : 0);
0894
0895 if (old_dcd_state != p_priv->dcd_state)
0896 tty_port_tty_hangup(&port->port, true);
0897 resubmit:
0898
0899 err = usb_submit_urb(urb, GFP_ATOMIC);
0900 if (err != 0)
0901 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
0902 exit: ;
0903 }
0904
0905 static void usa26_glocont_callback(struct urb *urb)
0906 {
0907 }
0908
0909
0910 static void usa28_indat_callback(struct urb *urb)
0911 {
0912 int err;
0913 struct usb_serial_port *port;
0914 unsigned char *data;
0915 struct keyspan_port_private *p_priv;
0916 int status = urb->status;
0917
0918 port = urb->context;
0919 p_priv = usb_get_serial_port_data(port);
0920 data = urb->transfer_buffer;
0921
0922 if (urb != p_priv->in_urbs[p_priv->in_flip])
0923 return;
0924
0925 do {
0926 if (status) {
0927 dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
0928 __func__, status, usb_pipeendpoint(urb->pipe));
0929 return;
0930 }
0931
0932 port = urb->context;
0933 p_priv = usb_get_serial_port_data(port);
0934 data = urb->transfer_buffer;
0935
0936 if (urb->actual_length) {
0937 tty_insert_flip_string(&port->port, data,
0938 urb->actual_length);
0939 tty_flip_buffer_push(&port->port);
0940 }
0941
0942
0943 err = usb_submit_urb(urb, GFP_ATOMIC);
0944 if (err != 0)
0945 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n",
0946 __func__, err);
0947 p_priv->in_flip ^= 1;
0948
0949 urb = p_priv->in_urbs[p_priv->in_flip];
0950 } while (urb->status != -EINPROGRESS);
0951 }
0952
0953 static void usa28_inack_callback(struct urb *urb)
0954 {
0955 }
0956
0957 static void usa28_outcont_callback(struct urb *urb)
0958 {
0959 struct usb_serial_port *port;
0960 struct keyspan_port_private *p_priv;
0961
0962 port = urb->context;
0963 p_priv = usb_get_serial_port_data(port);
0964
0965 if (p_priv->resend_cont) {
0966 dev_dbg(&port->dev, "%s - sending setup\n", __func__);
0967 keyspan_usa28_send_setup(port->serial, port,
0968 p_priv->resend_cont - 1);
0969 }
0970 }
0971
0972 static void usa28_instat_callback(struct urb *urb)
0973 {
0974 int err;
0975 unsigned char *data = urb->transfer_buffer;
0976 struct keyspan_usa28_portStatusMessage *msg;
0977 struct usb_serial *serial;
0978 struct usb_serial_port *port;
0979 struct keyspan_port_private *p_priv;
0980 int old_dcd_state;
0981 int status = urb->status;
0982
0983 serial = urb->context;
0984
0985 if (status) {
0986 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
0987 __func__, status);
0988 return;
0989 }
0990
0991 if (urb->actual_length != sizeof(struct keyspan_usa28_portStatusMessage)) {
0992 dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);
0993 goto exit;
0994 }
0995
0996 msg = (struct keyspan_usa28_portStatusMessage *)data;
0997
0998
0999 if (msg->port >= serial->num_ports) {
1000 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);
1001 goto exit;
1002 }
1003 port = serial->port[msg->port];
1004 p_priv = usb_get_serial_port_data(port);
1005 if (!p_priv)
1006 goto resubmit;
1007
1008
1009 old_dcd_state = p_priv->dcd_state;
1010 p_priv->cts_state = ((msg->cts) ? 1 : 0);
1011 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
1012 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1013 p_priv->ri_state = ((msg->ri) ? 1 : 0);
1014
1015 if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
1016 tty_port_tty_hangup(&port->port, true);
1017 resubmit:
1018
1019 err = usb_submit_urb(urb, GFP_ATOMIC);
1020 if (err != 0)
1021 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1022 exit: ;
1023 }
1024
1025 static void usa28_glocont_callback(struct urb *urb)
1026 {
1027 }
1028
1029
1030 static void usa49_glocont_callback(struct urb *urb)
1031 {
1032 struct usb_serial *serial;
1033 struct usb_serial_port *port;
1034 struct keyspan_port_private *p_priv;
1035 int i;
1036
1037 serial = urb->context;
1038 for (i = 0; i < serial->num_ports; ++i) {
1039 port = serial->port[i];
1040 p_priv = usb_get_serial_port_data(port);
1041 if (!p_priv)
1042 continue;
1043
1044 if (p_priv->resend_cont) {
1045 dev_dbg(&port->dev, "%s - sending setup\n", __func__);
1046 keyspan_usa49_send_setup(serial, port,
1047 p_priv->resend_cont - 1);
1048 break;
1049 }
1050 }
1051 }
1052
1053
1054
1055 static void usa49_instat_callback(struct urb *urb)
1056 {
1057 int err;
1058 unsigned char *data = urb->transfer_buffer;
1059 struct keyspan_usa49_portStatusMessage *msg;
1060 struct usb_serial *serial;
1061 struct usb_serial_port *port;
1062 struct keyspan_port_private *p_priv;
1063 int old_dcd_state;
1064 int status = urb->status;
1065
1066 serial = urb->context;
1067
1068 if (status) {
1069 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
1070 __func__, status);
1071 return;
1072 }
1073
1074 if (urb->actual_length !=
1075 sizeof(struct keyspan_usa49_portStatusMessage)) {
1076 dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);
1077 goto exit;
1078 }
1079
1080 msg = (struct keyspan_usa49_portStatusMessage *)data;
1081
1082
1083 if (msg->portNumber >= serial->num_ports) {
1084 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n",
1085 __func__, msg->portNumber);
1086 goto exit;
1087 }
1088 port = serial->port[msg->portNumber];
1089 p_priv = usb_get_serial_port_data(port);
1090 if (!p_priv)
1091 goto resubmit;
1092
1093
1094 old_dcd_state = p_priv->dcd_state;
1095 p_priv->cts_state = ((msg->cts) ? 1 : 0);
1096 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
1097 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1098 p_priv->ri_state = ((msg->ri) ? 1 : 0);
1099
1100 if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
1101 tty_port_tty_hangup(&port->port, true);
1102 resubmit:
1103
1104 err = usb_submit_urb(urb, GFP_ATOMIC);
1105 if (err != 0)
1106 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1107 exit: ;
1108 }
1109
1110 static void usa49_inack_callback(struct urb *urb)
1111 {
1112 }
1113
1114 static void usa49_indat_callback(struct urb *urb)
1115 {
1116 int i, err;
1117 int endpoint;
1118 struct usb_serial_port *port;
1119 unsigned char *data = urb->transfer_buffer;
1120 int status = urb->status;
1121
1122 endpoint = usb_pipeendpoint(urb->pipe);
1123
1124 if (status) {
1125 dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
1126 __func__, status, endpoint);
1127 return;
1128 }
1129
1130 port = urb->context;
1131 if (urb->actual_length) {
1132
1133 if ((data[0] & 0x80) == 0) {
1134
1135 tty_insert_flip_string(&port->port, data + 1,
1136 urb->actual_length - 1);
1137 } else {
1138
1139 for (i = 0; i + 1 < urb->actual_length; i += 2) {
1140 int stat = data[i];
1141 int flag = TTY_NORMAL;
1142
1143 if (stat & RXERROR_OVERRUN) {
1144 tty_insert_flip_char(&port->port, 0,
1145 TTY_OVERRUN);
1146 }
1147
1148 if (stat & RXERROR_PARITY)
1149 flag = TTY_PARITY;
1150 else if (stat & RXERROR_FRAMING)
1151 flag = TTY_FRAME;
1152
1153 tty_insert_flip_char(&port->port, data[i+1],
1154 flag);
1155 }
1156 }
1157 tty_flip_buffer_push(&port->port);
1158 }
1159
1160
1161 err = usb_submit_urb(urb, GFP_ATOMIC);
1162 if (err != 0)
1163 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1164 }
1165
1166 static void usa49wg_indat_callback(struct urb *urb)
1167 {
1168 int i, len, x, err;
1169 struct usb_serial *serial;
1170 struct usb_serial_port *port;
1171 unsigned char *data = urb->transfer_buffer;
1172 int status = urb->status;
1173
1174 serial = urb->context;
1175
1176 if (status) {
1177 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
1178 __func__, status);
1179 return;
1180 }
1181
1182
1183 i = 0;
1184 len = 0;
1185
1186 while (i < urb->actual_length) {
1187
1188
1189 if (data[i] >= serial->num_ports) {
1190 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n",
1191 __func__, data[i]);
1192 return;
1193 }
1194 port = serial->port[data[i++]];
1195 len = data[i++];
1196
1197
1198 if ((data[i] & 0x80) == 0) {
1199
1200 i++;
1201 for (x = 1; x < len && i < urb->actual_length; ++x)
1202 tty_insert_flip_char(&port->port,
1203 data[i++], 0);
1204 } else {
1205
1206
1207
1208 for (x = 0; x + 1 < len &&
1209 i + 1 < urb->actual_length; x += 2) {
1210 int stat = data[i];
1211 int flag = TTY_NORMAL;
1212
1213 if (stat & RXERROR_OVERRUN) {
1214 tty_insert_flip_char(&port->port, 0,
1215 TTY_OVERRUN);
1216 }
1217
1218 if (stat & RXERROR_PARITY)
1219 flag = TTY_PARITY;
1220 else if (stat & RXERROR_FRAMING)
1221 flag = TTY_FRAME;
1222
1223 tty_insert_flip_char(&port->port, data[i+1],
1224 flag);
1225 i += 2;
1226 }
1227 }
1228 tty_flip_buffer_push(&port->port);
1229 }
1230
1231
1232 err = usb_submit_urb(urb, GFP_ATOMIC);
1233 if (err != 0)
1234 dev_dbg(&urb->dev->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1235 }
1236
1237
1238 static void usa49_outcont_callback(struct urb *urb)
1239 {
1240 }
1241
1242 static void usa90_indat_callback(struct urb *urb)
1243 {
1244 int i, err;
1245 int endpoint;
1246 struct usb_serial_port *port;
1247 struct keyspan_port_private *p_priv;
1248 unsigned char *data = urb->transfer_buffer;
1249 int status = urb->status;
1250
1251 endpoint = usb_pipeendpoint(urb->pipe);
1252
1253 if (status) {
1254 dev_dbg(&urb->dev->dev, "%s - nonzero status %d on endpoint %x\n",
1255 __func__, status, endpoint);
1256 return;
1257 }
1258
1259 port = urb->context;
1260 p_priv = usb_get_serial_port_data(port);
1261
1262 if (urb->actual_length) {
1263
1264
1265
1266 if (p_priv->baud > 57600)
1267 tty_insert_flip_string(&port->port, data,
1268 urb->actual_length);
1269 else {
1270
1271 if ((data[0] & 0x80) == 0) {
1272
1273
1274 if (data[0] & RXERROR_OVERRUN) {
1275 tty_insert_flip_char(&port->port, 0,
1276 TTY_OVERRUN);
1277 }
1278 for (i = 1; i < urb->actual_length ; ++i)
1279 tty_insert_flip_char(&port->port,
1280 data[i], TTY_NORMAL);
1281 } else {
1282
1283 dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);
1284 for (i = 0; i + 1 < urb->actual_length; i += 2) {
1285 int stat = data[i];
1286 int flag = TTY_NORMAL;
1287
1288 if (stat & RXERROR_OVERRUN) {
1289 tty_insert_flip_char(
1290 &port->port, 0,
1291 TTY_OVERRUN);
1292 }
1293
1294 if (stat & RXERROR_PARITY)
1295 flag = TTY_PARITY;
1296 else if (stat & RXERROR_FRAMING)
1297 flag = TTY_FRAME;
1298
1299 tty_insert_flip_char(&port->port,
1300 data[i+1], flag);
1301 }
1302 }
1303 }
1304 tty_flip_buffer_push(&port->port);
1305 }
1306
1307
1308 err = usb_submit_urb(urb, GFP_ATOMIC);
1309 if (err != 0)
1310 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1311 }
1312
1313
1314 static void usa90_instat_callback(struct urb *urb)
1315 {
1316 unsigned char *data = urb->transfer_buffer;
1317 struct keyspan_usa90_portStatusMessage *msg;
1318 struct usb_serial *serial;
1319 struct usb_serial_port *port;
1320 struct keyspan_port_private *p_priv;
1321 int old_dcd_state, err;
1322 int status = urb->status;
1323
1324 serial = urb->context;
1325
1326 if (status) {
1327 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
1328 __func__, status);
1329 return;
1330 }
1331 if (urb->actual_length < 14) {
1332 dev_dbg(&urb->dev->dev, "%s - %d byte report??\n", __func__, urb->actual_length);
1333 goto exit;
1334 }
1335
1336 msg = (struct keyspan_usa90_portStatusMessage *)data;
1337
1338
1339
1340 port = serial->port[0];
1341 p_priv = usb_get_serial_port_data(port);
1342 if (!p_priv)
1343 goto resubmit;
1344
1345
1346 old_dcd_state = p_priv->dcd_state;
1347 p_priv->cts_state = ((msg->cts) ? 1 : 0);
1348 p_priv->dsr_state = ((msg->dsr) ? 1 : 0);
1349 p_priv->dcd_state = ((msg->dcd) ? 1 : 0);
1350 p_priv->ri_state = ((msg->ri) ? 1 : 0);
1351
1352 if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
1353 tty_port_tty_hangup(&port->port, true);
1354 resubmit:
1355
1356 err = usb_submit_urb(urb, GFP_ATOMIC);
1357 if (err != 0)
1358 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1359 exit:
1360 ;
1361 }
1362
1363 static void usa90_outcont_callback(struct urb *urb)
1364 {
1365 struct usb_serial_port *port;
1366 struct keyspan_port_private *p_priv;
1367
1368 port = urb->context;
1369 p_priv = usb_get_serial_port_data(port);
1370
1371 if (p_priv->resend_cont) {
1372 dev_dbg(&urb->dev->dev, "%s - sending setup\n", __func__);
1373 keyspan_usa90_send_setup(port->serial, port,
1374 p_priv->resend_cont - 1);
1375 }
1376 }
1377
1378
1379 static void usa67_instat_callback(struct urb *urb)
1380 {
1381 int err;
1382 unsigned char *data = urb->transfer_buffer;
1383 struct keyspan_usa67_portStatusMessage *msg;
1384 struct usb_serial *serial;
1385 struct usb_serial_port *port;
1386 struct keyspan_port_private *p_priv;
1387 int old_dcd_state;
1388 int status = urb->status;
1389
1390 serial = urb->context;
1391
1392 if (status) {
1393 dev_dbg(&urb->dev->dev, "%s - nonzero status: %d\n",
1394 __func__, status);
1395 return;
1396 }
1397
1398 if (urb->actual_length !=
1399 sizeof(struct keyspan_usa67_portStatusMessage)) {
1400 dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);
1401 return;
1402 }
1403
1404
1405
1406 msg = (struct keyspan_usa67_portStatusMessage *)data;
1407
1408
1409 if (msg->port >= serial->num_ports) {
1410 dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);
1411 return;
1412 }
1413
1414 port = serial->port[msg->port];
1415 p_priv = usb_get_serial_port_data(port);
1416 if (!p_priv)
1417 goto resubmit;
1418
1419
1420 old_dcd_state = p_priv->dcd_state;
1421 p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);
1422 p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);
1423
1424 if (old_dcd_state != p_priv->dcd_state && old_dcd_state)
1425 tty_port_tty_hangup(&port->port, true);
1426 resubmit:
1427
1428 err = usb_submit_urb(urb, GFP_ATOMIC);
1429 if (err != 0)
1430 dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);
1431 }
1432
1433 static void usa67_glocont_callback(struct urb *urb)
1434 {
1435 struct usb_serial *serial;
1436 struct usb_serial_port *port;
1437 struct keyspan_port_private *p_priv;
1438 int i;
1439
1440 serial = urb->context;
1441 for (i = 0; i < serial->num_ports; ++i) {
1442 port = serial->port[i];
1443 p_priv = usb_get_serial_port_data(port);
1444 if (!p_priv)
1445 continue;
1446
1447 if (p_priv->resend_cont) {
1448 dev_dbg(&port->dev, "%s - sending setup\n", __func__);
1449 keyspan_usa67_send_setup(serial, port,
1450 p_priv->resend_cont - 1);
1451 break;
1452 }
1453 }
1454 }
1455
1456 static unsigned int keyspan_write_room(struct tty_struct *tty)
1457 {
1458 struct usb_serial_port *port = tty->driver_data;
1459 struct keyspan_port_private *p_priv;
1460 const struct keyspan_device_details *d_details;
1461 int flip;
1462 unsigned int data_len;
1463 struct urb *this_urb;
1464
1465 p_priv = usb_get_serial_port_data(port);
1466 d_details = p_priv->device_details;
1467
1468
1469 if (d_details->msg_format == msg_usa90)
1470 data_len = 64;
1471 else
1472 data_len = 63;
1473
1474 flip = p_priv->out_flip;
1475
1476
1477 this_urb = p_priv->out_urbs[flip];
1478 if (this_urb != NULL) {
1479 if (this_urb->status != -EINPROGRESS)
1480 return data_len;
1481 flip = (flip + 1) & d_details->outdat_endp_flip;
1482 this_urb = p_priv->out_urbs[flip];
1483 if (this_urb != NULL) {
1484 if (this_urb->status != -EINPROGRESS)
1485 return data_len;
1486 }
1487 }
1488 return 0;
1489 }
1490
1491
1492 static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)
1493 {
1494 struct keyspan_port_private *p_priv;
1495 const struct keyspan_device_details *d_details;
1496 int i, err;
1497 int baud_rate, device_port;
1498 struct urb *urb;
1499 unsigned int cflag = 0;
1500
1501 p_priv = usb_get_serial_port_data(port);
1502 d_details = p_priv->device_details;
1503
1504
1505 p_priv->rts_state = 1;
1506 p_priv->dtr_state = 1;
1507 p_priv->baud = 9600;
1508
1509
1510 p_priv->old_baud = 0;
1511 p_priv->old_cflag = 0;
1512
1513 p_priv->out_flip = 0;
1514 p_priv->in_flip = 0;
1515
1516
1517 for (i = 0; i < 2; i++) {
1518 urb = p_priv->in_urbs[i];
1519 if (urb == NULL)
1520 continue;
1521
1522
1523
1524 usb_clear_halt(urb->dev, urb->pipe);
1525 err = usb_submit_urb(urb, GFP_KERNEL);
1526 if (err != 0)
1527 dev_dbg(&port->dev, "%s - submit urb %d failed (%d)\n", __func__, i, err);
1528 }
1529
1530
1531 for (i = 0; i < 2; i++) {
1532 urb = p_priv->out_urbs[i];
1533 if (urb == NULL)
1534 continue;
1535
1536
1537 }
1538
1539
1540
1541
1542 device_port = port->port_number;
1543 if (tty) {
1544 cflag = tty->termios.c_cflag;
1545
1546
1547 baud_rate = tty_get_baud_rate(tty);
1548
1549 if (baud_rate >= 0
1550 && d_details->calculate_baud_rate(port, baud_rate, d_details->baudclk,
1551 NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {
1552 p_priv->baud = baud_rate;
1553 }
1554 }
1555
1556 p_priv->cflag = cflag;
1557 p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none;
1558
1559 keyspan_send_setup(port, 1);
1560
1561
1562
1563 return 0;
1564 }
1565
1566 static void keyspan_dtr_rts(struct usb_serial_port *port, int on)
1567 {
1568 struct keyspan_port_private *p_priv = usb_get_serial_port_data(port);
1569
1570 p_priv->rts_state = on;
1571 p_priv->dtr_state = on;
1572 keyspan_send_setup(port, 0);
1573 }
1574
1575 static void keyspan_close(struct usb_serial_port *port)
1576 {
1577 int i;
1578 struct keyspan_port_private *p_priv;
1579
1580 p_priv = usb_get_serial_port_data(port);
1581
1582 p_priv->rts_state = 0;
1583 p_priv->dtr_state = 0;
1584
1585 keyspan_send_setup(port, 2);
1586
1587 mdelay(100);
1588
1589 p_priv->out_flip = 0;
1590 p_priv->in_flip = 0;
1591
1592 usb_kill_urb(p_priv->inack_urb);
1593 for (i = 0; i < 2; i++) {
1594 usb_kill_urb(p_priv->in_urbs[i]);
1595 usb_kill_urb(p_priv->out_urbs[i]);
1596 }
1597 }
1598
1599
1600 static int keyspan_fake_startup(struct usb_serial *serial)
1601 {
1602 char *fw_name;
1603
1604 dev_dbg(&serial->dev->dev, "Keyspan startup version %04x product %04x\n",
1605 le16_to_cpu(serial->dev->descriptor.bcdDevice),
1606 le16_to_cpu(serial->dev->descriptor.idProduct));
1607
1608 if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000)
1609 != 0x8000) {
1610 dev_dbg(&serial->dev->dev, "Firmware already loaded. Quitting.\n");
1611 return 1;
1612 }
1613
1614
1615 switch (le16_to_cpu(serial->dev->descriptor.idProduct)) {
1616 case keyspan_usa28_pre_product_id:
1617 fw_name = "keyspan/usa28.fw";
1618 break;
1619
1620 case keyspan_usa28x_pre_product_id:
1621 fw_name = "keyspan/usa28x.fw";
1622 break;
1623
1624 case keyspan_usa28xa_pre_product_id:
1625 fw_name = "keyspan/usa28xa.fw";
1626 break;
1627
1628 case keyspan_usa28xb_pre_product_id:
1629 fw_name = "keyspan/usa28xb.fw";
1630 break;
1631
1632 case keyspan_usa19_pre_product_id:
1633 fw_name = "keyspan/usa19.fw";
1634 break;
1635
1636 case keyspan_usa19qi_pre_product_id:
1637 fw_name = "keyspan/usa19qi.fw";
1638 break;
1639
1640 case keyspan_mpr_pre_product_id:
1641 fw_name = "keyspan/mpr.fw";
1642 break;
1643
1644 case keyspan_usa19qw_pre_product_id:
1645 fw_name = "keyspan/usa19qw.fw";
1646 break;
1647
1648 case keyspan_usa18x_pre_product_id:
1649 fw_name = "keyspan/usa18x.fw";
1650 break;
1651
1652 case keyspan_usa19w_pre_product_id:
1653 fw_name = "keyspan/usa19w.fw";
1654 break;
1655
1656 case keyspan_usa49w_pre_product_id:
1657 fw_name = "keyspan/usa49w.fw";
1658 break;
1659
1660 case keyspan_usa49wlc_pre_product_id:
1661 fw_name = "keyspan/usa49wlc.fw";
1662 break;
1663
1664 default:
1665 dev_err(&serial->dev->dev, "Unknown product ID (%04x)\n",
1666 le16_to_cpu(serial->dev->descriptor.idProduct));
1667 return 1;
1668 }
1669
1670 dev_dbg(&serial->dev->dev, "Uploading Keyspan %s firmware.\n", fw_name);
1671
1672 if (ezusb_fx1_ihex_firmware_download(serial->dev, fw_name) < 0) {
1673 dev_err(&serial->dev->dev, "failed to load firmware \"%s\"\n",
1674 fw_name);
1675 return -ENOENT;
1676 }
1677
1678
1679
1680
1681
1682 return 1;
1683 }
1684
1685
1686 static struct usb_endpoint_descriptor const *find_ep(struct usb_serial const *serial,
1687 int endpoint)
1688 {
1689 struct usb_host_interface *iface_desc;
1690 struct usb_endpoint_descriptor *ep;
1691 int i;
1692
1693 iface_desc = serial->interface->cur_altsetting;
1694 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1695 ep = &iface_desc->endpoint[i].desc;
1696 if (ep->bEndpointAddress == endpoint)
1697 return ep;
1698 }
1699 dev_warn(&serial->interface->dev, "found no endpoint descriptor for endpoint %x\n",
1700 endpoint);
1701 return NULL;
1702 }
1703
1704 static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint,
1705 int dir, void *ctx, char *buf, int len,
1706 void (*callback)(struct urb *))
1707 {
1708 struct urb *urb;
1709 struct usb_endpoint_descriptor const *ep_desc;
1710 char const *ep_type_name;
1711
1712 if (endpoint == -1)
1713 return NULL;
1714
1715 dev_dbg(&serial->interface->dev, "%s - alloc for endpoint %x\n",
1716 __func__, endpoint);
1717 urb = usb_alloc_urb(0, GFP_KERNEL);
1718 if (!urb)
1719 return NULL;
1720
1721 if (endpoint == 0) {
1722
1723 return urb;
1724 }
1725
1726 ep_desc = find_ep(serial, endpoint);
1727 if (!ep_desc) {
1728 usb_free_urb(urb);
1729 return NULL;
1730 }
1731 if (usb_endpoint_xfer_int(ep_desc)) {
1732 ep_type_name = "INT";
1733 usb_fill_int_urb(urb, serial->dev,
1734 usb_sndintpipe(serial->dev, endpoint) | dir,
1735 buf, len, callback, ctx,
1736 ep_desc->bInterval);
1737 } else if (usb_endpoint_xfer_bulk(ep_desc)) {
1738 ep_type_name = "BULK";
1739 usb_fill_bulk_urb(urb, serial->dev,
1740 usb_sndbulkpipe(serial->dev, endpoint) | dir,
1741 buf, len, callback, ctx);
1742 } else {
1743 dev_warn(&serial->interface->dev,
1744 "unsupported endpoint type %x\n",
1745 usb_endpoint_type(ep_desc));
1746 usb_free_urb(urb);
1747 return NULL;
1748 }
1749
1750 dev_dbg(&serial->interface->dev, "%s - using urb %p for %s endpoint %x\n",
1751 __func__, urb, ep_type_name, endpoint);
1752 return urb;
1753 }
1754
1755 static struct callbacks {
1756 void (*instat_callback)(struct urb *);
1757 void (*glocont_callback)(struct urb *);
1758 void (*indat_callback)(struct urb *);
1759 void (*outdat_callback)(struct urb *);
1760 void (*inack_callback)(struct urb *);
1761 void (*outcont_callback)(struct urb *);
1762 } keyspan_callbacks[] = {
1763 {
1764
1765 .instat_callback = usa26_instat_callback,
1766 .glocont_callback = usa26_glocont_callback,
1767 .indat_callback = usa26_indat_callback,
1768 .outdat_callback = usa2x_outdat_callback,
1769 .inack_callback = usa26_inack_callback,
1770 .outcont_callback = usa26_outcont_callback,
1771 }, {
1772
1773 .instat_callback = usa28_instat_callback,
1774 .glocont_callback = usa28_glocont_callback,
1775 .indat_callback = usa28_indat_callback,
1776 .outdat_callback = usa2x_outdat_callback,
1777 .inack_callback = usa28_inack_callback,
1778 .outcont_callback = usa28_outcont_callback,
1779 }, {
1780
1781 .instat_callback = usa49_instat_callback,
1782 .glocont_callback = usa49_glocont_callback,
1783 .indat_callback = usa49_indat_callback,
1784 .outdat_callback = usa2x_outdat_callback,
1785 .inack_callback = usa49_inack_callback,
1786 .outcont_callback = usa49_outcont_callback,
1787 }, {
1788
1789 .instat_callback = usa90_instat_callback,
1790 .glocont_callback = usa28_glocont_callback,
1791 .indat_callback = usa90_indat_callback,
1792 .outdat_callback = usa2x_outdat_callback,
1793 .inack_callback = usa28_inack_callback,
1794 .outcont_callback = usa90_outcont_callback,
1795 }, {
1796
1797 .instat_callback = usa67_instat_callback,
1798 .glocont_callback = usa67_glocont_callback,
1799 .indat_callback = usa26_indat_callback,
1800 .outdat_callback = usa2x_outdat_callback,
1801 .inack_callback = usa26_inack_callback,
1802 .outcont_callback = usa26_outcont_callback,
1803 }
1804 };
1805
1806
1807
1808 static void keyspan_setup_urbs(struct usb_serial *serial)
1809 {
1810 struct keyspan_serial_private *s_priv;
1811 const struct keyspan_device_details *d_details;
1812 struct callbacks *cback;
1813
1814 s_priv = usb_get_serial_data(serial);
1815 d_details = s_priv->device_details;
1816
1817
1818 cback = &keyspan_callbacks[d_details->msg_format];
1819
1820
1821
1822 s_priv->instat_urb = keyspan_setup_urb
1823 (serial, d_details->instat_endpoint, USB_DIR_IN,
1824 serial, s_priv->instat_buf, INSTAT_BUFLEN,
1825 cback->instat_callback);
1826
1827 s_priv->indat_urb = keyspan_setup_urb
1828 (serial, d_details->indat_endpoint, USB_DIR_IN,
1829 serial, s_priv->indat_buf, INDAT49W_BUFLEN,
1830 usa49wg_indat_callback);
1831
1832 s_priv->glocont_urb = keyspan_setup_urb
1833 (serial, d_details->glocont_endpoint, USB_DIR_OUT,
1834 serial, s_priv->glocont_buf, GLOCONT_BUFLEN,
1835 cback->glocont_callback);
1836 }
1837
1838
1839 static int keyspan_usa19_calc_baud(struct usb_serial_port *port,
1840 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1841 u8 *rate_low, u8 *prescaler, int portnum)
1842 {
1843 u32 b16,
1844 div,
1845 cnt;
1846
1847 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1848
1849
1850 b16 = baud_rate * 16L;
1851 if (b16 == 0)
1852 return KEYSPAN_INVALID_BAUD_RATE;
1853
1854
1855 if (baud_rate > 57600)
1856 return KEYSPAN_INVALID_BAUD_RATE;
1857
1858
1859 div = baudclk / b16;
1860 if (div == 0)
1861 return KEYSPAN_INVALID_BAUD_RATE;
1862 else
1863 cnt = 0 - div;
1864
1865 if (div > 0xffff)
1866 return KEYSPAN_INVALID_BAUD_RATE;
1867
1868
1869 if (rate_low)
1870 *rate_low = (u8) (cnt & 0xff);
1871 if (rate_hi)
1872 *rate_hi = (u8) ((cnt >> 8) & 0xff);
1873 if (rate_low && rate_hi)
1874 dev_dbg(&port->dev, "%s - %d %02x %02x.\n",
1875 __func__, baud_rate, *rate_hi, *rate_low);
1876 return KEYSPAN_BAUD_RATE_OK;
1877 }
1878
1879
1880 static int keyspan_usa19hs_calc_baud(struct usb_serial_port *port,
1881 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1882 u8 *rate_low, u8 *prescaler, int portnum)
1883 {
1884 u32 b16,
1885 div;
1886
1887 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1888
1889
1890 b16 = baud_rate * 16L;
1891 if (b16 == 0)
1892 return KEYSPAN_INVALID_BAUD_RATE;
1893
1894
1895 div = baudclk / b16;
1896 if (div == 0)
1897 return KEYSPAN_INVALID_BAUD_RATE;
1898
1899 if (div > 0xffff)
1900 return KEYSPAN_INVALID_BAUD_RATE;
1901
1902
1903 if (rate_low)
1904 *rate_low = (u8) (div & 0xff);
1905
1906 if (rate_hi)
1907 *rate_hi = (u8) ((div >> 8) & 0xff);
1908
1909 if (rate_low && rate_hi)
1910 dev_dbg(&port->dev, "%s - %d %02x %02x.\n",
1911 __func__, baud_rate, *rate_hi, *rate_low);
1912
1913 return KEYSPAN_BAUD_RATE_OK;
1914 }
1915
1916 static int keyspan_usa19w_calc_baud(struct usb_serial_port *port,
1917 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1918 u8 *rate_low, u8 *prescaler, int portnum)
1919 {
1920 u32 b16,
1921 clk,
1922 div,
1923 res,
1924 diff,
1925 smallest_diff;
1926 u8 best_prescaler;
1927 int i;
1928
1929 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1930
1931
1932 b16 = baud_rate * 16L;
1933 if (b16 == 0)
1934 return KEYSPAN_INVALID_BAUD_RATE;
1935
1936
1937
1938
1939
1940 smallest_diff = 0xffffffff;
1941
1942
1943 best_prescaler = 0;
1944
1945 for (i = 8; i <= 0xff; ++i) {
1946 clk = (baudclk * 8) / (u32) i;
1947
1948 div = clk / b16;
1949 if (div == 0)
1950 continue;
1951
1952 res = clk / div;
1953 diff = (res > b16) ? (res-b16) : (b16-res);
1954
1955 if (diff < smallest_diff) {
1956 best_prescaler = i;
1957 smallest_diff = diff;
1958 }
1959 }
1960
1961 if (best_prescaler == 0)
1962 return KEYSPAN_INVALID_BAUD_RATE;
1963
1964 clk = (baudclk * 8) / (u32) best_prescaler;
1965 div = clk / b16;
1966
1967
1968 if (rate_low)
1969 *rate_low = (u8) (div & 0xff);
1970 if (rate_hi)
1971 *rate_hi = (u8) ((div >> 8) & 0xff);
1972 if (prescaler) {
1973 *prescaler = best_prescaler;
1974
1975 }
1976 return KEYSPAN_BAUD_RATE_OK;
1977 }
1978
1979
1980 static int keyspan_usa28_calc_baud(struct usb_serial_port *port,
1981 u32 baud_rate, u32 baudclk, u8 *rate_hi,
1982 u8 *rate_low, u8 *prescaler, int portnum)
1983 {
1984 u32 b16,
1985 div,
1986 cnt;
1987
1988 dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);
1989
1990
1991 b16 = baud_rate * 16L;
1992 if (b16 == 0)
1993 return KEYSPAN_INVALID_BAUD_RATE;
1994
1995
1996 div = KEYSPAN_USA28_BAUDCLK / b16;
1997 if (div == 0)
1998 return KEYSPAN_INVALID_BAUD_RATE;
1999 else
2000 cnt = 0 - div;
2001
2002
2003
2004 if (portnum == 0) {
2005 if (div > 0xffff)
2006 return KEYSPAN_INVALID_BAUD_RATE;
2007 } else {
2008 if (portnum == 1) {
2009 if (div > 0xff)
2010 return KEYSPAN_INVALID_BAUD_RATE;
2011 } else
2012 return KEYSPAN_INVALID_BAUD_RATE;
2013 }
2014
2015
2016
2017 if (rate_low)
2018 *rate_low = (u8) (cnt & 0xff);
2019 if (rate_hi)
2020 *rate_hi = (u8) ((cnt >> 8) & 0xff);
2021 dev_dbg(&port->dev, "%s - %d OK.\n", __func__, baud_rate);
2022 return KEYSPAN_BAUD_RATE_OK;
2023 }
2024
2025 static int keyspan_usa26_send_setup(struct usb_serial *serial,
2026 struct usb_serial_port *port,
2027 int reset_port)
2028 {
2029 struct keyspan_usa26_portControlMessage msg;
2030 struct keyspan_serial_private *s_priv;
2031 struct keyspan_port_private *p_priv;
2032 const struct keyspan_device_details *d_details;
2033 struct urb *this_urb;
2034 int device_port, err;
2035
2036 dev_dbg(&port->dev, "%s reset=%d\n", __func__, reset_port);
2037
2038 s_priv = usb_get_serial_data(serial);
2039 p_priv = usb_get_serial_port_data(port);
2040 d_details = s_priv->device_details;
2041 device_port = port->port_number;
2042
2043 this_urb = p_priv->outcont_urb;
2044
2045
2046 if (this_urb == NULL) {
2047 dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);
2048 return -1;
2049 }
2050
2051 dev_dbg(&port->dev, "%s - endpoint %x\n",
2052 __func__, usb_pipeendpoint(this_urb->pipe));
2053
2054
2055
2056 if ((reset_port + 1) > p_priv->resend_cont)
2057 p_priv->resend_cont = reset_port + 1;
2058 if (this_urb->status == -EINPROGRESS) {
2059
2060 mdelay(5);
2061 return -1;
2062 }
2063
2064 memset(&msg, 0, sizeof(struct keyspan_usa26_portControlMessage));
2065
2066
2067 if (p_priv->old_baud != p_priv->baud) {
2068 p_priv->old_baud = p_priv->baud;
2069 msg.setClocking = 0xff;
2070 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2071 &msg.baudHi, &msg.baudLo, &msg.prescaler,
2072 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2073 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2074 __func__, p_priv->baud);
2075 msg.baudLo = 0;
2076 msg.baudHi = 125;
2077 msg.prescaler = 10;
2078 }
2079 msg.setPrescaler = 0xff;
2080 }
2081
2082 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2083 switch (p_priv->cflag & CSIZE) {
2084 case CS5:
2085 msg.lcr |= USA_DATABITS_5;
2086 break;
2087 case CS6:
2088 msg.lcr |= USA_DATABITS_6;
2089 break;
2090 case CS7:
2091 msg.lcr |= USA_DATABITS_7;
2092 break;
2093 case CS8:
2094 msg.lcr |= USA_DATABITS_8;
2095 break;
2096 }
2097 if (p_priv->cflag & PARENB) {
2098
2099 msg.lcr |= (p_priv->cflag & PARODD) ?
2100 USA_PARITY_ODD : USA_PARITY_EVEN;
2101 }
2102 msg.setLcr = 0xff;
2103
2104 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2105 msg.xonFlowControl = 0;
2106 msg.setFlowControl = 0xff;
2107 msg.forwardingLength = 16;
2108 msg.xonChar = 17;
2109 msg.xoffChar = 19;
2110
2111
2112 if (reset_port == 1) {
2113 msg._txOn = 1;
2114 msg._txOff = 0;
2115 msg.txFlush = 0;
2116 msg.txBreak = 0;
2117 msg.rxOn = 1;
2118 msg.rxOff = 0;
2119 msg.rxFlush = 1;
2120 msg.rxForward = 0;
2121 msg.returnStatus = 0;
2122 msg.resetDataToggle = 0xff;
2123 }
2124
2125
2126 else if (reset_port == 2) {
2127 msg._txOn = 0;
2128 msg._txOff = 1;
2129 msg.txFlush = 0;
2130 msg.txBreak = 0;
2131 msg.rxOn = 0;
2132 msg.rxOff = 1;
2133 msg.rxFlush = 1;
2134 msg.rxForward = 0;
2135 msg.returnStatus = 0;
2136 msg.resetDataToggle = 0;
2137 }
2138
2139
2140 else {
2141 msg._txOn = (!p_priv->break_on);
2142 msg._txOff = 0;
2143 msg.txFlush = 0;
2144 msg.txBreak = (p_priv->break_on);
2145 msg.rxOn = 0;
2146 msg.rxOff = 0;
2147 msg.rxFlush = 0;
2148 msg.rxForward = 0;
2149 msg.returnStatus = 0;
2150 msg.resetDataToggle = 0x0;
2151 }
2152
2153
2154 msg.setTxTriState_setRts = 0xff;
2155 msg.txTriState_rts = p_priv->rts_state;
2156
2157 msg.setHskoa_setDtr = 0xff;
2158 msg.hskoa_dtr = p_priv->dtr_state;
2159
2160 p_priv->resend_cont = 0;
2161 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2162
2163
2164 this_urb->transfer_buffer_length = sizeof(msg);
2165
2166 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2167 if (err != 0)
2168 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
2169 return 0;
2170 }
2171
2172 static int keyspan_usa28_send_setup(struct usb_serial *serial,
2173 struct usb_serial_port *port,
2174 int reset_port)
2175 {
2176 struct keyspan_usa28_portControlMessage msg;
2177 struct keyspan_serial_private *s_priv;
2178 struct keyspan_port_private *p_priv;
2179 const struct keyspan_device_details *d_details;
2180 struct urb *this_urb;
2181 int device_port, err;
2182
2183 s_priv = usb_get_serial_data(serial);
2184 p_priv = usb_get_serial_port_data(port);
2185 d_details = s_priv->device_details;
2186 device_port = port->port_number;
2187
2188
2189 this_urb = p_priv->outcont_urb;
2190 if (this_urb == NULL) {
2191 dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);
2192 return -1;
2193 }
2194
2195
2196
2197 if ((reset_port + 1) > p_priv->resend_cont)
2198 p_priv->resend_cont = reset_port + 1;
2199 if (this_urb->status == -EINPROGRESS) {
2200 dev_dbg(&port->dev, "%s already writing\n", __func__);
2201 mdelay(5);
2202 return -1;
2203 }
2204
2205 memset(&msg, 0, sizeof(struct keyspan_usa28_portControlMessage));
2206
2207 msg.setBaudRate = 1;
2208 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2209 &msg.baudHi, &msg.baudLo, NULL,
2210 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2211 dev_dbg(&port->dev, "%s - Invalid baud rate requested %d.\n",
2212 __func__, p_priv->baud);
2213 msg.baudLo = 0xff;
2214 msg.baudHi = 0xb2;
2215 }
2216
2217
2218 msg.parity = 0;
2219
2220 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2221 msg.xonFlowControl = 0;
2222
2223
2224 msg.rts = p_priv->rts_state;
2225 msg.dtr = p_priv->dtr_state;
2226
2227 msg.forwardingLength = 16;
2228 msg.forwardMs = 10;
2229 msg.breakThreshold = 45;
2230 msg.xonChar = 17;
2231 msg.xoffChar = 19;
2232
2233
2234
2235
2236 if (reset_port == 1) {
2237 msg._txOn = 1;
2238 msg._txOff = 0;
2239 msg.txFlush = 0;
2240 msg.txForceXoff = 0;
2241 msg.txBreak = 0;
2242 msg.rxOn = 1;
2243 msg.rxOff = 0;
2244 msg.rxFlush = 1;
2245 msg.rxForward = 0;
2246 msg.returnStatus = 0;
2247 msg.resetDataToggle = 0xff;
2248 }
2249
2250 else if (reset_port == 2) {
2251 msg._txOn = 0;
2252 msg._txOff = 1;
2253 msg.txFlush = 0;
2254 msg.txForceXoff = 0;
2255 msg.txBreak = 0;
2256 msg.rxOn = 0;
2257 msg.rxOff = 1;
2258 msg.rxFlush = 1;
2259 msg.rxForward = 0;
2260 msg.returnStatus = 0;
2261 msg.resetDataToggle = 0;
2262 }
2263
2264 else {
2265 msg._txOn = (!p_priv->break_on);
2266 msg._txOff = 0;
2267 msg.txFlush = 0;
2268 msg.txForceXoff = 0;
2269 msg.txBreak = (p_priv->break_on);
2270 msg.rxOn = 0;
2271 msg.rxOff = 0;
2272 msg.rxFlush = 0;
2273 msg.rxForward = 0;
2274 msg.returnStatus = 0;
2275 msg.resetDataToggle = 0x0;
2276 }
2277
2278 p_priv->resend_cont = 0;
2279 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2280
2281
2282 this_urb->transfer_buffer_length = sizeof(msg);
2283
2284 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2285 if (err != 0)
2286 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed\n", __func__);
2287
2288 return 0;
2289 }
2290
2291 static int keyspan_usa49_send_setup(struct usb_serial *serial,
2292 struct usb_serial_port *port,
2293 int reset_port)
2294 {
2295 struct keyspan_usa49_portControlMessage msg;
2296 struct usb_ctrlrequest *dr = NULL;
2297 struct keyspan_serial_private *s_priv;
2298 struct keyspan_port_private *p_priv;
2299 const struct keyspan_device_details *d_details;
2300 struct urb *this_urb;
2301 int err, device_port;
2302
2303 s_priv = usb_get_serial_data(serial);
2304 p_priv = usb_get_serial_port_data(port);
2305 d_details = s_priv->device_details;
2306
2307 this_urb = s_priv->glocont_urb;
2308
2309
2310 device_port = port->port_number;
2311
2312
2313 if (this_urb == NULL) {
2314 dev_dbg(&port->dev, "%s - oops no urb for port.\n", __func__);
2315 return -1;
2316 }
2317
2318 dev_dbg(&port->dev, "%s - endpoint %x (%d)\n",
2319 __func__, usb_pipeendpoint(this_urb->pipe), device_port);
2320
2321
2322
2323 if ((reset_port + 1) > p_priv->resend_cont)
2324 p_priv->resend_cont = reset_port + 1;
2325
2326 if (this_urb->status == -EINPROGRESS) {
2327
2328 mdelay(5);
2329 return -1;
2330 }
2331
2332 memset(&msg, 0, sizeof(struct keyspan_usa49_portControlMessage));
2333
2334 msg.portNumber = device_port;
2335
2336
2337 if (p_priv->old_baud != p_priv->baud) {
2338 p_priv->old_baud = p_priv->baud;
2339 msg.setClocking = 0xff;
2340 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2341 &msg.baudHi, &msg.baudLo, &msg.prescaler,
2342 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2343 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2344 __func__, p_priv->baud);
2345 msg.baudLo = 0;
2346 msg.baudHi = 125;
2347 msg.prescaler = 10;
2348 }
2349
2350 }
2351
2352 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2353 switch (p_priv->cflag & CSIZE) {
2354 case CS5:
2355 msg.lcr |= USA_DATABITS_5;
2356 break;
2357 case CS6:
2358 msg.lcr |= USA_DATABITS_6;
2359 break;
2360 case CS7:
2361 msg.lcr |= USA_DATABITS_7;
2362 break;
2363 case CS8:
2364 msg.lcr |= USA_DATABITS_8;
2365 break;
2366 }
2367 if (p_priv->cflag & PARENB) {
2368
2369 msg.lcr |= (p_priv->cflag & PARODD) ?
2370 USA_PARITY_ODD : USA_PARITY_EVEN;
2371 }
2372 msg.setLcr = 0xff;
2373
2374 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2375 msg.xonFlowControl = 0;
2376 msg.setFlowControl = 0xff;
2377
2378 msg.forwardingLength = 16;
2379 msg.xonChar = 17;
2380 msg.xoffChar = 19;
2381
2382
2383 if (reset_port == 1) {
2384 msg._txOn = 1;
2385 msg._txOff = 0;
2386 msg.txFlush = 0;
2387 msg.txBreak = 0;
2388 msg.rxOn = 1;
2389 msg.rxOff = 0;
2390 msg.rxFlush = 1;
2391 msg.rxForward = 0;
2392 msg.returnStatus = 0;
2393 msg.resetDataToggle = 0xff;
2394 msg.enablePort = 1;
2395 msg.disablePort = 0;
2396 }
2397
2398 else if (reset_port == 2) {
2399 msg._txOn = 0;
2400 msg._txOff = 1;
2401 msg.txFlush = 0;
2402 msg.txBreak = 0;
2403 msg.rxOn = 0;
2404 msg.rxOff = 1;
2405 msg.rxFlush = 1;
2406 msg.rxForward = 0;
2407 msg.returnStatus = 0;
2408 msg.resetDataToggle = 0;
2409 msg.enablePort = 0;
2410 msg.disablePort = 1;
2411 }
2412
2413 else {
2414 msg._txOn = (!p_priv->break_on);
2415 msg._txOff = 0;
2416 msg.txFlush = 0;
2417 msg.txBreak = (p_priv->break_on);
2418 msg.rxOn = 0;
2419 msg.rxOff = 0;
2420 msg.rxFlush = 0;
2421 msg.rxForward = 0;
2422 msg.returnStatus = 0;
2423 msg.resetDataToggle = 0x0;
2424 msg.enablePort = 0;
2425 msg.disablePort = 0;
2426 }
2427
2428
2429 msg.setRts = 0xff;
2430 msg.rts = p_priv->rts_state;
2431
2432 msg.setDtr = 0xff;
2433 msg.dtr = p_priv->dtr_state;
2434
2435 p_priv->resend_cont = 0;
2436
2437
2438
2439
2440 if (d_details->product_id == keyspan_usa49wg_product_id) {
2441 dr = (void *)(s_priv->ctrl_buf);
2442 dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT;
2443 dr->bRequest = 0xB0;
2444 dr->wValue = 0;
2445 dr->wIndex = 0;
2446 dr->wLength = cpu_to_le16(sizeof(msg));
2447
2448 memcpy(s_priv->glocont_buf, &msg, sizeof(msg));
2449
2450 usb_fill_control_urb(this_urb, serial->dev,
2451 usb_sndctrlpipe(serial->dev, 0),
2452 (unsigned char *)dr, s_priv->glocont_buf,
2453 sizeof(msg), usa49_glocont_callback, serial);
2454
2455 } else {
2456 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2457
2458
2459 this_urb->transfer_buffer_length = sizeof(msg);
2460 }
2461 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2462 if (err != 0)
2463 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
2464
2465 return 0;
2466 }
2467
2468 static int keyspan_usa90_send_setup(struct usb_serial *serial,
2469 struct usb_serial_port *port,
2470 int reset_port)
2471 {
2472 struct keyspan_usa90_portControlMessage msg;
2473 struct keyspan_serial_private *s_priv;
2474 struct keyspan_port_private *p_priv;
2475 const struct keyspan_device_details *d_details;
2476 struct urb *this_urb;
2477 int err;
2478 u8 prescaler;
2479
2480 s_priv = usb_get_serial_data(serial);
2481 p_priv = usb_get_serial_port_data(port);
2482 d_details = s_priv->device_details;
2483
2484
2485 this_urb = p_priv->outcont_urb;
2486 if (this_urb == NULL) {
2487 dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);
2488 return -1;
2489 }
2490
2491
2492
2493 if ((reset_port + 1) > p_priv->resend_cont)
2494 p_priv->resend_cont = reset_port + 1;
2495 if (this_urb->status == -EINPROGRESS) {
2496 dev_dbg(&port->dev, "%s already writing\n", __func__);
2497 mdelay(5);
2498 return -1;
2499 }
2500
2501 memset(&msg, 0, sizeof(struct keyspan_usa90_portControlMessage));
2502
2503
2504 if (p_priv->old_baud != p_priv->baud) {
2505 p_priv->old_baud = p_priv->baud;
2506 msg.setClocking = 0x01;
2507 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2508 &msg.baudHi, &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE) {
2509 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2510 __func__, p_priv->baud);
2511 p_priv->baud = 9600;
2512 d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2513 &msg.baudHi, &msg.baudLo, &prescaler, 0);
2514 }
2515 msg.setRxMode = 1;
2516 msg.setTxMode = 1;
2517 }
2518
2519
2520 if (p_priv->baud > 57600) {
2521 msg.rxMode = RXMODE_DMA;
2522 msg.txMode = TXMODE_DMA;
2523 } else {
2524 msg.rxMode = RXMODE_BYHAND;
2525 msg.txMode = TXMODE_BYHAND;
2526 }
2527
2528 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2529 switch (p_priv->cflag & CSIZE) {
2530 case CS5:
2531 msg.lcr |= USA_DATABITS_5;
2532 break;
2533 case CS6:
2534 msg.lcr |= USA_DATABITS_6;
2535 break;
2536 case CS7:
2537 msg.lcr |= USA_DATABITS_7;
2538 break;
2539 case CS8:
2540 msg.lcr |= USA_DATABITS_8;
2541 break;
2542 }
2543 if (p_priv->cflag & PARENB) {
2544
2545 msg.lcr |= (p_priv->cflag & PARODD) ?
2546 USA_PARITY_ODD : USA_PARITY_EVEN;
2547 }
2548 if (p_priv->old_cflag != p_priv->cflag) {
2549 p_priv->old_cflag = p_priv->cflag;
2550 msg.setLcr = 0x01;
2551 }
2552
2553 if (p_priv->flow_control == flow_cts)
2554 msg.txFlowControl = TXFLOW_CTS;
2555 msg.setTxFlowControl = 0x01;
2556 msg.setRxFlowControl = 0x01;
2557
2558 msg.rxForwardingLength = 16;
2559 msg.rxForwardingTimeout = 16;
2560 msg.txAckSetting = 0;
2561 msg.xonChar = 17;
2562 msg.xoffChar = 19;
2563
2564
2565 if (reset_port == 1) {
2566 msg.portEnabled = 1;
2567 msg.rxFlush = 1;
2568 msg.txBreak = (p_priv->break_on);
2569 }
2570
2571 else if (reset_port == 2)
2572 msg.portEnabled = 0;
2573
2574 else {
2575 msg.portEnabled = 1;
2576 msg.txBreak = (p_priv->break_on);
2577 }
2578
2579
2580 msg.setRts = 0x01;
2581 msg.rts = p_priv->rts_state;
2582
2583 msg.setDtr = 0x01;
2584 msg.dtr = p_priv->dtr_state;
2585
2586 p_priv->resend_cont = 0;
2587 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2588
2589
2590 this_urb->transfer_buffer_length = sizeof(msg);
2591
2592 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2593 if (err != 0)
2594 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
2595 return 0;
2596 }
2597
2598 static int keyspan_usa67_send_setup(struct usb_serial *serial,
2599 struct usb_serial_port *port,
2600 int reset_port)
2601 {
2602 struct keyspan_usa67_portControlMessage msg;
2603 struct keyspan_serial_private *s_priv;
2604 struct keyspan_port_private *p_priv;
2605 const struct keyspan_device_details *d_details;
2606 struct urb *this_urb;
2607 int err, device_port;
2608
2609 s_priv = usb_get_serial_data(serial);
2610 p_priv = usb_get_serial_port_data(port);
2611 d_details = s_priv->device_details;
2612
2613 this_urb = s_priv->glocont_urb;
2614
2615
2616 device_port = port->port_number;
2617
2618
2619 if (this_urb == NULL) {
2620 dev_dbg(&port->dev, "%s - oops no urb for port.\n", __func__);
2621 return -1;
2622 }
2623
2624
2625
2626 if ((reset_port + 1) > p_priv->resend_cont)
2627 p_priv->resend_cont = reset_port + 1;
2628 if (this_urb->status == -EINPROGRESS) {
2629
2630 mdelay(5);
2631 return -1;
2632 }
2633
2634 memset(&msg, 0, sizeof(struct keyspan_usa67_portControlMessage));
2635
2636 msg.port = device_port;
2637
2638
2639 if (p_priv->old_baud != p_priv->baud) {
2640 p_priv->old_baud = p_priv->baud;
2641 msg.setClocking = 0xff;
2642 if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,
2643 &msg.baudHi, &msg.baudLo, &msg.prescaler,
2644 device_port) == KEYSPAN_INVALID_BAUD_RATE) {
2645 dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n",
2646 __func__, p_priv->baud);
2647 msg.baudLo = 0;
2648 msg.baudHi = 125;
2649 msg.prescaler = 10;
2650 }
2651 msg.setPrescaler = 0xff;
2652 }
2653
2654 msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;
2655 switch (p_priv->cflag & CSIZE) {
2656 case CS5:
2657 msg.lcr |= USA_DATABITS_5;
2658 break;
2659 case CS6:
2660 msg.lcr |= USA_DATABITS_6;
2661 break;
2662 case CS7:
2663 msg.lcr |= USA_DATABITS_7;
2664 break;
2665 case CS8:
2666 msg.lcr |= USA_DATABITS_8;
2667 break;
2668 }
2669 if (p_priv->cflag & PARENB) {
2670
2671 msg.lcr |= (p_priv->cflag & PARODD) ?
2672 USA_PARITY_ODD : USA_PARITY_EVEN;
2673 }
2674 msg.setLcr = 0xff;
2675
2676 msg.ctsFlowControl = (p_priv->flow_control == flow_cts);
2677 msg.xonFlowControl = 0;
2678 msg.setFlowControl = 0xff;
2679 msg.forwardingLength = 16;
2680 msg.xonChar = 17;
2681 msg.xoffChar = 19;
2682
2683 if (reset_port == 1) {
2684
2685 msg._txOn = 1;
2686 msg._txOff = 0;
2687 msg.txFlush = 0;
2688 msg.txBreak = 0;
2689 msg.rxOn = 1;
2690 msg.rxOff = 0;
2691 msg.rxFlush = 1;
2692 msg.rxForward = 0;
2693 msg.returnStatus = 0;
2694 msg.resetDataToggle = 0xff;
2695 } else if (reset_port == 2) {
2696
2697 msg._txOn = 0;
2698 msg._txOff = 1;
2699 msg.txFlush = 0;
2700 msg.txBreak = 0;
2701 msg.rxOn = 0;
2702 msg.rxOff = 1;
2703 msg.rxFlush = 1;
2704 msg.rxForward = 0;
2705 msg.returnStatus = 0;
2706 msg.resetDataToggle = 0;
2707 } else {
2708
2709 msg._txOn = (!p_priv->break_on);
2710 msg._txOff = 0;
2711 msg.txFlush = 0;
2712 msg.txBreak = (p_priv->break_on);
2713 msg.rxOn = 0;
2714 msg.rxOff = 0;
2715 msg.rxFlush = 0;
2716 msg.rxForward = 0;
2717 msg.returnStatus = 0;
2718 msg.resetDataToggle = 0x0;
2719 }
2720
2721
2722 msg.setTxTriState_setRts = 0xff;
2723 msg.txTriState_rts = p_priv->rts_state;
2724
2725 msg.setHskoa_setDtr = 0xff;
2726 msg.hskoa_dtr = p_priv->dtr_state;
2727
2728 p_priv->resend_cont = 0;
2729
2730 memcpy(this_urb->transfer_buffer, &msg, sizeof(msg));
2731
2732
2733 this_urb->transfer_buffer_length = sizeof(msg);
2734
2735 err = usb_submit_urb(this_urb, GFP_ATOMIC);
2736 if (err != 0)
2737 dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);
2738 return 0;
2739 }
2740
2741 static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)
2742 {
2743 struct usb_serial *serial = port->serial;
2744 struct keyspan_serial_private *s_priv;
2745 const struct keyspan_device_details *d_details;
2746
2747 s_priv = usb_get_serial_data(serial);
2748 d_details = s_priv->device_details;
2749
2750 switch (d_details->msg_format) {
2751 case msg_usa26:
2752 keyspan_usa26_send_setup(serial, port, reset_port);
2753 break;
2754 case msg_usa28:
2755 keyspan_usa28_send_setup(serial, port, reset_port);
2756 break;
2757 case msg_usa49:
2758 keyspan_usa49_send_setup(serial, port, reset_port);
2759 break;
2760 case msg_usa90:
2761 keyspan_usa90_send_setup(serial, port, reset_port);
2762 break;
2763 case msg_usa67:
2764 keyspan_usa67_send_setup(serial, port, reset_port);
2765 break;
2766 }
2767 }
2768
2769
2770
2771
2772 static int keyspan_startup(struct usb_serial *serial)
2773 {
2774 int i, err;
2775 struct keyspan_serial_private *s_priv;
2776 const struct keyspan_device_details *d_details;
2777
2778 for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)
2779 if (d_details->product_id ==
2780 le16_to_cpu(serial->dev->descriptor.idProduct))
2781 break;
2782 if (d_details == NULL) {
2783 dev_err(&serial->dev->dev, "%s - unknown product id %x\n",
2784 __func__, le16_to_cpu(serial->dev->descriptor.idProduct));
2785 return -ENODEV;
2786 }
2787
2788
2789 s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL);
2790 if (!s_priv)
2791 return -ENOMEM;
2792
2793 s_priv->instat_buf = kzalloc(INSTAT_BUFLEN, GFP_KERNEL);
2794 if (!s_priv->instat_buf)
2795 goto err_instat_buf;
2796
2797 s_priv->indat_buf = kzalloc(INDAT49W_BUFLEN, GFP_KERNEL);
2798 if (!s_priv->indat_buf)
2799 goto err_indat_buf;
2800
2801 s_priv->glocont_buf = kzalloc(GLOCONT_BUFLEN, GFP_KERNEL);
2802 if (!s_priv->glocont_buf)
2803 goto err_glocont_buf;
2804
2805 s_priv->ctrl_buf = kzalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL);
2806 if (!s_priv->ctrl_buf)
2807 goto err_ctrl_buf;
2808
2809 s_priv->device_details = d_details;
2810 usb_set_serial_data(serial, s_priv);
2811
2812 keyspan_setup_urbs(serial);
2813
2814 if (s_priv->instat_urb != NULL) {
2815 err = usb_submit_urb(s_priv->instat_urb, GFP_KERNEL);
2816 if (err != 0)
2817 dev_dbg(&serial->dev->dev, "%s - submit instat urb failed %d\n", __func__, err);
2818 }
2819 if (s_priv->indat_urb != NULL) {
2820 err = usb_submit_urb(s_priv->indat_urb, GFP_KERNEL);
2821 if (err != 0)
2822 dev_dbg(&serial->dev->dev, "%s - submit indat urb failed %d\n", __func__, err);
2823 }
2824
2825 return 0;
2826
2827 err_ctrl_buf:
2828 kfree(s_priv->glocont_buf);
2829 err_glocont_buf:
2830 kfree(s_priv->indat_buf);
2831 err_indat_buf:
2832 kfree(s_priv->instat_buf);
2833 err_instat_buf:
2834 kfree(s_priv);
2835
2836 return -ENOMEM;
2837 }
2838
2839 static void keyspan_disconnect(struct usb_serial *serial)
2840 {
2841 struct keyspan_serial_private *s_priv;
2842
2843 s_priv = usb_get_serial_data(serial);
2844
2845 usb_kill_urb(s_priv->instat_urb);
2846 usb_kill_urb(s_priv->glocont_urb);
2847 usb_kill_urb(s_priv->indat_urb);
2848 }
2849
2850 static void keyspan_release(struct usb_serial *serial)
2851 {
2852 struct keyspan_serial_private *s_priv;
2853
2854 s_priv = usb_get_serial_data(serial);
2855
2856
2857 usb_kill_urb(s_priv->instat_urb);
2858 usb_kill_urb(s_priv->indat_urb);
2859
2860 usb_free_urb(s_priv->instat_urb);
2861 usb_free_urb(s_priv->indat_urb);
2862 usb_free_urb(s_priv->glocont_urb);
2863
2864 kfree(s_priv->ctrl_buf);
2865 kfree(s_priv->glocont_buf);
2866 kfree(s_priv->indat_buf);
2867 kfree(s_priv->instat_buf);
2868
2869 kfree(s_priv);
2870 }
2871
2872 static int keyspan_port_probe(struct usb_serial_port *port)
2873 {
2874 struct usb_serial *serial = port->serial;
2875 struct keyspan_serial_private *s_priv;
2876 struct keyspan_port_private *p_priv;
2877 const struct keyspan_device_details *d_details;
2878 struct callbacks *cback;
2879 int endp;
2880 int port_num;
2881 int i;
2882
2883 s_priv = usb_get_serial_data(serial);
2884 d_details = s_priv->device_details;
2885
2886 p_priv = kzalloc(sizeof(*p_priv), GFP_KERNEL);
2887 if (!p_priv)
2888 return -ENOMEM;
2889
2890 for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i) {
2891 p_priv->in_buffer[i] = kzalloc(IN_BUFLEN, GFP_KERNEL);
2892 if (!p_priv->in_buffer[i])
2893 goto err_free_in_buffer;
2894 }
2895
2896 for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i) {
2897 p_priv->out_buffer[i] = kzalloc(OUT_BUFLEN, GFP_KERNEL);
2898 if (!p_priv->out_buffer[i])
2899 goto err_free_out_buffer;
2900 }
2901
2902 p_priv->inack_buffer = kzalloc(INACK_BUFLEN, GFP_KERNEL);
2903 if (!p_priv->inack_buffer)
2904 goto err_free_out_buffer;
2905
2906 p_priv->outcont_buffer = kzalloc(OUTCONT_BUFLEN, GFP_KERNEL);
2907 if (!p_priv->outcont_buffer)
2908 goto err_free_inack_buffer;
2909
2910 p_priv->device_details = d_details;
2911
2912
2913 cback = &keyspan_callbacks[d_details->msg_format];
2914
2915 port_num = port->port_number;
2916
2917
2918 endp = d_details->indat_endpoints[port_num];
2919 for (i = 0; i <= d_details->indat_endp_flip; ++i, ++endp) {
2920 p_priv->in_urbs[i] = keyspan_setup_urb(serial, endp,
2921 USB_DIR_IN, port,
2922 p_priv->in_buffer[i],
2923 IN_BUFLEN,
2924 cback->indat_callback);
2925 }
2926
2927 endp = d_details->outdat_endpoints[port_num];
2928 for (i = 0; i <= d_details->outdat_endp_flip; ++i, ++endp) {
2929 p_priv->out_urbs[i] = keyspan_setup_urb(serial, endp,
2930 USB_DIR_OUT, port,
2931 p_priv->out_buffer[i],
2932 OUT_BUFLEN,
2933 cback->outdat_callback);
2934 }
2935
2936 p_priv->inack_urb = keyspan_setup_urb(serial,
2937 d_details->inack_endpoints[port_num],
2938 USB_DIR_IN, port,
2939 p_priv->inack_buffer,
2940 INACK_BUFLEN,
2941 cback->inack_callback);
2942
2943 p_priv->outcont_urb = keyspan_setup_urb(serial,
2944 d_details->outcont_endpoints[port_num],
2945 USB_DIR_OUT, port,
2946 p_priv->outcont_buffer,
2947 OUTCONT_BUFLEN,
2948 cback->outcont_callback);
2949
2950 usb_set_serial_port_data(port, p_priv);
2951
2952 return 0;
2953
2954 err_free_inack_buffer:
2955 kfree(p_priv->inack_buffer);
2956 err_free_out_buffer:
2957 for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i)
2958 kfree(p_priv->out_buffer[i]);
2959 err_free_in_buffer:
2960 for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i)
2961 kfree(p_priv->in_buffer[i]);
2962 kfree(p_priv);
2963
2964 return -ENOMEM;
2965 }
2966
2967 static void keyspan_port_remove(struct usb_serial_port *port)
2968 {
2969 struct keyspan_port_private *p_priv;
2970 int i;
2971
2972 p_priv = usb_get_serial_port_data(port);
2973
2974 usb_kill_urb(p_priv->inack_urb);
2975 usb_kill_urb(p_priv->outcont_urb);
2976 for (i = 0; i < 2; i++) {
2977 usb_kill_urb(p_priv->in_urbs[i]);
2978 usb_kill_urb(p_priv->out_urbs[i]);
2979 }
2980
2981 usb_free_urb(p_priv->inack_urb);
2982 usb_free_urb(p_priv->outcont_urb);
2983 for (i = 0; i < 2; i++) {
2984 usb_free_urb(p_priv->in_urbs[i]);
2985 usb_free_urb(p_priv->out_urbs[i]);
2986 }
2987
2988 kfree(p_priv->outcont_buffer);
2989 kfree(p_priv->inack_buffer);
2990 for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i)
2991 kfree(p_priv->out_buffer[i]);
2992 for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i)
2993 kfree(p_priv->in_buffer[i]);
2994
2995 kfree(p_priv);
2996 }
2997
2998
2999 static struct usb_serial_driver keyspan_pre_device = {
3000 .driver = {
3001 .owner = THIS_MODULE,
3002 .name = "keyspan_no_firm",
3003 },
3004 .description = "Keyspan - (without firmware)",
3005 .id_table = keyspan_pre_ids,
3006 .num_ports = 1,
3007 .attach = keyspan_fake_startup,
3008 };
3009
3010 static struct usb_serial_driver keyspan_1port_device = {
3011 .driver = {
3012 .owner = THIS_MODULE,
3013 .name = "keyspan_1",
3014 },
3015 .description = "Keyspan 1 port adapter",
3016 .id_table = keyspan_1port_ids,
3017 .num_ports = 1,
3018 .open = keyspan_open,
3019 .close = keyspan_close,
3020 .dtr_rts = keyspan_dtr_rts,
3021 .write = keyspan_write,
3022 .write_room = keyspan_write_room,
3023 .set_termios = keyspan_set_termios,
3024 .break_ctl = keyspan_break_ctl,
3025 .tiocmget = keyspan_tiocmget,
3026 .tiocmset = keyspan_tiocmset,
3027 .attach = keyspan_startup,
3028 .disconnect = keyspan_disconnect,
3029 .release = keyspan_release,
3030 .port_probe = keyspan_port_probe,
3031 .port_remove = keyspan_port_remove,
3032 };
3033
3034 static struct usb_serial_driver keyspan_2port_device = {
3035 .driver = {
3036 .owner = THIS_MODULE,
3037 .name = "keyspan_2",
3038 },
3039 .description = "Keyspan 2 port adapter",
3040 .id_table = keyspan_2port_ids,
3041 .num_ports = 2,
3042 .open = keyspan_open,
3043 .close = keyspan_close,
3044 .dtr_rts = keyspan_dtr_rts,
3045 .write = keyspan_write,
3046 .write_room = keyspan_write_room,
3047 .set_termios = keyspan_set_termios,
3048 .break_ctl = keyspan_break_ctl,
3049 .tiocmget = keyspan_tiocmget,
3050 .tiocmset = keyspan_tiocmset,
3051 .attach = keyspan_startup,
3052 .disconnect = keyspan_disconnect,
3053 .release = keyspan_release,
3054 .port_probe = keyspan_port_probe,
3055 .port_remove = keyspan_port_remove,
3056 };
3057
3058 static struct usb_serial_driver keyspan_4port_device = {
3059 .driver = {
3060 .owner = THIS_MODULE,
3061 .name = "keyspan_4",
3062 },
3063 .description = "Keyspan 4 port adapter",
3064 .id_table = keyspan_4port_ids,
3065 .num_ports = 4,
3066 .open = keyspan_open,
3067 .close = keyspan_close,
3068 .dtr_rts = keyspan_dtr_rts,
3069 .write = keyspan_write,
3070 .write_room = keyspan_write_room,
3071 .set_termios = keyspan_set_termios,
3072 .break_ctl = keyspan_break_ctl,
3073 .tiocmget = keyspan_tiocmget,
3074 .tiocmset = keyspan_tiocmset,
3075 .attach = keyspan_startup,
3076 .disconnect = keyspan_disconnect,
3077 .release = keyspan_release,
3078 .port_probe = keyspan_port_probe,
3079 .port_remove = keyspan_port_remove,
3080 };
3081
3082 static struct usb_serial_driver * const serial_drivers[] = {
3083 &keyspan_pre_device, &keyspan_1port_device,
3084 &keyspan_2port_device, &keyspan_4port_device, NULL
3085 };
3086
3087 module_usb_serial_driver(serial_drivers, keyspan_ids_combined);
3088
3089 MODULE_AUTHOR(DRIVER_AUTHOR);
3090 MODULE_DESCRIPTION(DRIVER_DESC);
3091 MODULE_LICENSE("GPL");
3092
3093 MODULE_FIRMWARE("keyspan/usa28.fw");
3094 MODULE_FIRMWARE("keyspan/usa28x.fw");
3095 MODULE_FIRMWARE("keyspan/usa28xa.fw");
3096 MODULE_FIRMWARE("keyspan/usa28xb.fw");
3097 MODULE_FIRMWARE("keyspan/usa19.fw");
3098 MODULE_FIRMWARE("keyspan/usa19qi.fw");
3099 MODULE_FIRMWARE("keyspan/mpr.fw");
3100 MODULE_FIRMWARE("keyspan/usa19qw.fw");
3101 MODULE_FIRMWARE("keyspan/usa18x.fw");
3102 MODULE_FIRMWARE("keyspan/usa19w.fw");
3103 MODULE_FIRMWARE("keyspan/usa49w.fw");
3104 MODULE_FIRMWARE("keyspan/usa49wlc.fw");