From 5e8e5ce09a186db6eb8a58c94e5358c50472e732 Mon Sep 17 00:00:00 2001 From: beeanyew Date: Fri, 14 May 2021 14:46:57 +0200 Subject: [PATCH] Update Pi-NET to new device driver framework --- platforms/amiga/net/net_driver_amiga/build.sh | 2 +- .../net/net_driver_amiga/pi-net-amiga-2.c | 321 ++++++++++++++++++ .../amiga/net/net_driver_amiga/pi-net.device | Bin 4796 -> 1364 bytes 3 files changed, 322 insertions(+), 1 deletion(-) create mode 100644 platforms/amiga/net/net_driver_amiga/pi-net-amiga-2.c diff --git a/platforms/amiga/net/net_driver_amiga/build.sh b/platforms/amiga/net/net_driver_amiga/build.sh index 302ffc5..7ee836d 100644 --- a/platforms/amiga/net/net_driver_amiga/build.sh +++ b/platforms/amiga/net/net_driver_amiga/build.sh @@ -1 +1 @@ -m68k-amigaos-gcc -m68020 -O2 -o pi-net.device -ramiga-dev -noixemul -fbaserel pi-net-amiga.c -ldebug -lamiga +m68k-amigaos-gcc pi-net-amiga-2.c -O2 -o pi-net.device -m68000 -Wall -Wextra -Wno-unused-parameter -fomit-frame-pointer -nostartfiles -lm -ldebug diff --git a/platforms/amiga/net/net_driver_amiga/pi-net-amiga-2.c b/platforms/amiga/net/net_driver_amiga/pi-net-amiga-2.c new file mode 100644 index 0000000..c209a41 --- /dev/null +++ b/platforms/amiga/net/net_driver_amiga/pi-net-amiga-2.c @@ -0,0 +1,321 @@ +// SPDX-License-Identifier: MIT + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include + +//#include +#include +//#include +#include "sana2.h" +#include "../pi-net-enums.h" + +#include +#include +#include + +#define STR(s) #s +#define XSTR(s) STR(s) + +#define DEVICE_NAME "pi-net.device" +#define DEVICE_DATE "(14 May 2021)" +#define DEVICE_ID_STRING "Pi-NET " XSTR(DEVICE_VERSION) "." XSTR(DEVICE_REVISION) " " DEVICE_DATE +#define DEVICE_VERSION 43 +#define DEVICE_REVISION 10 +#define DEVICE_PRIORITY 0 + +#pragma pack(4) +struct pinet_base { + struct Device* pi_dev; + struct Unit unit; + uint8_t MAC[6]; + uint8_t IP[4]; + + struct List read_list; + struct SignalSemaphore read_list_sem; +}; + +struct ExecBase* SysBase = NULL; +uint8_t *saved_seg_list; +uint8_t is_open; + +#define WRITESHORT(cmd, val) *(unsigned short *)((unsigned long)(PINET_OFFSET + cmd)) = val; +#define WRITELONG(cmd, val) *(unsigned long *)((unsigned long)(PINET_OFFSET + cmd)) = val; +#define WRITEBYTE(cmd, val) *(unsigned char *)((unsigned long)(PINET_OFFSET + cmd)) = val; + +#define READBYTE(cmd, var) var = *(volatile unsigned char *)(PINET_OFFSET + cmd); +#define READSHORT(cmd, var) var = *(volatile unsigned short *)(PINET_OFFSET + cmd); +#define READLONG(cmd, var) var = *(volatile unsigned long *)(PINET_OFFSET + cmd); + +int __attribute__((no_reorder)) _start() +{ + return -1; +} + +asm("romtag: \n" + " dc.w "XSTR(RTC_MATCHWORD)" \n" + " dc.l romtag \n" + " dc.l endcode \n" + " dc.b "XSTR(RTF_AUTOINIT)" \n" + " dc.b "XSTR(DEVICE_VERSION)" \n" + " dc.b "XSTR(NT_DEVICE)" \n" + " dc.b "XSTR(DEVICE_PRIORITY)" \n" + " dc.l _device_name \n" + " dc.l _device_id_string \n" + " dc.l _auto_init_tables \n" + "endcode: \n"); +char device_name[] = DEVICE_NAME; +char device_id_string[] = DEVICE_ID_STRING; + +typedef struct BufferManagement +{ + struct MinNode bm_Node; + BOOL (*bm_CopyFromBuffer)(void* a __asm("a0"), void* b __asm("a1"), long c __asm("d0")); + BOOL (*bm_CopyToBuffer)(void* a __asm("a0"), void* b __asm("a1"), long c __asm("d0")); +} BufferManagement; + +struct pinet_base *dev_base = NULL; + +//#define exit(...) +//#define debug(...) +#define kprintf(...) + +static struct Library __attribute__((used)) *init_device(struct Device* dev) { + uint8_t *p; + uint32_t i; + int32_t ok; + + // Unused variables + if (ok || i || p) { } + + SysBase = *(struct ExecBase **)4L; + + kprintf("Initializing net device.\n"); + + dev_base = AllocMem(sizeof(struct pinet_base), MEMF_PUBLIC | MEMF_CLEAR); + dev_base->pi_dev = dev; + + kprintf("Grabbing MAC.\n"); + for (int i = 0; i < 6; i++) { + READBYTE((PINET_CMD_MAC + i), dev_base->MAC[i]); + } + kprintf("Grabbing IP.\n"); + for (int i = 0; i < 4; i++) { + READBYTE((PINET_CMD_IP + i), dev_base->IP[i]); + } + + return (struct Library *)dev; +} + +static uint8_t* __attribute__((used)) expunge(void) { + kprintf("Cleaning up.\n"); + FreeMem(dev_base, sizeof(struct pinet_base)); + return 0; +} + +static void __attribute__((used)) open(struct IORequest *io, uint32_t num, uint32_t flags) { + struct IOSana2Req *ioreq = (struct IOSana2Req *)io; + int32_t ok = 0, ret = IOERR_OPENFAIL; + struct BufferManagement *bm; + + kprintf("Opening net device %ld.\n", num); + dev_base->unit.unit_OpenCnt++; + + // Unused variables + if (bm || ok) { } + + if (num == 0 && dev_base->unit.unit_OpenCnt == 1) { + //kprintf("Trying to alloc buffer management.\n"); + //if ((bm = (struct BufferManagement*)AllocVec(sizeof(struct BufferManagement), MEMF_CLEAR | MEMF_PUBLIC))) { + //kprintf("Setting up buffer copy funcs (1).\n"); + //bm->bm_CopyToBuffer = (BOOL *)GetTagData(S2_CopyToBuff, 0, (struct TagItem *)ioreq->ios2_BufferManagement); + //kprintf("Setting up buffer copy funcs (2).\n"); + //bm->bm_CopyFromBuffer = (BOOL *)GetTagData(S2_CopyFromBuff, 0, (struct TagItem *)ioreq->ios2_BufferManagement); + + kprintf("Doing more things.\n"); + ioreq->ios2_BufferManagement = NULL;//(VOID *)bm; + ioreq->ios2_Req.io_Error = 0; + ioreq->ios2_Req.io_Unit = (struct Unit *)&dev_base->unit; + ioreq->ios2_Req.io_Device = (struct Device *)dev_base->pi_dev; + + kprintf("New list.\n"); + + NewList(&dev_base->read_list); + InitSemaphore(&dev_base->read_list_sem); + + ret = 0; + ok = 1; + //} + } + + if (ret == IOERR_OPENFAIL) { + kprintf("Failed to open device. Already open?\n"); + } + else { + kprintf("Device opened, yay.\n"); + } + ioreq->ios2_Req.io_Error = ret; + ioreq->ios2_Req.io_Message.mn_Node.ln_Type = NT_REPLYMSG; + + kprintf("Opened device, return code: %ld\n", ret); +} + +static uint8_t* __attribute__((used)) close(struct IORequest *io) { + return 0; +} + +uint32_t pinet_read_frame(struct IOSana2Req *ioreq) { + return 0; +} + +void pinet_write_frame(struct IOSana2Req *ioreq) { +} + + +static void __attribute__((used)) begin_io(struct IORequest *io) { + struct IOSana2Req *ioreq = (struct IOSana2Req *)io; + ULONG unit = (ULONG)ioreq->ios2_Req.io_Unit; + int mtu; + + ioreq->ios2_Req.io_Message.mn_Node.ln_Type = NT_MESSAGE; + ioreq->ios2_Req.io_Error = S2ERR_NO_ERROR; + ioreq->ios2_WireError = S2WERR_GENERIC_ERROR; + + //D(("BeginIO command %ld unit %ld\n",(LONG)ioreq->ios2_Req.io_Command,unit)); + + // Unused variables + if (mtu || unit) {} + + switch( ioreq->ios2_Req.io_Command ) { + case CMD_READ: + kprintf("Read\n"); + if (pinet_read_frame(ioreq) != 0) { + ioreq->ios2_Req.io_Error = S2ERR_BAD_ARGUMENT; + ioreq->ios2_WireError = S2WERR_BUFF_ERROR; + } + ioreq = NULL; + break; + case S2_BROADCAST: + kprintf("Broadcast\n"); + if (ioreq->ios2_DstAddr) { + for (int i = 0; i < ADDRFIELDSIZE; i++) { + ioreq->ios2_DstAddr[i] = 0xFF; + } + } else { + kprintf("Invalid ios2_DstAddr\n"); + } + /* Fallthrough */ + case CMD_WRITE: { + kprintf("Write\n"); + pinet_write_frame(ioreq); + break; + } + + case S2_READORPHAN: + ioreq->ios2_Req.io_Flags &= ~SANA2IOF_QUICK; + ioreq = NULL; + break; + case S2_ONLINE: + case S2_OFFLINE: + case S2_CONFIGINTERFACE: /* forward request */ + break; + + case S2_GETSTATIONADDRESS: + for (int i = 0; i < ADDRFIELDSIZE; i++) { + ioreq->ios2_SrcAddr[i] = dev_base->MAC[i]; + ioreq->ios2_DstAddr[i] = dev_base->MAC[i]; + } + break; + case S2_DEVICEQUERY: { + struct Sana2DeviceQuery *devquery; + + devquery = ioreq->ios2_StatData; + devquery->DevQueryFormat = 0; + devquery->DeviceLevel = 0; + + if (devquery->SizeAvailable >= 18) + devquery->AddrFieldSize = ADDRFIELDSIZE * 8; + if (devquery->SizeAvailable >= 22) + devquery->MTU = 1500; + if (devquery->SizeAvailable >= 26) + devquery->BPS = 1000 * 1000 * 100; + if (devquery->SizeAvailable >= 30) + devquery->HardwareType = S2WireType_Ethernet; + + devquery->SizeSupplied = (devquery->SizeAvailable < 30) ? devquery->SizeAvailable : 30; + break; + } + case S2_GETSPECIALSTATS: { + struct Sana2SpecialStatHeader *s2ssh = (struct Sana2SpecialStatHeader *)ioreq->ios2_StatData; + s2ssh->RecordCountSupplied = 0; + break; + } + default: { + uint8_t cmd = ioreq->ios2_Req.io_Command; + if (cmd) {} + kprintf("Unknown/unhandled IO command %lx\n", cmd); + ioreq->ios2_Req.io_Error = S2ERR_NOT_SUPPORTED; + ioreq->ios2_WireError = S2WERR_GENERIC_ERROR; + break; + } + } + + if (ioreq) { + if (!(ioreq->ios2_Req.io_Flags & SANA2IOF_QUICK)) { + ReplyMsg((struct Message *)ioreq); + } else { + ioreq->ios2_Req.io_Message.mn_Node.ln_Type = NT_REPLYMSG; + } + } +} + +static uint32_t __attribute__((used)) abort_io(struct IORequest* ioreq) { + struct IOSana2Req* ios2 = (struct IOSana2Req*)ioreq; + + if (!ioreq) return IOERR_NOCMD; + ioreq->io_Error = IOERR_ABORTED; + ios2->ios2_WireError = 0; + + return IOERR_ABORTED; +} + +static uint32_t device_vectors[] = { + (uint32_t)open, + (uint32_t)close, + (uint32_t)expunge, + 0, + (uint32_t)begin_io, + (uint32_t)abort_io, + -1 +}; + +const uint32_t auto_init_tables[4] = { + sizeof(struct Library), + (uint32_t)device_vectors, + 0, + (uint32_t)init_device +}; diff --git a/platforms/amiga/net/net_driver_amiga/pi-net.device b/platforms/amiga/net/net_driver_amiga/pi-net.device index 96f8b30d132745b7278c0cfba6f1643898789ac2..84d3fd14c04263a571a29b4f22cecfb472214823 100644 GIT binary patch literal 1364 zcmY*ZO>Y}j6g@NkU??VXOihVX04h@beLQSiL%IcU(V z+r!nl@`*i}Irs7U0T#Vzwm;BtAKxU%G7R?d4^5>~JJz|78d5I2>5ZW+^s9CGiKi)G|4+}Mi7%FtSg`d+e(bh3}< zV6bA?>djZMnXDlF)-MRpzk}oRbxc>^$BOkWXWA|FQMvoKJZW^Ub^FPW7eABnPuK8Z z^(15$C}r8jOMOIOR2Gn~+=3Z%F@xC#v>6YD1e7hBebgz4A4}#sWJ_wPHL?%~N9!lRgh`*6vGPU%(+!BYB)>FgIq#{iELu zn)zZM1;qU%DmMJ5AX>hua#d~Ty z=l79Y-^Up*ns{aUPW;ZspoL*$B5xgB!f>-rKk){!N}MIm5pU9Wh7%Y_Q_7nigiWJ0 zb+pgE)9lpr4!PYYR*$o0iA6$E3XrjxDvXQO%5J7Qe9Rm8kZ<)Ny%7}yM9Gg3GrY}D z$bTc`v(*UswvW+%gZz0yzWF7hOxz?sCB7p5A`Y2CS!cYY(C_?<2)ozq2)FHaMb~a@ zJAv})*U5AtoUU`NE5$EWtmn3!uJ9eZDYkt314qSbv!mFcYx^=*QA7yQw7a$h6Sg~- zRbf>}7nXCi<^~MbcNrZKqqJ{F73>71JUuEHf2NU!f7`tkm3aUY6Jm~d+J_vv9S|W{wss92<$5k QdvaQ0TU`kdQx(|5zfuJqEdT%j literal 4796 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