Updated Zorro-LAN-IDE Driver to 2.15
- Multicast fixes - new Microchip OUIs added to verification table
This commit is contained in:
+19
-7
@@ -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
|
Author: Henryk Richter
|
||||||
Uploader: henryk.richter@gmx.net
|
Uploader: henryk.richter@gmx.net
|
||||||
Type: driver/net
|
Type: driver/net
|
||||||
Architecture: m68k-amigaos
|
Architecture: m68k-amigaos
|
||||||
Requires: OS 2.04+
|
Requires: OS 2.04+
|
||||||
|
|
||||||
This package contains network drivers for the following hardware:
|
This package contains network drivers and test utilities for the
|
||||||
- ZII LAN IDE CP (matze, scrat and buggs @a1k.org)
|
following hardware:
|
||||||
|
|
||||||
|
- ZII LAN IDE CP (matze and buggs @a1k.org)
|
||||||
OSS Zorro-II card with ENC624J600 ethernet controller, autoboot
|
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
|
- 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
|
- Vampire500V2+ or Vampire1200V2 with ENC28J60 module connected to
|
||||||
README.enc for installation and operation instructions
|
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.
|
||||||
|
|
||||||
|
|||||||
@@ -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 <henryk.richter@gmx.net>
|
ENC624J6Net Copyright (C) 2018 Henryk Richter <henryk.richter@gmx.net>
|
||||||
|
|
||||||
This driver is supposed to support ENC624J600 based ethernet on the
|
This driver is supposed to support ENC624J600 based ethernet on the
|
||||||
ZII LAN IDE CP card designed by Matze (a1k.org), Buggs (a1k.org)
|
ZII LAN IDE CP card designed by Matze (a1k.org) and Buggs (a1k.org).
|
||||||
and Scrat (a1k.org).
|
|
||||||
|
|
||||||
Please see at the end of the file for information about licensing
|
Please see at the end of the file for information about licensing
|
||||||
conditions.
|
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,
|
So far, successful tests have been done with the free AmiTCP/IP 3.0b2,
|
||||||
AmiTCP4.0-4.2, Genesis, MiamiDX and RoadShow.
|
AmiTCP4.0-4.2, Genesis, MiamiDX and RoadShow.
|
||||||
|
|
||||||
The Zorro board itself should be visible in early startup with manufacturer
|
The Zorro board itself should be visible in Early Startup and ShowConfig
|
||||||
ID 2588 and card ID 123.
|
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.
|
No special configuration of the driver is necessary for normal operation.
|
||||||
The configuration options outlined below are documented for tuning purposes.
|
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).
|
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,
|
FULLDUPLEX - change Ethernet module into full duplex mode,
|
||||||
caution: requires manual configuration of 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
|
FLOWCONTROL - enable automatic flow control that throttles incoming
|
||||||
data when the hardware buffer gets full
|
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):
|
example (useful for DSL via PPPoE with AmiTCP):
|
||||||
echo "MTU=1492 PRIORITY=6" >ENVARC:sana2/enc624j6net.config
|
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:
|
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
|
2.9 - better support for Envoy: automatically select a higher
|
||||||
task priority in presence of Envoy services
|
task priority in presence of Envoy services
|
||||||
|
|
||||||
|
|||||||
Regular → Executable
BIN
Binary file not shown.
Regular → Executable
BIN
Binary file not shown.
Regular → Executable
@@ -27,8 +27,8 @@ compiler_vcc = 0
|
|||||||
# prefix for system includes (ASM)
|
# prefix for system includes (ASM)
|
||||||
# native AmigaOS compilation: set PREFX=GG: or PREFX=ADE:, depending on toolchain
|
# native AmigaOS compilation: set PREFX=GG: or PREFX=ADE:, depending on toolchain
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#PREFX = /opt/amigaos-68k/
|
PREFX = /opt/amigaos-68k/
|
||||||
PREFX = gg:
|
#PREFX = gg:
|
||||||
SYSINC = $(PREFX)os-include
|
SYSINC = $(PREFX)os-include
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
@@ -39,8 +39,9 @@ SYSINC = $(PREFX)os-include
|
|||||||
ifeq ($(compiler_vcc),1)
|
ifeq ($(compiler_vcc),1)
|
||||||
|
|
||||||
# VBCC (use explicit vlink line for LINK= if complaints about R_PC happen)
|
# VBCC (use explicit vlink line for LINK= if complaints about R_PC happen)
|
||||||
|
# -Rshort
|
||||||
CCX = vc
|
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
|
LINKEXE = vlink -bamigahunk -x -s -mrel -Cvbcc -Bstatic
|
||||||
#LINK = $(CCX) -nostdlib
|
#LINK = $(CCX) -nostdlib
|
||||||
CFLAGS = -Os -+ -sc -c99 -cpu=$(CPU)
|
CFLAGS = -Os -+ -sc -c99 -cpu=$(CPU)
|
||||||
@@ -138,6 +139,7 @@ ifeq ($(debug),1)
|
|||||||
CFLAGS += -DDEBUG -g
|
CFLAGS += -DDEBUG -g
|
||||||
CFLAGS2 += -DDEBUG -g
|
CFLAGS2 += -DDEBUG -g
|
||||||
#LINKLIBS = -L$(PREFX)/lib -ldebug
|
#LINKLIBS = -L$(PREFX)/lib -ldebug
|
||||||
|
#ASMOBJECTS += kprintf.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#DEVICEREVISION=95
|
#DEVICEREVISION=95
|
||||||
#DEVICEDATE=08.09.2018
|
#DEVICEDATE=08.09.2018
|
||||||
SUBDIR=enc624j6net
|
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)
|
# 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
|
DEVICEID=enc624j6net.device
|
||||||
DEFINES = -DHW_DMA_TX # -DPROTO_V2EXPNET
|
DEFINES = -DHW_DMA_TX #-DUSEMMU #
|
||||||
ASMDEFS = -DHW_DMA_TX # -DPROTO_V2EXPNET
|
ASMDEFS = -DHW_DMA_TX #
|
||||||
CPU = 68060
|
CPU = 68060
|
||||||
|
|
||||||
DEVICEID2=enc624j6net.device_68000
|
DEVICEID2=enc624j6net.device_68000
|
||||||
DEFINES2 = # -DPROTO_V2EXPNET
|
DEFINES2 = #
|
||||||
ASMDEFS2 = # -DPROTO_V2EXPNET
|
ASMDEFS2 = #
|
||||||
CPU2 = 68000
|
CPU2 = 68000
|
||||||
|
|
||||||
SAME_DEVNAME=1
|
SAME_DEVNAME=1
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# VAMPIREGFX makefile for vbcc
|
||||||
|
#
|
||||||
|
# author: Henryk Richter <henryk.richter@gmx.net>
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# VWiznet build instructions
|
||||||
|
#
|
||||||
|
# author: Henryk Richter <henryk.richter@gmx.net>
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
+136
-32
@@ -120,6 +120,8 @@ ASM SAVEDS struct Device *DevInit( ASMR(d0) DEVBASEP ASMREG(d0)
|
|||||||
db->db_SegList = seglist;
|
db->db_SegList = seglist;
|
||||||
db->db_Flags = 0;
|
db->db_Flags = 0;
|
||||||
|
|
||||||
|
InitSemaphore( &db->db_Sem ); /* server start/stop/online/offline */
|
||||||
|
|
||||||
dbNewList( &db->db_BufferManagement );
|
dbNewList( &db->db_BufferManagement );
|
||||||
|
|
||||||
for(i=0 ; i < MAX_UNITS ; i++ )
|
for(i=0 ; i < MAX_UNITS ; i++ )
|
||||||
@@ -137,9 +139,12 @@ ASM SAVEDS struct Device *DevInit( ASMR(d0) DEVBASEP ASMREG(d0)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ok = 0;
|
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 */
|
/* Search HW */
|
||||||
ok = hw_Find_Boards( db );
|
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));
|
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) */
|
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 */
|
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 */
|
if( flags & SANA2OPF_PROM ) /* implies _MINE by spec */
|
||||||
db->db_Units[unit].du_Flags |= DUF_PROMISC;
|
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;
|
ok = 0;
|
||||||
dbm = (struct db_BufferManagement *)AllocMem( sizeof(struct db_BufferManagement),MEMF_ANY|MEMF_CLEAR);
|
dbm = (struct db_BufferManagement *)AllocMem( sizeof(struct db_BufferManagement),MEMF_ANY|MEMF_CLEAR);
|
||||||
if( dbm )
|
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.95: disabled CopyToBuffer32 due to problems with MiamiDX */
|
||||||
/* v1.99: try identifying Miami */
|
/* v1.99: try identifying Miami */
|
||||||
/* MiamiDX requires byte count to be a multiple of 4 */
|
/* 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_CopyToBuffer32 = (0);
|
||||||
dbm->dbm_CopyFromBuffer32 = (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;
|
dbm->dbm_ID = db->db_ID;
|
||||||
ok = 1;
|
ok = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* the server is started with the Semaphore locked, to avoid
|
||||||
|
the race condition of getting instantiated twice
|
||||||
|
*/
|
||||||
if( ok )
|
if( ok )
|
||||||
{
|
{
|
||||||
/* start server if necessary */
|
/* start server if necessary */
|
||||||
ok = dbStartServer( db, unit );
|
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 )
|
if( ok )
|
||||||
{
|
{
|
||||||
ret = 0;
|
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 )
|
(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);
|
Signal( (struct Task*)db->db_ServerProc, SIGBREAKF_CTRL_D);
|
||||||
Delay(1);
|
Delay(1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
ObtainSemaphore( &db->db_Units[unit].du_Sem ); /* lock current board */
|
ObtainSemaphore( &db->db_Units[unit].du_Sem ); /* lock current board */
|
||||||
@@ -365,29 +385,16 @@ ASM SAVEDS BPTR DevClose( ASMR(a1) struct IOSana2Req *ioreq ASMREG(a1),
|
|||||||
|
|
||||||
ReleaseSemaphore( &db->db_Units[unit].du_Sem );
|
ReleaseSemaphore( &db->db_Units[unit].du_Sem );
|
||||||
|
|
||||||
if (db->db_Lib.lib_Flags & LIBF_DELEXP)
|
#if 1
|
||||||
ret = DevExpunge(db);
|
/* now check if the device is no longer in use in any unit (=global OpenCnt)
|
||||||
|
and shut down server if that is the case
|
||||||
return ret;
|
*/
|
||||||
}
|
ObtainSemaphore( &db->db_Sem );
|
||||||
|
if( db->db_Lib.lib_OpenCnt == 0 )
|
||||||
|
|
||||||
ASM SAVEDS BPTR DevExpunge( ASMR(a6) DEVBASEP ASMREG(a6) )
|
|
||||||
{
|
{
|
||||||
BPTR seglist = db->db_SegList;
|
|
||||||
ULONG i;
|
ULONG i;
|
||||||
struct SanaReadType *type;
|
struct SanaReadType *type;
|
||||||
|
|
||||||
if( db->db_Lib.lib_OpenCnt )
|
|
||||||
{
|
|
||||||
db->db_Lib.lib_Flags |= LIBF_DELEXP;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
Forbid();
|
|
||||||
Remove((struct Node*)db); /* remove device node from system */
|
|
||||||
Permit();
|
|
||||||
|
|
||||||
dbStopServer(db,0);
|
dbStopServer(db,0);
|
||||||
|
|
||||||
for( i=0 ; i < db->db_NBoards ; i++ )
|
for( i=0 ; i < db->db_NBoards ; i++ )
|
||||||
@@ -398,6 +405,45 @@ ASM SAVEDS BPTR DevExpunge( ASMR(a6) DEVBASEP ASMREG(a6)
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
ReleaseSemaphore( &db->db_Sem );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (db->db_Lib.lib_Flags & LIBF_DELEXP)
|
||||||
|
ret = DevExpunge(db);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ASM SAVEDS BPTR DevExpunge( ASMR(a6) DEVBASEP ASMREG(a6) )
|
||||||
|
{
|
||||||
|
BPTR seglist = db->db_SegList;
|
||||||
|
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
Forbid();
|
||||||
|
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++ )
|
||||||
|
{
|
||||||
|
while( (type = GetHead( &db->db_Units[i].du_ReadTypes ) ))
|
||||||
|
{
|
||||||
|
dbDeleteType( db, i, type->srt_Type );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* last steps: libraries */
|
/* last steps: libraries */
|
||||||
CloseLibrary(DOSBase);
|
CloseLibrary(DOSBase);
|
||||||
@@ -816,9 +862,9 @@ LONG Need_HighPri( DEVBASEP )
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( FindPort("Services Manager") )
|
if( FindPort( (STRPTR)"Services Manager") )
|
||||||
return 1;
|
return 1;
|
||||||
if( FindPort("Accounts Manager") )
|
if( FindPort( (STRPTR)"Accounts Manager") )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -833,23 +879,32 @@ static LONG dbStartServer( DEVBASEP, LONG unit )
|
|||||||
LONG ret = 0,i,pri;
|
LONG ret = 0,i,pri;
|
||||||
struct TagItem sv_tags[5];
|
struct TagItem sv_tags[5];
|
||||||
|
|
||||||
|
ObtainSemaphore( &db->db_Sem );
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
/* server running ? */
|
/* server running ? */
|
||||||
if( db->db_ServerProc )
|
if( db->db_ServerProc )
|
||||||
{
|
{
|
||||||
if( Need_HighPri( db ) )
|
if( Need_HighPri( db ) )
|
||||||
SetTaskPri((struct Task*)db->db_ServerProc,HIGHPRI);
|
SetTaskPri((struct Task*)db->db_ServerProc,HIGHPRI);
|
||||||
return 1;
|
ret = 1;
|
||||||
|
break; /* ReleaseSemaphore */
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!(port = CreateMsgPort() ))
|
if(!(port = CreateMsgPort() ))
|
||||||
return 0;
|
break; /* ReleaseSemaphore */
|
||||||
|
|
||||||
pri = 0;
|
pri = 0;
|
||||||
if( Need_HighPri( db ) )
|
if( Need_HighPri( db ) )
|
||||||
pri = HIGHPRI;
|
pri = HIGHPRI;
|
||||||
else
|
else
|
||||||
if( FindPort("AMITCP") ) /* AmiTCP active ? */
|
{
|
||||||
|
if( FindPort( (STRPTR)"AMITCP") ) /* AmiTCP active ? */
|
||||||
pri = 6;
|
pri = 6;
|
||||||
|
if( FindPort( (STRPTR)"BAXTCP") ) /* BaxTCP active ? */
|
||||||
|
pri = 6;
|
||||||
|
}
|
||||||
|
|
||||||
sv_tags[i=0].ti_Tag = NP_Entry;
|
sv_tags[i=0].ti_Tag = NP_Entry;
|
||||||
sv_tags[i++].ti_Data = (ULONG)ServerTask;
|
sv_tags[i++].ti_Data = (ULONG)ServerTask;
|
||||||
@@ -880,18 +935,26 @@ static LONG dbStartServer( DEVBASEP, LONG unit )
|
|||||||
|
|
||||||
DeleteMsgPort( port );
|
DeleteMsgPort( port );
|
||||||
|
|
||||||
|
} while(0);
|
||||||
|
|
||||||
|
ReleaseSemaphore( &db->db_Sem );
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* stop Server function */
|
/* stop Server function */
|
||||||
/* note: server is global right now */
|
/* note: server is global right now */
|
||||||
|
/* note: this code assumes to run with locked Semaphore (db_Sem) */
|
||||||
static LONG dbStopServer( DEVBASEP, LONG unit )
|
static LONG dbStopServer( DEVBASEP, LONG unit )
|
||||||
{
|
{
|
||||||
ULONG i=1;
|
ULONG i=1;
|
||||||
volatile struct Task *P;
|
volatile struct Task *P;
|
||||||
|
|
||||||
/* server deletes itself from devbase */
|
/* 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) )
|
while( (P=(volatile struct Task*)db->db_ServerProc) )
|
||||||
{
|
{
|
||||||
Signal( (struct Task*)P, SIGBREAKF_CTRL_C);
|
Signal( (struct Task*)P, SIGBREAKF_CTRL_C);
|
||||||
@@ -902,6 +965,47 @@ static LONG dbStopServer( DEVBASEP, LONG unit )
|
|||||||
return 0;
|
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<<sigbit;
|
||||||
|
|
||||||
|
if( flags & 1 )
|
||||||
|
ObtainSemaphore( &db->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
|
delete all buffers (type references) associated with device opener
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#define SysBase db->db_SysBase
|
#define SysBase db->db_SysBase
|
||||||
#define DOSBase db->db_DOSBase
|
#define DOSBase db->db_DOSBase
|
||||||
#define UtilityBase db->db_UtilityBase
|
#define UtilityBase db->db_UtilityBase
|
||||||
|
#define MMUBase db->db_MMUBase
|
||||||
//#define VampireBase db->db_VampireBase
|
//#define VampireBase db->db_VampireBase
|
||||||
|
|
||||||
/* old sana2.h ? */
|
/* old sana2.h ? */
|
||||||
@@ -103,6 +104,7 @@ struct devbase {
|
|||||||
struct Library *db_SysBase; /* Exec Base */
|
struct Library *db_SysBase; /* Exec Base */
|
||||||
struct Library *db_DOSBase;
|
struct Library *db_DOSBase;
|
||||||
struct Library *db_UtilityBase;
|
struct Library *db_UtilityBase;
|
||||||
|
struct Library *db_MMUBase;
|
||||||
ULONG db_NBoards;
|
ULONG db_NBoards;
|
||||||
ULONG db_ID; /* device opener ID enumeration */
|
ULONG db_ID; /* device opener ID enumeration */
|
||||||
|
|
||||||
@@ -110,6 +112,8 @@ struct devbase {
|
|||||||
than 1 network card of the same type, anyway ? */
|
than 1 network card of the same type, anyway ? */
|
||||||
|
|
||||||
/* server process data */
|
/* 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 */
|
volatile struct Process *db_ServerProc; /* process of main queue server */
|
||||||
struct Task *db_Task; /* server shutdown task address (non permanently available) */
|
struct Task *db_Task; /* server shutdown task address (non permanently available) */
|
||||||
ULONG db_ServerSigMask; /* shutdown signal */
|
ULONG db_ServerSigMask; /* shutdown signal */
|
||||||
@@ -249,6 +253,7 @@ static LONG dbIsInList( struct List *, struct Node * );
|
|||||||
|
|
||||||
static LONG dbStartServer( DEVBASETYPE*, LONG );
|
static LONG dbStartServer( DEVBASETYPE*, LONG );
|
||||||
static LONG dbStopServer( DEVBASETYPE*, LONG );
|
static LONG dbStopServer( DEVBASETYPE*, LONG );
|
||||||
|
static LONG dbSignalServer( DEVBASETYPE*, ULONG, ULONG );
|
||||||
|
|
||||||
static void dbDeleteBuffers( DEVBASETYPE*, struct IOSana2Req * );
|
static void dbDeleteBuffers( DEVBASETYPE*, struct IOSana2Req * );
|
||||||
|
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ DUF_PROMISC EQU (1<<DUB_PROMISC)
|
|||||||
;than 1 network card of the same type, anyway ?
|
;than 1 network card of the same type, anyway ?
|
||||||
|
|
||||||
; server process data
|
; server process data
|
||||||
|
STRUCT db_Sem,SS_SIZE ;list locking (global per unit)
|
||||||
APTR db_ServerProc ;process of main queue server
|
APTR db_ServerProc ;process of main queue server
|
||||||
APTR db_Task ;server shutdown task address (non permanently available)
|
APTR db_Task ;server shutdown task address (non permanently available)
|
||||||
ULONG db_ServerSigMask ;shutdown signal
|
ULONG db_ServerSigMask ;shutdown signal
|
||||||
|
|||||||
@@ -23,11 +23,13 @@
|
|||||||
DEBUG EQU 0
|
DEBUG EQU 0
|
||||||
GLOBALINT_BOARD EQU 0 ;if 1, then toggle board interrupt, else ENC624 INTIE
|
GLOBALINT_BOARD EQU 0 ;if 1, then toggle board interrupt, else ENC624 INTIE
|
||||||
OPT_AVOID_DEFAULT_RESETS EQU 1 ;if 1, then check valid Microchip MAC OUI and don't reset the whole chip if the MAC address is ok
|
OPT_AVOID_DEFAULT_RESETS EQU 1 ;if 1, then check valid Microchip MAC OUI and don't reset the whole chip if the MAC address is ok
|
||||||
|
OPT_Z2_WORDREAD EQU 1 ;read words instead of Longs on Z2 (specifically, 68030)
|
||||||
|
|
||||||
incdir src:baxnet/trunk/source/
|
incdir src:baxnet/trunk/source/
|
||||||
;Temp:Amiga/src/Zorro-LAN-IDE.git/Driver/enc624j6net/
|
;Temp:Amiga/src/Zorro-LAN-IDE.git/Driver/enc624j6net/
|
||||||
include "enc624j6net/registers.i"
|
include "enc624j6net/registers.i"
|
||||||
include "enc624j6net/macros.i"
|
include "enc624j6net/macros.i"
|
||||||
|
include "hw.i"
|
||||||
|
|
||||||
ifnd DEBUG
|
ifnd DEBUG
|
||||||
DEBUG EQU 0
|
DEBUG EQU 0
|
||||||
@@ -129,6 +131,9 @@ ENC_BOARDID EQU 123 ;ZII-IDE-LAN-CP
|
|||||||
XDEF _enc624j6l_ReadPHY
|
XDEF _enc624j6l_ReadPHY
|
||||||
XDEF _enc624j6l_WritePHY
|
XDEF _enc624j6l_WritePHY
|
||||||
|
|
||||||
|
ifne OPT_Z2_WORDREAD
|
||||||
|
XDEF _enc624j6l_Z2Mode
|
||||||
|
endc
|
||||||
|
|
||||||
;
|
;
|
||||||
; System includes
|
; System includes
|
||||||
@@ -458,6 +463,15 @@ a
|
|||||||
dc.b $54,$10,$EC,0
|
dc.b $54,$10,$EC,0
|
||||||
dc.b $80,$1F,$12,0
|
dc.b $80,$1F,$12,0
|
||||||
dc.b $D8,$80,$39,0
|
dc.b $D8,$80,$39,0
|
||||||
|
;new registrations by Microchip
|
||||||
|
dc.b $e8,$eb,$1b,0 ; 23-Jun-2020
|
||||||
|
dc.b $80,$34,$28,0 ; 22-Dec-2020
|
||||||
|
dc.b $60,$8a,$10,0 ; 30-Mar-2021
|
||||||
|
dc.b $fc,$0f,$e7,0 ; 10-Sep-2021
|
||||||
|
dc.b $9c,$95,$6e,0 ; 21-Apr-2022
|
||||||
|
dc.b $44,$b7,$d0,0 ; 02-Aug-2022
|
||||||
|
dc.b $D8,$47,$8f,0 ; 13-Jan-2023
|
||||||
|
dc.b $40,$84,$32,0 ; 30-Mar-2023
|
||||||
dc.b 0,0,0,0
|
dc.b 0,0,0,0
|
||||||
|
|
||||||
.dorst:
|
.dorst:
|
||||||
@@ -657,7 +671,7 @@ _enc624j6l_Init:
|
|||||||
move #RXSTOP_INIT&$fffe,d0
|
move #RXSTOP_INIT&$fffe,d0
|
||||||
WRITEREG ERXTAIL,a0,d0 ;tail pointer in buffer = rx-2, wraparound
|
WRITEREG ERXTAIL,a0,d0 ;tail pointer in buffer = rx-2, wraparound
|
||||||
|
|
||||||
; ifne _OPT_FLOWCONTROL
|
; ifne _OPT_FLOWCONTROL ;this is now a runtime option
|
||||||
moveq #PIO_INIT_FLOW_CONTROL,d0
|
moveq #PIO_INIT_FLOW_CONTROL,d0
|
||||||
and d1,d0
|
and d1,d0
|
||||||
beq.s .init_noflow
|
beq.s .init_noflow
|
||||||
@@ -810,6 +824,49 @@ _enc624j6l_SetOnline:
|
|||||||
moveq #0,d0
|
moveq #0,d0
|
||||||
WRITEREG PLinkChange,a0,d0 ;no detected/acknowledged link right now, i.e. LNK and DPX bits = 0
|
WRITEREG PLinkChange,a0,d0 ;no detected/acknowledged link right now, i.e. LNK and DPX bits = 0
|
||||||
|
|
||||||
|
ifne 1
|
||||||
|
moveq #48,d0 ;was: 12
|
||||||
|
move.l d0,-(sp)
|
||||||
|
.an_wait_loop:
|
||||||
|
moveq #100,d0 ;
|
||||||
|
lsl.l #5,d0 ;wait 3.2ms (0.1*32)
|
||||||
|
bsr _enc624j6l_UMinDelay ;
|
||||||
|
|
||||||
|
moveq #PHSTAT1,d0 ;AUTONEG DONE, forced speeds/duplex
|
||||||
|
bsr _enc624j6l_ReadPHY
|
||||||
|
and.w #PHSTAT1_ANDONE,d0 ;autoneg success?
|
||||||
|
beq.s .an_not_finished
|
||||||
|
|
||||||
|
bsr _enc624j6l_CheckLinkChange ;
|
||||||
|
bra.s .an_finished
|
||||||
|
.an_not_finished:
|
||||||
|
subq.l #1,(sp)
|
||||||
|
bgt.s .an_wait_loop
|
||||||
|
.an_finished:
|
||||||
|
addq.l #4,sp
|
||||||
|
endc
|
||||||
|
|
||||||
|
ifne 0
|
||||||
|
;---------------- until HW comes upe ----------------------------------
|
||||||
|
;
|
||||||
|
;wait 256 us
|
||||||
|
;
|
||||||
|
moveq #40,d1 ;
|
||||||
|
.txwait:
|
||||||
|
READREG ECON1,a0,d0
|
||||||
|
and.w #ECON1_TXRTS,d0
|
||||||
|
beq.s .txrdy
|
||||||
|
;100 MBit/s frame time is max. 0.12 ms (without inter-frame spacing)
|
||||||
|
|
||||||
|
;WRITEDEBUG TXWait_MSG
|
||||||
|
|
||||||
|
;wait 5 us via CIA
|
||||||
|
moveq #5,d0
|
||||||
|
bsr _enc624j6l_UMinDelay
|
||||||
|
dbf d1,.txwait ;approx. 1ms max. wait
|
||||||
|
.txrdy:
|
||||||
|
endc
|
||||||
|
|
||||||
;moveq #1,d0 ;already set, see above
|
;moveq #1,d0 ;already set, see above
|
||||||
.err
|
.err
|
||||||
rts
|
rts
|
||||||
@@ -1073,6 +1130,7 @@ _enc624j6l_IntServer_List:
|
|||||||
; In: A0 = board base address
|
; In: A0 = board base address
|
||||||
;
|
;
|
||||||
; Out: D0 <0 error
|
; Out: D0 <0 error
|
||||||
|
;
|
||||||
; =0 ok, no link change handled
|
; =0 ok, no link change handled
|
||||||
; >0 ok, link change handled
|
; >0 ok, link change handled
|
||||||
;
|
;
|
||||||
@@ -1080,7 +1138,7 @@ _enc624j6l_IntServer_List:
|
|||||||
;
|
;
|
||||||
_enc624j6l_CheckLinkChange:
|
_enc624j6l_CheckLinkChange:
|
||||||
move.l a0,d0
|
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
|
; link change events are captured with Interrupts and stored
|
||||||
; in the (custom) PLinkChange location (per board) by init and
|
; in the (custom) PLinkChange location (per board) by init and
|
||||||
@@ -1145,7 +1203,8 @@ _enc624j6l_CheckLinkChange:
|
|||||||
moveq #0,d0
|
moveq #0,d0
|
||||||
.rts:
|
.rts:
|
||||||
rts
|
rts
|
||||||
|
.err: moveq #HW_MAC_INVALID,d0 ;-1
|
||||||
|
rts
|
||||||
|
|
||||||
;---------------------------------------------------------------------------------------
|
;---------------------------------------------------------------------------------------
|
||||||
;
|
;
|
||||||
@@ -1272,6 +1331,305 @@ _enc624j6l_HaveRecv:
|
|||||||
bra.s .rts
|
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
|
; receive single frame from HW into supplied memory buffer
|
||||||
@@ -1289,10 +1647,17 @@ _enc624j6l_HaveRecv:
|
|||||||
; notes:
|
; notes:
|
||||||
;
|
;
|
||||||
_enc624j6l_RecvFrame: ;
|
_enc624j6l_RecvFrame: ;
|
||||||
|
ifne OPT_Z2_WORDREAD
|
||||||
|
tst.l Z2Mode
|
||||||
|
bne.w _enc624j6l_RecvFrameZ2
|
||||||
|
endc
|
||||||
|
|
||||||
movem.l d2-d7/a1-a3,-(sp)
|
movem.l d2-d7/a1-a3,-(sp)
|
||||||
move.l a0,d1
|
move.l a0,d1
|
||||||
beq .err
|
beq .err
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
moveq #0,d0
|
moveq #0,d0
|
||||||
READREG ESTAT,a0,d2 ;number of pending frames
|
READREG ESTAT,a0,d2 ;number of pending frames
|
||||||
move.b d2,d0 ;clear out count (ESTAT_PKTCNT7...ESTAT_PKTCNT0)
|
move.b d2,d0 ;clear out count (ESTAT_PKTCNT7...ESTAT_PKTCNT0)
|
||||||
@@ -1899,4 +2264,12 @@ _enc624j6l_UMinDelay:
|
|||||||
;recvcount: dc.l 0
|
;recvcount: dc.l 0
|
||||||
;recvlist: ds.w 65536
|
;recvlist: ds.w 65536
|
||||||
|
|
||||||
|
;separate section necessary with SAS/C
|
||||||
|
section data,data
|
||||||
|
|
||||||
|
Z2Mode:
|
||||||
|
_enc624j6l_Z2Mode:
|
||||||
|
dc.l 0
|
||||||
|
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|||||||
@@ -362,5 +362,6 @@ ASM SAVEDS int enc624j6l_WritePHY(
|
|||||||
ASMR(d0) unsigned long phyreg ASMREG(d0),
|
ASMR(d0) unsigned long phyreg ASMREG(d0),
|
||||||
ASMR(d1) unsigned short data ASMREG(d1) );
|
ASMR(d1) unsigned short data ASMREG(d1) );
|
||||||
|
|
||||||
|
extern unsigned long enc624j6l_Z2Mode;
|
||||||
|
|
||||||
#endif /* _INC_ENC624J6L_H */
|
#endif /* _INC_ENC624J6L_H */
|
||||||
|
|||||||
@@ -9,21 +9,26 @@
|
|||||||
*/
|
*/
|
||||||
#include <exec/libraries.h>
|
#include <exec/libraries.h>
|
||||||
#include <proto/exec.h>
|
#include <proto/exec.h>
|
||||||
|
#include <exec/execbase.h>
|
||||||
|
|
||||||
/*#include <clib/expansion_protos.h>
|
/*#include <clib/expansion_protos.h>
|
||||||
#include <pragmas/expansion_pragmas.h>*/
|
#include <pragmas/expansion_pragmas.h>*/
|
||||||
#include <proto/expansion.h>
|
#include <proto/expansion.h>
|
||||||
#include <libraries/configvars.h>
|
#include <libraries/configvars.h>
|
||||||
#include <hardware/intbits.h>
|
#include <hardware/intbits.h>
|
||||||
|
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include "hw.h"
|
#include "hw.h"
|
||||||
|
|
||||||
#include "enc624j6l.h"
|
#include "enc624j6l.h"
|
||||||
#include "registers.h"
|
#include "registers.h"
|
||||||
|
#include "mmustuff.h"
|
||||||
|
|
||||||
extern const BYTE DeviceName[];
|
extern const BYTE DeviceName[];
|
||||||
|
|
||||||
|
#ifndef AFF_68060
|
||||||
|
#define AFF_68060 (1<<10)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define ENC_MANUFACTURER 2588
|
#define ENC_MANUFACTURER 2588
|
||||||
#define ENC_BOARD 123
|
#define ENC_BOARD 123
|
||||||
|
|
||||||
@@ -90,11 +95,12 @@ ASM SAVEDS LONG hw_Find_Boards( ASMR(a0) DEVBASEP ASMREG(a0) )
|
|||||||
struct ConfigDev *cfg = (0);
|
struct ConfigDev *cfg = (0);
|
||||||
APTR boardbase;
|
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 */
|
/* TODO: actually verify that we have a module here */
|
||||||
/* ret = 1; */
|
/* ret = 1; */
|
||||||
|
|
||||||
|
enc624j6l_Z2Mode = 0;
|
||||||
for( i=0 ; i < MAX_UNITS ; i++ )
|
for( i=0 ; i < MAX_UNITS ; i++ )
|
||||||
{
|
{
|
||||||
cfg = FindConfigDev( cfg, ENC_MANUFACTURER, ENC_BOARD );
|
cfg = FindConfigDev( cfg, ENC_MANUFACTURER, ENC_BOARD );
|
||||||
@@ -104,9 +110,28 @@ ASM SAVEDS LONG hw_Find_Boards( ASMR(a0) DEVBASEP ASMREG(a0) )
|
|||||||
db->db_Units[i].duh_BASE = boardbase;
|
db->db_Units[i].duh_BASE = boardbase;
|
||||||
D(("Board at %lx\n",(ULONG)cfg->cd_BoardAddr ));
|
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) */
|
/* bring board to sane state (i.e. perform soft reset) */
|
||||||
/* if( boardbase < (APTR)0x40000000 ) */ /* debug only */
|
/* if( boardbase < (APTR)0x40000000 ) */ /* debug only */
|
||||||
enc624j6l_CheckBoard( boardbase );
|
enc624j6l_CheckBoard( boardbase );
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
ret = i;
|
ret = i;
|
||||||
D(("%ld boards found\n",ret));
|
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),
|
ASM SAVEDS void hw_ConfigUpdate( ASMR(a0) DEVBASEP ASMREG(a0),
|
||||||
ASMR(a1) void*argsv ASMREG(a1))
|
ASMR(a1) void*argsv ASMREG(a1))
|
||||||
{
|
{
|
||||||
struct HWConfig *args = (struct HWConfig *)argsv; /* see hwprivate.h */
|
struct HWConfig *args = (struct HWConfig *)argsv; /* see hwprivate.h */
|
||||||
struct HWData *hwd = &db->db_hwdat;
|
struct HWData *hwd = &db->db_hwdat;
|
||||||
|
|
||||||
|
D(("hw_ConfigUpdate\n"));
|
||||||
if( args->timervalue )
|
if( args->timervalue )
|
||||||
hwd->timervalue = *args->timervalue;
|
hwd->timervalue = *args->timervalue;
|
||||||
if( args->fullduplex )
|
if( args->fullduplex )
|
||||||
@@ -314,6 +357,28 @@ ASM SAVEDS void hw_ConfigUpdate( ASMR(a0) DEVBASEP ASMREG(a0),
|
|||||||
hwd->flowcontrol = 1;
|
hwd->flowcontrol = 1;
|
||||||
if( args->multicast )
|
if( args->multicast )
|
||||||
hwd->multicast = 1;
|
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 );
|
phcon1 = enc624j6l_ReadPHY( boardbase, PHCON1 );
|
||||||
phstat1 = enc624j6l_ReadPHY( boardbase, PHSTAT1 ); /* read again to see whether link is established */
|
phstat1 = enc624j6l_ReadPHY( boardbase, PHSTAT1 ); /* read again to see whether link is established */
|
||||||
if( ( phstat1 < 0 ) || ( phstat3 < 0 ) )
|
if( ( phstat1 < 0 ) || ( phstat3 < 0 ) )
|
||||||
|
{
|
||||||
return HW_MAC_INVALID; /* no valid data found */
|
return HW_MAC_INVALID; /* no valid data found */
|
||||||
|
}
|
||||||
|
|
||||||
/* a) check Link */
|
/* a) check Link */
|
||||||
ret = 0;
|
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 */
|
/* TODO: implement Multicast hashing */
|
||||||
ASM SAVEDS LONG hw_change_multicast( ASMR(a0) DEVBASEP ASMREG(a0),
|
ASM SAVEDS LONG hw_change_multicast( ASMR(a0) DEVBASEP ASMREG(a0),
|
||||||
ASMR(d0) ULONG unit ASMREG(d0),
|
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 mc_hashes[4] = {0,0,0,0}; /* EHT1, EHT2, EHT3, EHT4 */
|
||||||
USHORT *hash_tab;
|
USHORT *hash_tab;
|
||||||
struct MCastEntry *mc;
|
struct MCastEntry *mc;
|
||||||
UBYTE *curmc;
|
UBYTE curmc[6];
|
||||||
|
|
||||||
flags = PIO_INIT_BROAD_CAST;
|
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->mce_Node.mln_Succ ;
|
||||||
mc=(struct MCastEntry*)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 ) )
|
while( CMPleMAC( curmc, mc->mce_stop ) )
|
||||||
{
|
{
|
||||||
D(("CMPleMAC %ld %02lx%02lx%02lx%02lx%02lx%02lx - %02lx%02lx%02lx%02lx%02lx%02lx\n",\
|
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] \
|
(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 */
|
curhash = (crc & 0x1f800000)>>23; /* 2 bit reg, 4 bit hash pos in reg */
|
||||||
mc_hashes[ ((curhash >> 4)&3) ] |= 1<<(curhash&0xf);
|
mc_hashes[ ((curhash >> 4)&3) ] |= 1<<(curhash&0xf);
|
||||||
INCMAC( curmc );
|
INCMAC( curmc );
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ struct HWData {
|
|||||||
#define HW_CONFIGFILE "ENV:SANA2/enc624j6net.config"
|
#define HW_CONFIGFILE "ENV:SANA2/enc624j6net.config"
|
||||||
|
|
||||||
/* appended to COMMON_TEMPLATE */
|
/* 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 */
|
/* referenced by server.c, hw.c */
|
||||||
struct HWConfig
|
struct HWConfig
|
||||||
@@ -51,6 +51,7 @@ struct HWConfig
|
|||||||
ULONG fullduplex;
|
ULONG fullduplex;
|
||||||
ULONG multicast;
|
ULONG multicast;
|
||||||
ULONG flowcontrol;
|
ULONG flowcontrol;
|
||||||
|
STRPTR conf_mac; /* user config MAC address */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _INC_HWPRIVATE_H */
|
#endif /* _INC_HWPRIVATE_H */
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
_OPT_BUFFER_SWAP EQU 0 ;perform byte swap on buffer ops (1) or assume native endian (0)
|
_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_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_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_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
|
_OPT_CHECKLINK_TX EQU 0 ;check for link changes in TX (1) or expect from outside (0) -> see server.c
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
incdir include:
|
;incdir include:
|
||||||
ifnd _LVOSupervisor
|
;ifnd _LVOSupervisor
|
||||||
include lvo/exec_lib.i
|
;include lvo/exec_lib.i
|
||||||
;include exec/exec_lib.i
|
;include exec/exec_lib.i
|
||||||
endc
|
;endc
|
||||||
include exec/execbase.i
|
;include exec/execbase.i
|
||||||
include device.i
|
;include device.i
|
||||||
|
|
||||||
|
|
||||||
ifnd _LVORawDoFmt
|
ifnd _LVORawDoFmt
|
||||||
@@ -52,10 +52,10 @@ _KPrintFa0a1:
|
|||||||
rts
|
rts
|
||||||
|
|
||||||
;DEBUG
|
;DEBUG
|
||||||
dc.l $deadbeef
|
; dc.l $deadbeef
|
||||||
dc.l sds_SIZEOF
|
; dc.l sds_SIZEOF
|
||||||
dc.l sv_SIZEOF
|
; dc.l sv_SIZEOF
|
||||||
dc.l du_SIZEOF
|
; dc.l du_SIZEOF
|
||||||
dc.l db_SIZEOF
|
; dc.l db_SIZEOF
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -174,7 +174,7 @@ LONG get_device(struct prgdata *prg, BYTE *name, LONG unit )
|
|||||||
static BOOL findcmd(struct NSDeviceQueryResult *nsdqr, UWORD cmd)
|
static BOOL findcmd(struct NSDeviceQueryResult *nsdqr, UWORD cmd)
|
||||||
{
|
{
|
||||||
UWORD *p;
|
UWORD *p;
|
||||||
for (p = nsdqr->SupportedCommands; (*p); ++p)
|
for (p = nsdqr->nsdqr_SupportedCommands; (*p); ++p )
|
||||||
if (*p == cmd)
|
if (*p == cmd)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -204,9 +204,9 @@ LONG probe_device( struct prgdata *prg )
|
|||||||
return 0;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 <proto/mmu.h>
|
||||||
|
#include <mmu/context.h>
|
||||||
|
#include <mmu/mmutags.h>
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -154,7 +154,7 @@ static LONG server_setOnline( DEVBASEP , ULONG unit, ULONG evt )
|
|||||||
struct Library *TimerBase;
|
struct Library *TimerBase;
|
||||||
|
|
||||||
MemSet( &timereq, 0, sizeof(struct timerequest));
|
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;
|
TimerBase = (struct Library *)timereq.tr_node.io_Device;
|
||||||
GetSysTime( &db->db_Units[unit].du_DevStats.LastStart );
|
GetSysTime( &db->db_Units[unit].du_DevStats.LastStart );
|
||||||
CloseDevice( (struct IORequest*)&timereq);
|
CloseDevice( (struct IORequest*)&timereq);
|
||||||
@@ -293,7 +293,7 @@ static LONG server_Config( DEVBASEP )
|
|||||||
|
|
||||||
hw_ConfigInit( db ); /* hw defaults */
|
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 HWConfig args; /* see hwprivate.h */
|
||||||
struct RDArgs *readargs;
|
struct RDArgs *readargs;
|
||||||
@@ -302,7 +302,7 @@ static LONG server_Config( DEVBASEP )
|
|||||||
|
|
||||||
MemSet( &args, 0, sizeof( args ) );
|
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 */
|
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;
|
entry = (struct MCastEntry *)db->db_svdat.sv_mclist.lh_Head;
|
||||||
while( entry->mce_Node.mln_Succ )
|
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;
|
break;
|
||||||
entry = (struct MCastEntry *)entry->mce_Node.mln_Succ;
|
entry = (struct MCastEntry *)entry->mce_Node.mln_Succ;
|
||||||
}
|
}
|
||||||
@@ -1143,11 +1143,17 @@ VOID SAVEDS ServerTask(void)
|
|||||||
server_HandleS2Commands( db );
|
server_HandleS2Commands( db );
|
||||||
gotmask &= ~portsigmask;
|
gotmask &= ~portsigmask;
|
||||||
}
|
}
|
||||||
|
/* Important: first check CTRL_D to go offline cleanly
|
||||||
|
before acting on CTRL_C
|
||||||
|
*/
|
||||||
if( gotmask & SIGBREAKF_CTRL_D )
|
if( gotmask & SIGBREAKF_CTRL_D )
|
||||||
{
|
{
|
||||||
D(("Got CTRL-D in Server. Checking Online status\n"));
|
D(("Got CTRL-D in Server. Checking Online status\n"));
|
||||||
gotmask &= ~SIGBREAKF_CTRL_D;
|
gotmask &= ~SIGBREAKF_CTRL_D;
|
||||||
server_CloseDevice_offline( db );
|
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 )
|
if( gotmask & SIGBREAKF_CTRL_C )
|
||||||
{
|
{
|
||||||
@@ -1161,10 +1167,16 @@ VOID SAVEDS ServerTask(void)
|
|||||||
|
|
||||||
QuitServer:
|
QuitServer:
|
||||||
if( db )
|
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 */
|
{ /* revert to "real" execbase, in case that we never got the startup msg */
|
||||||
struct { struct Library *db_SysBase; } *db = (void*)0x4;
|
struct { struct Library *db_SysBase; } *db = (void*)0x4;
|
||||||
|
|
||||||
D(("Server exiting"));
|
D(("Server exiting"));
|
||||||
Forbid();
|
Forbid();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ ASMOBJECTS = $(SUBDIR)/enc624j6l.o$(TYPE) $(SUBDIR)/intervaltimer.o$(TYPE)
|
|||||||
# arguments passed down recursively (example):
|
# arguments passed down recursively (example):
|
||||||
#DEVICEID=v2expeth.device
|
#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
|
ASMDEFS1 = -DHW_DMA_TX=1
|
||||||
#CPU = 68020
|
#CPU = 68020
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,165 @@
|
|||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# SAS/C Makefile for V4 ETH
|
||||||
|
#
|
||||||
|
# author: Henryk Richter <henryk.richter@gmx.net>
|
||||||
|
#
|
||||||
|
# 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 <henryk.richter@gmx.net>
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# SAS/C Makefile for VWizNet
|
||||||
|
#
|
||||||
|
# author: Henryk Richter <henryk.richter@gmx.net>
|
||||||
|
#
|
||||||
|
# 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 <henryk.richter@gmx.net>
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
@@ -9,9 +9,9 @@
|
|||||||
#define _INC_VERSION_H
|
#define _INC_VERSION_H
|
||||||
|
|
||||||
#define DEVICEVERSION 2
|
#define DEVICEVERSION 2
|
||||||
#define DEVICEREVISION 9
|
#define DEVICEREVISION 15
|
||||||
#define DEVICEEXTRA
|
#define DEVICEEXTRA
|
||||||
/* #define DEVICEEXTRA Beta */
|
/* #define DEVICEEXTRA Beta */
|
||||||
#define DEVICEDATE 23.08.20
|
#define DEVICEDATE 1.3.26
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user