From: Tatyana Brokhman <tlinder-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
To: greg-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org
Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
balbi-l0cyMroinI0@public.gmane.org,
ablay-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org,
Tatyana Brokhman
<tlinder-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>,
open list <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: [PATCH/RFC 2/5] usb:dummy_hcd: connect/disconnect test support
Date: Thu, 16 Jun 2011 16:31:04 +0300 [thread overview]
Message-ID: <1308231068-24038-3-git-send-email-tlinder@codeaurora.org> (raw)
In-Reply-To: <1308231068-24038-2-git-send-email-tlinder-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
This implementation adds a new proprietary device control requests (to be
handled by the dummy_hcd) that initiates a connect/disconnect sequence.
The bRequest value of the new control request is 0x52.
It is used by the user-space Unit testing application.
Signed-off-by: Tatyana Linder <tlinder-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
---
drivers/usb/gadget/dummy_hcd.c | 48 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c
index 74b7655..7d0a6fe 100644
--- a/drivers/usb/gadget/dummy_hcd.c
+++ b/drivers/usb/gadget/dummy_hcd.c
@@ -179,6 +179,7 @@ struct dummy_hcd {
unsigned active:1;
unsigned old_active:1;
unsigned resuming:1;
+ struct work_struct conn_disc_work;
};
struct dummy {
@@ -1362,6 +1363,43 @@ static struct dummy_ep *find_endpoint (struct dummy *dum, u8 address)
#define Ep_Request (USB_TYPE_STANDARD | USB_RECIP_ENDPOINT)
#define Ep_InRequest (Ep_Request | USB_DIR_IN)
+/**
+ * dummy_hcd_conn_disc_work() - performs a disconnect/connect sequence.
+ * @data: pointer to the sceduled work_struct
+ */
+static void dummy_hcd_conn_disc_work(struct work_struct *data)
+{
+ struct dummy_hcd *dum_hcd =
+ container_of(data, struct dummy_hcd, conn_disc_work);
+ int ret_val;
+
+ if (!dum_hcd->dum->driver) {
+ dev_err(dummy_dev(dum_hcd),
+ "dummy_hcd_conn_disc_work called without connected "
+ "device\n");
+ return;
+ }
+
+ dev_info(dummy_dev(dum_hcd), "disconnecting device...\n");
+ ret_val = dummy_pullup(&dum_hcd->dum->gadget, 0);
+ if (ret_val) {
+ dev_err(dummy_dev(dum_hcd), "dummy_hcd_conn_disc_work:"
+ " couldn't disconnect device:"
+ " ret_val=%d\n",
+ ret_val);
+ return;
+ }
+
+ dev_info(dummy_dev(dum_hcd), "re-connecting device...\n");
+ /* We have to let the hub task to update the device disconnect state */
+ msleep_interruptible(1000);
+ ret_val = dummy_pullup(&dum_hcd->dum->gadget, 1);
+ if (ret_val)
+ dev_err(dummy_dev(dum_hcd), "dummy_hcd_conn_disc_work:"
+ " couldn't re-connect device:"
+ " ret_val=%d\n",
+ ret_val);
+}
/**
* handle_control_request() - handles all control transfers
@@ -1534,6 +1572,10 @@ static int handle_control_request(struct dummy_hcd *dum_hcd, struct urb *urb,
*status = 0;
}
break;
+ case 0x52: /* UT: Connect/disconnect the device */
+ schedule_work(&dum_hcd->conn_disc_work);
+ ret_val = 0;
+ break;
}
return ret_val;
}
@@ -2249,6 +2291,8 @@ static int dummy_setup(struct usb_hcd *hcd)
if (usb_hcd_is_primary_hcd(hcd)) {
the_controller.hs_hcd = hcd_to_dummy_hcd(hcd);
the_controller.hs_hcd->dum = &the_controller;
+ INIT_WORK(&the_controller.hs_hcd->conn_disc_work,
+ dummy_hcd_conn_disc_work);
/*
* Mark the first roothub as being USB 2.0.
* The USB 3.0 roothub will be registered later by
@@ -2259,6 +2303,8 @@ static int dummy_setup(struct usb_hcd *hcd)
} else {
the_controller.ss_hcd = hcd_to_dummy_hcd(hcd);
the_controller.ss_hcd->dum = &the_controller;
+ INIT_WORK(&the_controller.ss_hcd->conn_disc_work,
+ dummy_hcd_conn_disc_work);
hcd->speed = HCD_USB3;
hcd->self.root_hub->speed = USB_SPEED_SUPER;
}
@@ -2364,9 +2410,11 @@ static int dummy_hcd_remove (struct platform_device *pdev)
if (dum->ss_hcd) {
usb_remove_hcd(dummy_hcd_to_hcd(dum->ss_hcd));
usb_put_hcd(dummy_hcd_to_hcd(dum->ss_hcd));
+ cancel_work_sync(&dum->ss_hcd->conn_disc_work);
}
usb_remove_hcd(dummy_hcd_to_hcd(dum->hs_hcd));
usb_put_hcd(dummy_hcd_to_hcd(dum->hs_hcd));
+ cancel_work_sync(&dum->hs_hcd->conn_disc_work);
the_controller.ss_hcd = the_controller.hs_hcd = NULL;
return 0;
}
--
1.7.3.3
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: Tatyana Brokhman <tlinder@codeaurora.org>
To: greg@kroah.com
Cc: linux-usb@vger.kernel.org, linux-arm-msm@vger.kernel.org,
balbi@ti.com, ablay@codeaurora.org,
Tatyana Brokhman <tlinder@codeaurora.org>,
linux-kernel@vger.kernel.org (open list)
Subject: [PATCH/RFC 2/5] usb:dummy_hcd: connect/disconnect test support
Date: Thu, 16 Jun 2011 16:31:04 +0300 [thread overview]
Message-ID: <1308231068-24038-3-git-send-email-tlinder@codeaurora.org> (raw)
In-Reply-To: <1308231068-24038-2-git-send-email-tlinder@codeaurora.org>
This implementation adds a new proprietary device control requests (to be
handled by the dummy_hcd) that initiates a connect/disconnect sequence.
The bRequest value of the new control request is 0x52.
It is used by the user-space Unit testing application.
Signed-off-by: Tatyana Linder <tlinder@codeaurora.org>
---
drivers/usb/gadget/dummy_hcd.c | 48 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c
index 74b7655..7d0a6fe 100644
--- a/drivers/usb/gadget/dummy_hcd.c
+++ b/drivers/usb/gadget/dummy_hcd.c
@@ -179,6 +179,7 @@ struct dummy_hcd {
unsigned active:1;
unsigned old_active:1;
unsigned resuming:1;
+ struct work_struct conn_disc_work;
};
struct dummy {
@@ -1362,6 +1363,43 @@ static struct dummy_ep *find_endpoint (struct dummy *dum, u8 address)
#define Ep_Request (USB_TYPE_STANDARD | USB_RECIP_ENDPOINT)
#define Ep_InRequest (Ep_Request | USB_DIR_IN)
+/**
+ * dummy_hcd_conn_disc_work() - performs a disconnect/connect sequence.
+ * @data: pointer to the sceduled work_struct
+ */
+static void dummy_hcd_conn_disc_work(struct work_struct *data)
+{
+ struct dummy_hcd *dum_hcd =
+ container_of(data, struct dummy_hcd, conn_disc_work);
+ int ret_val;
+
+ if (!dum_hcd->dum->driver) {
+ dev_err(dummy_dev(dum_hcd),
+ "dummy_hcd_conn_disc_work called without connected "
+ "device\n");
+ return;
+ }
+
+ dev_info(dummy_dev(dum_hcd), "disconnecting device...\n");
+ ret_val = dummy_pullup(&dum_hcd->dum->gadget, 0);
+ if (ret_val) {
+ dev_err(dummy_dev(dum_hcd), "dummy_hcd_conn_disc_work:"
+ " couldn't disconnect device:"
+ " ret_val=%d\n",
+ ret_val);
+ return;
+ }
+
+ dev_info(dummy_dev(dum_hcd), "re-connecting device...\n");
+ /* We have to let the hub task to update the device disconnect state */
+ msleep_interruptible(1000);
+ ret_val = dummy_pullup(&dum_hcd->dum->gadget, 1);
+ if (ret_val)
+ dev_err(dummy_dev(dum_hcd), "dummy_hcd_conn_disc_work:"
+ " couldn't re-connect device:"
+ " ret_val=%d\n",
+ ret_val);
+}
/**
* handle_control_request() - handles all control transfers
@@ -1534,6 +1572,10 @@ static int handle_control_request(struct dummy_hcd *dum_hcd, struct urb *urb,
*status = 0;
}
break;
+ case 0x52: /* UT: Connect/disconnect the device */
+ schedule_work(&dum_hcd->conn_disc_work);
+ ret_val = 0;
+ break;
}
return ret_val;
}
@@ -2249,6 +2291,8 @@ static int dummy_setup(struct usb_hcd *hcd)
if (usb_hcd_is_primary_hcd(hcd)) {
the_controller.hs_hcd = hcd_to_dummy_hcd(hcd);
the_controller.hs_hcd->dum = &the_controller;
+ INIT_WORK(&the_controller.hs_hcd->conn_disc_work,
+ dummy_hcd_conn_disc_work);
/*
* Mark the first roothub as being USB 2.0.
* The USB 3.0 roothub will be registered later by
@@ -2259,6 +2303,8 @@ static int dummy_setup(struct usb_hcd *hcd)
} else {
the_controller.ss_hcd = hcd_to_dummy_hcd(hcd);
the_controller.ss_hcd->dum = &the_controller;
+ INIT_WORK(&the_controller.ss_hcd->conn_disc_work,
+ dummy_hcd_conn_disc_work);
hcd->speed = HCD_USB3;
hcd->self.root_hub->speed = USB_SPEED_SUPER;
}
@@ -2364,9 +2410,11 @@ static int dummy_hcd_remove (struct platform_device *pdev)
if (dum->ss_hcd) {
usb_remove_hcd(dummy_hcd_to_hcd(dum->ss_hcd));
usb_put_hcd(dummy_hcd_to_hcd(dum->ss_hcd));
+ cancel_work_sync(&dum->ss_hcd->conn_disc_work);
}
usb_remove_hcd(dummy_hcd_to_hcd(dum->hs_hcd));
usb_put_hcd(dummy_hcd_to_hcd(dum->hs_hcd));
+ cancel_work_sync(&dum->hs_hcd->conn_disc_work);
the_controller.ss_hcd = the_controller.hs_hcd = NULL;
return 0;
}
--
1.7.3.3
--
Sent by an employee of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
next prev parent reply other threads:[~2011-06-16 13:31 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-06-16 13:31 [PATCH/RFC 1/5] usb:tools: usb unittests framework Tatyana Brokhman
2011-06-16 13:31 ` Tatyana Brokhman
[not found] ` <1308231068-24038-2-git-send-email-tlinder-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-06-16 13:31 ` Tatyana Brokhman [this message]
2011-06-16 13:31 ` [PATCH/RFC 2/5] usb:dummy_hcd: connect/disconnect test support Tatyana Brokhman
2011-06-16 15:06 ` Alan Stern
2011-06-16 15:06 ` Alan Stern
2011-06-16 16:16 ` Felipe Balbi
2011-06-16 17:06 ` Alan Stern
2011-06-16 17:06 ` Alan Stern
2011-06-16 17:19 ` Alan Stern
2011-06-16 17:19 ` Alan Stern
2011-06-16 15:17 ` Alan Stern
2011-06-16 15:17 ` Alan Stern
2011-06-16 16:18 ` Felipe Balbi
2011-06-16 13:31 ` [PATCH/RFC 4/5] usb:dummy_hcd: Disable single-request fifo in dummy hcd Tatyana Brokhman
2011-06-16 13:31 ` Tatyana Brokhman
2011-06-16 15:09 ` Alan Stern
2011-06-16 15:09 ` Alan Stern
2011-06-16 13:31 ` [PATCH/RFC 3/5] usb:g_zero: bulk in/out unittest support Tatyana Brokhman
2011-06-16 13:31 ` Tatyana Brokhman
2011-06-16 16:25 ` Felipe Balbi
2011-06-16 13:31 ` [PATCH/RFC 5/5] usb: Add support for streams alloc/dealloc to devio.c Tatyana Brokhman
2011-06-16 13:31 ` Tatyana Brokhman
[not found] ` <1308231068-24038-6-git-send-email-tlinder-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-06-16 15:20 ` Alan Stern
2011-06-16 15:20 ` Alan Stern
2011-06-30 17:45 ` Sarah Sharp
2011-06-30 17:45 ` Sarah Sharp
2011-06-30 18:39 ` William Gulland
2011-06-30 18:39 ` William Gulland
2011-06-30 18:41 ` Tanya Brokhman
2011-06-30 18:41 ` Tanya Brokhman
2011-07-19 9:12 ` Amit Blay
2011-07-19 9:12 ` Amit Blay
2011-07-19 9:18 ` Oliver Neukum
2011-07-19 10:07 ` Amit Blay
2011-07-19 10:07 ` Amit Blay
2011-07-19 10:26 ` Oliver Neukum
2011-07-19 10:36 ` Amit Blay
2011-07-19 10:36 ` Amit Blay
2011-07-27 6:21 ` Amit Blay
[not found] ` <a9d8b0f164cdb51e88125d8432644213.squirrel-mMfbam+mt9083fI46fginR2eb7JE58TQ@public.gmane.org>
2011-08-17 7:06 ` Hans Petter Selasky
2011-08-17 7:06 ` Hans Petter Selasky
2011-08-18 22:47 ` Sarah Sharp
2011-08-21 10:18 ` Amit Blay
2011-08-21 10:18 ` Amit Blay
2011-08-22 7:58 ` Hans Petter Selasky
2011-08-22 7:56 ` Hans Petter Selasky
2011-08-22 16:41 ` Sarah Sharp
2011-06-16 16:28 ` Felipe Balbi
2011-06-16 18:21 ` Greg KH
2011-06-17 8:55 ` ablay
2011-06-17 8:55 ` ablay
2011-06-17 14:35 ` Alan Stern
2011-06-17 14:35 ` Alan Stern
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1308231068-24038-3-git-send-email-tlinder@codeaurora.org \
--to=tlinder-sgv2jx0feol9jmxxk+q4oq@public.gmane.org \
--cc=ablay-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org \
--cc=balbi-l0cyMroinI0@public.gmane.org \
--cc=greg-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org \
--cc=linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.