|
Lines 25-31
Link Here
|
| 25 |
*/ |
25 |
*/ |
| 26 |
|
26 |
|
| 27 |
#include <sys/cdefs.h> |
27 |
#include <sys/cdefs.h> |
| 28 |
__FBSDID("$FreeBSD: src/sys/dev/usb/ubsa.c,v 1.17 2005/01/06 01:43:28 imp Exp $"); |
28 |
__FBSDID("$FreeBSD: src/sys/dev/usb/ubsa.c,v 1.25 2007/06/09 06:39:43 imp Exp $"); |
| 29 |
/*- |
29 |
/*- |
| 30 |
* Copyright (c) 2001 The NetBSD Foundation, Inc. |
30 |
* Copyright (c) 2001 The NetBSD Foundation, Inc. |
| 31 |
* All rights reserved. |
31 |
* All rights reserved. |
|
Lines 93-103
Link Here
|
| 93 |
|
93 |
|
| 94 |
#include <dev/usb/ucomvar.h> |
94 |
#include <dev/usb/ucomvar.h> |
| 95 |
|
95 |
|
| 96 |
#ifdef USB_DEBUG |
|
|
| 97 |
Static int ubsadebug = 0; |
| 98 |
SYSCTL_NODE(_hw_usb, OID_AUTO, ubsa, CTLFLAG_RW, 0, "USB ubsa"); |
96 |
SYSCTL_NODE(_hw_usb, OID_AUTO, ubsa, CTLFLAG_RW, 0, "USB ubsa"); |
| 99 |
SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, debug, CTLFLAG_RW, |
97 |
|
| 100 |
&ubsadebug, 0, "ubsa debug level"); |
98 |
#ifdef USB_DEBUG |
| 101 |
|
99 |
|
| 102 |
#define DPRINTFN(n, x) do { \ |
100 |
#define DPRINTFN(n, x) do { \ |
| 103 |
if (ubsadebug > (n)) \ |
101 |
if (ubsadebug > (n)) \ |
|
Lines 106-111
Link Here
|
| 106 |
#else |
104 |
#else |
| 107 |
#define DPRINTFN(n, x) |
105 |
#define DPRINTFN(n, x) |
| 108 |
#endif |
106 |
#endif |
|
|
107 |
Static int ubsadebug = 0; |
| 108 |
SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, debug, CTLFLAG_RW, |
| 109 |
&ubsadebug, 0, "ubsa debug level"); |
| 110 |
int ubsaibufsize = 4096; |
| 111 |
int ubsaobufsize = 256; |
| 112 |
TUNABLE_INT("hw.usb.ubsa.ibufsize", &ubsaibufsize); |
| 113 |
TUNABLE_INT("hw.usb.ubsa.obufsize", &ubsaobufsize); |
| 114 |
SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, ibufsize, CTLFLAG_RD, |
| 115 |
&ubsaibufsize, 0, "ubsa input packet length"); |
| 116 |
SYSCTL_INT(_hw_usb_ubsa, OID_AUTO, obufsize, CTLFLAG_RD, |
| 117 |
&ubsaobufsize, 0, "ubsa output packet length"); |
| 118 |
#define UBSAIBUFSIZE (ubsaibufsize) |
| 119 |
#define UBSAOBUFSIZE (ubsaobufsize) |
| 109 |
#define DPRINTF(x) DPRINTFN(0, x) |
120 |
#define DPRINTF(x) DPRINTFN(0, x) |
| 110 |
|
121 |
|
| 111 |
#define UBSA_MODVER 1 /* module version */ |
122 |
#define UBSA_MODVER 1 /* module version */ |
|
Lines 214-219
Link Here
|
| 214 |
uint16_t vendor; |
225 |
uint16_t vendor; |
| 215 |
uint16_t product; |
226 |
uint16_t product; |
| 216 |
} ubsa_products [] = { |
227 |
} ubsa_products [] = { |
|
|
228 |
/* AnyData ADU-E100A/H */ |
| 229 |
{ USB_VENDOR_ANYDATA, USB_PRODUCT_ANYDATA_ADU_E100X }, |
| 217 |
/* BELKIN F5U103 */ |
230 |
/* BELKIN F5U103 */ |
| 218 |
{ USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U103 }, |
231 |
{ USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5U103 }, |
| 219 |
/* BELKIN F5U120 */ |
232 |
/* BELKIN F5U120 */ |
|
Lines 224-231
Link Here
|
| 224 |
{ USB_VENDOR_GOHUBS, USB_PRODUCT_GOHUBS_GOCOM232 }, |
237 |
{ USB_VENDOR_GOHUBS, USB_PRODUCT_GOHUBS_GOCOM232 }, |
| 225 |
/* Peracom */ |
238 |
/* Peracom */ |
| 226 |
{ USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1 }, |
239 |
{ USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_SERIAL1 }, |
| 227 |
/* Vodafone */ |
240 |
/* Novatel Wireless Merlin cards */ |
| 228 |
{ USB_VENDOR_VODAFONE, USB_PRODUCT_VODAFONE_MC3G }, |
241 |
{ USB_VENDOR_NOVATEL, USB_PRODUCT_NOVATEL_U740 }, |
|
|
242 |
/* Option Vodafone MC3G */ |
| 243 |
{ USB_VENDOR_OPTION, USB_PRODUCT_OPTION_VODAFONEMC3G }, |
| 244 |
/* Option GlobeTrotter 3G */ |
| 245 |
{ USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3G }, |
| 246 |
/* Option GlobeTrotter 3G QUAD */ |
| 247 |
{ USB_VENDOR_OPTION, USB_PRODUCT_OPTION_GT3GQUAD }, |
| 248 |
/* Huawei Mobile */ |
| 249 |
{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_MOBILE }, |
| 229 |
{ 0, 0 } |
250 |
{ 0, 0 } |
| 230 |
}; |
251 |
}; |
| 231 |
|
252 |
|
|
Lines 277-293
Link Here
|
| 277 |
usb_config_descriptor_t *cdesc; |
298 |
usb_config_descriptor_t *cdesc; |
| 278 |
usb_interface_descriptor_t *id; |
299 |
usb_interface_descriptor_t *id; |
| 279 |
usb_endpoint_descriptor_t *ed; |
300 |
usb_endpoint_descriptor_t *ed; |
| 280 |
char *devinfo; |
|
|
| 281 |
const char *devname; |
301 |
const char *devname; |
| 282 |
usbd_status err; |
302 |
usbd_status err; |
| 283 |
int i; |
303 |
int i; |
| 284 |
|
304 |
|
| 285 |
dev = uaa->device; |
305 |
dev = uaa->device; |
| 286 |
devinfo = malloc(1024, M_USBDEV, M_WAITOK); |
|
|
| 287 |
ucom = &sc->sc_ucom; |
306 |
ucom = &sc->sc_ucom; |
| 288 |
|
307 |
|
| 289 |
bzero(sc, sizeof (struct ubsa_softc)); |
|
|
| 290 |
|
| 291 |
/* |
308 |
/* |
| 292 |
* initialize rts, dtr variables to something |
309 |
* initialize rts, dtr variables to something |
| 293 |
* different from boolean 0, 1 |
310 |
* different from boolean 0, 1 |
|
Lines 295-311
Link Here
|
| 295 |
sc->sc_dtr = -1; |
312 |
sc->sc_dtr = -1; |
| 296 |
sc->sc_rts = -1; |
313 |
sc->sc_rts = -1; |
| 297 |
|
314 |
|
| 298 |
usbd_devinfo(dev, 0, devinfo); |
|
|
| 299 |
/* USB_ATTACH_SETUP; */ |
| 300 |
ucom->sc_dev = self; |
315 |
ucom->sc_dev = self; |
| 301 |
device_set_desc_copy(self, devinfo); |
|
|
| 302 |
/* USB_ATTACH_SETUP; */ |
| 303 |
|
316 |
|
| 304 |
ucom->sc_udev = dev; |
317 |
ucom->sc_udev = dev; |
| 305 |
ucom->sc_iface = uaa->iface; |
318 |
ucom->sc_iface = uaa->iface; |
| 306 |
|
319 |
|
| 307 |
devname = USBDEVNAME(ucom->sc_dev); |
320 |
devname = device_get_nameunit(ucom->sc_dev); |
| 308 |
printf("%s: %s\n", devname, devinfo); |
|
|
| 309 |
|
321 |
|
| 310 |
DPRINTF(("ubsa attach: sc = %p\n", sc)); |
322 |
DPRINTF(("ubsa attach: sc = %p\n", sc)); |
| 311 |
|
323 |
|
|
Lines 328-334
Link Here
|
| 328 |
|
340 |
|
| 329 |
if (cdesc == NULL) { |
341 |
if (cdesc == NULL) { |
| 330 |
printf("%s: failed to get configuration descriptor\n", |
342 |
printf("%s: failed to get configuration descriptor\n", |
| 331 |
USBDEVNAME(ucom->sc_dev)); |
343 |
device_get_nameunit(ucom->sc_dev)); |
| 332 |
ucom->sc_dying = 1; |
344 |
ucom->sc_dying = 1; |
| 333 |
goto error; |
345 |
goto error; |
| 334 |
} |
346 |
} |
|
Lines 352-358
Link Here
|
| 352 |
ed = usbd_interface2endpoint_descriptor(ucom->sc_iface, i); |
364 |
ed = usbd_interface2endpoint_descriptor(ucom->sc_iface, i); |
| 353 |
if (ed == NULL) { |
365 |
if (ed == NULL) { |
| 354 |
printf("%s: no endpoint descriptor for %d\n", |
366 |
printf("%s: no endpoint descriptor for %d\n", |
| 355 |
USBDEVNAME(ucom->sc_dev), i); |
367 |
device_get_nameunit(ucom->sc_dev), i); |
| 356 |
ucom->sc_dying = 1; |
368 |
ucom->sc_dying = 1; |
| 357 |
goto error; |
369 |
goto error; |
| 358 |
} |
370 |
} |
|
Lines 364-380
Link Here
|
| 364 |
} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && |
376 |
} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && |
| 365 |
UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { |
377 |
UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { |
| 366 |
ucom->sc_bulkin_no = ed->bEndpointAddress; |
378 |
ucom->sc_bulkin_no = ed->bEndpointAddress; |
|
|
379 |
if (uaa->product == USB_PRODUCT_ANYDATA_ADU_E100X) |
| 380 |
ucom->sc_ibufsize = UBSAIBUFSIZE; //UGETW(ed->wMaxPacketSize); |
| 381 |
else |
| 367 |
ucom->sc_ibufsize = UGETW(ed->wMaxPacketSize); |
382 |
ucom->sc_ibufsize = UGETW(ed->wMaxPacketSize); |
| 368 |
} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && |
383 |
} else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && |
| 369 |
UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { |
384 |
UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) { |
| 370 |
ucom->sc_bulkout_no = ed->bEndpointAddress; |
385 |
ucom->sc_bulkout_no = ed->bEndpointAddress; |
|
|
386 |
if (uaa->product == USB_PRODUCT_ANYDATA_ADU_E100X) |
| 387 |
ucom->sc_obufsize = UBSAOBUFSIZE; //UGETW(ed->wMaxPacketSize); |
| 388 |
else |
| 371 |
ucom->sc_obufsize = UGETW(ed->wMaxPacketSize); |
389 |
ucom->sc_obufsize = UGETW(ed->wMaxPacketSize); |
| 372 |
} |
390 |
} |
| 373 |
} |
391 |
} |
| 374 |
|
392 |
|
| 375 |
if (sc->sc_intr_number == -1) { |
393 |
if (sc->sc_intr_number == -1) { |
| 376 |
printf("%s: Could not find interrupt in\n", |
394 |
printf("%s: Could not find interrupt in\n", |
| 377 |
USBDEVNAME(ucom->sc_dev)); |
395 |
device_get_nameunit(ucom->sc_dev)); |
| 378 |
ucom->sc_dying = 1; |
396 |
ucom->sc_dying = 1; |
| 379 |
goto error; |
397 |
goto error; |
| 380 |
} |
398 |
} |
|
Lines 384-397
Link Here
|
| 384 |
|
402 |
|
| 385 |
if (ucom->sc_bulkin_no == -1) { |
403 |
if (ucom->sc_bulkin_no == -1) { |
| 386 |
printf("%s: Could not find data bulk in\n", |
404 |
printf("%s: Could not find data bulk in\n", |
| 387 |
USBDEVNAME(ucom->sc_dev)); |
405 |
device_get_nameunit(ucom->sc_dev)); |
| 388 |
ucom->sc_dying = 1; |
406 |
ucom->sc_dying = 1; |
| 389 |
goto error; |
407 |
goto error; |
| 390 |
} |
408 |
} |
| 391 |
|
409 |
|
| 392 |
if (ucom->sc_bulkout_no == -1) { |
410 |
if (ucom->sc_bulkout_no == -1) { |
| 393 |
printf("%s: Could not find data bulk out\n", |
411 |
printf("%s: Could not find data bulk out\n", |
| 394 |
USBDEVNAME(ucom->sc_dev)); |
412 |
device_get_nameunit(ucom->sc_dev)); |
| 395 |
ucom->sc_dying = 1; |
413 |
ucom->sc_dying = 1; |
| 396 |
goto error; |
414 |
goto error; |
| 397 |
} |
415 |
} |
|
Lines 408-419
Link Here
|
| 408 |
|
426 |
|
| 409 |
TASK_INIT(&sc->sc_task, 0, ubsa_notify, sc); |
427 |
TASK_INIT(&sc->sc_task, 0, ubsa_notify, sc); |
| 410 |
ucom_attach(ucom); |
428 |
ucom_attach(ucom); |
| 411 |
|
|
|
| 412 |
free(devinfo, M_USBDEV); |
| 413 |
USB_ATTACH_SUCCESS_RETURN; |
429 |
USB_ATTACH_SUCCESS_RETURN; |
| 414 |
|
430 |
|
| 415 |
error: |
431 |
error: |
| 416 |
free(devinfo, M_USBDEV); |
|
|
| 417 |
USB_ATTACH_ERROR_RETURN; |
432 |
USB_ATTACH_ERROR_RETURN; |
| 418 |
} |
433 |
} |
| 419 |
|
434 |
|
|
Lines 456-462
Link Here
|
| 456 |
err = usbd_do_request(sc->sc_ucom.sc_udev, &req, 0); |
471 |
err = usbd_do_request(sc->sc_ucom.sc_udev, &req, 0); |
| 457 |
if (err) |
472 |
if (err) |
| 458 |
printf("%s: ubsa_request: %s\n", |
473 |
printf("%s: ubsa_request: %s\n", |
| 459 |
USBDEVNAME(sc->sc_ucom.sc_dev), usbd_errstr(err)); |
474 |
device_get_nameunit(sc->sc_ucom.sc_dev), usbd_errstr(err)); |
| 460 |
return (err); |
475 |
return (err); |
| 461 |
} |
476 |
} |
| 462 |
|
477 |
|
|
Lines 542-548
Link Here
|
| 542 |
default: |
557 |
default: |
| 543 |
printf("%s: ubsa_param: unsupported baudrate, " |
558 |
printf("%s: ubsa_param: unsupported baudrate, " |
| 544 |
"forcing default of 9600\n", |
559 |
"forcing default of 9600\n", |
| 545 |
USBDEVNAME(sc->sc_ucom.sc_dev)); |
560 |
device_get_nameunit(sc->sc_ucom.sc_dev)); |
| 546 |
value = B230400 / B9600; |
561 |
value = B230400 / B9600; |
| 547 |
break; |
562 |
break; |
| 548 |
}; |
563 |
}; |
|
Lines 585-591
Link Here
|
| 585 |
default: |
600 |
default: |
| 586 |
printf("%s: ubsa_param: unsupported databits requested, " |
601 |
printf("%s: ubsa_param: unsupported databits requested, " |
| 587 |
"forcing default of 8\n", |
602 |
"forcing default of 8\n", |
| 588 |
USBDEVNAME(sc->sc_ucom.sc_dev)); |
603 |
device_get_nameunit(sc->sc_ucom.sc_dev)); |
| 589 |
value = 3; |
604 |
value = 3; |
| 590 |
} |
605 |
} |
| 591 |
|
606 |
|
|
Lines 663-669
Link Here
|
| 663 |
UBSA_INTR_INTERVAL); |
678 |
UBSA_INTR_INTERVAL); |
| 664 |
if (err) { |
679 |
if (err) { |
| 665 |
printf("%s: cannot open interrupt pipe (addr %d)\n", |
680 |
printf("%s: cannot open interrupt pipe (addr %d)\n", |
| 666 |
USBDEVNAME(sc->sc_ucom.sc_dev), |
681 |
device_get_nameunit(sc->sc_ucom.sc_dev), |
| 667 |
sc->sc_intr_number); |
682 |
sc->sc_intr_number); |
| 668 |
return (EIO); |
683 |
return (EIO); |
| 669 |
} |
684 |
} |
|
Lines 688-699
Link Here
|
| 688 |
err = usbd_abort_pipe(sc->sc_intr_pipe); |
703 |
err = usbd_abort_pipe(sc->sc_intr_pipe); |
| 689 |
if (err) |
704 |
if (err) |
| 690 |
printf("%s: abort interrupt pipe failed: %s\n", |
705 |
printf("%s: abort interrupt pipe failed: %s\n", |
| 691 |
USBDEVNAME(sc->sc_ucom.sc_dev), |
706 |
device_get_nameunit(sc->sc_ucom.sc_dev), |
| 692 |
usbd_errstr(err)); |
707 |
usbd_errstr(err)); |
| 693 |
err = usbd_close_pipe(sc->sc_intr_pipe); |
708 |
err = usbd_close_pipe(sc->sc_intr_pipe); |
| 694 |
if (err) |
709 |
if (err) |
| 695 |
printf("%s: close interrupt pipe failed: %s\n", |
710 |
printf("%s: close interrupt pipe failed: %s\n", |
| 696 |
USBDEVNAME(sc->sc_ucom.sc_dev), |
711 |
device_get_nameunit(sc->sc_ucom.sc_dev), |
| 697 |
usbd_errstr(err)); |
712 |
usbd_errstr(err)); |
| 698 |
free(sc->sc_intr_buf, M_USBDEV); |
713 |
free(sc->sc_intr_buf, M_USBDEV); |
| 699 |
sc->sc_intr_pipe = NULL; |
714 |
sc->sc_intr_pipe = NULL; |
|
Lines 716-722
Link Here
|
| 716 |
return; |
731 |
return; |
| 717 |
|
732 |
|
| 718 |
DPRINTF(("%s: ubsa_intr: abnormal status: %s\n", |
733 |
DPRINTF(("%s: ubsa_intr: abnormal status: %s\n", |
| 719 |
USBDEVNAME(sc->sc_ucom.sc_dev), |
734 |
device_get_nameunit(sc->sc_ucom.sc_dev), |
| 720 |
usbd_errstr(status))); |
735 |
usbd_errstr(status))); |
| 721 |
usbd_clear_endpoint_stall_async(sc->sc_intr_pipe); |
736 |
usbd_clear_endpoint_stall_async(sc->sc_intr_pipe); |
| 722 |
return; |
737 |
return; |
|
Lines 727-733
Link Here
|
| 727 |
sc->sc_msr = buf[3]; |
742 |
sc->sc_msr = buf[3]; |
| 728 |
|
743 |
|
| 729 |
DPRINTF(("%s: ubsa lsr = 0x%02x, msr = 0x%02x\n", |
744 |
DPRINTF(("%s: ubsa lsr = 0x%02x, msr = 0x%02x\n", |
| 730 |
USBDEVNAME(sc->sc_ucom.sc_dev), sc->sc_lsr, sc->sc_msr)); |
745 |
device_get_nameunit(sc->sc_ucom.sc_dev), sc->sc_lsr, sc->sc_msr)); |
| 731 |
|
746 |
|
| 732 |
taskqueue_enqueue(taskqueue_swi_giant, &sc->sc_task); |
747 |
taskqueue_enqueue(taskqueue_swi_giant, &sc->sc_task); |
| 733 |
} |
748 |
} |