From 7c19cf2fd10b7c6803183d9bed1b787acb1dc93a Mon Sep 17 00:00:00 2001 From: Henryk Richter Date: Sat, 13 Apr 2019 21:13:28 +0200 Subject: [PATCH] updated ENC624j6net driver - fixes to gcc native and cross compilation settings - implemented hardware based multicast filtering hashes, resulting in less unwanted traffic to our Amigas (especially Bonjour, UPNP and such) - MULTICAST option in envarc:sana2/enc624j6net.config will now allow all multicast traffic as opposed to the default fine grained filtering behaviour --- Driver/baxnet/README.enc | 28 ++- Driver/baxnet/bin/enc624j6net.device | Bin 14808 -> 12804 bytes Driver/baxnet/bin/enc624j6net.device_68000 | Bin 14920 -> 12916 bytes Driver/baxnet/source/Common.mk | 13 +- Driver/baxnet/source/Makefile.enc | 2 +- Driver/baxnet/source/debug.i | 11 +- Driver/baxnet/source/device.c | 9 +- .../baxnet/source/enc624j6net/enc624j6l.asm | 48 +++-- Driver/baxnet/source/enc624j6net/enc624j6l.h | 5 +- Driver/baxnet/source/enc624j6net/hw.c | 175 +++++++++++++++++- Driver/baxnet/source/kprintf.asm | 11 +- Driver/baxnet/source/server.c | 39 ++-- Driver/baxnet/source/smakefile.enc | 2 +- Driver/baxnet/source/version.h | 4 +- 14 files changed, 285 insertions(+), 62 deletions(-) diff --git a/Driver/baxnet/README.enc b/Driver/baxnet/README.enc index 4b760d1..ad44808 100644 --- a/Driver/baxnet/README.enc +++ b/Driver/baxnet/README.enc @@ -44,6 +44,8 @@ PRIORITY=PRI/K/N,BPS/K/N,MTU/K/N,FULLDUPLEX/S,FLOWCONTROL/S,TIMER/K/N,MULTICAST/ note: this switch should not be enabled in normal cases. The module features autoconfiguration that determines speed and duplex automatically. + note(2): see miitool for changing speed/duplex + settings at runtime. PRIORITY - server task priority (default 1) @@ -51,8 +53,8 @@ PRIORITY=PRI/K/N,BPS/K/N,MTU/K/N,FULLDUPLEX/S,FLOWCONTROL/S,TIMER/K/N,MULTICAST/ MTU - maximum transmission unit (default 1500) - MULTICAST - obsolete, kept for config file backwards compatibility with - old driver + MULTICAST - (V2.3+) override fine-grained automatic multicast filtering + and accept all multicast frames (default: off) FLOWCONTROL - enable automatic flow control that throttles incoming data when the hardware buffer gets full @@ -64,6 +66,8 @@ PRIORITY=PRI/K/N,BPS/K/N,MTU/K/N,FULLDUPLEX/S,FLOWCONTROL/S,TIMER/K/N,MULTICAST/ Changelog: ---------- +2.3 - implemented fine grained multicast filter hashes + 2.2 - some more tuning to RX/TX scheduling - added optional debug code to lowlevel routines - removed some obsolete bus transfers @@ -110,11 +114,12 @@ Changelog: Compilation / Development Notes ------------------------------- -Either VBCC or GCC (tested with version 2.95 only) can be used. General -options for compiler usage can be found in Common.mk. Also, you might want -to adapt the paths to your setup (PREFX,SYSINC). In addition to the regular -NDK, the sana2.h is expected in the devices/ subdir of the includes. sana2.h -may be found in the AmiTCP or Roadshow SDK, respectively. +Either VBCC or GCC (tested with version 2.95 only) can be used for +cross-compiles. General options for compiler usage can be found in +Common.mk. Also, you might want to adapt the paths to your setup +(PREFX,SYSINC). In addition to the regular NDK, the sana2.h is expected +in the devices/ subdir of the includes. sana2.h may be found in the +AmiTCP or Roadshow SDK, respectively. Call @@ -125,6 +130,15 @@ for building the device. VBCC note: When calling the GNU Make port supplied with ADE/GG natively on AmigaOS3, please make sure that "vc" is within the search path of "/bin/sh". +Native compilation is also supported for GCC and VBCC. In addition, SAS/C +smakefiles are provided for the hardware targets. + +Call + + smake -f smakefile.enc + +for native building with SAS/C. + Conceptually, the driver was meant to support multiple hardware targets. Therefore, it features a SANA-II frontend (device.c,deviceheader.c,deviceinit.c), a main server running in a task (server.c) and several hardware backends. A new hardware diff --git a/Driver/baxnet/bin/enc624j6net.device b/Driver/baxnet/bin/enc624j6net.device index b8bbdc5feac74ab2e960b16ff6c48a0480b2802d..3dbd74dd267e6d1d6a1688a3c612ae853c03d8d4 100755 GIT binary patch delta 1191 zcmXw(e@t6d6vxlKeSLi`&{eEtFrb%5smQw5N9h<$0tManD5b-0F${IKnNUR&o(Ksc zO?e|^!-Xx#U7~+1Mv2)U{y^kuBxE5K7o0PixR`~I1r~!cH-m&Mi$6B-KBhPM+;ei@ z_nvpoJvVpZjiHxDbL<%_0MH6x`VAmsvcs3T?|hfim^k+-ihM>7RLf(S|PVVo{0i&u>QPuC5jAMrfUW zTv(0f>92)#$V)x0DQtO-F1kd4rM^AreODE>4AV-oA7@2rH&F=pISIwVe3|Tqi?0ga zKHwq~o0F`LmqjHGSr_OcIg0tKR4&TN!`;@y z52Ks7GR4;jnJJXq&PnEfOp60ukjdn{qg;S&#}u?PPH-uR3DJWpe<|30omj%lBy9vy z%~2VkgF6!Jycg+x_dXD1wWzl7FQXxD#nULlFDJ*eJB({5z1_J4)_n?;`XWH;|Nf`+ zsXrhfE{F>$PACHoK1$$}JM`fIM-rUy4R8&gf=rHtMia*kq1(t*jztdL2BGOT*khHX zN#*0Pc>`-M4Zt{owP6u%z1d@$8|>MU9_#@$#|qh(7tjXlw7h`PjI9>ZB(knb&3tA+aAXRv9U&bmXHcq1l|PFQCWi8@QhBmsv` zciR5HOF{$lavt8W2lL_O@OzQo$m@|_7MWw&3-n5fL@({h$2_Ksd#bSc3Ux}a9=%2iXRHABwe52<(lA&vHhy!KmWOy#8!@p)`TaW z+5Y1R(yv7-jS`jxziVwy$W0ah}1R9l|su#qcoLH`fMZh5o+pEHdf+Rmai4 DIb&17 delta 1871 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.io_Error = S2ERR_NO_ERROR; ioreq->ios2_WireError = S2WERR_GENERIC_ERROR;*/ - D(("BeginIO command %ld unit %ld\n",(LONG)ioreq->ios2_Req.io_Command,unit)); + /* heavy debug on beginIO */ + D2(("BeginIO command %ld unit %ld\n",(LONG)ioreq->ios2_Req.io_Command,unit)); switch( ioreq->ios2_Req.io_Command ) { diff --git a/Driver/baxnet/source/enc624j6net/enc624j6l.asm b/Driver/baxnet/source/enc624j6net/enc624j6l.asm index 43ba47c..6ab6e43 100755 --- a/Driver/baxnet/source/enc624j6net/enc624j6l.asm +++ b/Driver/baxnet/source/enc624j6net/enc624j6l.asm @@ -1,3 +1,4 @@ +;APS00000000000000000000000000000000000000000000000000000000000000000000000000000000 ; ------------------------------------------------------------------------------ ; | Lowlevel Access to memory mapped ENC624J600 in PSP mode | ; | Henryk Richter | @@ -19,19 +20,25 @@ ; - _enc624j6l_RXReset -> won't recover from totally unresponsive chip (but exits gracefully) ; ; enable debugging code block (comment/uncomment, see below) -DEBUG EQU 1 +DEBUG EQU 0 GLOBALINT_BOARD EQU 1 ;if 1, then toggle board interrupt, else ENC624 INTIE incdir src:baxnet/trunk/source/ ;Temp:Amiga/src/Zorro-LAN-IDE.git/Driver/enc624j6net/ include "enc624j6net/registers.i" include "enc624j6net/macros.i" - include "debug.i" ifnd DEBUG DEBUG EQU 0 endc + ifne 1 + include "debug.i" + else +WRITEDEBUG macro + nop + endm + endc ; ADD_4RX EQU 1 ;add 4 to valid RX size (fake CRC), fixes shapeshifter RAW treatment _OPT_LONGRESET EQU 0 ;in testing, don't enable @@ -134,12 +141,6 @@ _LVOSignal EQU -324 section code,code - - - - - - ; ----------------------------------------------------------------------------- ; | | ; | Test/Debug code | @@ -277,7 +278,13 @@ regtests: READREG ESTAT,a0,d0 READREG ECON1,a0,d1 READREG MACON2,a0,d2 - READREG MABBIPG,a0,d3 +; READREG MABBIPG,a0,d3 + + READREG ERXFCON,a0,d3 + READREG EHT1,a0,d4 + READREG EHT2,a0,d5 + READREG EHT3,a0,d6 + READREG EHT4,a0,d7 rts @@ -587,6 +594,7 @@ _enc624j6l_Init: WRITEREG ERXST,a0,d0 ;set RX start pointer (end will be $5fff) WRITEREG PNextPacket,a0,d0 ;set user read pointer + suba.l a1,a1 ;no multicast hash table (yet) bsr _enc624j6l_bc_mc_filter ;in: A0/D1, out: D0 move #RXSTOP_INIT&$fffe,d0 @@ -644,6 +652,7 @@ _enc624j6l_Init: ; ; in: A0 - board base ; D1 - init flags +; A1 - multicast hash table (4x USHORT) ;out: D0 >0 = OK ; <=0 = FAIL _enc624j6l_bc_mc_filter: @@ -658,15 +667,32 @@ _enc624j6l_bc_mc_filter: move #ERXFCON_NOTMEEN|ERXFCON_MCEN|ERXFCON_BCEN|ERXFCON_UCEN|ERXFCON_MPEN|ERXFCON_CRCEN|ERXFCON_RUNTEN,d0 bra.s .setfilter .no_promisc: - moveq #PIO_INIT_MULTI_CAST,d0 + moveq #PIO_INIT_MULTI_CAST,d0 ;all multicast ? and d1,d0 beq.s .no_multicast move #ERXFCON_MCEN|ERXFCON_BCEN|ERXFCON_UCEN|ERXFCON_MPEN|ERXFCON_CRCEN|ERXFCON_RUNTEN,d0 bra.s .setfilter .no_multicast: move #ERXFCON_BCEN|ERXFCON_UCEN|ERXFCON_MPEN|ERXFCON_CRCEN|ERXFCON_RUNTEN,d0 + + ; did we get a multicast hash table ? + move.l a1,d1 + beq.s .nohashes + AND #$ffff-ERXFCON_MCEN,d0 ;don't accept ALL multicast + OR #ERXFCON_HTEN,d0 ;enable multicast hash table filter + + move (a1),d1 + WRITEREG EHT1,a0,d1 + move 2(a1),d1 + WRITEREG EHT2,a0,d1 + move 4(a1),d1 + WRITEREG EHT3,a0,d1 + move 6(a1),d1 + WRITEREG EHT4,a0,d1 +.nohashes: + .setfilter: - WRITEREG ERXFCON,a0,d0 ;set filter TODO: pattern matching stuff + WRITEREG ERXFCON,a0,d0 ;set filter moveq #1,d0 .rts: diff --git a/Driver/baxnet/source/enc624j6net/enc624j6l.h b/Driver/baxnet/source/enc624j6net/enc624j6l.h index 57dc715..9a7bd27 100644 --- a/Driver/baxnet/source/enc624j6net/enc624j6l.h +++ b/Driver/baxnet/source/enc624j6net/enc624j6l.h @@ -239,8 +239,9 @@ ASM SAVEDS int enc624j6l_SetOnline( ASMR(a0) void *board ASMREG(a0) ); >=0 - OK */ ASM SAVEDS int enc624j6l_bc_mc_filter( - ASMR(a0) void *board ASMREG(a0), - ASMR(d1) unsigned long flags ASMREG(d1) ); + ASMR(a0) void *board ASMREG(a0), + ASMR(d1) unsigned long flags ASMREG(d1), + ASMR(a1) unsigned short *mc_hashes ASMREG(a1)); /* diff --git a/Driver/baxnet/source/enc624j6net/hw.c b/Driver/baxnet/source/enc624j6net/hw.c index d4c7603..70d0259 100644 --- a/Driver/baxnet/source/enc624j6net/hw.c +++ b/Driver/baxnet/source/enc624j6net/hw.c @@ -30,6 +30,7 @@ extern const BYTE DeviceName[]; /* use generic board fields in current unit */ #define duh_online du_hwl0 #define duh_BASE du_hwp0 +#define duh_RefCount du_hwl1 #define HW_INTERVALDEF 100000L @@ -105,7 +106,7 @@ ASM SAVEDS LONG hw_Find_Boards( ASMR(a0) DEVBASEP ASMREG(a0) ) /* bring board to sane state (i.e. perform soft reset) */ /* if( boardbase < (APTR)0x40000000 ) */ /* debug only */ - enc624j6l_CheckBoard( boardbase ); + enc624j6l_CheckBoard( boardbase ); } ret = i; D(("%ld boards found\n",ret)); @@ -119,7 +120,33 @@ ASM SAVEDS LONG hw_Find_Boards( ASMR(a0) DEVBASEP ASMREG(a0) ) ASM SAVEDS LONG hw_AllocBoard( ASMR(a0) DEVBASEP ASMREG(a0), ASMR(d0) ULONG unit ASMREG(d0) ) { - /* is there a way to lock a ZII Board ? */ +#if 0 + LONG i; + struct ConfigDev *cfg = (0); + + if( unit > db->db_NBoards ) + return 0; + + for( i=0 ; i < db->db_NBoards ; i++ ) + { + cfg = FindConfigDev( cfg, ENC_MANUFACTURER, ENC_BOARD ); + if( !cfg ) + return 0; + if( (APTR)cfg->cd_BoardAddr == db->db_Units[unit].duh_BASE ) + break; + } + + if( (APTR)cfg->cd_BoardAddr != db->db_Units[unit].duh_BASE ) + return 0; + + if( db->db_Units[unit].duh_RefCount == 0 ) + { + ObtainConfigBinding(); + + ReleaseConfigBinding(); + } + db->db_Units[unit].duh_RefCount++; +#endif return 1; } @@ -127,6 +154,20 @@ ASM SAVEDS LONG hw_AllocBoard( ASMR(a0) DEVBASEP ASMREG(a0), ASM SAVEDS LONG hw_ReleaseBoard( ASMR(a0) DEVBASEP ASMREG(a0), ASMR(d0) ULONG unit ASMREG(d0) ) { +#if 0 + if( unit > db->db_NBoards ) + return 0; + + for( i=0 ; i < db->db_NBoards ; i++ ) + { + cfg = FindConfigDev( cfg, ENC_MANUFACTURER, ENC_BOARD ); + if( !cfg ) + return 0; + if( (APTR)cfg->cd_BoardAddr == db->db_Units[unit].duh_BASE ) + break; + } + +#endif return 1; } @@ -427,27 +468,143 @@ ASM SAVEDS LONG hw_write_phy( ASMR(a0) DEVBASEP ASMREG( return enc624j6l_WritePHY( boardbase, reg, value ); } +/* + calculate CRC32 for MAC address hashing + slow but relatively short (and can be adapted to other + polynoms easily) +*/ +ASM ULONG myhw_CRC32( ASMR(a0) UBYTE *buffer ASMREG(a0), + ASMR(d0) ULONG nbytes ASMREG(d0) ) +{ + UWORD i,j; + ULONG t,crc = 0xffffffff; + ULONG poly = 0x04c11db7; + + for( j = 0 ; j < nbytes ; j++ ) + { + for( i = 0 ; i < 8 ; i++ ) + { + t = crc>>31; + crc <<= 1; + if( ( t ^ ( buffer[j] >> i ) ) & 0x01 ) + crc ^= poly; + } + } + + return crc; +} + +#if 0 +ASM ULONG CMPgeMAC( ASMR(a0) UBYTE *cur ASMREG(a0), + ASMR(a1) UBYTE *cmp ASMREG(a1) ) +{ + USHORT i; + ULONG res = 1; + + for( i = 0 ; i < 6 ; i++ ) + { + if( cur[i] > cmp[i] ) + break; + if( cur[i] < cmp[i] ) + { + res = 0; + break; + } + } + return res; +} +#endif + +ASM ULONG CMPleMAC( ASMR(a0) UBYTE *cur ASMREG(a0), + ASMR(a1) UBYTE *cmp ASMREG(a1) ) +{ + USHORT i; + ULONG res = 1; + + for( i = 0 ; i < 6 ; i++ ) + { + if( cur[i] < cmp[i] ) + break; + if( cur[i] > cmp[i] ) + { + res = 0; + break; + } + } + return res; +} +ASM void INCMAC( ASMR(a0) UBYTE *curmc ASMREG(a0) ) +{ + SHORT i; + for( i=5 ; i >= 0 ; i-- ) + { + curmc[i]++; + if( curmc[i] != 0 ) + { + break; + } + } +} +/* TODO: implement Multicast hashing */ ASM SAVEDS LONG hw_change_multicast( ASMR(a0) DEVBASEP ASMREG(a0), ASMR(d0) ULONG unit ASMREG(d0), ASMR(a1) struct List *mcastlist ASMREG(a1) ) { - /* TODO: implement Multicast hashing */ - APTR boardbase = db->db_Units[unit].duh_BASE; - ULONG flags; + APTR boardbase = db->db_Units[unit].duh_BASE; + struct HWData *hwd = &db->db_hwdat; + ULONG flags; + ULONG crc,curhash; + USHORT mc_hashes[4] = {0,0,0,0}; /* EHT1, EHT2, EHT3, EHT4 */ + USHORT *hash_tab; + struct MCastEntry *mc; + UBYTE *curmc; flags = PIO_INIT_BROAD_CAST; if( db->db_Units[0].du_Flags & DUF_PROMISC ) flags |= PIO_INIT_PROMISC; - /* list non-empty ? (kludge right now, can be done more fine grained) */ - if( mcastlist->lh_Head->ln_Succ ) + if( hwd->multicast ) /* accept ALL multicast ? (config option) */ flags |= PIO_INIT_MULTI_CAST; - enc624j6l_bc_mc_filter(boardbase, flags );/* flags & (PIO_INIT_BROAD_CAST|PIO_INIT_MULTI_CAST) ); */ + /* list non-empty ? */ + hash_tab = NULL; + if( mcastlist->lh_Head->ln_Succ ) + { + /* flags |= PIO_INIT_MULTI_CAST; */ /* see above */ + hash_tab = mc_hashes; + + for( mc = (struct MCastEntry *)mcastlist->lh_Head; + mc->mce_Node.mln_Succ ; + mc=(struct MCastEntry*)mc->mce_Node.mln_Succ ) + { + curmc = mc->mce_start; + while( CMPleMAC( curmc, mc->mce_stop ) ) + { + D(("CMPleMAC %ld %02lx%02lx%02lx%02lx%02lx%02lx - %02lx%02lx%02lx%02lx%02lx%02lx\n",\ + CMPleMAC( curmc, mc->mce_stop ),\ + (ULONG)curmc[0],(ULONG)curmc[1],\ + (ULONG)curmc[2],(ULONG)curmc[3],\ + (ULONG)curmc[4],(ULONG)curmc[5],\ + (ULONG)mc->mce_stop[0],(ULONG)mc->mce_stop[1],\ + (ULONG)mc->mce_stop[2],(ULONG)mc->mce_stop[3],\ + (ULONG)mc->mce_stop[4],(ULONG)mc->mce_stop[5] \ + )); + + crc = myhw_CRC32( mc->mce_start, 6 ); + curhash = (crc & 0x1f800000)>>23; /* 2 bit reg, 4 bit hash pos in reg */ + mc_hashes[ ((curhash >> 4)&3) ] |= 1<<(curhash&0xf); + INCMAC( curmc ); + } + } + } + + D(("hw_change_multicast board %lx flags %lx hashtab %lx\n",(ULONG)boardbase,(ULONG)flags,(ULONG)hash_tab)); + + enc624j6l_bc_mc_filter(boardbase, flags, hash_tab );/* flags & (PIO_INIT_BROAD_CAST|PIO_INIT_MULTI_CAST) ); */ return 1; } @@ -494,7 +651,7 @@ void myhw_ControlInterrupts( DEVBASEP ) hwd->hwd_Interrupt.is_Code = (void(*)())enc624j6l_IntServer_List; hwd->hwd_Interrupt.is_Data = &hwd->hwd_act_boards[0]; hwd->hwd_Interrupt.is_Node.ln_Type = NT_INTERRUPT; - hwd->hwd_Interrupt.is_Node.ln_Pri = 51; + hwd->hwd_Interrupt.is_Node.ln_Pri = 126; /* 51; */ hwd->hwd_Interrupt.is_Node.ln_Name = (char*)intname; AddIntServer( HW_INTSOURCE, &hwd->hwd_Interrupt ); } diff --git a/Driver/baxnet/source/kprintf.asm b/Driver/baxnet/source/kprintf.asm index f47a42f..faaae90 100644 --- a/Driver/baxnet/source/kprintf.asm +++ b/Driver/baxnet/source/kprintf.asm @@ -14,11 +14,18 @@ _LVORawIOInit equ -$1f8 _LVORawMayGetChar equ -$1fe endc - XDEF _KPrintF +; XDEF _KPrintF + XDEF _KPrintFa0a1 + +;_KPrintF: + rts + move.l 4(sp),a0 + lea 8(sp),a1 + ; fall through ;A0 = format ;A1 = arguments -_KPrintF: +_KPrintFa0a1: ; ifd DEBUG movem.l d0-d2/a0-a3/a6,-(sp) diff --git a/Driver/baxnet/source/server.c b/Driver/baxnet/source/server.c index b3637b6..fa9ee40 100644 --- a/Driver/baxnet/source/server.c +++ b/Driver/baxnet/source/server.c @@ -41,6 +41,12 @@ static LONG server_queryext( DEVBASEP, ULONG unit, struct IOSana2Req *ioreq ); /* this limits the number of processed read requests per run when enabled */ #define ONE_READ_REQ 2 +/* heavy debug on read/write */ +#define D2(x) +#define D4(x) +/* #define D2(x) D(x) */ +/* #define D4(x) D(x) */ + /* (avoid external link libraries) this call is not time critical */ @@ -384,6 +390,15 @@ static LONG server_changeMulticast( DEVBASEP, ULONG unit, struct IOSana2Req *ior COPYMAC( entry->mce_start, ioreq->ios2_SrcAddr ); COPYMAC( entry->mce_stop, ioreq->ios2_SrcAddr ); + D(("ADD Multicast MAC %02lx%02lx%02lx%02lx%02lx%02lx - %02lx%02lx%02lx%02lx%02lx%02lx\n",\ + (ULONG)entry->mce_start[0],(ULONG)entry->mce_start[1],\ + (ULONG)entry->mce_start[2],(ULONG)entry->mce_start[3],\ + (ULONG)entry->mce_start[4],(ULONG)entry->mce_start[5],\ + (ULONG)entry->mce_stop[0],(ULONG)entry->mce_stop[1],\ + (ULONG)entry->mce_stop[2],(ULONG)entry->mce_stop[3],\ + (ULONG)entry->mce_stop[4],(ULONG)entry->mce_stop[5] \ + )); + ADDTAIL( &db->db_svdat.sv_mclist, entry ); apply: @@ -715,7 +730,7 @@ static LONG write_frame( DEVBASEP, ULONG unit, struct IOSana2Req *ioreq ) UBYTE *header_ptr; #endif - D(("write: type %08lx, size %ld\n",ioreq->ios2_PacketType, + D2(("write: type %08lx, size %ld\n",ioreq->ios2_PacketType, ioreq->ios2_DataLength)); frame = db->db_svdat.sv_frame; @@ -765,13 +780,13 @@ static LONG write_frame( DEVBASEP, ULONG unit, struct IOSana2Req *ioreq ) if( (*dbm->dbm_CopyFromBuffer32)(copy_ptr,ioreq->ios2_Data, ioreq->ios2_DataLength) ) { send: - D(("+hw_send\n")); + D2(("+hw_send\n")); #ifdef HW_DMA_TX ret = hw_send_frame(db, unit, copy_ptr, framesize, header_ptr ) ? SERR_OK:SERR_ERROR; #else ret = hw_send_frame(db, unit, frame, framesize ) ? SERR_OK : SERR_ERROR; #endif - D(("-hw_send\n")); + D2(("-hw_send\n")); } else { @@ -892,14 +907,14 @@ static void server_read_frame( DEVBASEP, ULONG unit, struct IOSana2Req *ioreq, U { frame += 14; /* skip DST,SRC,Type */ framesize -= 18; /* also remove CRC */ - D(("plain mode: frame flags %ld\n",bcflag)); + D4(("plain mode: frame flags %ld\n",bcflag)); } ioreq->ios2_Req.io_Flags &= SANA2IOF_RAW; /* ignore all other flags */ ioreq->ios2_Req.io_Flags |= bcflag; ioreq->ios2_Req.io_Error = 0; ioreq->ios2_WireError = 0; - D(("ReadFrm IO %lx, DBM %lx frm %lx frmsz %ld\n",(ULONG)ioreq,(ULONG)dbm,(ULONG)frame,framesize)); + D4(("ReadFrm IO %lx, DBM %lx frm %lx frmsz %ld\n",(ULONG)ioreq,(ULONG)dbm,(ULONG)frame,framesize)); if( dbm->dbm_PacketFilter ) /* Filter Packets ? */ { @@ -918,7 +933,7 @@ static void server_read_frame( DEVBASEP, ULONG unit, struct IOSana2Req *ioreq, U ioreq->ios2_WireError = S2WERR_BUFF_ERROR; } } - D(("Copied io_Error %ld\n",(LONG)ioreq->ios2_Req.io_Error)); + D4(("Copied io_Error %ld\n",(LONG)ioreq->ios2_Req.io_Error)); Remove( (struct Node*)ioreq ); svTermIO( db, ioreq ); @@ -946,7 +961,7 @@ static LONG server_readqueue( DEVBASEP, ULONG unit ) /* TODO: devstats */ frametype = *( (USHORT*)(frame+12) ); - D(("Have Frame size %ld type %ld\n",framesize,frametype)); + D4(("Have Frame size %ld type %ld\n",framesize,frametype)); ObtainSemaphore( &db->db_Units[unit].du_Sem ); @@ -964,14 +979,14 @@ orphan: ioreq = (struct IOSana2Req *)GetHead( (struct List*)&db->db_Units[unit].du_ReadOrphans ); if( ioreq ) { - D(("Orphaned Frame\n")); + D4(("Orphaned Frame\n")); ioreq->ios2_PacketType = frametype; server_read_frame( db, unit, ioreq, frame, framesize ); } else { - D(("No ioreq for orphaned frame\n")); + D4(("No ioreq for orphaned frame\n")); } goto nextframe; @@ -1005,7 +1020,7 @@ havetype: { db->db_Units[unit].du_DevStats.Overruns++; type->srt_Sana2PacketTypeStats.PacketsDropped++; - D(("No Reader for frame\n")); + D4(("No Reader for frame\n")); goto orphan; /* does it help if we give the frame to the orphan list? */ } nextframe: @@ -1094,9 +1109,9 @@ VOID SAVEDS ServerTask(void) } if( hw_recv_pending(db,i) ) { - D(("Read on unit %ld start\n",i)); + D4(("Read on unit %ld start\n",i)); server_readqueue( db, i ); - D(("Read on unit %ld stop\n",i)); + D4(("Read on unit %ld stop\n",i)); action = 1; } } diff --git a/Driver/baxnet/source/smakefile.enc b/Driver/baxnet/source/smakefile.enc index d94eef3..8a078ba 100644 --- a/Driver/baxnet/source/smakefile.enc +++ b/Driver/baxnet/source/smakefile.enc @@ -46,7 +46,7 @@ ASMDEFS1 = -DHW_DMA_TX=1 ############################################################################### # debug = 1 will include string debugging for terminal/sushi/sashimi # not enabled yet in SAS/C makefile -debug = 0 +#debug = 0 ############################################################################### # prefix for system includes (ASM) diff --git a/Driver/baxnet/source/version.h b/Driver/baxnet/source/version.h index 9a10d60..497f59b 100644 --- a/Driver/baxnet/source/version.h +++ b/Driver/baxnet/source/version.h @@ -9,9 +9,9 @@ #define _INC_VERSION_H #define DEVICEVERSION 2 -#define DEVICEREVISION 2 +#define DEVICEREVISION 3 #define DEVICEEXTRA /* #define DEVICEEXTRA Beta */ -#define DEVICEDATE 10.03.2019 +#define DEVICEDATE 04.04.2019 #endif