All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/4] usbnet: various CDC-ECM and xHCI fixes
@ 2016-02-08 14:19 Michael Brown
  2016-02-08 14:19 ` [Qemu-devel] [PATCH 1/4] usbnet: Add missing usb_wakeup() call in usbnet_receive() Michael Brown
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Michael Brown @ 2016-02-08 14:19 UTC (permalink / raw)
  To: qemu-devel

This patch series fixes a few minor issues discovered when attempting
to use the CDC-ECM configuration for usbnet with the xHCI host
controller.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 1/4] usbnet: Add missing usb_wakeup() call in usbnet_receive()
  2016-02-08 14:19 [Qemu-devel] [PATCH 0/4] usbnet: various CDC-ECM and xHCI fixes Michael Brown
@ 2016-02-08 14:19 ` Michael Brown
  2016-02-08 14:19 ` [Qemu-devel] [PATCH 2/4] usbnet: Accept mandatory USB_CDC_SET_ETHERNET_PACKET_FILTER request Michael Brown
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Michael Brown @ 2016-02-08 14:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: Michael Brown

usbnet_receive() does not currently wake up the USB endpoint, leading
to a dead RX datapath when used with a host controller such as xHCI
that relies on being woken up.

Fix by adding a call to usb_wakeup() at the end of usbnet_receive().

Signed-off-by: Michael Brown <mcb30@ipxe.org>
---
 hw/usb/dev-network.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c
index 985a629..cf2c641 100644
--- a/hw/usb/dev-network.c
+++ b/hw/usb/dev-network.c
@@ -642,6 +642,7 @@ typedef struct USBNetState {
     uint8_t in_buf[2048];
 
     USBEndpoint *intr;
+    USBEndpoint *bulk_in;
 
     char usbstring_mac[13];
     NICState *nic;
@@ -1311,6 +1312,7 @@ static ssize_t usbnet_receive(NetClientState *nc, const uint8_t *buf, size_t siz
     memcpy(in_buf, buf, size);
     s->in_len = total_size;
     s->in_ptr = 0;
+    usb_wakeup(s->bulk_in, 0);
     return size;
 }
 
@@ -1353,6 +1355,7 @@ static void usb_net_realize(USBDevice *dev, Error **errrp)
     s->filter = 0;
     s->vendorid = 0x1234;
     s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
+    s->bulk_in = usb_ep_get(dev, USB_TOKEN_IN, 2);
 
     qemu_macaddr_default_if_unset(&s->conf.macaddr);
     s->nic = qemu_new_nic(&net_usbnet_info, &s->conf,
-- 
2.3.8

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 2/4] usbnet: Accept mandatory USB_CDC_SET_ETHERNET_PACKET_FILTER request
  2016-02-08 14:19 [Qemu-devel] [PATCH 0/4] usbnet: various CDC-ECM and xHCI fixes Michael Brown
  2016-02-08 14:19 ` [Qemu-devel] [PATCH 1/4] usbnet: Add missing usb_wakeup() call in usbnet_receive() Michael Brown
@ 2016-02-08 14:19 ` Michael Brown
  2016-02-08 14:19 ` [Qemu-devel] [PATCH 3/4] usbnet: Detect short packets as sent by the xHCI controller Michael Brown
  2016-02-08 14:19 ` [Qemu-devel] [PATCH 4/4] usbnet: Report link-up via interrupt endpoint in CDC-ECM mode Michael Brown
  3 siblings, 0 replies; 5+ messages in thread
From: Michael Brown @ 2016-02-08 14:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: Michael Brown

The USB_CDC_SET_ETHERNET_PACKET_FILTER request is mandatory for
CDC-ECM devices.  Accept this request, ignoring the actual filter
value (to match the existing behaviour for RNDIS).

Signed-off-by: Michael Brown <mcb30@ipxe.org>
---
 hw/usb/dev-network.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c
index cf2c641..f4e7acb 100644
--- a/hw/usb/dev-network.c
+++ b/hw/usb/dev-network.c
@@ -1117,6 +1117,12 @@ static void usb_net_handle_control(USBDevice *dev, USBPacket *p,
 #endif
         break;
 
+    case ClassInterfaceOutRequest | USB_CDC_SET_ETHERNET_PACKET_FILTER:
+        if (is_rndis(s)) {
+            goto fail;
+        }
+        break;
+
     default:
     fail:
         fprintf(stderr, "usbnet: failed control transaction: "
-- 
2.3.8

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 3/4] usbnet: Detect short packets as sent by the xHCI controller
  2016-02-08 14:19 [Qemu-devel] [PATCH 0/4] usbnet: various CDC-ECM and xHCI fixes Michael Brown
  2016-02-08 14:19 ` [Qemu-devel] [PATCH 1/4] usbnet: Add missing usb_wakeup() call in usbnet_receive() Michael Brown
  2016-02-08 14:19 ` [Qemu-devel] [PATCH 2/4] usbnet: Accept mandatory USB_CDC_SET_ETHERNET_PACKET_FILTER request Michael Brown
@ 2016-02-08 14:19 ` Michael Brown
  2016-02-08 14:19 ` [Qemu-devel] [PATCH 4/4] usbnet: Report link-up via interrupt endpoint in CDC-ECM mode Michael Brown
  3 siblings, 0 replies; 5+ messages in thread
From: Michael Brown @ 2016-02-08 14:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: Michael Brown

The xHCI controller will ignore the endpoint MTU and so may deliver
packets of any length.  Detect short packets as being any packet that
has a length of zero or a length that is not a multiple of the MTU.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
---
 hw/usb/dev-network.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c
index f4e7acb..09312d4 100644
--- a/hw/usb/dev-network.c
+++ b/hw/usb/dev-network.c
@@ -1206,7 +1206,7 @@ static void usb_net_handle_dataout(USBNetState *s, USBPacket *p)
     s->out_ptr += sz;
 
     if (!is_rndis(s)) {
-        if (p->iov.size < 64) {
+        if (p->iov.size % 64 || p->iov.size == 0) {
             qemu_send_packet(qemu_get_queue(s->nic), s->out_buf, s->out_ptr);
             s->out_ptr = 0;
         }
-- 
2.3.8

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [Qemu-devel] [PATCH 4/4] usbnet: Report link-up via interrupt endpoint in CDC-ECM mode
  2016-02-08 14:19 [Qemu-devel] [PATCH 0/4] usbnet: various CDC-ECM and xHCI fixes Michael Brown
                   ` (2 preceding siblings ...)
  2016-02-08 14:19 ` [Qemu-devel] [PATCH 3/4] usbnet: Detect short packets as sent by the xHCI controller Michael Brown
@ 2016-02-08 14:19 ` Michael Brown
  3 siblings, 0 replies; 5+ messages in thread
