Annotation of previous/src/ethernet.c, revision 1.1

1.1     ! root        1: /*  Previous - iethernet.c
        !             2: 
        !             3:   This file is distributed under the GNU Public License, version 2 or at
        !             4:   your option any later version. Read the file gpl.txt for details.
        !             5: 
        !             6:    Network adapter for the NEXT. 
        !             7: 
        !             8:    constants and struct netBSD mb8795reg.h file
        !             9: 
        !            10: */
        !            11: 
        !            12: #include "ioMem.h"
        !            13: #include "ioMemTables.h"
        !            14: #include "m68000.h"
        !            15: #include "configuration.h"
        !            16: #include "esp.h"
        !            17: #include "sysReg.h"
        !            18: #include "dma.h"
        !            19: #include "scsi.h"
        !            20: #include "ethernet.h"
        !            21: 
        !            22: #define LOG_EN_LEVEL LOG_WARN
        !            23: #define IO_SEG_MASK    0x1FFFF
        !            24: 
        !            25: 
        !            26: /* Function Prototypes */
        !            27: void EnTx_Lower_IRQ(void);
        !            28: void EnRx_Lower_IRQ(void);
        !            29: void EnTx_Raise_IRQ(void);
        !            30: void EnRx_Raise_IRQ(void);
        !            31: 
        !            32: 
        !            33: /* Ethernet Regisers */
        !            34: #define EN_TXSTAT   0
        !            35: #define EN_TXMASK   1
        !            36: #define EN_RXSTAT   2
        !            37: #define EN_RXMASK   3
        !            38: #define EN_TXMODE   4
        !            39: #define EN_RXMODE   5
        !            40: 
        !            41: #define EN_RESET    6
        !            42: 
        !            43: 
        !            44: /* Ethernet Register Constants */
        !            45: #define TXSTAT_RDY          0x80    // Ready for Packet
        !            46: 
        !            47: #define RXSTAT_OK           0x80    // Packet received is correct
        !            48: 
        !            49: #define TXMODE_NOLOOP       0x02    // Loop back control disabled
        !            50: 
        !            51: #define RXMODE_ADDRSIZE     0x10    // Reduces NODE match to 5 chars
        !            52: #define RXMODE_NOPACKETS    0x00    // Accept no packets
        !            53: #define RXMODE_LIMITED      0x01    // Accept Broadcast/limited
        !            54: #define RXMODE_NORMAL       0x02    // Accept Broadcast/multicasts
        !            55: #define RXMODE_PROMISCUOUS  0x03    // Accept all packets
        !            56: #define RXMODE_RESETENABLE  0x04    // One for reset packet enable
        !            57: 
        !            58: #define RESET_VAL           0x80    // Generate Reset
        !            59: 
        !            60: typedef struct {
        !            61:     Uint8 tx_status;
        !            62:     Uint8 tx_mask;
        !            63:     Uint8 tx_mode;
        !            64:     Uint8 rx_status;
        !            65:     Uint8 rx_mask;
        !            66:     Uint8 rx_mode;
        !            67: } ETHERNET_CONTROLLER;
        !            68: 
        !            69: ETHERNET_CONTROLLER ethernet;
        !            70: 
        !            71: Uint8 ethernet_buffer[1600];
        !            72: 
        !            73: 
        !            74: Uint8 MACaddress[6];
        !            75: 
        !            76: void Ethernet_Read(void) {
        !            77:        Uint8 reg = IoAccessCurrentAddress&0x0F;
        !            78:        Uint8 val;
        !            79:     
        !            80:        switch (reg) {
        !            81:                case EN_TXSTAT:
        !            82:                        val = ethernet.tx_status;
        !            83:                        break;
        !            84:         case EN_TXMASK:
        !            85:             val = ethernet.tx_mask;
        !            86:             break;
        !            87:         case EN_RXSTAT:
        !            88:             val = ethernet.rx_status;
        !            89:             break;
        !            90:         case EN_RXMASK:
        !            91:             val = ethernet.rx_mask;
        !            92:             break;
        !            93:         case EN_TXMODE:
        !            94:             val = ethernet.tx_mode;
        !            95:             break;
        !            96:         case EN_RXMODE:
        !            97:             val = ethernet.rx_mode;
        !            98:             break;
        !            99:         case EN_RESET:
        !           100:             break;
        !           101:             
        !           102:         /* Read MAC Address */
        !           103:         case 8:
        !           104:         case 9:
        !           105:         case 10:
        !           106:         case 11:
        !           107:         case 12:
        !           108:         case 13:
        !           109:             val = MACaddress[reg-8];
        !           110:             break;
        !           111:         default:
        !           112:             break;
        !           113:        }
        !           114:     IoMem[IoAccessCurrentAddress&IO_SEG_MASK] = val;
        !           115:     
        !           116:     Log_Printf(LOG_EN_LEVEL, "[Ethernet] read reg %d val %02x PC=%x %s at %d",reg,val,m68k_getpc(),__FILE__,__LINE__);
        !           117: }
        !           118: 
        !           119: void Ethernet_Write(void) {
        !           120:        Uint8 val = IoMem[IoAccessCurrentAddress & IO_SEG_MASK];
        !           121:        Uint8 reg = IoAccessCurrentAddress&0xF;
        !           122:     
        !           123:     Log_Printf(LOG_EN_LEVEL, "[Ethernet] write reg %d val %02x PC=%x %s at %d",reg,val,m68k_getpc(),__FILE__,__LINE__);
        !           124:     
        !           125:     switch (reg) {
        !           126:         case EN_TXSTAT:
        !           127:             if (val == 0xFF)
        !           128:                 ethernet.tx_status = 0x80; // ? temp hack
        !           129:             else
        !           130:                 ethernet.tx_status = val; //ethernet.tx_status & (0xF0 | ~val); ?
        !           131: //            EnTx_Raise_IRQ(); // check irq
        !           132:                        break;
        !           133:         case EN_TXMASK:
        !           134:             ethernet.tx_mask = val & 0xAF;
        !           135: //            EnTx_Raise_IRQ(); // check irq
        !           136:             break;
        !           137:         case EN_RXSTAT:
        !           138:             if (val == 0xFF)
        !           139:                 ethernet.rx_status = 0x00;
        !           140:             else
        !           141:                 ethernet.rx_status = val; //ethernet.rx_status & (0x07 | ~val); ?
        !           142: //            EnRx_Raise_IRQ(); // check irq
        !           143:             break;
        !           144:         case EN_RXMASK:
        !           145:             ethernet.rx_mask = val & 0x9F;
        !           146: //            EnRx_Raise_IRQ(); // check irq
        !           147:             break;
        !           148:         case EN_TXMODE:
        !           149:             ethernet.tx_mode = val;
        !           150:             break;
        !           151:         case EN_RXMODE:
        !           152:             ethernet.rx_mode = val;
        !           153:             break;
        !           154:         case EN_RESET:
        !           155:             if (val&RESET_VAL)
        !           156:                 Ethernet_Reset();
        !           157:             break;
        !           158: 
        !           159:         /* Write MAC Address */
        !           160:         case 8:
        !           161:         case 9:
        !           162:         case 10:
        !           163:         case 11:
        !           164:         case 12:
        !           165:         case 13:
        !           166:             MACaddress[reg-8] = val;
        !           167:             break;
        !           168:             
        !           169:         default:
        !           170:             break;
        !           171:     }
        !           172: }
        !           173: 
        !           174: 
        !           175: void Ethernet_Reset(void) {
        !           176:     ethernet.tx_status = TXSTAT_RDY;
        !           177:     ethernet.tx_mask = 0x00;
        !           178:     ethernet.tx_mode = 0x00;
        !           179:     ethernet.rx_status = 0x00;
        !           180:     ethernet.rx_mask = 0x00;
        !           181:     ethernet.rx_mode = 0x00;
        !           182:     
        !           183:     EnTx_Lower_IRQ();
        !           184:     EnRx_Lower_IRQ();
        !           185:     
        !           186:     // txlen = rxlen = txcount = 0;
        !           187:     // set_promisc(true);
        !           188:     // start_send();
        !           189: }
        !           190: 
        !           191: void Ethernet_Transmit(void) {
        !           192:     Uint32 size;
        !           193:     dma_memory_read(ethernet_buffer, &size, CHANNEL_EN_TX);
        !           194:     ethernet.tx_status = TXSTAT_RDY;
        !           195:     EnTx_Raise_IRQ();
        !           196:     
        !           197:     Log_Printf(LOG_EN_LEVEL, "Ethernet: Send packet to %02X:%02X:%02X:%02X:%02X:%02X",
        !           198:                ethernet_buffer[0], ethernet_buffer[1], ethernet_buffer[2],
        !           199:                ethernet_buffer[3], ethernet_buffer[4], ethernet_buffer[5]);
        !           200:     
        !           201:     if (!(ethernet.tx_mode&TXMODE_NOLOOP)) { // if loop back is not disabled
        !           202:         Ethernet_Receive(ethernet_buffer, size); // loop back
        !           203:     }
        !           204:     
        !           205:     // TODO: send packet to real network
        !           206: }
        !           207: 
        !           208: void Ethernet_Receive(Uint8 *packet, Uint32 size) {
        !           209:     if (Packet_Receiver_Me(packet)) {
        !           210:         Log_Printf(LOG_EN_LEVEL, "Ethernet: Receive packet from %02X:%02X:%02X:%02X:%02X:%02X",
        !           211:                    packet[6], packet[7], packet[8], packet[9], packet[10], packet[11]);
        !           212:                    
        !           213:         dma_memory_write(packet, size, CHANNEL_EN_RX); // loop back for experiment
        !           214:         ethernet.rx_status |= RXSTAT_OK; // packet received is correct
        !           215:         EnRx_Raise_IRQ();
        !           216:     }
        !           217: }
        !           218: 
        !           219: 
        !           220: void EnTx_Lower_IRQ(void) {
        !           221:     set_interrupt(INT_EN_TX, RELEASE_INT);
        !           222: }
        !           223: 
        !           224: void EnRx_Lower_IRQ(void) {
        !           225:     set_interrupt(INT_EN_RX, RELEASE_INT);
        !           226: }
        !           227: 
        !           228: void EnTx_Raise_IRQ(void) {
        !           229:     set_interrupt(INT_EN_TX, SET_INT);
        !           230: }
        !           231: 
        !           232: void EnRx_Raise_IRQ(void) {
        !           233:     set_interrupt(INT_EN_RX, SET_INT);
        !           234: }
        !           235: 
        !           236: 
        !           237: /* Functions to find out if we are intended to receive a packet */
        !           238: 
        !           239: bool Packet_Receiver_Me(Uint8 *packet) {
        !           240:     switch (ethernet.rx_mode&0x03) {
        !           241:         case RXMODE_NOPACKETS:
        !           242:             return false;
        !           243:             
        !           244:         case RXMODE_NORMAL:
        !           245:             if (Broadcast(packet) || Me(packet) || Local_Multicast(packet))
        !           246:                 return true;
        !           247:             else
        !           248:                 return false;
        !           249:             
        !           250:         case RXMODE_LIMITED:
        !           251:             if (Broadcast(packet) || Me(packet) || Multicast(packet))
        !           252:                 return true;
        !           253:             else
        !           254:                 return false;
        !           255:             
        !           256:         case RXMODE_PROMISCUOUS:
        !           257:             return true;
        !           258:             
        !           259:         default: return false;
        !           260:     }
        !           261: }
        !           262: 
        !           263: bool Multicast(Uint8 *packet) {
        !           264:     if (packet[0]&0x01)
        !           265:         return true;
        !           266:     else 
        !           267:         return false;
        !           268: }
        !           269: 
        !           270: bool Local_Multicast(Uint8 *packet) {
        !           271:     if (packet[0]&0x01 &&
        !           272:         (packet[0]&0xFE) == MACaddress[0] //&&
        !           273:         //        packet[1] == MACaddress[1] &&
        !           274:         //        packet[2] == MACaddress[2]
        !           275:         )
        !           276:         return true;
        !           277:     else 
        !           278:         return false;
        !           279: }
        !           280: 
        !           281: bool Me(Uint8 *packet) {
        !           282:     if (packet[0] == MACaddress[0] &&
        !           283:         //        packet[1] == MACaddress[1] &&
        !           284:         //        packet[2] == MACaddress[2] &&
        !           285:         //        packet[3] == MACaddress[3] &&
        !           286:         packet[4] == MACaddress[4] &&
        !           287:         (packet[5] == MACaddress[5] || (ethernet.rx_mode&RXMODE_ADDRSIZE)))
        !           288:         return true;
        !           289:     else 
        !           290:         return false;
        !           291: }
        !           292: 
        !           293: bool Broadcast(Uint8 *packet) {
        !           294:     if (packet[0] == 0xFF &&
        !           295:         //        packet[1] == 0xFF &&
        !           296:         //        packet[2] == 0xFF &&
        !           297:         //        packet[3] == 0xFF &&
        !           298:         packet[4] == 0xFF &&
        !           299:         packet[5] == 0xFF)
        !           300:         return true;
        !           301:     else 
        !           302:         return false;
        !           303: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.