Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/rump/dev/lib/libugenhc * get UDESC_CONFIG for proper con...



details:   https://anonhg.NetBSD.org/src/rev/10b1a2a7b98a
branches:  trunk
changeset: 752307:10b1a2a7b98a
user:      pooka <pooka%NetBSD.org@localhost>
date:      Mon Feb 22 14:47:40 2010 +0000

description:
* get UDESC_CONFIG for proper config index
* support UR_SET_CONFIG for root hub
* set port change bits for root hub interrupts
+ cosmetics

diffstat:

 sys/rump/dev/lib/libugenhc/ugenhc.c |  58 +++++++++++++++++++++++++-----------
 1 files changed, 40 insertions(+), 18 deletions(-)

diffs (146 lines):

diff -r f47e446d5c5a -r 10b1a2a7b98a sys/rump/dev/lib/libugenhc/ugenhc.c
--- a/sys/rump/dev/lib/libugenhc/ugenhc.c       Mon Feb 22 13:42:04 2010 +0000
+++ b/sys/rump/dev/lib/libugenhc/ugenhc.c       Mon Feb 22 14:47:40 2010 +0000
@@ -1,7 +1,7 @@
-/*     $NetBSD: ugenhc.c,v 1.6 2010/02/20 13:56:29 pooka Exp $ */
+/*     $NetBSD: ugenhc.c,v 1.7 2010/02/22 14:47:40 pooka Exp $ */
 
 /*
- * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
+ * Copyright (c) 2009, 2010 Antti Kantee.  All Rights Reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ugenhc.c,v 1.6 2010/02/20 13:56:29 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ugenhc.c,v 1.7 2010/02/22 14:47:40 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -396,14 +396,16 @@
                case UDESC_CONFIG:
                        {
                        struct usb_full_desc ufdesc;
-                       ufdesc.ufd_config_index = 0;
+                       ufdesc.ufd_config_index = value & 0xff;
                        ufdesc.ufd_size = len;
                        ufdesc.ufd_data = buf;
-                       memset(buf, 0, totlen);
+                       memset(buf, 0, len);
                        if (rumpuser_ioctl(sc->sc_ugenfd[UGEN_EPT_CTRL],
-                           USB_GET_FULL_DESC, &ufdesc, &ru_error) == -1)
-                               panic("%d", ru_error);
-                       totlen = len;
+                           USB_GET_FULL_DESC, &ufdesc, &ru_error) == -1) {
+                               err = USBD_IOERROR;
+                               goto ret;
+                       }
+                       totlen = ufdesc.ufd_size;
                        }
                        break;
 
@@ -446,7 +448,13 @@
                break;
 
        case C(UR_SET_CONFIG, UT_WRITE_DEVICE):
-               /* ignored, ugen won't let us .... REALLY? */
+               if (rumpuser_ioctl(sc->sc_ugenfd[UGEN_EPT_CTRL],
+                   USB_SET_CONFIG, &value, &ru_error) == -1) {
+                       printf("ugenhc: set config failed: %d\n",
+                           ru_error);
+                       err = USBD_IOERROR;
+                       goto ret;
+               }
                break;
 
        case C(UR_SET_INTERFACE, UT_WRITE_INTERFACE):
@@ -511,7 +519,6 @@
                                panic("request failed: %d", ru_error);
                        } else {
                                err = ru_error;
-                               printf("warning: request failed: %d\n", err);
                        }
                }
                }
@@ -600,13 +607,17 @@
                sc->sc_ugenfd[UGEN_EPT_CTRL] = fd;
                sc->sc_port_status = UPS_CURRENT_CONNECT_STATUS
                    | UPS_PORT_ENABLED | UPS_PORT_POWER;
-               sc->sc_port_change = UPS_C_CONNECT_STATUS;
+               sc->sc_port_change = UPS_C_CONNECT_STATUS | UPS_C_PORT_RESET;
 
                xfer = sc->sc_intrxfer;
-               xfer->actlen = 0;
+               memset(xfer->buffer, 0xff, xfer->length);
+               xfer->actlen = xfer->length;
                xfer->status = USBD_NORMAL_COMPLETION;
+
                usb_transfer_complete(xfer);
 
+               kpause("ugwait2", false, hz, NULL);
+
                /*
                 * Detect device detach.
                 */
@@ -615,22 +626,25 @@
                        fd = rumpuser_open(buf, O_RDWR, &error);
                        if (fd == -1)
                                break;
-                       
+
                        rumpuser_close(fd, &error);
                        kpause("ugwait2", false, hz/4, NULL);
                }
 
                sc->sc_port_status = ~(UPS_CURRENT_CONNECT_STATUS
                    | UPS_PORT_ENABLED | UPS_PORT_POWER);
-               sc->sc_port_change = UPS_C_CONNECT_STATUS;
+               sc->sc_port_change = UPS_C_CONNECT_STATUS | UPS_C_PORT_RESET;
 
                rumpuser_close(sc->sc_ugenfd[UGEN_EPT_CTRL], &error);
                sc->sc_ugenfd[UGEN_EPT_CTRL] = -1;
 
                xfer = sc->sc_intrxfer;
-               xfer->actlen = 0;
+               memset(xfer->buffer, 0xff, xfer->length);
+               xfer->actlen = xfer->length;
                xfer->status = USBD_NORMAL_COMPLETION;
                usb_transfer_complete(xfer);
+
+               kpause("ugwait3", false, hz, NULL);
        }
 
        kthread_exit(0);
@@ -826,7 +840,17 @@
 static void
 rumpusb_device_bulk_close(usbd_pipe_handle pipe)
 {
+       struct ugenhc_softc *sc = pipe->device->bus->hci_private;
+       int endpt = pipe->endpoint->edesc->bEndpointAddress;
+       usbd_xfer_handle xfer;
+       int error;
 
+       while ((xfer = SIMPLEQ_FIRST(&pipe->queue)) != NULL)
+               rumpusb_device_bulk_abort(xfer);
+
+       rumpuser_close(sc->sc_ugenfd[endpt], &error);
+       sc->sc_ugenfd[endpt] = -1;
+       sc->sc_fdmodes[endpt] = -1;
 }
 
 static void
@@ -994,10 +1018,8 @@
        int error;
 
        makeugendevstr(match->cf_unit, 0, buf);
-       if (rumpuser_getfileinfo(buf, NULL, NULL, &error) == -1) {
-               printf("match error %d\n", error);
+       if (rumpuser_getfileinfo(buf, NULL, NULL, &error) == -1)
                return 0;
-       }
 
        return 1;
 }



Home | Main Index | Thread Index | Old Index