Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
Arquivo: rtl8139.c Projeto: else/xelix
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);
}