From: Michael Brown @ 2016-02-08 14:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: Michael Brown

Signed-off-by: Michael Brown <mcb30@ipxe.org>
---
 hw/usb/dev-network.c | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/hw/usb/dev-network.c b/hw/usb/dev-network.c
index 09312d4..f8e6e57 100644
--- a/hw/usb/dev-network.c
+++ b/hw/usb/dev-network.c
@@ -86,6 +86,8 @@ enum usbstring_idx {
 #define USB_CDC_SET_ETHERNET_PACKET_FILTER	0x43
 #define USB_CDC_GET_ETHERNET_STATISTIC		0x44
 
+#define USB_CDC_NETWORK_CONNECTION	0x00
+
 #define LOG2_STATUS_INTERVAL_MSEC	5    /* 1 << 5 == 32 msec */
 #define STATUS_BYTECOUNT		16   /* 8 byte header + data */
 
@@ -635,6 +637,8 @@ typedef struct USBNetState {
     uint16_t filter;
     uint32_t vendorid;
 
+    uint16_t connection;
+
     unsigned int out_ptr;
     uint8_t out_buf[2048];
 
@@ -1135,18 +1139,28 @@ static void usb_net_handle_control(USBDevice *dev, USBPacket *p,
 
 static void usb_net_handle_statusin(USBNetState *s, USBPacket *p)
 {
-    le32 buf[2];
+    le32 rbuf[2];
+    uint16_t ebuf[4];
 
     if (p->iov.size < 8) {
         p->status = USB_RET_STALL;
         return;
     }
 
-    buf[0] = cpu_to_le32(1);
-    buf[1] = cpu_to_le32(0);
-    usb_packet_copy(p, buf, 8);
-    if (!s->rndis_resp.tqh_first) {
-        p->status = USB_RET_NAK;
+    if (is_rndis(s)) {
+        rbuf[0] = cpu_to_le32(1);
+        rbuf[1] = cpu_to_le32(0);
+        usb_packet_copy(p, rbuf, 8);
+        if (!s->rndis_resp.tqh_first) {
+            p->status = USB_RET_NAK;
+        }
+    } else {
+        ebuf[0] =
+            cpu_to_be16(ClassInterfaceRequest | USB_CDC_NETWORK_CONNECTION);
+        ebuf[1] = cpu_to_le16(s->connection);
+        ebuf[2] = cpu_to_le16(1);
+        ebuf[3] = cpu_to_le16(0);
+        usb_packet_copy(p, ebuf, 8);
     }
 
 #ifdef TRAFFIC_DEBUG
@@ -1360,6 +1374,7 @@ static void usb_net_realize(USBDevice *dev, Error **errrp)
     s->media_state = 0;	/* NDIS_MEDIA_STATE_CONNECTED */;
     s->filter = 0;
     s->vendorid = 0x1234;
+    s->connection = 1;	/* Connected */
     s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
     s->bulk_in = usb_ep_get(dev, USB_TOKEN_IN, 2);
 
-- 
2.3.8

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-02-08 14:19 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-02-08 14:19 [Qemu-devel] [PATCH 0/4] usbnet: various CDC-ECM and xHCI fixes Michael Brown
2016-02-08 14:19 ` [Qemu-devel] [PATCH 1/4] usbnet: Add missing usb_wakeup() call in usbnet_receive() Michael Brown
2016-02-08 14:19 ` [Qemu-devel] [PATCH 2/4] usbnet: Accept mandatory USB_CDC_SET_ETHERNET_PACKET_FILTER request Michael Brown
2016-02-08 14:19 ` [Qemu-devel] [PATCH 3/4] usbnet: Detect short packets as sent by the xHCI controller Michael Brown
2016-02-08 14:19 ` [Qemu-devel] [PATCH 4/4] usbnet: Report link-up via interrupt endpoint in CDC-ECM mode Michael Brown

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.