Hallo!

Grummel, wer hat sich den Namen EtherSEX ausgedacht, jetzt sind alle neuen eMails
im Spamordner gelandet ...  Also Enschuldigung wenn ich so spät antworte.

Ich habe einen Patch zusammengefasst, siehe Anhang. Hoffentlich ist
alles reingekommen (ich bin mit git noch nicht so firm):

hardware/ethernet/enc28j60.c
hardware/ethernet/enc28j60_process.c
config.h

Bitte ENC debug einschalten, dann kann man sehen ob Fehler aufgetreten sind.

Eventuell sehen wir auch 2 Fehler mit der gleichen Auswirkung.
Der Fehler oben tritt meine ich nur unter ping-stress auf (Receiver overrun)
Mein ursprünglicher Fehler trat aber auch ohne Netzwerklast auf,
ich kann mir nicht vorstellen dass da ein Receiver overrun stattgefunden
hat.
Allerdings habe ich auf meinen Boards den ENC mit Kondensatoren abgeblockt.
Es ist möglich dass das schon den ursprünglichen Fehler beseitigt hat, und
ich dann nur noch den zweiten Fehler sehe.
Es ist möglich dass die Funktion enc28j60_periodic(void) Fehler behebt, die
durch Spannungseinbrüche am ENC verursacht werden. Daher habe ich sie
nochmal dringelassen.

Bitte im menuconfig ENC debug einschalten, dann kann man sehen ob Fehler
von enc28j60_periodic(void) behoben wurden.
Das ist sehr interessant bei allen, die noch KEINE Zusatzkondensatoren eingelötet haben.

Happy Testing

taru





Am 17.04.2011 20:26, schrieb [email protected]:
Hallo,
ich hab die Überwachung für MACON1 in master aufgenommen. Netzwerk hat bei einem spontanem Test funktioniert, scheint also nichts kaputt zu machen. Langzeitauswirkungen müsste man jetzt beobachten. @taru: Kannst du noch den Code für den richtig implementierten errata fix hier posten? Muss jetzt auch nicht unbedingt den ethersex patch Richtlinien entsprechen, hauptsache dieser 3 Jahre alte, sehr nervige Bug ist endlich behoben :D

Grüße,
David

-----Ursprüngliche Nachricht----- From: taru
Sent: Sunday, April 17, 2011 1:50 PM
To: [email protected]
Subject: Re: [ethersex-devel] NET-IO Netzwerk fällt aus !!!SOLVED !!!

Hallo

wie ist der Prozess beim Code-Fix? Einen commit machen? Oder möchte
das jemand vorher nochmal testen? Ich kenne mich auch mit Git nicht aus.
Eine kurze Anleitung wäre schön.

Nach der Durchsicht von enc28j60.c bin ich der Meinung dass ein errata Fix
nicht richtig implementiert wurde. Ich habe das berichtigt und mein AVR
läuft jetzt seit Tagen ohne Netzwerkfehler durch, trotz ping-stress.
Die Funktion enc28j60_periodic(void) die auf die Bits im ENC aufpasst,
ist nun anscheinend auch arbeitslos - findet bei mir keine Fehler mehr.
(Weiss jemand warum die dazugekommen ist?)

Eventuell sehen wir auch 2 Fehler mit der gleichen Auswirkung.
Der Fehler oben tritt meine ich nur unter ping-stress auf (Receiver overrun)
Mein ursprünglicher Fehler trat aber auch ohne Netzwerklast auf,
ich kann mir nicht vorstellen dass da ein Receiver overrun stattgefunden
hat.
Allerdings habe ich auf meinen Boards den ENC mit Kondensatoren abgeblockt. Es ist möglich dass das schon den ursprünglichen Fehler beseitigt hat, und
ich dann nur noch den zweiten Fehler sehe.

Frohes Basteln,

taru


Am 13.04.2011 10:14, schrieb [email protected]:
Hallo,

mit folgendem fix läuft jetzt mein Board durch (MACON1 Überwachung):

void enc28j60_periodic(void)
{
      uint8_t mask = _BV(PADCFG0) | _BV(TXCRCEN) | _BV(FRMLNEN);

      if (   (read_control_register(REG_MACON3)&  mask) != mask
          || (read_control_register(REG_MACON1))        != 0x0D  ) {
          init_enc28j60();
      }
}


Jetzt stellen sich natürlich neue Fragen:
Wer weiss wann/warum der erste Fix eingeführt wurde?
Müssen wir jetzt alle Register überwachen?
Wie wichtig sind die Blockkondesatoren ?

Viele Grüße,


taru







-------- Original-Nachricht --------
Datum: Tue, 12 Apr 2011 07:27:42 +0200
Von: taru<[email protected]>
An: [email protected]
Betreff: Re: [ethersex-devel] NET-IO Netzwerk fällt aus
Hallo,

