usb/164090: [umodem] [patch] Add sysctl with ucom unit number
Mykhaylo Yehorov
yehorov at gmail.com
Sun Jan 15 22:26:54 UTC 2012
On Sat, Jan 14, 2012 at 12:45, Hans Petter Selasky <hselasky at c2i.net> wrote:
> On Saturday 14 January 2012 10:51:07 Mykhaylo Yehorov wrote:
>> On Fri, Jan 13, 2012 at 22:54, Hans Petter Selasky <hselasky at c2i.net> wrote:
>> > Hi,
>> >
>> > Could you patch ucom_set_pnpinfo_usb() instead, so that such a sysctl is
>> > created for all ucom devices, not only umodem?
>>
>> I guess it will be necessary to remove a sysctl oid from a parent
>> sysctl tree before destroying ucom structures.
>> It's would be better to do in ucom_detach() but now there is no a
>> pointer to a parent device structure from there.
>>
>> Now all drivers that use ucom pass a pointer to parent softc structure
>> to ucom_attach().
>> Is there any reason for this?
>> May be it's would be more useful to pass a pointer to a parent device
>> structure.
>>
>> > Can you explain a bit more how you use this information in your scripts?
>>
>> I've got a gps receiver and a mobile phone that supported by the umodem
>> driver. I can attach its in any order.
>> So I use sysctl to generate gpsd and ppp configs with appropriate
>> values of serial port.
>
> Ok, I see.
>
> And you cannot use the information passed through devd by
> ucom_set_pnpinfo_usb()?ucom_detach
You are right. It's possible to use ucom_set_pnpinfo_usb().
In the attached patch an ucom sysctl oid will be added to a parent sysctl tree
in ucom_set_pnpinfo_usb() and will be removed in ucom_detach().
--
Mykhaylo Yehorov
-------------- next part --------------
--- sys/dev/usb/serial/usb_serial.h.orig 2011-11-11 06:20:22.000000000 +0200
+++ sys/dev/usb/serial/usb_serial.h 2012-01-14 22:59:23.000000000 +0200
@@ -70,6 +70,7 @@
#include <sys/tty.h>
#include <sys/serial.h>
#include <sys/fcntl.h>
+#include <sys/sysctl.h>
/* Module interface related macros */
#define UCOM_MODVER 1
@@ -134,6 +135,7 @@
struct usb_process sc_tq;
uint32_t sc_unit;
uint32_t sc_subunits;
+ struct sysctl_oid *sc_sysctl_dev_ucom;
};
struct ucom_softc {
--- sys/dev/usb/serial/usb_serial.c.orig 2011-11-11 06:20:22.000000000 +0200
+++ sys/dev/usb/serial/usb_serial.c 2012-01-14 23:01:15.000000000 +0200
@@ -274,6 +274,8 @@
sc[subunit].sc_flag |= UCOM_FLAG_ATTACHED;
}
+ ssc->sc_sysctl_dev_ucom = NULL;
+
DPRINTF("tp = %p, unit = %d, subunits = %d\n",
sc->sc_tty, ssc->sc_unit, ssc->sc_subunits);
@@ -292,6 +294,8 @@
if (ssc->sc_subunits == 0)
return; /* not initialized */
+ sysctl_remove_oid(ssc->sc_sysctl_dev_ucom, 1, 0);
+
usb_proc_drain(&ssc->sc_tq);
for (subunit = 0; subunit < ssc->sc_subunits; subunit++) {
@@ -433,6 +437,12 @@
if (usbd_set_pnpinfo(uaa->device, iface_index, buf) != 0)
device_printf(dev, "Could not set PNP info\n");
+
+ if (ssc->sc_sysctl_dev_ucom == NULL)
+ ssc->sc_sysctl_dev_ucom = SYSCTL_ADD_INT(NULL,
+ SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
+ OID_AUTO, "ucom", CTLFLAG_RD,
+ &ssc->sc_unit, -1, "Attached ucom unit number");
}
static void
More information about the freebsd-usb
mailing list