From 52ba722800c267e71c8df88a1e76b3fb68c10dfd Mon Sep 17 00:00:00 2001 From: Henryk Richter Date: Mon, 2 Mar 2026 10:41:17 +0100 Subject: [PATCH] Updated Zorro-LAN-IDE Driver to 2.15 - Multicast fixes - new Microchip OUIs added to verification table --- Driver/baxnet/README | 26 +- Driver/baxnet/README.enc | 41 +- Driver/baxnet/bin/enc624j6net.device | Bin 12768 -> 14060 bytes Driver/baxnet/bin/enc624j6net.device_68000 | Bin 13216 -> 14180 bytes Driver/baxnet/bin/miitool | Bin Driver/baxnet/source/Common.mk | 8 +- Driver/baxnet/source/Makefile.enc | 10 +- Driver/baxnet/source/Makefile.v4 | 50 +++ Driver/baxnet/source/Makefile.vwiz | 51 +++ Driver/baxnet/source/device.c | 176 ++++++-- Driver/baxnet/source/device.h | 5 + Driver/baxnet/source/device.i | 1 + .../baxnet/source/enc624j6net/enc624j6l.asm | 383 +++++++++++++++++- Driver/baxnet/source/enc624j6net/enc624j6l.h | 1 + Driver/baxnet/source/enc624j6net/hw.c | 88 +++- Driver/baxnet/source/enc624j6net/hwprivate.h | 3 +- Driver/baxnet/source/enc624j6net/macros.i | 4 +- Driver/baxnet/source/kprintf.asm | 22 +- Driver/baxnet/source/miitool.c | 6 +- Driver/baxnet/source/mmustuff.c | 109 +++++ Driver/baxnet/source/mmustuff.h | 30 ++ Driver/baxnet/source/server.c | 22 +- Driver/baxnet/source/smakefile.enc | 3 +- Driver/baxnet/source/smakefile.v4 | 165 ++++++++ Driver/baxnet/source/smakefile.vwiz | 169 ++++++++ Driver/baxnet/source/version.h | 4 +- 26 files changed, 1284 insertions(+), 93 deletions(-) mode change 100644 => 100755 Driver/baxnet/bin/enc624j6net.device mode change 100644 => 100755 Driver/baxnet/bin/enc624j6net.device_68000 mode change 100644 => 100755 Driver/baxnet/bin/miitool create mode 100644 Driver/baxnet/source/Makefile.v4 create mode 100644 Driver/baxnet/source/Makefile.vwiz create mode 100644 Driver/baxnet/source/mmustuff.c create mode 100644 Driver/baxnet/source/mmustuff.h create mode 100644 Driver/baxnet/source/smakefile.v4 create mode 100644 Driver/baxnet/source/smakefile.vwiz diff --git a/Driver/baxnet/README b/Driver/baxnet/README index b9e8b62..5c70646 100644 --- a/Driver/baxnet/README +++ b/Driver/baxnet/README @@ -1,17 +1,29 @@ -Short: V2.00, SANA-II network drivers for several adapters +Short: V2.15, SANA-II network drivers for several adapters Author: Henryk Richter Uploader: henryk.richter@gmx.net Type: driver/net Architecture: m68k-amigaos Requires: OS 2.04+ -This package contains network drivers for the following hardware: -- ZII LAN IDE CP (matze, scrat and buggs @a1k.org) +This package contains network drivers and test utilities for the +following hardware: + +- ZII LAN IDE CP (matze and buggs @a1k.org) OSS Zorro-II card with ENC624J600 ethernet controller, autoboot - IDE and Clockport + IDE and Clockport (see https://gitlab.com/MHeinrichs/Zorro-LAN-IDE) + - Vampire500/600 with ENC28J60 module connected to the SD-card slot -- Vampire500V2+ with ENC28J60 module connected to the expansion port + (sdnet.device) -Full source code is included. Please refer to README.sdnet and -README.enc for installation and operation instructions +- Vampire500V2+ or Vampire1200V2 with ENC28J60 module connected to + the expansion port (v2expeth.device) + +- Vampire500V2+ with Wiznet W5500 module connected to the expansion + port (requires adapter PCB) + +- VampireV4 (assumes HW registers didn't change since the time of my + initial implementation, YMMV) + +Full source code (GPL V3) is included. Please refer to README.sdnet +and README.enc for installation and operation instructions. diff --git a/Driver/baxnet/README.enc b/Driver/baxnet/README.enc index 97d548d..31235c9 100644 --- a/Driver/baxnet/README.enc +++ b/Driver/baxnet/README.enc @@ -1,10 +1,9 @@ -ENC624J6Net - A SANA-II driver for the Scratze card +ENC624J6Net - A SANA-II driver for the Zorro-LAN-IDE card ENC624J6Net Copyright (C) 2018 Henryk Richter This driver is supposed to support ENC624J600 based ethernet on the -ZII LAN IDE CP card designed by Matze (a1k.org), Buggs (a1k.org) -and Scrat (a1k.org). +ZII LAN IDE CP card designed by Matze (a1k.org) and Buggs (a1k.org). Please see at the end of the file for information about licensing conditions. @@ -23,8 +22,8 @@ the 68000/68010 version to enc624j6net.device before use. So far, successful tests have been done with the free AmiTCP/IP 3.0b2, AmiTCP4.0-4.2, Genesis, MiamiDX and RoadShow. -The Zorro board itself should be visible in early startup with manufacturer -ID 2588 and card ID 123. +The Zorro board itself should be visible in Early Startup and ShowConfig +with manufacturer ID 2588 and card ID 123. @@ -34,10 +33,10 @@ Configuration options No special configuration of the driver is necessary for normal operation. The configuration options outlined below are documented for tuning purposes. -The config to be placed in ENVARC:sana2/enc624j6net.config and consists +The config is to be placed in ENVARC:sana2/enc624j6net.config and consists of a single line with parameters (much like CLI parameters). -PRIORITY=PRI/K/N,BPS/K/N,MTU/K/N,FULLDUPLEX/S,FLOWCONTROL/S,TIMER/K/N,MULTICAST/S +PRIORITY=PRI/K/N,BPS/K/N,MTU/K/N,FULLDUPLEX/S,FLOWCONTROL/S,TIMER/K/N,MULTICAST/S,MAC/K FULLDUPLEX - change Ethernet module into full duplex mode, caution: requires manual configuration of duplex mode @@ -60,13 +59,41 @@ PRIORITY=PRI/K/N,BPS/K/N,MTU/K/N,FULLDUPLEX/S,FLOWCONTROL/S,TIMER/K/N,MULTICAST/ FLOWCONTROL - enable automatic flow control that throttles incoming data when the hardware buffer gets full + MAC - explicitly set MAC address (default: read from hardware), + use hexadecimal notation like AA:BB:CC:DD:EE:FF + example (useful for DSL via PPPoE with AmiTCP): echo "MTU=1492 PRIORITY=6" >ENVARC:sana2/enc624j6net.config +Troubleshooting: +---------------- + +It has been reported that the MMU.library marked the LAN part +of the card as invalid in at least one Zorro-III configuration +such that the respective I/O space got inaccessible to the driver. +Should "muscan" report "I/O space Invalid" for the slot assigned +to the card (compare with "showConfig" or "Scout->Expansions"),then +an additional line in the MMU configuration file might help. Add +the following to the MMU-Configuration: + +For 2588 123 SetCacheMode {base} 0x10000 Valid CacheInhibit IOSpace Changelog: ---------- +2.15 - fixed multicast mapping code + - added recent Microchip OUIs to MAC address validation list + (2020 and later) + - disabled automatic MMU configuration as commonly redundant + +2.13 - explicit MMU parameters for LAN address space, if mmu.library + is present in the system + +2.11 - try to finish up auto neg and duplex setup when going online + - improved startup/shutdown of the server process + +2.10 - option to set MAC address for first board explicitly + 2.9 - better support for Envoy: automatically select a higher task priority in presence of Envoy services diff --git a/Driver/baxnet/bin/enc624j6net.device b/Driver/baxnet/bin/enc624j6net.device old mode 100644 new mode 100755 index a72d62089d7779bd5fbf544a28c8350763a59f81..6f798bb6d6d67edf5ac0994a62e3b11f0d5962a7 GIT binary patch literal 14060 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 literal 12768 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 literal 13216 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 Ef0rBX>;M1& diff --git a/Driver/baxnet/bin/miitool b/Driver/baxnet/bin/miitool old mode 100644 new mode 100755 diff --git a/Driver/baxnet/source/Common.mk b/Driver/baxnet/source/Common.mk index e2579df..751a373 100644 --- a/Driver/baxnet/source/Common.mk +++ b/Driver/baxnet/source/Common.mk @@ -27,8 +27,8 @@ compiler_vcc = 0 # prefix for system includes (ASM) # native AmigaOS compilation: set PREFX=GG: or PREFX=ADE:, depending on toolchain ############################################################################### -#PREFX = /opt/amigaos-68k/ -PREFX = gg: +PREFX = /opt/amigaos-68k/ +#PREFX = gg: SYSINC = $(PREFX)os-include ############################################################################### @@ -39,8 +39,9 @@ SYSINC = $(PREFX)os-include ifeq ($(compiler_vcc),1) # VBCC (use explicit vlink line for LINK= if complaints about R_PC happen) +# -Rshort CCX = vc -LINK = vlink -bamigahunk -x -s -mrel -Cvbcc -Bstatic -nostdlib #-Rshort +LINK = vlink -bamigahunk -x -s -mrel -Cvbcc -Bstatic -nostdlib -Rshort LINKEXE = vlink -bamigahunk -x -s -mrel -Cvbcc -Bstatic #LINK = $(CCX) -nostdlib CFLAGS = -Os -+ -sc -c99 -cpu=$(CPU) @@ -138,6 +139,7 @@ ifeq ($(debug),1) CFLAGS += -DDEBUG -g CFLAGS2 += -DDEBUG -g #LINKLIBS = -L$(PREFX)/lib -ldebug +#ASMOBJECTS += kprintf.o endif ############################################################################### diff --git a/Driver/baxnet/source/Makefile.enc b/Driver/baxnet/source/Makefile.enc index d560df1..86f45ae 100644 --- a/Driver/baxnet/source/Makefile.enc +++ b/Driver/baxnet/source/Makefile.enc @@ -23,7 +23,7 @@ #DEVICEREVISION=95 #DEVICEDATE=08.09.2018 SUBDIR=enc624j6net -ASMOBJECTS = $(SUBDIR)/enc624j6l.o $(SUBDIR)/intervaltimer.o kprintf.o +ASMOBJECTS = $(SUBDIR)/enc624j6l.o $(SUBDIR)/intervaltimer.o kprintf.o #mmustuff.o ############################################################################### # Devices to build (1 or 2, keep DEVICEID2 empty if only one build is desired) @@ -31,13 +31,13 @@ ASMOBJECTS = $(SUBDIR)/enc624j6l.o $(SUBDIR)/intervaltimer.o kprintf.o ############################################################################### DEVICEID=enc624j6net.device -DEFINES = -DHW_DMA_TX # -DPROTO_V2EXPNET -ASMDEFS = -DHW_DMA_TX # -DPROTO_V2EXPNET +DEFINES = -DHW_DMA_TX #-DUSEMMU # +ASMDEFS = -DHW_DMA_TX # CPU = 68060 DEVICEID2=enc624j6net.device_68000 -DEFINES2 = # -DPROTO_V2EXPNET -ASMDEFS2 = # -DPROTO_V2EXPNET +DEFINES2 = # +ASMDEFS2 = # CPU2 = 68000 SAME_DEVNAME=1 diff --git a/Driver/baxnet/source/Makefile.v4 b/Driver/baxnet/source/Makefile.v4 new file mode 100644 index 0000000..c5351f4 --- /dev/null +++ b/Driver/baxnet/source/Makefile.v4 @@ -0,0 +1,50 @@ +############################################################################### +# +# VAMPIREGFX makefile for vbcc +# +# author: Henryk Richter +# +# concept: +# +# tools required: +# - vbcc, defaulting to m68k-amigaos +# - vlink +# - vasm +# +# porting: +# +############################################################################### + +############################################################################### +# Date, version, extra objects to build +# +############################################################################### +#DEVICEVERSION=1 +#DEVICEREVISION=95 +#DEVICEDATE=08.09.2018 +SUBDIR=v4net +ASMOBJECTS = $(SUBDIR)/vampuuid.o $(SUBDIR)/v4l.o $(SUBDIR)/intervaltimer.o kprintf.o + +############################################################################### +# Devices to build (1 or 2, keep DEVICEID2 empty if only one build is desired) +# +############################################################################### + +DEVICEID=v4net.device +DEFINES = #-DHW_DMA_TX # -DPROTO_V2EXPNET +ASMDEFS = #-DHW_DMA_TX # -DPROTO_V2EXPNET +CPU = 68060 + +#DEVICEID2=v4net.device_68000 +#DEFINES2 = # -DPROTO_V2EXPNET +#ASMDEFS2 = # -DPROTO_V2EXPNET +#CPU2 = 68000 +#SAME_DEVNAME=1 + +############################################################################### +# import generic ruleset +# +############################################################################### +include Common.mk + + diff --git a/Driver/baxnet/source/Makefile.vwiz b/Driver/baxnet/source/Makefile.vwiz new file mode 100644 index 0000000..dff25a5 --- /dev/null +++ b/Driver/baxnet/source/Makefile.vwiz @@ -0,0 +1,51 @@ +############################################################################### +# +# VWiznet build instructions +# +# author: Henryk Richter +# +# concept: +# this makefile is intended mainly for cross compilation, +# although building on AmigaOS works (see Common.mk) +# +# tools required: +# - vbcc or m68k-amigaos-gcc (Default: gcc) +# - vlink or GNU ld +# - vasm (vasmm68k_mot) +# - system headers (default: /opt/amigaos-68k/os-include, see Common.mk) +# +# porting: +# see smakefile for native building using SAS/C +# +############################################################################### + +############################################################################### +# Name, version +# +############################################################################### +#DEVICEVERSION=1 +#DEVICEREVISION=95 +#DEVICEDATE=09.09.2018 +#DEVICEEXTRA=Beta +ASMOBJECTS = $(SUBDIR)/vampuuid.o $(SUBDIR)/intervaltimer.o $(SUBDIR)/w5500l.o +SUBDIR=qwiznet + +# two flavours of the same code base may be build with this setup +# leave DEVICEID2 empty to disable second build +DEVICEID=vwiznet600sd.device +DEFINES = # -DPROTO_V2EXPNET +ASMDEFS = # -DPROTO_V2EXPNET +CPU = 68060 + +DEVICEID2=vwiznet500ex.device +DEFINES2 = -DPROTO_V2EXPNET +ASMDEFS2 = -DPROTO_V2EXPNET +CPU2 = 68020 + +############################################################################### +# import generic ruleset +# +############################################################################### + +include Common.mk + diff --git a/Driver/baxnet/source/device.c b/Driver/baxnet/source/device.c index 5346b91..313e5a7 100644 --- a/Driver/baxnet/source/device.c +++ b/Driver/baxnet/source/device.c @@ -120,6 +120,8 @@ ASM SAVEDS struct Device *DevInit( ASMR(d0) DEVBASEP ASMREG(d0) db->db_SegList = seglist; db->db_Flags = 0; + InitSemaphore( &db->db_Sem ); /* server start/stop/online/offline */ + dbNewList( &db->db_BufferManagement ); for(i=0 ; i < MAX_UNITS ; i++ ) @@ -137,9 +139,12 @@ ASM SAVEDS struct Device *DevInit( ASMR(d0) DEVBASEP ASMREG(d0) } ok = 0; - if( (DOSBase = OpenLibrary("dos.library", 36)) ) + if( (DOSBase = OpenLibrary( (STRPTR)"dos.library", 36)) ) { - if( (UtilityBase = OpenLibrary("utility.library", 37)) ) +#ifdef USEMMU + MMUBase = OpenLibrary( (STRPTR)"mmu.library",46 ); +#endif + if( (UtilityBase = OpenLibrary( (STRPTR)"utility.library", 37)) ) { /* Search HW */ ok = hw_Find_Boards( db ); @@ -182,10 +187,16 @@ ASM SAVEDS LONG DevOpen( ASMR(a1) struct IOSana2Req *ioreq ASMREG(a1), D(("DevOpen for %ld\n",unit)); - db->db_Lib.lib_OpenCnt++; /* avoid Expunge, see below for separate "unit" open count */ + /* avoid Expunge, see below for separate "unit" open count */ + //ObtainSemaphore( &db->db_Sem ); /* probably overkill */ + db->db_Lib.lib_OpenCnt++; + //ReleaseSemaphore( &db->db_Sem ); + db->db_ID++; /* opener ID (always >0) */ - if( unit < db->db_NBoards ) + if( (unit < db->db_NBoards) && + (ioreq->ios2_Req.io_Message.mn_Length >= sizeof( struct IOSana2Req ) ) + ) { ObtainSemaphore( &db->db_Units[unit].du_Sem ); /* lock current board */ @@ -222,9 +233,6 @@ ASM SAVEDS LONG DevOpen( ASMR(a1) struct IOSana2Req *ioreq ASMREG(a1), if( flags & SANA2OPF_PROM ) /* implies _MINE by spec */ db->db_Units[unit].du_Flags |= DUF_PROMISC; - hw_GetMacAddress( db, unit, &db->db_Units[unit].du_HWAddr[0] ); - hw_GetMacAddress( db, unit, &db->db_Units[unit].du_CFGAddr[0] ); - ok = 0; dbm = (struct db_BufferManagement *)AllocMem( sizeof(struct db_BufferManagement),MEMF_ANY|MEMF_CLEAR); if( dbm ) @@ -246,7 +254,7 @@ ASM SAVEDS LONG DevOpen( ASMR(a1) struct IOSana2Req *ioreq ASMREG(a1), /* v1.95: disabled CopyToBuffer32 due to problems with MiamiDX */ /* v1.99: try identifying Miami */ /* MiamiDX requires byte count to be a multiple of 4 */ - if( FindPort("MIAMI.1") ) /* Miami active ? */ + if( FindPort( (STRPTR)"MIAMI.1") ) /* Miami active ? */ { dbm->dbm_CopyToBuffer32 = (0); dbm->dbm_CopyFromBuffer32 = (0); @@ -269,11 +277,19 @@ ASM SAVEDS LONG DevOpen( ASMR(a1) struct IOSana2Req *ioreq ASMREG(a1), dbm->dbm_ID = db->db_ID; ok = 1; } + + /* the server is started with the Semaphore locked, to avoid + the race condition of getting instantiated twice + */ if( ok ) { /* start server if necessary */ ok = dbStartServer( db, unit ); } + + hw_GetMacAddress( db, unit, &db->db_Units[unit].du_HWAddr[0] ); + hw_GetMacAddress( db, unit, &db->db_Units[unit].du_CFGAddr[0] ); + if( ok ) { ret = 0; @@ -352,8 +368,12 @@ ASM SAVEDS BPTR DevClose( ASMR(a1) struct IOSana2Req *ioreq ASMREG(a1), (db->db_Units[unit].du_Flags & DUF_ONLINE ) ) { +#if 1 + dbSignalServer( db , SIGBREAKF_CTRL_D, 1 ); /* signal server to shut down unit (and lock the semaphore while doing so) */ +#else Signal( (struct Task*)db->db_ServerProc, SIGBREAKF_CTRL_D); Delay(1); +#endif } ObtainSemaphore( &db->db_Units[unit].du_Sem ); /* lock current board */ @@ -365,6 +385,30 @@ ASM SAVEDS BPTR DevClose( ASMR(a1) struct IOSana2Req *ioreq ASMREG(a1), ReleaseSemaphore( &db->db_Units[unit].du_Sem ); +#if 1 + /* now check if the device is no longer in use in any unit (=global OpenCnt) + and shut down server if that is the case + */ + ObtainSemaphore( &db->db_Sem ); + if( db->db_Lib.lib_OpenCnt == 0 ) + { + ULONG i; + struct SanaReadType *type; + + dbStopServer(db,0); + + for( i=0 ; i < db->db_NBoards ; i++ ) + { + while( (type = GetHead( &db->db_Units[i].du_ReadTypes ) )) + { + dbDeleteType( db, i, type->srt_Type ); + } + + } + } + ReleaseSemaphore( &db->db_Sem ); +#endif + if (db->db_Lib.lib_Flags & LIBF_DELEXP) ret = DevExpunge(db); @@ -375,10 +419,9 @@ ASM SAVEDS BPTR DevClose( ASMR(a1) struct IOSana2Req *ioreq ASMREG(a1), ASM SAVEDS BPTR DevExpunge( ASMR(a6) DEVBASEP ASMREG(a6) ) { BPTR seglist = db->db_SegList; - ULONG i; - struct SanaReadType *type; - if( db->db_Lib.lib_OpenCnt ) + /* don't go if the server is still up (for whatever reason) */ + if( (db->db_Lib.lib_OpenCnt) || (db->db_ServerProc) ) { db->db_Lib.lib_Flags |= LIBF_DELEXP; return (0); @@ -388,6 +431,8 @@ ASM SAVEDS BPTR DevExpunge( ASMR(a6) DEVBASEP ASMREG(a6) Remove((struct Node*)db); /* remove device node from system */ Permit(); +#if 0 + /* moved to CloseDevice() */ dbStopServer(db,0); for( i=0 ; i < db->db_NBoards ; i++ ) @@ -398,6 +443,7 @@ ASM SAVEDS BPTR DevExpunge( ASMR(a6) DEVBASEP ASMREG(a6) } } +#endif /* last steps: libraries */ CloseLibrary(DOSBase); @@ -816,9 +862,9 @@ LONG Need_HighPri( DEVBASEP ) return 0; } - if( FindPort("Services Manager") ) + if( FindPort( (STRPTR)"Services Manager") ) return 1; - if( FindPort("Accounts Manager") ) + if( FindPort( (STRPTR)"Accounts Manager") ) return 1; return 0; @@ -833,34 +879,43 @@ static LONG dbStartServer( DEVBASEP, LONG unit ) LONG ret = 0,i,pri; struct TagItem sv_tags[5]; - /* server running ? */ - if( db->db_ServerProc ) + ObtainSemaphore( &db->db_Sem ); + + do { + /* server running ? */ + if( db->db_ServerProc ) + { if( Need_HighPri( db ) ) SetTaskPri((struct Task*)db->db_ServerProc,HIGHPRI); - return 1; - } + ret = 1; + break; /* ReleaseSemaphore */ + } - if(!(port = CreateMsgPort() )) - return 0; - - pri = 0; - if( Need_HighPri( db ) ) + if(!(port = CreateMsgPort() )) + break; /* ReleaseSemaphore */ + + pri = 0; + if( Need_HighPri( db ) ) pri = HIGHPRI; - else - if( FindPort("AMITCP") ) /* AmiTCP active ? */ + else + { + if( FindPort( (STRPTR)"AMITCP") ) /* AmiTCP active ? */ pri = 6; + if( FindPort( (STRPTR)"BAXTCP") ) /* BaxTCP active ? */ + pri = 6; + } - sv_tags[i=0].ti_Tag = NP_Entry; - sv_tags[i++].ti_Data = (ULONG)ServerTask; - sv_tags[i ].ti_Tag = NP_Name; - sv_tags[i++].ti_Data = (ULONG)db->db_Lib.lib_Node.ln_Name; - sv_tags[i ].ti_Tag = NP_Priority; - sv_tags[i++].ti_Data = (ULONG)pri; - sv_tags[i ].ti_Tag = TAG_DONE; + sv_tags[i=0].ti_Tag = NP_Entry; + sv_tags[i++].ti_Data = (ULONG)ServerTask; + sv_tags[i ].ti_Tag = NP_Name; + sv_tags[i++].ti_Data = (ULONG)db->db_Lib.lib_Node.ln_Name; + sv_tags[i ].ti_Tag = NP_Priority; + sv_tags[i++].ti_Data = (ULONG)pri; + sv_tags[i ].ti_Tag = TAG_DONE; - if( (db->db_ServerProc = CreateNewProc(sv_tags))) - { + if( (db->db_ServerProc = CreateNewProc(sv_tags))) + { /* server is running, wait for response */ volatile struct ServerMsg msg; @@ -874,11 +929,15 @@ static LONG dbStartServer( DEVBASEP, LONG unit ) WaitPort( port ); ret = msg.sm_result; /* should be 1 */ D(("Server answered with %ld\n",ret)); - } - if( !ret ) + } + if( !ret ) db->db_ServerProc = (0); - DeleteMsgPort( port ); + DeleteMsgPort( port ); + + } while(0); + + ReleaseSemaphore( &db->db_Sem ); return ret; } @@ -886,12 +945,16 @@ static LONG dbStartServer( DEVBASEP, LONG unit ) /* stop Server function */ /* note: server is global right now */ +/* note: this code assumes to run with locked Semaphore (db_Sem) */ static LONG dbStopServer( DEVBASEP, LONG unit ) { ULONG i=1; volatile struct Task *P; /* server deletes itself from devbase */ + dbSignalServer( db, SIGBREAKF_CTRL_C, 0 ); + + /* failsafe: when the server does not come down, hammer it with CTRL_C */ while( (P=(volatile struct Task*)db->db_ServerProc) ) { Signal( (struct Task*)P, SIGBREAKF_CTRL_C); @@ -902,6 +965,47 @@ static LONG dbStopServer( DEVBASEP, LONG unit ) return 0; } +/* Signal server and wait for response */ +/* notes: + - server is global right now + - a Semaphore is used to ensure one signal per call only + - a signal is allocated, if possible +*/ +static LONG dbSignalServer( DEVBASEP, ULONG sig, ULONG flags ) +{ + ULONG mysig = SIGBREAKF_CTRL_D; /* failsafe */ + LONG sigbit=-1; + + sigbit = AllocSignal(-1); + if( sigbit >= 0 ) + mysig = 1<db_Sem ); /* lock access to server state */ + if( db->db_ServerProc ) + { + /* important: we might land here from various tasks/procs: always update + task pointer, always lock semaphore + */ + db->db_ServerSigMask = mysig; + db->db_Task = FindTask(NULL); + + Signal( (struct Task*)db->db_ServerProc, sig ); + + /* TODO: check "sig" for valid server signals, + currently: SIGBREAKF_CTRL_D,SIGBREAKF_CTRL_F,SIGBREAKF_CTRL_C + and otherwise don't wait */ + Wait( mysig ); + db->db_Task = NULL; /* no waiting is pending */ + } + if( flags & 1 ) + ReleaseSemaphore( &db->db_Sem ); /* unlock access to server state */ + + if( sigbit >= 0 ) + FreeSignal(sigbit); + + return 0; +} /* delete all buffers (type references) associated with device opener diff --git a/Driver/baxnet/source/device.h b/Driver/baxnet/source/device.h index 3474a54..1860306 100644 --- a/Driver/baxnet/source/device.h +++ b/Driver/baxnet/source/device.h @@ -33,6 +33,7 @@ #define SysBase db->db_SysBase #define DOSBase db->db_DOSBase #define UtilityBase db->db_UtilityBase +#define MMUBase db->db_MMUBase //#define VampireBase db->db_VampireBase /* old sana2.h ? */ @@ -103,6 +104,7 @@ struct devbase { struct Library *db_SysBase; /* Exec Base */ struct Library *db_DOSBase; struct Library *db_UtilityBase; + struct Library *db_MMUBase; ULONG db_NBoards; ULONG db_ID; /* device opener ID enumeration */ @@ -110,6 +112,8 @@ struct devbase { than 1 network card of the same type, anyway ? */ /* server process data */ + struct SignalSemaphore db_Sem; /* lock server state communication to one caller */ + /* (see per-unit Semaphore for queue stuff) */ volatile struct Process *db_ServerProc; /* process of main queue server */ struct Task *db_Task; /* server shutdown task address (non permanently available) */ ULONG db_ServerSigMask; /* shutdown signal */ @@ -249,6 +253,7 @@ static LONG dbIsInList( struct List *, struct Node * ); static LONG dbStartServer( DEVBASETYPE*, LONG ); static LONG dbStopServer( DEVBASETYPE*, LONG ); +static LONG dbSignalServer( DEVBASETYPE*, ULONG, ULONG ); static void dbDeleteBuffers( DEVBASETYPE*, struct IOSana2Req * ); diff --git a/Driver/baxnet/source/device.i b/Driver/baxnet/source/device.i index 5433985..d4de421 100644 --- a/Driver/baxnet/source/device.i +++ b/Driver/baxnet/source/device.i @@ -112,6 +112,7 @@ DUF_PROMISC EQU (1<0 ok, link change handled ; @@ -1080,7 +1138,7 @@ _enc624j6l_IntServer_List: ; _enc624j6l_CheckLinkChange: move.l a0,d0 - beq.s .rts + beq.s .err ;error: we don't have a board ; link change events are captured with Interrupts and stored ; in the (custom) PLinkChange location (per board) by init and @@ -1145,7 +1203,8 @@ _enc624j6l_CheckLinkChange: moveq #0,d0 .rts: rts - +.err: moveq #HW_MAC_INVALID,d0 ;-1 + rts ;--------------------------------------------------------------------------------------- ; @@ -1272,6 +1331,305 @@ _enc624j6l_HaveRecv: bra.s .rts + ifne OPT_Z2_WORDREAD +;--------------------------------------------------------------------------------------- +; +; receive single frame from HW into supplied memory buffer (Z2 Only) +; +; input: A0 - APTR mmapped board base address +; A1 - APTR buffer for received frame +; D0 - SHORT maximum size in buffer +; +; output: D0 <0 - error (i.e. frame too large) +; 0 - no pending frames +; >0 - size of received frame in buffer +; +; trash: - +; +; notes: +; + + +_enc624j6l_RecvFrameZ2: +;WORD READS ONLY + movem.l d2-d7/a1-a3,-(sp) + move.l a0,d1 + beq .err + + moveq #0,d0 + READREG ESTAT,a0,d2 ;number of pending frames + move.b d2,d0 ;clear out count (ESTAT_PKTCNT7...ESTAT_PKTCNT0) + beq .rts ;nothing in buffer, return sheer emptiness + ;at least one frame in buffer + + ifne DEBUG + READREG ERXHEAD,A0,d4 + READREG ERXTAIL,A0,d5 + endc + + ;----------- check next packet pointer and verify expected state ----------- + READREG PNextPacket,a0,d7 ;get user read pointer from private space + ;lea (a0,d7.w),a2 ;read ptr for next packet address + ;READREG 0,a2,d0 ;next packet pointer + + READSRAM a0,d7,d0 ;move (a0,d7.w),d0 + ifeq _OPT_BUFFER_SWAP + rol.w #8,d0 ;swap pointer to Big Endian + endc + + ;verify next packet pointer, re-initialize recv if this is invalid + cmp #RXSTOP_INIT,d0 ;bad pointer (<0 or >end of memory) + bhi.w .recv_err + cmp d0,d7 + bgt.s .maybewrap + ;unwrapped next packet + move d0,d1 + bra.s .ptrcheck +.maybewrap: + ;wrapped next packet ? + move #RXSTOP_INIT+1-RXSTART_INIT,d1 ;unwrap distance + add.w d0,d1 ;next pkt + unwrap distance +.ptrcheck: + sub.w d7,d1 ;length of pkt + cmp #MAX_FRAMELEN+2+6+2,d1 ;must be smaller than max framelen + ptr + status vector + alignment + bhi .recv_err ;-> reinit recv (am I paranoid ? -> try ENC28J60, then you know why...) + + ;------------------ check receive status vector ----------------------------- + addq.w #2,d7 ;increment pointer + WRAPINDEX d7 ;wrap D7 if beyond buffer + + ifne 0 + READSRAM a0,d7,d2 ;move (a0,d7.w),d0 + ifeq _OPT_BUFFER_SWAP + rol.w #8,d2 ;swap pointer to Big Endian + endc + and.w #$f800,d2 ;verify (should be all zeros in upper 9 bits) + bne .recv_err ;receive buffer is wrong -> re-initialize + endc + + addq.w #4,d7 ;increment pointer + WRAPINDEX d7 ;wrap D7 if beyond buffer + + WRITEREG PNextPacket,a0,d0 ;write pointer for next packet + + ifne 0 + ;lea (a0,d7.w),a2 ;new read pointer for length + ;READREG 0,a2,d0 ;last control word = length (byte count) + READSRAM a0,d7,d2 ;move (a0,d7.w),d0 + ifeq _OPT_BUFFER_SWAP + rol.w #8,d2 ;swap pointer to Big Endian + endc ;_OPT_BUFFER_SWAP + endc ;0 + + ;D1 is the distance to the next frame = stored length + recv vevtor + subq #6+2,d1 ;STATUS VECTOR, Pointer + move d1,d0 ; + + subq #4,d0 ;subtract CRC length + + addq.w #2,d7 ;increment pointer (skip status vector length field) + WRAPINDEX d7 ;wrap D7 if beyond buffer + + ;d0.w: length (without crc) + ;d7.w: read position (beginning of frame, dest MAC) + ;a0: board I/O + ;a1: dest pointer + move.l a1,a3 + + ifne _OPT_RECV + move.l d7,d1 ;start + ;and.l #$FFFF,d1 ;keep only lower address + add.w d0,d1 ;start+bytes + bvs.s .nooptrecv ;what? beyond 16 Bit ? -> we really should consider this an error, really :-) + cmp.w #RXSTOP_INIT,d1 ; + bgt.s .nooptrecv ;sadly, we cannot use faster routine atm, because we have a wrap around in the SRAM buffer + + ifne _OPT_ADR_QUIRK + eor.w #$6000,d7 + endc ;_OPT_ADR_QUIRK + + lea (a0,d7.w),a2 ;read pointer + ifeq _OPT_BUFFER_SWAP + btst #1,d7 ;do we have a read address that`s not long aligned? + beq.s .no_impair + move.w (a2)+,(a1)+ ;long-align address + subq #2,d0 + ble.w .end_read ;should not happen (>14 per valid frame) + moveq #15,d1 ; + move.l d0,d2 ;total bytes + and.l d0,d1 ;remainder: max 15 bytes + lsr.w #4,d2 ;total/16 + addq #2,d0 + bra.s .impair +.no_impair: + move.l d0,d2 ;total bytes + moveq #15,d1 ; + lsr.w #4,d2 ;total/16 + and.l d0,d1 ;remainder: max 15 bytes +.impair: + addq #3,d1 ;remainder, rounded up to +3 bytes + subq #1,d2 ;dbf + blt.s .nopt16_read ;less than 16 bytes -> bail out + bra.s .opt16_read +.opt16_loop: + move.w d3,(a1)+ +.opt16_read: + rept 3 + move.w (a2)+,(a1)+ + move.w (a2)+,(a1)+ + endr + move.w (a2)+,(a1)+ + move.w (a2)+,d3 + dbf d2,.opt16_loop + move.w d3,(a1)+ +.nopt16_read: + else ;_OPT_BUFFER_SWAP + moveq #3,d1 ;round bytes up + add d0,d1 ;byte count + 3 + endc ;_OPT_BUFFER_SWAP + lsr #2,d1 ;converted to dword count = ceil(bytes/4) + subq #1,d1 ;longwords - 1 + blt.s .end_read +.opt_read: + ifne _OPT_BUFFER_SWAP + move.w (a2)+,d2 ;get current word + rol.w #8,d2 ;swap buffer to Big Endian + move.w d2,(a1)+ + move.w (a2)+,d2 + rol.w #8,d2 ;swap buffer to Big Endian + move.w d2,(a1)+ + else ;_OPT_BUFFER_SWAP + move.w (a2)+,(a1)+ + move.w (a2)+,(a1)+ + endc ;_OPT_BUFFER_SWAP + dbf d1,.opt_read + bra.s .end_read + +.nooptrecv: + ;DEBUG ONLY + ;bra.s .emergency_slow + ;DEBUG ONLY + + ifeq _OPT_BUFFER_SWAP ;1 + ; + ;wraparound aware loop for big endian buffer + ; + move.w #RXSTOP_INIT+1,d1 ;end address $6000 + lea (a0,d7.w),a2 ;read pointer + sub.w d7,d1 ;minus start pointer = number of bytes until wrap + cmp.w d0,d1 ; + bhi.s .emergency_slow ;don`t trust anyone: if d1<0 or >total_length, then branch to slow routine + + move d1,d2 + lsr #2,d2 ;we copy long words + subq #1,d2 ;dbf + blt.s .nowords_beforewrap ; +.loop_beforewrap: + move.w (a2)+,(a1)+ + move.w (a2)+,(a1)+ + dbf d2,.loop_beforewrap + +.nowords_beforewrap: ; + btst #1,d7 ;uneven longword address before wraparound ? + beq.s .copy_afterwrap + move.w (a2)+,(a1)+ ;copy word from uneven address +.copy_afterwrap: + + move #RXSTART_INIT,d7 ;wrap + lea (a0,d7.w),a2 ;read pointer + + move d0,d2 ;total bytes to read + sub.w d1,d2 ;remaining=total-copied (D1=RXSTOP_INIT+1-D7) + ble.s .end_read ;done, if zero + + move d2,d1 ; + lsr #2,d2 ;we copy long words + bra.s .enter_afterwrap +.loop_afterwrap: + move.w (a2)+,(a1)+ + move.w (a2)+,(a1)+ +.enter_afterwrap: + dbf d2,.loop_afterwrap + + and.b #3,d1 ;btst #1,d1 ;1 byte or short remaining ? + beq.s .end_read + move.w (a2)+,(a1)+ + bra.s .end_read + +.emergency_slow: + endc ;_OPT_BUFFER_SWAP + endc ;_OPT_RECV + + ;generic loop: check for position overflows with each word + ; + ;CAUTION: DWORD loop doesn`t apply here since buffer is organized + ; in multiples of two bytes, same for frame lengths and + ; possible wraparounds + ; + moveq #1,d2 ;mask for lower bit + move d0,d1 ;byte count + lsr #1,d1 ;converted to word count + and.l d0,d2 ;if lower bits are set -> + bne.s .generic_read ;read 1 word more if impair byte/word count + subq #1,d1 ;words - 1 +.generic_read: + move.w (a0,d7.w),d2 ;get current word + ifne _OPT_BUFFER_SWAP + rol.w #8,d2 ;swap buffer to Big Endian + endc + move.w d2,(a1)+ ; store currend word + addq #2,d7 ;increment position + WRAPINDEX d7 ;wrap D7 if beyond buffer + dbf d1,.generic_read + +.end_read: + ;frame copied, now advance HW pointer + READREG PNextPacket,a0,d1 ;write pointer for next packet + cmp #RXSTART_INIT,d1 + bne.s .tail_nowrap + move #(RXSTOP_INIT&$fffe)+2,d1 +.tail_nowrap: + subq #2,d1 + WRITEREG ERXTAIL,a0,d1 ;tail pointer in buffer = rx-2, wraparound + + move #ECON1_PKTDEC,d1 + SETREG ECON1,a0,d1 ;set packet decrement ("frame", actually) + + ext.l d0 + ifne ADD_4RX + addq.l #4,d0 ;+4 (fake CRC) for Shapeshifter, also see server.c plain copy mode + endc + + cmp.w #14,d0 + bge.s .rts + + moveq #0,d0 +.rts: + movem.l (sp)+,d2-d7/a1-a3 + rts +.err: moveq #-1,d0 ;receive error + bra.s .rts + +.recv_err: + moveq #0,d0 + READREG ESTAT,a0,d2 ;number of pending frames + move.b d2,d0 ;clear out count (ESTAT_PKTCNT7...ESTAT_PKTCNT0) + beq.s .rts ;nothing in buffer, return sheer emptiness + + ;serious problem: we need to re-initialize the recv buffer here + bsr _enc624j6l_RXReset + + moveq #ECON1_RXEN,d0 ;re-enable reception + SETREG ECON1,a0,d0 + + moveq #0,d0 + bra.s .rts + + + + + endc + ;--------------------------------------------------------------------------------------- ; ; receive single frame from HW into supplied memory buffer @@ -1289,10 +1647,17 @@ _enc624j6l_HaveRecv: ; notes: ; _enc624j6l_RecvFrame: ; + ifne OPT_Z2_WORDREAD + tst.l Z2Mode + bne.w _enc624j6l_RecvFrameZ2 + endc + movem.l d2-d7/a1-a3,-(sp) move.l a0,d1 beq .err + + moveq #0,d0 READREG ESTAT,a0,d2 ;number of pending frames move.b d2,d0 ;clear out count (ESTAT_PKTCNT7...ESTAT_PKTCNT0) @@ -1899,4 +2264,12 @@ _enc624j6l_UMinDelay: ;recvcount: dc.l 0 ;recvlist: ds.w 65536 +;separate section necessary with SAS/C + section data,data + +Z2Mode: +_enc624j6l_Z2Mode: + dc.l 0 + + END diff --git a/Driver/baxnet/source/enc624j6net/enc624j6l.h b/Driver/baxnet/source/enc624j6net/enc624j6l.h index 9a7bd27..d81390c 100644 --- a/Driver/baxnet/source/enc624j6net/enc624j6l.h +++ b/Driver/baxnet/source/enc624j6net/enc624j6l.h @@ -362,5 +362,6 @@ ASM SAVEDS int enc624j6l_WritePHY( ASMR(d0) unsigned long phyreg ASMREG(d0), ASMR(d1) unsigned short data ASMREG(d1) ); +extern unsigned long enc624j6l_Z2Mode; #endif /* _INC_ENC624J6L_H */ diff --git a/Driver/baxnet/source/enc624j6net/hw.c b/Driver/baxnet/source/enc624j6net/hw.c index 0fd8054..35d94b8 100644 --- a/Driver/baxnet/source/enc624j6net/hw.c +++ b/Driver/baxnet/source/enc624j6net/hw.c @@ -9,21 +9,26 @@ */ #include #include +#include /*#include #include */ #include #include #include - #include "device.h" #include "hw.h" #include "enc624j6l.h" #include "registers.h" +#include "mmustuff.h" extern const BYTE DeviceName[]; +#ifndef AFF_68060 +#define AFF_68060 (1<<10) +#endif + #define ENC_MANUFACTURER 2588 #define ENC_BOARD 123 @@ -90,11 +95,12 @@ ASM SAVEDS LONG hw_Find_Boards( ASMR(a0) DEVBASEP ASMREG(a0) ) struct ConfigDev *cfg = (0); APTR boardbase; - if( (ExpansionBase = OpenLibrary( (BYTE*)exp_name, 37 )) ) + if( (ExpansionBase = OpenLibrary( (STRPTR)exp_name, 37 )) ) { /* TODO: actually verify that we have a module here */ /* ret = 1; */ + enc624j6l_Z2Mode = 0; for( i=0 ; i < MAX_UNITS ; i++ ) { cfg = FindConfigDev( cfg, ENC_MANUFACTURER, ENC_BOARD ); @@ -103,10 +109,29 @@ ASM SAVEDS LONG hw_Find_Boards( ASMR(a0) DEVBASEP ASMREG(a0) ) boardbase = (APTR)cfg->cd_BoardAddr; db->db_Units[i].duh_BASE = boardbase; D(("Board at %lx\n",(ULONG)cfg->cd_BoardAddr )); + + /* on Z2 ? */ + if( boardbase <= (APTR)0x40000000 ) + { + struct ExecBase *EB = (struct ExecBase *)SysBase; + /* 68000-68030 ? */ + if( !(EB->AttnFlags & (AFF_68040|AFF_68060) )) + enc624j6l_Z2Mode = 1; + } +#ifdef USEMMU + if( MMUBase ) + { + /* sometimes (A3000 with SuperKickstart), the MMU table is just wrong, fix "Invalid" bit, if necessary */ + setupMMU( boardbase, 0x10000, 0, db ); + } +#endif + /* bring board to sane state (i.e. perform soft reset) */ /* if( boardbase < (APTR)0x40000000 ) */ /* debug only */ enc624j6l_CheckBoard( boardbase ); + + } ret = i; D(("%ld boards found\n",ret)); @@ -300,12 +325,30 @@ ASM SAVEDS void hw_ConfigInit( ASMR(a0) DEVBASEP ASMREG(a0) ) } +UBYTE hex2char( STRPTR src ) +{ + UBYTE cur = 0; + + cur = *src; + + if( cur >= 'a' ) + cur &= ~32; + + if( (cur < '0') || (cur>'F') ) + return 0; + + cur = ( cur < 'A' ) ? cur-'0' : cur-'A'+10; + + return cur; +} + ASM SAVEDS void hw_ConfigUpdate( ASMR(a0) DEVBASEP ASMREG(a0), ASMR(a1) void*argsv ASMREG(a1)) { struct HWConfig *args = (struct HWConfig *)argsv; /* see hwprivate.h */ struct HWData *hwd = &db->db_hwdat; + D(("hw_ConfigUpdate\n")); if( args->timervalue ) hwd->timervalue = *args->timervalue; if( args->fullduplex ) @@ -314,6 +357,28 @@ ASM SAVEDS void hw_ConfigUpdate( ASMR(a0) DEVBASEP ASMREG(a0), hwd->flowcontrol = 1; if( args->multicast ) hwd->multicast = 1; + if( args->conf_mac ) /* user-configured MAC address */ + { + int i=0,val; + STRPTR src = args->conf_mac; + + while( i < 6 ) + { + val = hex2char( src++ ) << 4; + val |= hex2char( src++ ); + if( (*src++ != ':') && (i<5) ) + break; + db->db_Units[0].du_CFGAddr[i] = val; +/* db->db_Units[0].du_HWAddr[i] = val; */ + i++; + } + D(("Configured MAC %s (-> %02lx%02lx%02lx%02lx%02lx%02lx\n",\ + args->conf_mac, \ + db->db_Units[0].du_CFGAddr[0], db->db_Units[0].du_CFGAddr[1],\ + db->db_Units[0].du_CFGAddr[2], db->db_Units[0].du_CFGAddr[3],\ + db->db_Units[0].du_CFGAddr[4], db->db_Units[0].du_CFGAddr[5] )); + enc624j6l_SetMAC( db->db_Units[0].duh_BASE, db->db_Units[0].du_CFGAddr ); + } } /* @@ -408,7 +473,9 @@ ASM SAVEDS LONG hw_get_mac_status( ASMR(a0) DEVBASEP ASMREG( phcon1 = enc624j6l_ReadPHY( boardbase, PHCON1 ); phstat1 = enc624j6l_ReadPHY( boardbase, PHSTAT1 ); /* read again to see whether link is established */ if( ( phstat1 < 0 ) || ( phstat3 < 0 ) ) + { return HW_MAC_INVALID; /* no valid data found */ + } /* a) check Link */ ret = 0; @@ -548,6 +615,17 @@ ASM void INCMAC( ASMR(a0) UBYTE *curmc ASMREG(a0) ) } } +ASM void COPYMAC( ASMR(a0) UBYTE *dest ASMREG(a0), + ASMR(a1) UBYTE *src ASMREG(a1) ) +{ + dest[0] = src[0]; + dest[1] = src[1]; + dest[2] = src[2]; + dest[3] = src[3]; + dest[4] = src[4]; + dest[5] = src[5]; +} + /* TODO: implement Multicast hashing */ ASM SAVEDS LONG hw_change_multicast( ASMR(a0) DEVBASEP ASMREG(a0), ASMR(d0) ULONG unit ASMREG(d0), @@ -560,7 +638,7 @@ ASM SAVEDS LONG hw_change_multicast( ASMR(a0) DEVBASEP ASMREG( USHORT mc_hashes[4] = {0,0,0,0}; /* EHT1, EHT2, EHT3, EHT4 */ USHORT *hash_tab; struct MCastEntry *mc; - UBYTE *curmc; + UBYTE curmc[6]; flags = PIO_INIT_BROAD_CAST; @@ -581,7 +659,7 @@ ASM SAVEDS LONG hw_change_multicast( ASMR(a0) DEVBASEP ASMREG( mc->mce_Node.mln_Succ ; mc=(struct MCastEntry*)mc->mce_Node.mln_Succ ) { - curmc = mc->mce_start; + COPYMAC( 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",\ @@ -594,7 +672,7 @@ ASM SAVEDS LONG hw_change_multicast( ASMR(a0) DEVBASEP ASMREG( (ULONG)mc->mce_stop[4],(ULONG)mc->mce_stop[5] \ )); - crc = myhw_CRC32( mc->mce_start, 6 ); + crc = myhw_CRC32( curmc, 6 ); curhash = (crc & 0x1f800000)>>23; /* 2 bit reg, 4 bit hash pos in reg */ mc_hashes[ ((curhash >> 4)&3) ] |= 1<<(curhash&0xf); INCMAC( curmc ); diff --git a/Driver/baxnet/source/enc624j6net/hwprivate.h b/Driver/baxnet/source/enc624j6net/hwprivate.h index 3f2127f..43e3f75 100644 --- a/Driver/baxnet/source/enc624j6net/hwprivate.h +++ b/Driver/baxnet/source/enc624j6net/hwprivate.h @@ -41,7 +41,7 @@ struct HWData { #define HW_CONFIGFILE "ENV:SANA2/enc624j6net.config" /* appended to COMMON_TEMPLATE */ -#define HW_CONFIGTEMPLATE "TIMER/K/N,FULLDUPLEX/S,MULTICAST/S,FLOWCONTROL/S" +#define HW_CONFIGTEMPLATE "TIMER/K/N,FULLDUPLEX/S,MULTICAST/S,FLOWCONTROL/S,MAC/K" /* referenced by server.c, hw.c */ struct HWConfig @@ -51,6 +51,7 @@ struct HWConfig ULONG fullduplex; ULONG multicast; ULONG flowcontrol; + STRPTR conf_mac; /* user config MAC address */ }; #endif /* _INC_HWPRIVATE_H */ diff --git a/Driver/baxnet/source/enc624j6net/macros.i b/Driver/baxnet/source/enc624j6net/macros.i index e30a27b..40738c2 100644 --- a/Driver/baxnet/source/enc624j6net/macros.i +++ b/Driver/baxnet/source/enc624j6net/macros.i @@ -8,7 +8,7 @@ _OPT_BUFFER_SWAP EQU 0 ;perform byte swap on buffer ops (1) or assume native endian (0) _OPT_REG_SWAP EQU 0 ;perform byte swap on register ops (1) or assume native endian (0) _OPT_ADR_QUIRK EQU 0 ;address lines 12/13 are swapped (1) or linear addressing (0) -_OPT_FLOWCONTROL EQU 0 ;perform flow control on RX (1) or not (0) +_OPT_FLOWCONTROL EQU 0 ;perform flow control on RX (1) or not (0), obsolete (runtime option now) _OPT_RECV EQU 1 ;faster recv (1) or generic (0) _OPT_CHECKLINK_TX EQU 0 ;check for link changes in TX (1) or expect from outside (0) -> see server.c @@ -123,4 +123,4 @@ WRAPINDEX macro ble.s .nowrap\0\@ add.w #RXSTART_INIT-RXSTOP_INIT-1,\1 .nowrap\0\@ - endm \ No newline at end of file + endm diff --git a/Driver/baxnet/source/kprintf.asm b/Driver/baxnet/source/kprintf.asm index 0365136..a58d77d 100644 --- a/Driver/baxnet/source/kprintf.asm +++ b/Driver/baxnet/source/kprintf.asm @@ -1,10 +1,10 @@ - incdir include: - ifnd _LVOSupervisor - include lvo/exec_lib.i + ;incdir include: + ;ifnd _LVOSupervisor + ;include lvo/exec_lib.i ;include exec/exec_lib.i - endc - include exec/execbase.i - include device.i + ;endc + ;include exec/execbase.i + ;include device.i ifnd _LVORawDoFmt @@ -52,10 +52,10 @@ _KPrintFa0a1: rts ;DEBUG - dc.l $deadbeef - dc.l sds_SIZEOF - dc.l sv_SIZEOF - dc.l du_SIZEOF - dc.l db_SIZEOF +; dc.l $deadbeef +; dc.l sds_SIZEOF +; dc.l sv_SIZEOF +; dc.l du_SIZEOF +; dc.l db_SIZEOF diff --git a/Driver/baxnet/source/miitool.c b/Driver/baxnet/source/miitool.c index 5aff7da..a2143ad 100644 --- a/Driver/baxnet/source/miitool.c +++ b/Driver/baxnet/source/miitool.c @@ -174,7 +174,7 @@ LONG get_device(struct prgdata *prg, BYTE *name, LONG unit ) static BOOL findcmd(struct NSDeviceQueryResult *nsdqr, UWORD cmd) { UWORD *p; - for (p = nsdqr->SupportedCommands; (*p); ++p) + for (p = nsdqr->nsdqr_SupportedCommands; (*p); ++p ) if (*p == cmd) return TRUE; return FALSE; @@ -204,9 +204,9 @@ LONG probe_device( struct prgdata *prg ) return 0; } - if (nsdqr.DeviceType != NSDEVTYPE_SANA2) + if ( nsdqr.nsdqr_DeviceType != NSDEVTYPE_SANA2 ) { - Printf("Device is not a SANA-II device (type %ld, needed %ld\n).", (LONG)nsdqr.DeviceType, (LONG) NSDEVTYPE_SANA2); + Printf("Device is not a SANA-II device (type %ld, needed %ld\n).", (LONG)nsdqr.nsdqr_DeviceType, (LONG) NSDEVTYPE_SANA2 ); return 0; } diff --git a/Driver/baxnet/source/mmustuff.c b/Driver/baxnet/source/mmustuff.c new file mode 100644 index 0000000..c37c37c --- /dev/null +++ b/Driver/baxnet/source/mmustuff.c @@ -0,0 +1,109 @@ +/* + set up MMU for flash access using mmu.library + + (C) 2022 Henryk Richter + + The F0 area (0xF00000-0xF7ffff) is known to be + reserved by Commodore for diagnostic ROMs (or + BootROMs), as well as additional kickstart modules. + + Some configurations of the MMU will mark this + area as ROM such that write attempts are inhibited + by the processor itself. + + This code will revert any existing remapping (to + RAM) and set up useable cache flags such that the + Flash can be written to. + +*/ +#define __NOLIBBASE__ +#include +#include +#include +#include "debug.h" +#include "mmustuff.h" + + +//extern struct Library *MMUBase; +//extern struct DosLibrary *DOSBase; + +#define CACHEFLAGS (MAPP_CACHEINHIBIT|MAPP_COPYBACK|MAPP_NONSERIALIZED|MAPP_IMPRECISE) + +#define ROMFLAGS (MAPP_CACHEINHIBIT|MAPP_GLOBAL|MAPP_IO|MAPP_USER0) +#define ROMCFLAGS (MAPP_CACHEINHIBIT|MAPP_COPYBACK|MAPP_NONSERIALIZED|MAPP_IMPRECISE|MAPP_GLOBAL|MAPP_IO|MAPP_WRITEPROTECTED|MAPP_ROM|MAPP_INVALID) + +#ifdef __VBCC__ +#define BCAST +#else +#define BCAST (ULONG) +#endif + + +/* + set up MMU as I/O space from "base", "size" bytes, + keep flags==0 for now + + the device pointer is used to fetch the MMUbase from it, nothing more +*/ +ASM SAVEDS LONG setupMMU( ASMR(a0) void *base ASMREG(a0), + ASMR(d0) LONG size ASMREG(d0), + ASMR(d1) ULONG flags ASMREG(d1), + ASMR(a6) DEVBASEP ASMREG(a6) ) +{ + struct MMUContext *ctx,*sctx; /* default context, supervisor context */ + ULONG props; + struct MinList *ctxl,*sctxl; + struct TagItem tgs[2] = {{TAG_DONE,0},{TAG_DONE,0} }; + + if( !MMUBase ) + return 1; /* cannot setup MMU without MMULib */ + + ctx=DefaultContext(); + sctx=SuperContext(ctx); + + props = GetPropertiesA(sctx,BCAST base,tgs); + props |= GetPropertiesA(sctx,BCAST base,tgs); + + D(( (STRPTR)"Current MMU props on 0x%lx area: 0x%lx\n",(ULONG)base,props)); + + LockContextList(); + LockMMUContext(ctx); + LockMMUContext(sctx); + + if( (props & MAPP_REMAPPED) ) + { + D(( (STRPTR)"Memory was remapped elsewhere, reverting to physical location\n" )); + + if( (ctxl=GetMapping(ctx))) + { + if( (sctxl=GetMapping(sctx))) + { + if( SetPropertiesA(ctx,0,MAPP_REMAPPED|CACHEFLAGS,BCAST base,size,tgs) ) + { + if( SetPropertiesA(sctx,0,MAPP_REMAPPED|CACHEFLAGS,BCAST base,size,tgs) ) + { + } + } + ReleaseMapping(sctx,sctxl); + } + ReleaseMapping(ctx,ctxl); + } + } + + /* set desired flags */ + SetPropertiesA(ctx,ROMFLAGS,ROMCFLAGS, BCAST base,size,tgs); + SetPropertiesA(sctx,ROMFLAGS,ROMCFLAGS,BCAST base,size,tgs); + + RebuildTrees(ctx,sctx,NULL); + + UnlockMMUContext(sctx); + UnlockMMUContext(ctx); + UnlockContextList(); + + props = GetPropertiesA(sctx,BCAST base,tgs); + props |= GetPropertiesA(sctx,BCAST base,tgs); + D(( (STRPTR)"New MMU props on 0x%lx area: 0x%lx\n",(ULONG)base,props)); + + return 0; +} + diff --git a/Driver/baxnet/source/mmustuff.h b/Driver/baxnet/source/mmustuff.h new file mode 100644 index 0000000..15c4453 --- /dev/null +++ b/Driver/baxnet/source/mmustuff.h @@ -0,0 +1,30 @@ +/* + set up MMU for flash access using mmu.library + + (C) 2022 Henryk Richter + + The F0 area (0xF00000-0xF7ffff) is known to be + reserved by Commodore for diagnostic ROMs (or + BootROMs), as well as additional kickstart modules. + + Some configurations of the MMU will mark this + area as ROM such that write attempts are inhibited + by the processor itself. + + This code will revert any existing remapping (to + RAM) and set up useable cache flags such that the + Flash can be written to. + +*/ +#ifndef _INC_MMUSTUFF_H +#define _INC_MMUSTUFF_H + +#include "compiler.h" +#include "device.h" + +ASM SAVEDS LONG setupMMU( ASMR(a0) void *base ASMREG(a0), + ASMR(d0) LONG size ASMREG(d0), + ASMR(d1) ULONG flags ASMREG(d1), + ASMR(a6) DEVBASEP ASMREG(a6) ); + +#endif diff --git a/Driver/baxnet/source/server.c b/Driver/baxnet/source/server.c index cc6ec6d..0c55e4f 100644 --- a/Driver/baxnet/source/server.c +++ b/Driver/baxnet/source/server.c @@ -154,7 +154,7 @@ static LONG server_setOnline( DEVBASEP , ULONG unit, ULONG evt ) struct Library *TimerBase; MemSet( &timereq, 0, sizeof(struct timerequest)); - OpenDevice("timer.device", 0, (struct IORequest*)&timereq, 0); + OpenDevice( (STRPTR)"timer.device", 0, (struct IORequest*)&timereq, 0); TimerBase = (struct Library *)timereq.tr_node.io_Device; GetSysTime( &db->db_Units[unit].du_DevStats.LastStart ); CloseDevice( (struct IORequest*)&timereq); @@ -293,7 +293,7 @@ static LONG server_Config( DEVBASEP ) hw_ConfigInit( db ); /* hw defaults */ - if((cfgfile = Open(HW_CONFIGFILE, MODE_OLDFILE))) /* see hwprivate.h for CONFIGFILE */ + if((cfgfile = Open( (STRPTR)HW_CONFIGFILE, MODE_OLDFILE))) /* see hwprivate.h for CONFIGFILE */ { struct HWConfig args; /* see hwprivate.h */ struct RDArgs *readargs; @@ -302,7 +302,7 @@ static LONG server_Config( DEVBASEP ) MemSet( &args, 0, sizeof( args ) ); - readargs = ReadArgs( (BYTE*)configtemplate, (LONG *)&args, NULL); + readargs = ReadArgs( (STRPTR)configtemplate, (LONG *)&args, NULL); Close( SelectInput( cfgfile ) ); /* restore default input and retrieve cfgfile */ @@ -354,7 +354,7 @@ static LONG server_changeMulticast( DEVBASEP, ULONG unit, struct IOSana2Req *ior entry = (struct MCastEntry *)db->db_svdat.sv_mclist.lh_Head; while( entry->mce_Node.mln_Succ ) { - if( CMPeqMAC( entry->mce_start, ioreq->ios2_SrcAddr ) ) + if( CMPeqMAC( (BYTE*)entry->mce_start, (BYTE*)ioreq->ios2_SrcAddr ) ) break; entry = (struct MCastEntry *)entry->mce_Node.mln_Succ; } @@ -1143,11 +1143,17 @@ VOID SAVEDS ServerTask(void) server_HandleS2Commands( db ); gotmask &= ~portsigmask; } + /* Important: first check CTRL_D to go offline cleanly + before acting on CTRL_C + */ if( gotmask & SIGBREAKF_CTRL_D ) { D(("Got CTRL-D in Server. Checking Online status\n")); gotmask &= ~SIGBREAKF_CTRL_D; server_CloseDevice_offline( db ); + /* acknowledge command (unless CTRL_C was also set) */ + if( (db->db_Task) && (!(gotmask & SIGBREAKF_CTRL_C)) ) + Signal( db->db_Task, db->db_ServerSigMask ); } if( gotmask & SIGBREAKF_CTRL_C ) { @@ -1161,10 +1167,16 @@ VOID SAVEDS ServerTask(void) QuitServer: if( db ) - db->db_ServerProc = (0); + { + db->db_ServerProc = (0); + /* acknowledge command */ + if( db->db_Task ) + Signal( db->db_Task, db->db_ServerSigMask ); + } { /* revert to "real" execbase, in case that we never got the startup msg */ struct { struct Library *db_SysBase; } *db = (void*)0x4; + D(("Server exiting")); Forbid(); } diff --git a/Driver/baxnet/source/smakefile.enc b/Driver/baxnet/source/smakefile.enc index 8a078ba..11287ae 100644 --- a/Driver/baxnet/source/smakefile.enc +++ b/Driver/baxnet/source/smakefile.enc @@ -30,7 +30,8 @@ ASMOBJECTS = $(SUBDIR)/enc624j6l.o$(TYPE) $(SUBDIR)/intervaltimer.o$(TYPE) # more than one flavour of the same code base may be build with this setup # arguments passed down recursively (example): #DEVICEID=v2expeth.device -DEFINES1 = DEFINE HW_DMA_TX=1 +DEFINES1 = DEFINE HW_DMA_TX=1 +#DEFINES1 = $(DEFINES1) DEFINE USEMMU=1 ASMDEFS1 = -DHW_DMA_TX=1 #CPU = 68020 diff --git a/Driver/baxnet/source/smakefile.v4 b/Driver/baxnet/source/smakefile.v4 new file mode 100644 index 0000000..b5d35d6 --- /dev/null +++ b/Driver/baxnet/source/smakefile.v4 @@ -0,0 +1,165 @@ +############################################################################### +# +# SAS/C Makefile for V4 ETH +# +# author: Henryk Richter +# +# tools required: +# working SAS/C installation (sc:, sc:include and sc:netinclude assigned, +# "sc", "smake" and "slink in path) +# vasm in path (vasmm68k_mot) +# +############################################################################### + +############################################################################### +# Name, version +# +############################################################################### +#DEVICEVERSION=1 +#DEVICEREVISION=95 +#DEVICEDATE=08.09.2018 +#DEVICEEXTRA=Beta + +SUBDIR=v4net +ASMOBJECTS = $(SUBDIR)/vampuuid.o$(TYPE) $(SUBDIR)/intervaltimer.o$(TYPE) \ + $(SUBDIR)/v4l.o$(TYPE) kprintf.o$(TYPE) + +# +# more than one flavour of the same code base may be build with this setup +# +# some arguments are passed down recursively (example): +#DEVICEID=v4net.device +#DEFINES1 = DEFINE HW_DMA_TX=1 +#ASMDEFS1 = -DHW_DMA_TX +#CPU = 68020 + + +############################################################################### +# +# common.smk (SAS/C variant of common.mk) +# +# author: Henryk Richter +# +# note: when switching between different hardware targets, don`t forget +# "make clean" in between +############################################################################### +# debug = 1 will include string debugging for terminal/sushi/sashimi +# not enabled yet in SAS/C makefile +debug = 0 + +############################################################################### +# prefix for system includes (ASM) +# +############################################################################### +PREFX = sc: +SYSINC = $(PREFX)include + + +############################################################################### +# +# compiler executables and support calls +# +############################################################################### +RM = delete force quiet +CC = sc +LD = slink +MAKE = smake +CFLAGS = NOVER NOICONS nostackcheck math=standard strmerge strsect=code parameters=regs data=near opt optsize +LDFLAGS = NOICONS SC SD ND + +VASM = vasmm68k_mot +VASMFORMAT = -m$(CPU) -Fhunk -nowarn=2064 -quiet -I$(SYSINC) + + +############################################################################### +# +# paths to the local includes +# +############################################################################### + +IPATH = + +############################################################################### +# +# compile-level feature definitions +# +############################################################################### + +# see all: target for defaults in $(DEFINES) +DEFINES = $(DEFINES1) CPU=$(CPU) +DEFINES = $(DEFINES) DEFINE ALLREADREQS=1 +#DEFINES = $(DEFINES) DEFINE DEVICEVERSION=$(DEVICEVERSION) +#DEFINES = $(DEFINES) DEFINE DEVICEREVISION=$(DEVICEREVISION) +#DEFINES = $(DEFINES) DEFINE DEVICEDATE=$(DEVICEDATE) +#DEFINES = $(DEFINES) DEFINE DEVICEEXTRA=$(DEVICEEXTRA) +DEFINES = $(DEFINES) DEFINE NEWSTYLE=1 +DEFINES = $(DEFINES) DEFINE HAVE_VERSION_H=1 +DEFINES = $(DEFINES) DEFINE DEVICENAME=$(DEVICEID) +ASMDEFS = $(ASMDEFS1) +#-DDEVICEVERSION=$(DEVICEVERSION) -DDEVICEREVISION=$(DEVICEREVISION) + +############################################################################### +# +# debug +# +############################################################################### +#ifeq ($(debug),1) +#CFLAGS += -DDEBUG -g +#CFLAGS2 += -DDEBUG -g +#LINKLIBS = -L$(PREFX)/lib -ldebug +#endif + +############################################################################### +# +# compiler flags and optimization levels +# +############################################################################### + +CFLAGS = $(CFLAGS) INCLUDEDIR="" INCLUDEDIR=$(SUBDIR) $(DEFINES) + +############################################################################### +# +# objects to build +# +############################################################################### +# ASM based alternative to deviceheader.o would be romtag.o + +OBJECTS = deviceheader.o$(TYPE) deviceinit.o$(TYPE) device.o$(TYPE) \ + server.o$(TYPE) $(SUBDIR)/hw.o$(TYPE) + +OBJECTS = $(OBJECTS) $(ASMOBJECTS) + +BUILDDEPS = device.h server.h hw.h macros.h compiler.h + +############################################################################### +# +# rules and commands +# +############################################################################### + +.asm.o$(TYPE): $(BUILDDEPS) $*.asm + $(VASM) $(VASMFORMAT) $(ASMDEFS) -o $@ $*.asm + +.c.o$(TYPE): $(BUILDDEPS) $*.c + $(CC) $(CFLAGS) OBJECTNAME $@ $*.c + +all: + $(MAKE) -f smakefile.v4 TYPE=4 v4net.device DEVICEID=v4net.device CPU=68020 + +v4net.device: $(OBJECTS) + -$(LD) $(OBJECTS) LIB sc:lib/sc.lib $(LDFLAGS) TO $(DEVICEID) + +clean: + -$(RM) v4net.device \#?.o4 $(SUBDIR)/\#?.o4 + +install: + copy v4net.device DEVS:Networks + + + +# dependencies +device.o$(TYPE): device.c device.h server.h hw.h macros.h compiler.h +server.o$(TYPE): server.c device.h server.h hw.h macros.h compiler.h +deviceinit.o$(TYPE): deviceinit.c device.h server.h hw.h macros.h compiler.h +deviceheader.o$(TYPE): deviceheader.c device.h server.h hw.h macros.h compiler.h + diff --git a/Driver/baxnet/source/smakefile.vwiz b/Driver/baxnet/source/smakefile.vwiz new file mode 100644 index 0000000..834aa13 --- /dev/null +++ b/Driver/baxnet/source/smakefile.vwiz @@ -0,0 +1,169 @@ +############################################################################### +# +# SAS/C Makefile for VWizNet +# +# author: Henryk Richter +# +# tools required: +# working SAS/C installation (sc:, sc:include and sc:netinclude assigned, +# "sc", "smake" and "slink in path) +# vasm in path (vasmm68k_mot) +# +############################################################################### + +############################################################################### +# Name, version +# +############################################################################### +#DEVICEVERSION=1 +#DEVICEREVISION=95 +#DEVICEDATE=08.09.2018 +#DEVICEEXTRA=Beta + +SUBDIR=qwiznet +ASMOBJECTS = $(SUBDIR)/vampuuid.o$(TYPE) $(SUBDIR)/intervaltimer.o$(TYPE) \ + $(SUBDIR)/w5500l.o$(TYPE) + +# +# more than one flavour of the same code base may be build with this setup +# +# some arguments are passed down recursively (example): +#DEVICEID=vwiznet500ex.device +#DEFINES1 = -DPROTO_V2EXPNET +#ASMDEFS = -DPROTO_V2EXPNET +#CPU = 68020 + + +############################################################################### +# +# common.smk (SAS/C variant of common.mk) +# +# author: Henryk Richter +# +# note: when switching between different hardware targets, don`t forget +# "make clean" in between +############################################################################### +# debug = 1 will include string debugging for terminal/sushi/sashimi +# not enabled yet in SAS/C makefile +debug = 0 + +############################################################################### +# prefix for system includes (ASM) +# +############################################################################### +PREFX = sc: +SYSINC = $(PREFX)include + + +############################################################################### +# +# compiler executables and support calls +# +############################################################################### +RM = delete force quiet +CC = sc +LD = slink +MAKE = smake +CFLAGS = NOVER NOICONS nostackcheck math=standard strmerge strsect=code parameters=regs data=near opt optsize +LDFLAGS = NOICONS SC SD ND + +VASM = vasmm68k_mot +VASMFORMAT = -m$(CPU) -Fhunk -nowarn=2064 -quiet -I$(SYSINC) + + +############################################################################### +# +# paths to the local includes +# +############################################################################### + +IPATH = + +############################################################################### +# +# compile-level feature definitions +# +############################################################################### + +# see all: target for defaults in $(DEFINES) +DEFINES = $(DEFINES1) CPU=$(CPU) +#DEFINES = $(DEFINES) DEFINE DEVICEVERSION=$(DEVICEVERSION) +#DEFINES = $(DEFINES) DEFINE DEVICEREVISION=$(DEVICEREVISION) +#DEFINES = $(DEFINES) DEFINE DEVICEDATE=$(DEVICEDATE) +DEFINES = $(DEFINES) DEFINE NEWSTYLE=1 +DEFINES = $(DEFINES) DEFINE HAVE_VERSION_H=1 +DEFINES = $(DEFINES) DEFINE DEVICENAME=$(DEVICEID) +#DEFINES = $(DEFINES) DEFINE DEVICEEXTRA=$(DEVICEEXTRA) +ASMDEFS = $(ASMDEFS1) +#-DDEVICEVERSION=$(DEVICEVERSION) -DDEVICEREVISION=$(DEVICEREVISION) + +############################################################################### +# +# debug +# +############################################################################### +#ifeq ($(debug),1) +#CFLAGS += -DDEBUG -g +#CFLAGS2 += -DDEBUG -g +#LINKLIBS = -L$(PREFX)/lib -ldebug +#endif + +############################################################################### +# +# compiler flags and optimization levels +# +############################################################################### + +CFLAGS = $(CFLAGS) INCLUDEDIR="" INCLUDEDIR=$(SUBDIR) $(DEFINES) + +############################################################################### +# +# objects to build +# +############################################################################### +# ASM based alternative to deviceheader.o would be romtag.o + +OBJECTS = deviceheader.o$(TYPE) deviceinit.o$(TYPE) device.o$(TYPE) \ + server.o$(TYPE) $(SUBDIR)/hw.o$(TYPE) + +OBJECTS = $(OBJECTS) $(ASMOBJECTS) + +BUILDDEPS = device.h server.h hw.h macros.h compiler.h + +############################################################################### +# +# rules and commands +# +############################################################################### + +.asm.o$(TYPE): $(BUILDDEPS) $*.asm + $(VASM) $(VASMFORMAT) $(ASMDEFS) -o $@ $*.asm + +.c.o$(TYPE): $(BUILDDEPS) $*.c + $(CC) $(CFLAGS) OBJECTNAME $@ $*.c + +all: + $(MAKE) -f smakefile.vwiz TYPE=sd vwiznet600sd.device DEVICEID=vwiznet600sd.device CPU=68020 + $(MAKE) -f smakefile.vwiz TYPE=ex vwiznet500ex.device DEVICEID=vwiznet500ex.device CPU=68020 \ + "DEFINES1=DEFINE PROTO_V2EXPNET" ASMDEFS1=-DPROTO_V2EXPNET + +vwiznet600sd.device: $(OBJECTS) + -$(LD) $(OBJECTS) LIB sc:lib/sc.lib $(LDFLAGS) TO $(DEVICEID) + +vwiznet500ex.device: $(OBJECTS) + -$(LD) $(OBJECTS) LIB sc:lib/sc.lib $(LDFLAGS) TO $(DEVICEID) + +clean: + -$(RM) vwiznet600sd.device vwiznet500ex.device \#?.oex \#?.osd $(SUBDIR)/\#?.oex $(SUBDIR)/\#?.osd + +install: + copy vwiznet600sd.device vwiznet500ex.device DEVS:Networks + + + +# dependencies +device.o$(TYPE): device.c device.h server.h hw.h macros.h compiler.h +server.o$(TYPE): server.c device.h server.h hw.h macros.h compiler.h +deviceinit.o$(TYPE): deviceinit.c device.h server.h hw.h macros.h compiler.h +deviceheader.o$(TYPE): deviceheader.c device.h server.h hw.h macros.h compiler.h + diff --git a/Driver/baxnet/source/version.h b/Driver/baxnet/source/version.h index 27cbefb..0271401 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 9 +#define DEVICEREVISION 15 #define DEVICEEXTRA /* #define DEVICEEXTRA Beta */ -#define DEVICEDATE 23.08.20 +#define DEVICEDATE 1.3.26 #endif