From 9a08941c1f6996357cb8167f95965ff3d009c53d Mon Sep 17 00:00:00 2001 From: gdisirio Date: Sat, 3 Oct 2009 06:48:01 +0000 Subject: [PATCH] Fixed lockup in the experimental MAC driver. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@1199 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c | 2 +- os/io/platforms/AT91SAM7X/mac_lld.c | 28 +++++++++++++------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c b/demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c index ceb9ebcd1..12c3b8405 100644 --- a/demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c +++ b/demos/ARM7-AT91SAM7X-WEB-GCC/web/webthread.c @@ -102,8 +102,8 @@ static void PeriodicTimerHandler(eventid_t id) { */ static void ARPTimerHandler(eventid_t id) { - uip_arp_timer(); (void)macPollLinkStatus(Ð1); + uip_arp_timer(); } /* diff --git a/os/io/platforms/AT91SAM7X/mac_lld.c b/os/io/platforms/AT91SAM7X/mac_lld.c index 3f3560d6a..47167fa80 100644 --- a/os/io/platforms/AT91SAM7X/mac_lld.c +++ b/os/io/platforms/AT91SAM7X/mac_lld.c @@ -293,6 +293,19 @@ void mac_lld_release_transmit_descriptor(MACTransmitDescriptor *tdp) { chSysUnlock(); } +/** + * @brief Cleans an incomplete frame. + * @param from the start position of the incomplete frame + */ +static void cleanup(EMACDescriptor *from) { + + while (from != rxptr) { + from->w1 &= ~W1_R_OWNERSHIP; + if (++from >= &rd[EMAC_RECEIVE_DESCRIPTORS]) + from = rd; + } +} + /** * @brief Returns a receive descriptor. * @@ -337,9 +350,11 @@ skip: restart: edp = rxptr; while (n > 0) { - if (!(rxptr->w1 & W1_R_OWNERSHIP)) - goto skip; /* Empty buffer for some reason... */ - + if (!(rxptr->w1 & W1_R_OWNERSHIP)) { + /* Empty buffer for some reason... cleaning up the incomplete frame.*/ + cleanup(edp); + goto skip; + } /* * End Of Frame found. */ @@ -352,12 +367,7 @@ restart: if ((edp != rxptr) && (rxptr->w2 & W2_R_FRAME_START)) { /* Found another start... cleaning up the incomplete frame.*/ - do { - edp->w1 &= ~W1_R_OWNERSHIP; - if (++edp >= &rd[EMAC_RECEIVE_DESCRIPTORS]) - edp = rd; - } - while (edp != rxptr); + cleanup(edp); goto restart; /* Another start buffer for some reason... */ }