hier ist mal ein Dump vom ENC, vielleicht kann das jemand interpretieren:

(bitte mit Courier formatieren, dann stimmen die Abstände)

running snapshot:
D: RevID: 0x06
D: Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
D:        0x07  0x80  0x81   0x48 0xdb
D: MAC  : MACON1  MACON2  MACON3  MACON4  MAC-Address
D:         0x0d    0x00    0x32    0x00  ac:de:48:10:97:27
D: Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
D:       0x0000 0x0fff   0x05ca  0x0fcf    0x83    0x03 0x01f8
D: Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
D:        0x1000 0x11f4   0x0f     0x37     0x10
D: DMA  : EDMAST EDMAND
D:        0x0000 0x0000

Fehlerfall:
--------------------------------------------------------------------------------------
D: RevID: 0x06
D: Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
D:        0x07  0x80  0x81   0x18 0xdb
D: MAC  : MACON1  MACON2  MACON3  MACON4  MAC-Address
D:         0x00    0x00    0x32    0x00  ac:de:48:10:97:27
D: Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
D:       0x0000 0x0fff   0x0000  0x0000    0x83    0x00 0x01f8
D: Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
D:        0x1000 0x1036   0x0f     0x37     0x10
D: DMA  : EDMAST EDMAND
D:        0x0000 0x0000

D: RevID: 0x06
D: Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
D:        0x07  0x80  0x81   0x18 0xdb
D: MAC  : MACON1  MACON2  MACON3  MACON4  MAC-Address
D:         0x00    0x00    0x32    0x00  ac:de:48:10:97:27
D: Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
D:       0x0000 0x0fff   0x0000  0x0000    0x83    0x00 0x01f8
D: Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
D:        0x1000 0x1036   0x0f     0x37     0x10
D: DMA  : EDMAST EDMAND
D:        0x0000 0x0000

nach Reset:
------------------------------------------------------------------------------------
D: RevID: 0x06
D: Cntrl: ECON1 ECON2 ESTAT  EIR  EIE
D:        0x07  0x80  0x81   0x10 0xdb
D: MAC  : MACON1  MACON2  MACON3  MACON4  MAC-Address
D:         0x0d    0x00    0x32    0x00  ac:de:48:10:97:27
D: Rx   : ERXST  ERXND  ERXWRPT ERXRDPT ERXFCON EPKTCNT MAMXFL
D:       0x0000 0x0fff   0x0000  0x0000    0x83    0x00 0x01f8
D: Tx   : ETXST  ETXND  MACLCON1 MACLCON2 MAPHSUP
D:        0x1000 0x0000   0x0f     0x37     0x10
D: DMA  : EDMAST EDMAND
D:        0x0000 0x0000
OK


Fragen an die Experten:
sollte der ERXRDPT nach den errata-Liste nicht immer ungerade sein?

kann jemand die Dumps interpretieren was da zum Ausfall führt?

Ich habe gesehen, dass es auch im Bugtracker einen Eintrag
zu einem Hänger mit 1w gibt: http://bugs.ethersex.de/view.php?id=128

viele Grüße,

taru










_______________________________________________
Ethersex-devel mailing list
[email protected]
https://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel


_______________________________________________
Ethersex-devel mailing list
[email protected]
https://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel

_______________________________________________
Ethersex-devel mailing list
[email protected]
https://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel


>From a859bcd38943e9cd3a8263cb95d6a8f732d84137 Mon Sep 17 00:00:00 2001
From: cs <cs@hp4100.(none)>
Date: Mon, 18 Apr 2011 21:29:05 +0200
Subject: [PATCH] Network Hangup Problem

Description of the error:
Network chips receiver hangup. Messages can be send, but not received.
ENC dump reveals that register macon1 has lost its content.

Fix:
In the ENC errata sheet see

error #6:
enc28j60_process.c
- Add packet count in rcv loop (pktcnt)

enc28j60.c:
- remove of reset in rx routine (Not mentioned in the errata sheet)

other changes:
enc28j60.c:
- Debug output added  (define DEBUG_REV6_WORKAROUND)
- enc28j60_periodic(void) seem to be obsole, but not yet removed in this patch
  for monitoring purpose. It is also possible that the missing decoupling Caps
  around the ENC are the cause of errors which can be treated by this function.
---
 config.h                             |    1 +
 hardware/ethernet/enc28j60.c         |   44 +++++++++++++++++++++++++++++++--
 hardware/ethernet/enc28j60_process.c |    4 ++-
 3 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/config.h b/config.h
index acdbcbb..e1bf400 100644
--- a/config.h
+++ b/config.h
@@ -25,6 +25,7 @@
 /* network controller hardware bug defines */
 #define ENC28J60_REV4_WORKAROUND
 #define ENC28J60_REV5_WORKAROUND
