* Configuring host_addr and device_addr for u_ether
@ 2019-03-06 8:48 Felipe Balbi
0 siblings, 0 replies; only message in thread
From: Felipe Balbi @ 2019-03-06 8:48 UTC (permalink / raw)
To: Westermann, Oliver, linux-usb@vger.kernel.org
Hi,
(please break your lines at 80-columns)
"Westermann, Oliver" <Oliver.Westermann@cognex.com> writes:
> Hey,
>
> I'm trying to use a composite gadget on a embedded linux platform
> using configfs. The kernel-doc was fine and I can now create my
> gadgets as needed. One big drawback is that the host_addr and dev_addr
> change on every start.
>
> So I tried to change them, without success:
>
> * Most web documentation applies only to g_ether (eg setting
> module/kernel parameters)
>
> * ${CONFIGFS}/usb_gadget/g1/functions/rndis.0/host_addr reports EBUSY
> if I try to write it
because the gadget is already configured.
> * I checked the sources of my kernel (4.19) and the current ones to
> check if I can somehow add a MAC to the dtb of my system: It seems
> that there is no such binding.
you can write host_addr and dev_addr via configufs, but according to
code, you have to do it before adding the functions to the gadget. This,
to me, seems a bit odd. Does this patch help the situation in any way?
diff --git a/drivers/usb/gadget/function/f_ecm.c b/drivers/usb/gadget/function/f_ecm.c
index 6ce044008cf6..31279aaf3f3b 100644
--- a/drivers/usb/gadget/function/f_ecm.c
+++ b/drivers/usb/gadget/function/f_ecm.c
@@ -530,14 +530,19 @@ static int ecm_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
static int ecm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
{
struct f_ecm *ecm = func_to_ecm(f);
+ struct f_ecm_opts *ecm_opts;
struct usb_composite_dev *cdev = f->config->cdev;
+ ecm_opts = container_of(f->fi, struct f_ecm_opts, func_inst);
+
/* Control interface has only altsetting 0 */
if (intf == ecm->ctrl_id) {
if (alt != 0)
goto fail;
VDBG(cdev, "reset ecm control %d\n", intf);
+
+ ecm_opts->running = false;
usb_ep_disable(ecm->notify);
if (!(ecm->notify->desc)) {
VDBG(cdev, "init ecm ctrl %d\n", intf);
@@ -545,6 +550,7 @@ static int ecm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
goto fail;
}
usb_ep_enable(ecm->notify);
+ ecm_opts->running = true;
/* Data interface has two altsettings, 0 and 1 */
} else if (intf == ecm->data_id) {
@@ -553,6 +559,7 @@ static int ecm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
if (ecm->port.in_ep->enabled) {
DBG(cdev, "reset ecm\n");
+ ecm_opts->running = false;
gether_disconnect(&ecm->port);
}
@@ -585,6 +592,7 @@ static int ecm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
net = gether_connect(&ecm->port);
if (IS_ERR(net))
return PTR_ERR(net);
+ ecm_opts->running = true;
}
/* NOTE this can be a minor disagreement with the ECM spec,
diff --git a/drivers/usb/gadget/function/u_ecm.h b/drivers/usb/gadget/function/u_ecm.h
index 050aa672ee7f..752258dd1c3e 100644
--- a/drivers/usb/gadget/function/u_ecm.h
+++ b/drivers/usb/gadget/function/u_ecm.h
@@ -19,6 +19,7 @@ struct f_ecm_opts {
struct usb_function_instance func_inst;
struct net_device *net;
bool bound;
+ bool running;
/*
* Read/write access to configfs attributes is handled by configfs.
diff --git a/drivers/usb/gadget/function/u_ether_configfs.h b/drivers/usb/gadget/function/u_ether_configfs.h
index cd33cee4d78b..7fe0a7fa4e7a 100644
--- a/drivers/usb/gadget/function/u_ether_configfs.h
+++ b/drivers/usb/gadget/function/u_ether_configfs.h
@@ -46,7 +46,7 @@
int ret; \
\
mutex_lock(&opts->lock); \
- if (opts->refcnt) { \
+ if (opts->running) { \
mutex_unlock(&opts->lock); \
return -EBUSY; \
} \
@@ -81,7 +81,7 @@
int ret; \
\
mutex_lock(&opts->lock); \
- if (opts->refcnt) { \
+ if (opts->running) { \
mutex_unlock(&opts->lock); \
return -EBUSY; \
} \
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2019-03-06 8:48 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-03-06 8:48 Configuring host_addr and device_addr for u_ether Felipe Balbi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).