summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/udbp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/udbp.c')
-rw-r--r--sys/dev/usb/udbp.c71
1 files changed, 41 insertions, 30 deletions
diff --git a/sys/dev/usb/udbp.c b/sys/dev/usb/udbp.c
index 29e203e..125558b 100644
--- a/sys/dev/usb/udbp.c
+++ b/sys/dev/usb/udbp.c
@@ -355,22 +355,20 @@ USB_ATTACH(udbp)
if ((err = ng_make_node_common(&ng_udbp_typestruct, &sc->node)) == 0) {
char nodename[128];
- sc->node->private = sc;
- sc->xmitq.ifq_maxlen = IFQ_MAXLEN;
- sc->xmitq_hipri.ifq_maxlen = IFQ_MAXLEN;
- mtx_init(&sc->xmitq.ifq_mtx, "usb_xmitq", MTX_DEF);
- mtx_init(&sc->xmitq_hipri.ifq_mtx, "usb_xmitq_hipri", MTX_DEF);
sprintf(nodename, "%s", USBDEVNAME(sc->sc_dev));
if ((err = ng_name_node(sc->node, nodename))) {
- ng_rmnode(sc->node);
ng_unref(sc->node);
+ sc->node = NULL;
+ goto bad;
} else {
- /* something to note it's done */
+ sc->node->private = sc;
+ sc->xmitq.ifq_maxlen = IFQ_MAXLEN;
+ sc->xmitq_hipri.ifq_maxlen = IFQ_MAXLEN;
+ mtx_init(&sc->xmitq.ifq_mtx, "usb_xmitq", MTX_DEF);
+ mtx_init(&sc->xmitq_hipri.ifq_mtx,
+ "usb_xmitq_hipri", MTX_DEF);
}
}
- if (err) {
- goto bad;
- }
sc->flags = NETGRAPH_INITIALISED;
/* sc->flags &= ~DISCONNECTED; */ /* XXX */
@@ -612,7 +610,7 @@ DRIVER_MODULE(udbp, uhub, udbp_driver, udbp_devclass, usbd_driver_load, 0);
* to create nodes that depend on hardware (unless you can add the hardware :)
*/
Static int
-ng_udbp_constructor(node_p *nodep)
+ng_udbp_constructor(node_p node)
{
return (EINVAL);
}
@@ -641,7 +639,6 @@ ng_udbp_newhook(node_p node, hook_p hook, const char *name)
#endif
if (strcmp(name, NG_UDBP_HOOK_NAME) == 0) {
- /* do something specific to a debug connection */
sc->hook = hook;
hook->private = NULL;
} else {
@@ -662,14 +659,14 @@ ng_udbp_newhook(node_p node, hook_p hook, const char *name)
* (so that old userland programs could continue to work).
*/
Static int
-ng_udbp_rcvmsg(node_p node,
- struct ng_mesg *msg, const char *retaddr, struct ng_mesg **rptr,
- hook_p lasthook)
+ng_udbp_rcvmsg(node_p node, item_p item, hook_p lasthook)
{
const udbp_p sc = node->private;
struct ng_mesg *resp = NULL;
int error = 0;
+ struct ng_mesg *msg;
+ NGI_GET_MSG(item, msg);
/* Deal with message according to cookie and command */
switch (msg->header.typecookie) {
case NGM_UDBP_COOKIE:
@@ -706,13 +703,8 @@ ng_udbp_rcvmsg(node_p node,
}
/* Take care of synchronous response, if any */
- if (rptr)
- *rptr = resp;
- else if (resp)
- FREE(resp, M_NETGRAPH);
-
- /* Free the message and return */
- FREE(msg, M_NETGRAPH);
+ NG_RESPOND_MSG(error, node, item, resp);
+ NG_FREE_MSG(msg);
return(error);
}
@@ -720,14 +712,18 @@ ng_udbp_rcvmsg(node_p node,
* Accept data from the hook and queue it for output.
*/
Static int
-ng_udbp_rcvdata(hook_p hook, struct mbuf *m, meta_p meta,
- struct mbuf **ret_m, meta_p *ret_meta, struct ng_mesg **resp)
+ng_udbp_rcvdata(hook_p hook, item_p item)
{
const udbp_p sc = hook->node->private;
int error;
struct ifqueue *xmitq_p;
int s;
+ struct mbuf *m;
+ meta_p meta;
+ NGI_GET_M(item, m);
+ NGI_GET_META(item, meta);
+ NG_FREE_ITEM(item);
/*
* Now queue the data for when it can be sent
*/
@@ -756,7 +752,8 @@ bad: /*
* It was an error case.
* check if we need to free the mbuf, and then return the error
*/
- NG_FREE_DATA(m, meta);
+ NG_FREE_M(m);
+ NG_FREE_META(meta);
return (error);
}
@@ -769,9 +766,9 @@ Static int
ng_udbp_rmnode(node_p node)
{
const udbp_p sc = node->private;
+ int err;
node->flags |= NG_INVALID;
- ng_cutlinks(node);
/* Drain the queues */
IF_DRAIN(&sc->xmitq_hipri);
@@ -779,8 +776,21 @@ ng_udbp_rmnode(node_p node)
sc->packets_in = 0; /* reset stats */
sc->packets_out = 0;
- node->flags &= ~NG_INVALID; /* reset invalid flag */
- return (0);
+ ng_unref(node); /* forget it ever existed */
+
+ /* stolen from attach routine */
+ if ((err = ng_make_node_common(&ng_udbp_typestruct, &sc->node)) == 0) {
+ char nodename[128];
+ sprintf(nodename, "%s", USBDEVNAME(sc->sc_dev));
+ if ((err = ng_name_node(sc->node, nodename))) {
+ ng_unref(sc->node); /* out damned spot! */
+ sc->flags &= ~NETGRAPH_INITIALISED;
+ sc->node = NULL;
+ } else {
+ sc->node->private = sc;
+ }
+ }
+ return (err);
}
/*
@@ -807,8 +817,9 @@ ng_udbp_disconnect(hook_p hook)
const udbp_p sc = hook->node->private;
sc->hook = NULL;
- if (hook->node->numhooks == 0)
- ng_rmnode(hook->node);
+ if ((hook->node->numhooks == 0)
+ && ((hook->node->flags & NG_INVALID) == 0))
+ ng_rmnode_self(hook->node);
return (0);
}
OpenPOWER on IntegriCloud