static int ne2k_dev_init(nic_t *nic_data) { /* Get HW resources */ hw_res_list_parsed_t hw_res_parsed; hw_res_list_parsed_init(&hw_res_parsed); int rc = nic_get_resources(nic_data, &hw_res_parsed); if (rc != EOK) goto failed; if (hw_res_parsed.irqs.count == 0) { rc = EINVAL; goto failed; } if (hw_res_parsed.io_ranges.count == 0) { rc = EINVAL; goto failed; } if (hw_res_parsed.io_ranges.ranges[0].size < NE2K_IO_SIZE) { rc = EINVAL; goto failed; } ne2k_t *ne2k = (ne2k_t *) nic_get_specific(nic_data); ne2k->irq = hw_res_parsed.irqs.irqs[0]; ne2k->base_port = (void *) (uintptr_t) hw_res_parsed.io_ranges.ranges[0].address; hw_res_list_parsed_clean(&hw_res_parsed); /* Enable port I/O */ if (pio_enable(ne2k->base_port, NE2K_IO_SIZE, &ne2k->port) != EOK) return EADDRNOTAVAIL; ne2k->data_port = ne2k->port + NE2K_DATA; ne2k->receive_configuration = RCR_AB | RCR_AM; ne2k->probed = false; ne2k->up = false; /* Find out whether the device is present. */ if (ne2k_probe(ne2k) != EOK) return ENOENT; ne2k->probed = true; rc = ne2k_register_interrupt(nic_data); if (rc != EOK) return EINVAL; return EOK; failed: hw_res_list_parsed_clean(&hw_res_parsed); return rc; }
void Init_Ne2k() { ne = (NE2K*) AllocateKernel(sizeof(NE2K)); if (!ne){disp_str("!yes");} mem_set((u32)ne,6,0); ne->iobase = 0x280; ne->nic_addr = ne->iobase + NE2K_NOVELL_NIC_OFFSET; ne->asic_addr = ne->iobase + NE2K_NOVELL_ASIC_OFFSET; if(!ne2k_probe(ne)){ disp_str("yes"); } disp_str("no"); }