void slip_init() { mydev = (net_device_t*)kmalloc(sizeof(net_device_t)); memcpy(mydev->name, "slip0", 6); mydev->proto = NET_PROTO_RAW; mydev->mtu = 65535; mydev->send = slip_send; net_register_device(mydev); // Hook up to the serial port #1 interrupt interrupts_registerHandler(IRQ4, slip_receive); }
static void enableCard(struct rtl8139_card *card) { // Power on! (LWAKE + LWPTN to active high) int_out8(card, REG_CONFIG1, 0); // Reset card int_out8(card, REG_COMMAND, CR_RESET); // Wait until reset is finished while((int_in8(card, REG_COMMAND) & REG_COMMAND) == CR_RESET); log(LOG_DEBUG, "rtl8139: Reset finished.\n"); // Load MAC address memset(&card->macAddr, 0, 6); card->macAddr[0] = int_in8(card, 0); card->macAddr[1] = int_in8(card, 1); card->macAddr[2] = int_in8(card, 2); card->macAddr[3] = int_in8(card, 3); card->macAddr[4] = int_in8(card, 4); card->macAddr[5] = int_in8(card, 5); log(LOG_DEBUG, "rtl8139: Got MAC address.\n"); // Enable all interrupt events if(card->device->interruptLine == 0xFF) { log(LOG_DEBUG, "rtl8139: Error: Card isn't connected to the PIC."); return; } interrupts_registerHandler(card->device->interruptLine + IRQ0, rtl8139_intHandler); int_out16(card, REG_INTERRUPT_MASK, 0x0005); int_out16(card, REG_INTERRUPT_STATUS, 0); // Initialize RCR/TCR // RBLEN = 00, 8K + 16 bytes rx ring buffer int_out32(card, REG_RECEIVE_CONFIGURATION, RCR_MXDMA_UNLIMITED | RCR_ACCEPT_BROADCAST | RCR_ACCEPT_PHYS_MATCH ); int_out32(card, REG_TRANSMIT_CONFIGURATION, TCR_IFG_STANDARD | TCR_MXDMA_2048 ); card->rxBuffer = (char *)kmalloc(8192 + 16 ); memset(card->rxBuffer, 0, 8192 + 16); card->rxBufferOffset = 0; int_out32(card, REG_RECEIVE_BUFFER, (uint32_t)card->rxBuffer); // Enable receiver and transmitter int_out8(card, REG_COMMAND, CR_RECEIVER_ENABLE | CR_TRANSMITTER_ENABLE); log(LOG_DEBUG, "rtl8139: Enabled receiver / transmitter.\n"); card->netDevice = kmalloc(sizeof(net_device_t)); card->netDevice->mtu = 1500; card->netDevice->proto = NET_PROTO_ETH; card->netDevice->send = sendCallback; card->netDevice->data = card; net_register_device(card->netDevice); }