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