+#define ENC28J60_REV6_WORKAROUND  /* rev is 6; but microchip calls it B7 */
 
 /* global version defines */
 #if VERSION_STRING_CHOICE == USE_BUILDDATE_VERSION
diff --git a/hardware/ethernet/enc28j60.c b/hardware/ethernet/enc28j60.c
index b8dc5a0..6a240d2 100644
--- a/hardware/ethernet/enc28j60.c
+++ b/hardware/ethernet/enc28j60.c
@@ -38,6 +38,19 @@
 uint8_t enc28j60_current_bank = 0;
 int16_t enc28j60_next_packet_pointer;
 
+#define DEBUG_REV6_WORKAROUND
+#ifdef DEBUG_REV6_WORKAROUND
+ uint8_t macon1 = 0;
+ uint8_t macon3 = 0;
+ uint8_t debug_guard = 0; /* if true, ENC28j60 is in reset process */
+ 
+ #define DEBUG_GUARD debug_guard
+ #define MACON1_PP macon1++
+ #define MACON3_PP macon3++
+#endif
+
+
+
 /* module local macros */
 #ifdef RFM12_IP_SUPPORT
 /* RFM12 uses interrupts which do SPI interaction, therefore
@@ -232,7 +245,7 @@ void reset_controller(void)
 
     /* wait until the controller is ready */
 #ifdef ENC28J60_REV5_WORKAROUND
-    _delay_ms (2);
+    _delay_ms (2);  /* see errata #2: Module Reset */
 #else
     while (!(read_control_register(REG_ESTAT) & _BV(CLKRDY)));
 #endif
@@ -257,6 +270,9 @@ void reset_rx(void)
 
 void init_enc28j60(void)
 {
+#ifdef DEBUG_REV6_WORKAROUND
+    debug_guard=0xff;
+#endif
 
     reset_controller();
 
@@ -351,6 +367,11 @@ void init_enc28j60(void)
     /* set auto-increment bit */
     bit_field_set(REG_ECON2, _BV(AUTOINC));
 
+#ifdef DEBUG_REV6_WORKAROUND
+    debug_guard=0x0;
+#endif
+
+
 }
 
 void switch_bank(uint8_t bank)
@@ -366,10 +387,23 @@ void switch_bank(uint8_t bank)
 void enc28j60_periodic(void) 
 {
     uint8_t mask = _BV(PADCFG0) | _BV(TXCRCEN) | _BV(FRMLNEN);
-
-    if ((read_control_register(REG_MACON3) & mask) != mask) {
+#ifdef DEBUG_REV6_WORKAROUND
+  if (!DEBUG_GUARD) {
+    if (   (read_control_register(REG_MACON3) & mask) != mask ) {
+ 	MACON1_PP;	
+	init_enc28j60();
+	}
+    if (   (read_control_register(REG_MACON1))        != 0x0D  ) {
+	MACON3_PP;
 	init_enc28j60();
     }
+  }
+#else
+    if (   ((read_control_register(REG_MACON3) & mask) != mask  )
+        || ( read_control_register(REG_MACON1)         != 0x0D  ) ) {
+        init_enc28j60();
+    }
+#endif
 }
 
 /* dump out all the interesting registers
@@ -436,6 +470,10 @@ int16_t parse_cmd_enc_dump(char *cmd, char *output, uint16_t len)
         read_control_register(REG_EDMANDH),
         read_control_register(REG_EDMANDL));
 
+#ifdef DEBUG_REV6_WORKAROUND
+    debug_printf("debug: macon1= %d, macon3= %d \n", macon1, macon3);
+#endif
+
     return 0;
 }
 #endif
diff --git a/hardware/ethernet/enc28j60_process.c b/hardware/ethernet/enc28j60_process.c
index a3c080d..7626815 100644
--- a/hardware/ethernet/enc28j60_process.c
+++ b/hardware/ethernet/enc28j60_process.c
@@ -131,7 +131,7 @@ void network_process(void)
     }
 
     /* packet receive flag */
-    if (EIR & _BV(PKTIF)) {
+    if ( (EIR & _BV(PKTIF)) || pktcnt ) {
       if (uip_buf_lock ())
 	return;			/* already locked */
 
@@ -145,9 +145,11 @@ void network_process(void)
 
         bit_field_clear(REG_EIR, _BV(RXERIF));
 
+/* not needed anymore ??
 #ifdef ENC28J60_REV4_WORKAROUND
         init_enc28j60();
 #endif
+*/
 
     }
 
-- 
1.7.0.4

_______________________________________________
Ethersex-devel mailing list
[email protected]
https://list.zerties.org/cgi-bin/mailman/listinfo/ethersex-devel

Antwort per Email an