Deleted Added
full compact
uvscom.c (193045) uvscom.c (194228)
1/* $NetBSD: usb/uvscom.c,v 1.1 2002/03/19 15:08:42 augustss Exp $ */
2
3#include <sys/cdefs.h>
1/* $NetBSD: usb/uvscom.c,v 1.1 2002/03/19 15:08:42 augustss Exp $ */
2
3#include <sys/cdefs.h>
4__FBSDID("$FreeBSD: head/sys/dev/usb/serial/uvscom.c 193045 2009-05-29 18:46:57Z thompsa $");
4__FBSDID("$FreeBSD: head/sys/dev/usb/serial/uvscom.c 194228 2009-06-15 01:02:43Z thompsa $");
5
6/*-
7 * Copyright (c) 2001-2003, 2005 Shunsuke Akiyama <akiyama@jp.FreeBSD.org>.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:

--- 186 unchanged lines hidden (view full) ---

199 .direction = UE_DIR_IN,
200 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
201 .bufsize = 0, /* use wMaxPacketSize */
202 .callback = &uvscom_intr_callback,
203 },
204};
205
206static const struct ucom_callback uvscom_callback = {
5
6/*-
7 * Copyright (c) 2001-2003, 2005 Shunsuke Akiyama <akiyama@jp.FreeBSD.org>.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:

--- 186 unchanged lines hidden (view full) ---

199 .direction = UE_DIR_IN,
200 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
201 .bufsize = 0, /* use wMaxPacketSize */
202 .callback = &uvscom_intr_callback,
203 },
204};
205
206static const struct ucom_callback uvscom_callback = {
207 .usb2_com_cfg_get_status = &uvscom_cfg_get_status,
208 .usb2_com_cfg_set_dtr = &uvscom_cfg_set_dtr,
209 .usb2_com_cfg_set_rts = &uvscom_cfg_set_rts,
210 .usb2_com_cfg_set_break = &uvscom_cfg_set_break,
211 .usb2_com_cfg_param = &uvscom_cfg_param,
212 .usb2_com_cfg_open = &uvscom_cfg_open,
213 .usb2_com_cfg_close = &uvscom_cfg_close,
214 .usb2_com_pre_open = &uvscom_pre_open,
215 .usb2_com_pre_param = &uvscom_pre_param,
216 .usb2_com_start_read = &uvscom_start_read,
217 .usb2_com_stop_read = &uvscom_stop_read,
218 .usb2_com_start_write = &uvscom_start_write,
219 .usb2_com_stop_write = &uvscom_stop_write,
207 .ucom_cfg_get_status = &uvscom_cfg_get_status,
208 .ucom_cfg_set_dtr = &uvscom_cfg_set_dtr,
209 .ucom_cfg_set_rts = &uvscom_cfg_set_rts,
210 .ucom_cfg_set_break = &uvscom_cfg_set_break,
211 .ucom_cfg_param = &uvscom_cfg_param,
212 .ucom_cfg_open = &uvscom_cfg_open,
213 .ucom_cfg_close = &uvscom_cfg_close,
214 .ucom_pre_open = &uvscom_pre_open,
215 .ucom_pre_param = &uvscom_pre_param,
216 .ucom_start_read = &uvscom_start_read,
217 .ucom_stop_read = &uvscom_stop_read,
218 .ucom_start_write = &uvscom_start_write,
219 .ucom_stop_write = &uvscom_stop_write,
220};
221
222static const struct usb_device_id uvscom_devs[] = {
223 /* SUNTAC U-Cable type A4 */
224 {USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_AS144L4, 0)},
225 /* SUNTAC U-Cable type D2 */
226 {USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_DS96L, 0)},
227 /* SUNTAC Ir-Trinity */

--- 33 unchanged lines hidden (view full) ---

261 return (ENXIO);
262 }
263 if (uaa->info.bConfigIndex != UVSCOM_CONFIG_INDEX) {
264 return (ENXIO);
265 }
266 if (uaa->info.bIfaceIndex != UVSCOM_IFACE_INDEX) {
267 return (ENXIO);
268 }
220};
221
222static const struct usb_device_id uvscom_devs[] = {
223 /* SUNTAC U-Cable type A4 */
224 {USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_AS144L4, 0)},
225 /* SUNTAC U-Cable type D2 */
226 {USB_VPI(USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_DS96L, 0)},
227 /* SUNTAC Ir-Trinity */

