From 15ffaeed867b14ddace545efcd8c0fc42fd1142b Mon Sep 17 00:00:00 2001 From: c_oflynn Date: Sun, 24 Jan 2010 13:01:58 +0000 Subject: [PATCH] Fix for error where USB host could send NAK, but isn't considered in jackdaw, resulting in jackdaw hanging --- cpu/avr/dev/usb/rndis/rndis.c | 37 ++++++++++++++++++++++------------- cpu/avr/dev/usb/usb_drv.h | 2 ++ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/cpu/avr/dev/usb/rndis/rndis.c b/cpu/avr/dev/usb/rndis/rndis.c index ef168caee..77e8c83ec 100644 --- a/cpu/avr/dev/usb/rndis/rndis.c +++ b/cpu/avr/dev/usb/rndis/rndis.c @@ -210,23 +210,32 @@ uint8_t send_encapsulated_command(uint16_t wLength) uint8_t nb_counter; + //Clear NAK bit + Usb_ack_nak_in(); - while (wLength) { - nb_counter = EP_CONTROL_LENGTH; + while (wLength) { + nb_counter = EP_CONTROL_LENGTH; - //Wait for data to come in - while (!(Is_usb_receive_out())); - - while(nb_counter && wLength) { - encapsulated_buffer[i] = Usb_read_byte(); - i++; - wLength--; - nb_counter--; - } - - Usb_ack_receive_out(); + //Wait for data to come in or nak + while((!Is_usb_receive_out()) & (!Is_usb_receive_nak_in())); - } + //Received OUT + if (Is_usb_receive_out()) { + while(nb_counter && wLength) { + encapsulated_buffer[i] = Usb_read_byte(); + i++; + wLength--; + nb_counter--; + } + + Usb_ack_receive_out(); + + //Received NAK, no more data + } else { + Usb_ack_nak_in(); + break; + } + } Usb_send_control_in(); diff --git a/cpu/avr/dev/usb/usb_drv.h b/cpu/avr/dev/usb/usb_drv.h index 4ab7fcb8b..699367b7d 100644 --- a/cpu/avr/dev/usb/usb_drv.h +++ b/cpu/avr/dev/usb/usb_drv.h @@ -530,6 +530,8 @@ typedef enum endpoint_parameter{ep_num, ep_type, ep_direction, ep_size, ep_bank, #define Usb_ack_nak_out() (UEINTX &= ~(1<