diff --git a/hermit/arch/x86/include/asm/pci.h b/hermit/arch/x86/include/asm/pci.h index fbf2ea55c..26d4b0860 100644 --- a/hermit/arch/x86/include/asm/pci.h +++ b/hermit/arch/x86/include/asm/pci.h @@ -57,12 +57,13 @@ int pci_init(void); * @param vendor_id The device's vendor ID * @param device_id the device's ID * @param info Pointer to the record pci_info_t where among other the IObase address will be stored + * @param enable_bus_master If true, the bus mastering will be enabled. * * @return * - 0 on success * - -EINVAL (-22) on failure */ -int pci_get_device_info(uint32_t vendor_id, uint32_t device_id, pci_info_t* info); +int pci_get_device_info(uint32_t vendor_id, uint32_t device_id, pci_info_t* info, int8_t enble_bus_master); /** @brief Print information of existing pci adapters * diff --git a/hermit/arch/x86/kernel/pci.c b/hermit/arch/x86/kernel/pci.c index 330f1fe84..e9a697241 100644 --- a/hermit/arch/x86/kernel/pci.c +++ b/hermit/arch/x86/kernel/pci.c @@ -110,6 +110,14 @@ static inline uint32_t pci_what_iobase(uint32_t bus, uint32_t slot, uint32_t nr) return pci_conf_read(bus, slot, PCI_CBIO + nr*4) & 0xFFFFFFFC; } +static inline void pci_bus_master(uint32_t bus, uint32_t slot) +{ + // set the device to a bus master + + uint32_t cmd = pci_conf_read(bus, slot, PCI_CFCS) | 0x4; + pci_conf_write(bus, slot, PCI_CFCS, cmd); +} + static inline uint32_t pci_what_size(uint32_t bus, uint32_t slot, uint32_t nr) { uint32_t tmp, ret; @@ -138,7 +146,7 @@ int pci_init(void) return 0; } -int pci_get_device_info(uint32_t vendor_id, uint32_t device_id, pci_info_t* info) +int pci_get_device_info(uint32_t vendor_id, uint32_t device_id, pci_info_t* info, int8_t bus_master) { uint32_t slot, bus, i; @@ -155,9 +163,11 @@ int pci_get_device_info(uint32_t vendor_id, uint32_t device_id, pci_info_t* info (((adapters[bus][slot] & 0xffff0000) >> 16) == device_id)) { for(i=0; i<6; i++) { info->base[i] = pci_what_iobase(bus, slot, i); - info->size[i] = (info->base[i]) ? pci_what_size(bus, slot, i) : 0; + info->size[i] = (info->base[i]) ? pci_what_size(bus, slot, i) : 0; } info->irq = pci_what_irq(bus, slot); + if (bus_master) + pci_bus_master(bus, slot); return 0; } } diff --git a/hermit/drivers/net/e1000.c b/hermit/drivers/net/e1000.c index 0800ce923..a2774947a 100644 --- a/hermit/drivers/net/e1000.c +++ b/hermit/drivers/net/e1000.c @@ -335,7 +335,7 @@ err_t e1000if_init(struct netif* netif) tmp8 = 0; while (board_tbl[tmp8].vendor_str) { - if (pci_get_device_info(board_tbl[tmp8].vendor, board_tbl[tmp8].device, &pci_info) == 0) + if (pci_get_device_info(board_tbl[tmp8].vendor, board_tbl[tmp8].device, &pci_info, 1) == 0) break; tmp8++; } diff --git a/hermit/drivers/net/rtl8139.c b/hermit/drivers/net/rtl8139.c index f2ca669c0..561b3f108 100644 --- a/hermit/drivers/net/rtl8139.c +++ b/hermit/drivers/net/rtl8139.c @@ -304,7 +304,7 @@ err_t rtl8139if_init(struct netif* netif) tmp8 = 0; while (board_tbl[tmp8].vendor_str) { - if (pci_get_device_info(board_tbl[tmp8].vendor, board_tbl[tmp8].device, &pci_info) == 0) + if (pci_get_device_info(board_tbl[tmp8].vendor, board_tbl[tmp8].device, &pci_info, 1) == 0) break; tmp8++; } @@ -312,6 +312,8 @@ err_t rtl8139if_init(struct netif* netif) if (!board_tbl[tmp8].vendor_str) return ERR_ARG; + //kprintf("Found %s %s\n", board_tbl[tmp8].vendor_str, board_tbl[tmp8].device_str); + rtl8139if = kmalloc(sizeof(rtl1839if_t)); if (!rtl8139if) { LWIP_DEBUGF(NETIF_DEBUG, ("rtl8139if_init: out of memory\n")); @@ -340,9 +342,9 @@ err_t rtl8139if_init(struct netif* netif) return ERR_MEM; } memset(rtl8139if->tx_buffer[0], 0x00, 4*TX_BUF_LEN); - rtl8139if->tx_buffer[1] = rtl8139if->tx_buffer[0] + TX_BUF_LEN; - rtl8139if->tx_buffer[2] = rtl8139if->tx_buffer[1] + TX_BUF_LEN; - rtl8139if->tx_buffer[3] = rtl8139if->tx_buffer[2] + TX_BUF_LEN; + rtl8139if->tx_buffer[1] = rtl8139if->tx_buffer[0] + 1*TX_BUF_LEN; + rtl8139if->tx_buffer[2] = rtl8139if->tx_buffer[0] + 2*TX_BUF_LEN; + rtl8139if->tx_buffer[3] = rtl8139if->tx_buffer[0] + 3*TX_BUF_LEN; netif->state = rtl8139if; mynetif = netif; @@ -480,5 +482,6 @@ err_t rtl8139if_init(struct netif* netif) /* broadcast capability */ netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_IGMP; +vma_dump(); return ERR_OK; }