--- 33 unchanged lines hidden (view full) ---

261 return (ENXIO);
262 }
263 if (uaa->info.bConfigIndex != UVSCOM_CONFIG_INDEX) {
264 return (ENXIO);
265 }
266 if (uaa->info.bIfaceIndex != UVSCOM_IFACE_INDEX) {
267 return (ENXIO);
268 }
269 return (usb2_lookup_id_by_uaa(uvscom_devs, sizeof(uvscom_devs), uaa));
269 return (usbd_lookup_id_by_uaa(uvscom_devs, sizeof(uvscom_devs), uaa));
270}
271
272static int
273uvscom_attach(device_t dev)
274{
275 struct usb_attach_arg *uaa = device_get_ivars(dev);
276 struct uvscom_softc *sc = device_get_softc(dev);
277 int error;
278
270}
271
272static int
273uvscom_attach(device_t dev)
274{
275 struct usb_attach_arg *uaa = device_get_ivars(dev);
276 struct uvscom_softc *sc = device_get_softc(dev);
277 int error;
278
279 device_set_usb2_desc(dev);
279 device_set_usb_desc(dev);
280 mtx_init(&sc->sc_mtx, "uvscom", NULL, MTX_DEF);
281
282 sc->sc_udev = uaa->device;
283
284 DPRINTF("sc=%p\n", sc);
285
286 sc->sc_iface_no = uaa->info.bIfaceNum;
287 sc->sc_iface_index = UVSCOM_IFACE_INDEX;
288
280 mtx_init(&sc->sc_mtx, "uvscom", NULL, MTX_DEF);
281
282 sc->sc_udev = uaa->device;
283
284 DPRINTF("sc=%p\n", sc);
285
286 sc->sc_iface_no = uaa->info.bIfaceNum;
287 sc->sc_iface_index = UVSCOM_IFACE_INDEX;
288
289 error = usb2_transfer_setup(uaa->device, &sc->sc_iface_index,
289 error = usbd_transfer_setup(uaa->device, &sc->sc_iface_index,
290 sc->sc_xfer, uvscom_config, UVSCOM_N_TRANSFER, sc, &sc->sc_mtx);
291
292 if (error) {
293 DPRINTF("could not allocate all USB transfers!\n");
294 goto detach;
295 }
296 sc->sc_line = UVSCOM_LINE_INIT;
297
298 /* clear stall at first run */
299 mtx_lock(&sc->sc_mtx);
290 sc->sc_xfer, uvscom_config, UVSCOM_N_TRANSFER, sc, &sc->sc_mtx);
291
292 if (error) {
293 DPRINTF("could not allocate all USB transfers!\n");
294 goto detach;
295 }
296 sc->sc_line = UVSCOM_LINE_INIT;
297
298 /* clear stall at first run */
299 mtx_lock(&sc->sc_mtx);
300 usb2_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_WR]);
301 usb2_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_RD]);
300 usbd_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_WR]);
301 usbd_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_RD]);
302 mtx_unlock(&sc->sc_mtx);
303
302 mtx_unlock(&sc->sc_mtx);
303
304 error = usb2_com_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
304 error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
305 &uvscom_callback, &sc->sc_mtx);
306 if (error) {
307 goto detach;
308 }
309 /* start interrupt pipe */
310 mtx_lock(&sc->sc_mtx);
305 &uvscom_callback, &sc->sc_mtx);
306 if (error) {
307 goto detach;
308 }
309 /* start interrupt pipe */
310 mtx_lock(&sc->sc_mtx);
311 usb2_transfer_start(sc->sc_xfer[UVSCOM_INTR_DT_RD]);
311 usbd_transfer_start(sc->sc_xfer[UVSCOM_INTR_DT_RD]);
312 mtx_unlock(&sc->sc_mtx);
313
314 return (0);
315
316detach:
317 uvscom_detach(dev);
318 return (ENXIO);
319}
320
321static int
322uvscom_detach(device_t dev)
323{
324 struct uvscom_softc *sc = device_get_softc(dev);
325
326 DPRINTF("sc=%p\n", sc);
327
328 /* stop interrupt pipe */
329
330 if (sc->sc_xfer[UVSCOM_INTR_DT_RD])
312 mtx_unlock(&sc->sc_mtx);
313
314 return (0);
315
316detach:
317 uvscom_detach(dev);
318 return (ENXIO);
319}
320
321static int
322uvscom_detach(device_t dev)
323{
324 struct uvscom_softc *sc = device_get_softc(dev);
325
326 DPRINTF("sc=%p\n", sc);
327
328 /* stop interrupt pipe */
329
330 if (sc->sc_xfer[UVSCOM_INTR_DT_RD])
331 usb2_transfer_stop(sc->sc_xfer[UVSCOM_INTR_DT_RD]);
331 usbd_transfer_stop(sc->sc_xfer[UVSCOM_INTR_DT_RD]);
332
332
333 usb2_com_detach(&sc->sc_super_ucom, &sc->sc_ucom, 1);
334 usb2_transfer_unsetup(sc->sc_xfer, UVSCOM_N_TRANSFER);
333 ucom_detach(&sc->sc_super_ucom, &sc->sc_ucom, 1);
334 usbd_transfer_unsetup(sc->sc_xfer, UVSCOM_N_TRANSFER);
335 mtx_destroy(&sc->sc_mtx);
336
337 return (0);
338}
339
340static void
341uvscom_write_callback(struct usb_xfer *xfer)
342{
343 struct uvscom_softc *sc = xfer->priv_sc;
344 uint32_t actlen;
345
346 switch (USB_GET_STATE(xfer)) {
347 case USB_ST_SETUP:
348 case USB_ST_TRANSFERRED:
349tr_setup:
335 mtx_destroy(&sc->sc_mtx);
336
337 return (0);
338}
339
340static void
341uvscom_write_callback(struct usb_xfer *xfer)
342{
343 struct uvscom_softc *sc = xfer->priv_sc;
344 uint32_t actlen;
345
346 switch (USB_GET_STATE(xfer)) {
347 case USB_ST_SETUP:
348 case USB_ST_TRANSFERRED:
349tr_setup:
350 if (usb2_com_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
350 if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
351 UVSCOM_BULK_BUF_SIZE, &actlen)) {
352
353 xfer->frlengths[0] = actlen;
351 UVSCOM_BULK_BUF_SIZE, &actlen)) {
352
353 xfer->frlengths[0] = actlen;
354 usb2_start_hardware(xfer);
354 usbd_transfer_submit(xfer);
355 }
356 return;
357
358 default: /* Error */
359 if (xfer->error != USB_ERR_CANCELLED) {
360 /* try to clear stall first */
361 xfer->flags.stall_pipe = 1;
362 goto tr_setup;

--- 4 unchanged lines hidden (view full) ---

367
368static void
369uvscom_read_callback(struct usb_xfer *xfer)
370{
371 struct uvscom_softc *sc = xfer->priv_sc;
372
373 switch (USB_GET_STATE(xfer)) {
374 case USB_ST_TRANSFERRED:
355 }
356 return;
357
358 default: /* Error */
359 if (xfer->error != USB_ERR_CANCELLED) {
360 /* try to clear stall first */
361 xfer->flags.stall_pipe = 1;
362 goto tr_setup;

--- 4 unchanged lines hidden (view full) ---

367
368static void
369uvscom_read_callback(struct usb_xfer *xfer)
370{
371 struct uvscom_softc *sc = xfer->priv_sc;
372
373 switch (USB_GET_STATE(xfer)) {
374 case USB_ST_TRANSFERRED:
375 usb2_com_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
375 ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
376
377 case USB_ST_SETUP:
378tr_setup:
379 xfer->frlengths[0] = xfer->max_data_length;
376
377 case USB_ST_SETUP:
378tr_setup:
379 xfer->frlengths[0] = xfer->max_data_length;
380 usb2_start_hardware(xfer);
380 usbd_transfer_submit(xfer);
381 return;
382
383 default: /* Error */
384 if (xfer->error != USB_ERR_CANCELLED) {
385 /* try to clear stall first */
386 xfer->flags.stall_pipe = 1;
387 goto tr_setup;
388 }

--- 6 unchanged lines hidden (view full) ---

395{
396 struct uvscom_softc *sc = xfer->priv_sc;
397 uint8_t buf[2];
398
399 switch (USB_GET_STATE(xfer)) {
400 case USB_ST_TRANSFERRED:
401 if (xfer->actlen >= 2) {
402
381 return;
382
383 default: /* Error */
384 if (xfer->error != USB_ERR_CANCELLED) {
385 /* try to clear stall first */
386 xfer->flags.stall_pipe = 1;
387 goto tr_setup;
388 }

--- 6 unchanged lines hidden (view full) ---

395{
396 struct uvscom_softc *sc = xfer->priv_sc;
397 uint8_t buf[2];
398
399 switch (USB_GET_STATE(xfer)) {
400 case USB_ST_TRANSFERRED:
401 if (xfer->actlen >= 2) {
402
403 usb2_copy_out(xfer->frbuffers, 0, buf, sizeof(buf));
403 usbd_copy_out(xfer->frbuffers, 0, buf, sizeof(buf));
404
405 sc->sc_lsr = 0;
406 sc->sc_msr = 0;
407 sc->sc_unit_status = buf[1];
408
409 if (buf[0] & UVSCOM_TXRDY) {
410 sc->sc_lsr |= ULSR_TXRDY;
411 }

--- 8 unchanged lines hidden (view full) ---

420 }
421 if (buf[1] & UVSCOM_DCD) {
422 sc->sc_msr |= SER_DCD;
423 }
424 /*
425 * the UCOM layer will ignore this call if the TTY
426 * device is closed!
427 */
404
405 sc->sc_lsr = 0;
406 sc->sc_msr = 0;
407 sc->sc_unit_status = buf[1];
408
409 if (buf[0] & UVSCOM_TXRDY) {
410 sc->sc_lsr |= ULSR_TXRDY;
411 }

--- 8 unchanged lines hidden (view full) ---

420 }
421 if (buf[1] & UVSCOM_DCD) {
422 sc->sc_msr |= SER_DCD;
423 }
424 /*
425 * the UCOM layer will ignore this call if the TTY
426 * device is closed!
427 */
428 usb2_com_status_change(&sc->sc_ucom);
428 ucom_status_change(&sc->sc_ucom);
429 }
430 case USB_ST_SETUP:
431tr_setup:
432 xfer->frlengths[0] = xfer->max_data_length;
429 }
430 case USB_ST_SETUP:
431tr_setup:
432 xfer->frlengths[0] = xfer->max_data_length;
433 usb2_start_hardware(xfer);
433 usbd_transfer_submit(xfer);
434 return;
435
436 default: /* Error */
437 if (xfer->error != USB_ERR_CANCELLED) {
438 /* try to clear stall first */
439 xfer->flags.stall_pipe = 1;
440 goto tr_setup;
441 }

--- 185 unchanged lines hidden (view full) ---

627 uvscom_cfg_write(sc, UVSCOM_SHUTDOWN, 0);
628}
629
630static void
631uvscom_start_read(struct ucom_softc *ucom)
632{
633 struct uvscom_softc *sc = ucom->sc_parent;
634
434 return;
435
436 default: /* Error */
437 if (xfer->error != USB_ERR_CANCELLED) {
438 /* try to clear stall first */
439 xfer->flags.stall_pipe = 1;
440 goto tr_setup;
441 }

--- 185 unchanged lines hidden (view full) ---

627 uvscom_cfg_write(sc, UVSCOM_SHUTDOWN, 0);
628}
629
630static void
631uvscom_start_read(struct ucom_softc *ucom)
632{
633 struct uvscom_softc *sc = ucom->sc_parent;
634
635 usb2_transfer_start(sc->sc_xfer[UVSCOM_BULK_DT_RD]);
635 usbd_transfer_start(sc->sc_xfer[UVSCOM_BULK_DT_RD]);
636}
637
638static void
639uvscom_stop_read(struct ucom_softc *ucom)
640{
641 struct uvscom_softc *sc = ucom->sc_parent;
642
636}
637
638static void
639uvscom_stop_read(struct ucom_softc *ucom)
640{
641 struct uvscom_softc *sc = ucom->sc_parent;
642
643 usb2_transfer_stop(sc->sc_xfer[UVSCOM_BULK_DT_RD]);
643 usbd_transfer_stop(sc->sc_xfer[UVSCOM_BULK_DT_RD]);
644}
645
646static void
647uvscom_start_write(struct ucom_softc *ucom)
648{
649 struct uvscom_softc *sc = ucom->sc_parent;
650
644}
645
646static void
647uvscom_start_write(struct ucom_softc *ucom)
648{
649 struct uvscom_softc *sc = ucom->sc_parent;
650
651 usb2_transfer_start(sc->sc_xfer[UVSCOM_BULK_DT_WR]);
651 usbd_transfer_start(sc->sc_xfer[UVSCOM_BULK_DT_WR]);
652}
653
654static void
655uvscom_stop_write(struct ucom_softc *ucom)
656{
657 struct uvscom_softc *sc = ucom->sc_parent;
658
652}
653
654static void
655uvscom_stop_write(struct ucom_softc *ucom)
656{
657 struct uvscom_softc *sc = ucom->sc_parent;
658
659 usb2_transfer_stop(sc->sc_xfer[UVSCOM_BULK_DT_WR]);
659 usbd_transfer_stop(sc->sc_xfer[UVSCOM_BULK_DT_WR]);
660}
661
662static void
663uvscom_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr)
664{
665 struct uvscom_softc *sc = ucom->sc_parent;
666
667 *lsr = sc->sc_lsr;

--- 7 unchanged lines hidden (view full) ---

675 usb_error_t err;
676
677 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
678 req.bRequest = index;
679 USETW(req.wValue, value);
680 USETW(req.wIndex, 0);
681 USETW(req.wLength, 0);
682
660}
661
662static void
663uvscom_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr)
664{
665 struct uvscom_softc *sc = ucom->sc_parent;
666
667 *lsr = sc->sc_lsr;

--- 7 unchanged lines hidden (view full) ---

675 usb_error_t err;
676
677 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
678 req.bRequest = index;
679 USETW(req.wValue, value);
680 USETW(req.wIndex, 0);
681 USETW(req.wLength, 0);
682
683 err = usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
683 err = ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
684 &req, NULL, 0, 1000);
685 if (err) {
686 DPRINTFN(0, "device request failed, err=%s "
684 &req, NULL, 0, 1000);
685 if (err) {
686 DPRINTFN(0, "device request failed, err=%s "
687 "(ignored)\n", usb2_errstr(err));
687 "(ignored)\n", usbd_errstr(err));
688 }
689}
690
691static uint16_t
692uvscom_cfg_read_status(struct uvscom_softc *sc)
693{
694 struct usb_device_request req;
695 usb_error_t err;
696 uint8_t data[2];
697
698 req.bmRequestType = UT_READ_VENDOR_DEVICE;
699 req.bRequest = UVSCOM_READ_STATUS;
700 USETW(req.wValue, 0);
701 USETW(req.wIndex, 0);
702 USETW(req.wLength, 2);
703
688 }
689}
690
691static uint16_t
692uvscom_cfg_read_status(struct uvscom_softc *sc)
693{
694 struct usb_device_request req;
695 usb_error_t err;
696 uint8_t data[2];
697
698 req.bmRequestType = UT_READ_VENDOR_DEVICE;
699 req.bRequest = UVSCOM_READ_STATUS;
700 USETW(req.wValue, 0);
701 USETW(req.wIndex, 0);
702 USETW(req.wLength, 2);
703
704 err = usb2_com_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
704 err = ucom_cfg_do_request(sc->sc_udev, &sc->sc_ucom,
705 &req, data, 0, 1000);
706 if (err) {
707 DPRINTFN(0, "device request failed, err=%s "
705 &req, data, 0, 1000);
706 if (err) {
707 DPRINTFN(0, "device request failed, err=%s "
708 "(ignored)\n", usb2_errstr(err));
708 "(ignored)\n", usbd_errstr(err));
709 }
710 return (data[0] | (data[1] << 8));
711}
709 }
710 return (data[0] | (data[1] << 8));
711}