u3g serial device name query

Milan Obuch freebsd-usb at dino.sk
Thu Apr 30 19:36:20 UTC 2009


On Thursday 30 April 2009 16:41:46 M. Warner Losh wrote:
> In message: <200904301412.38313.freebsd-usb at dino.sk>

[ snip ]

> : > USB serial devices have their own unit management. There is however a
> : > way to override the unit number through the "usb2_com_tty_name"
> : > callback, which requires some code changes to the u3g driver.
> : >
> : > All USB modems and serial adapters end up with the same naming
> : > prefix: /dev/cuaU%d.%d, so the assigned numbers must be serialised.
> : >
> : > What we could do is to have a separate naming prefix for 3G modems, and
> : > use the device_get_unit() for unit number.
> : >
> : > See: src/sys/dev/usb/serial and usb_serial.c
> :
> : I looked over usb2_com_attach_tty function in usb_serial.c, and somewhere
> : after call to tty_makedev (where a DPRINT is too) I could put a devctl
> : call.
> :
> : All I need for it would be device name. In /var/log/message file I see a
> : line telling 'u3g0 : Found 2 ports' just after usb2_com_attach_tty
> : function is called. If you could tell me how I can get 'u3g0' name via sc
> : argument in usb2_com_attach_tty function, I can solve this with no other
> : change.
>
> While I have issues with the names of the new ttys, since they are
> gratuitously different than the past, it isn't the fundamental
> problem.
>
> What we really need in devd is the ability to tie events to /dev
> entries appearing rather than at device attach time, since the two can
> be different...
>
> What you really need to do is to take the u3g0 attach, find out what
> its children are and use that to figure out things...
>
> Warner

First I tried simple patch

--- usb_serial.c.orig   2009-04-07 11:15:03.000000000 +0200
+++ usb_serial.c        2009-04-30 14:41:38.000000000 +0200
@@ -328,6 +328,7 @@
        sc->sc_tty = tp;

        DPRINTF("ttycreate: %s\n", buf);
+       devctl_notify("UCOM",buf,"ATTACH",NULL);
        usb2_cv_init(&sc->sc_cv, "usb2_com");

 done:

It shows me 'U0.0', 'U0.1' or 'U0' etc, but no parent class like u3g0 or 
uplcom. I tried to find to way how to get it, but it was not easy and 
universal.

My second try is

--- u3g.c.orig  2009-04-07 11:15:03.000000000 +0200
+++ u3g.c       2009-04-30 21:15:53.000000000 +0200
@@ -50,6 +50,8 @@

 #include <dev/usb/serial/usb_serial.h>

+#include <sys/conf.h>
+
 #if USB_DEBUG
 static int u3g_debug = 0;

@@ -529,6 +531,10 @@
                device_printf(dev, "Found %u ports.\n",
                    (unsigned int)sc->sc_numports);
        }
+
+       for (i = 0; i < sc->sc_numports; i++)
+               device_printf(dev, "%d %s\n", i, 
sc->sc_ucom[i].sc_tty->t_dev->si_name);
+
        return (0);

 detach:

which does almost what I want, just shows 'u3g0: 0 ttyU0.0', but... You need 
cuaU0.0 in ppp.conf :( I can replace device_printf with devctl_notify and 
change it a little, simplest would be to use 'si_name + 3' so the 'tty' part 
would be stripped, but this is not so nice. And, again, it is not universal.
If I like to do something similar with uplcom, uark or other serial USB 
device, their drivers need to be modified too...

In any case I would like to get some more opinion on this problem and my 
simple test patches, too.

Regards,
Milan


More information about the freebsd-usb mailing list