e1000: add support for 82545EM
Tested on VirtualBox and VMware.
This commit is contained in:
parent
fb31513b00
commit
831450aacc
4 changed files with 25 additions and 33 deletions
|
@ -21,17 +21,6 @@
|
|||
#include "e1000_reg.h"
|
||||
#include "e1000_pci.h"
|
||||
|
||||
PRIVATE u16_t pcitab_e1000[] =
|
||||
{
|
||||
E1000_DEV_ID_82540EM,
|
||||
E1000_DEV_ID_82541GI_LF,
|
||||
E1000_DEV_ID_ICH10_D_BM_LM,
|
||||
E1000_DEV_ID_ICH10_R_BM_LF,
|
||||
E1000_DEV_ID_82574L,
|
||||
E1000_DEV_ID_82571EB_COPPER,
|
||||
0,
|
||||
};
|
||||
|
||||
PRIVATE int e1000_instance;
|
||||
PRIVATE e1000_t e1000_state;
|
||||
|
||||
|
@ -236,9 +225,10 @@ PRIVATE void e1000_init_pci()
|
|||
*===========================================================================*/
|
||||
PRIVATE int e1000_probe(e1000_t *e, int skip)
|
||||
{
|
||||
int i, r, devind;
|
||||
u16_t vid, did;
|
||||
int r, devind, ioflag;
|
||||
u16_t vid, did, cr;
|
||||
u32_t status[2];
|
||||
u32_t base, size;
|
||||
u32_t gfpreg, sector_base_addr;
|
||||
char *dname;
|
||||
|
||||
|
@ -256,24 +246,11 @@ PRIVATE int e1000_probe(e1000_t *e, int skip)
|
|||
{
|
||||
E1000_DEBUG(3, ("%s: probe() devind %d vid 0x%x did 0x%x\n",
|
||||
e->name, devind, vid, did));
|
||||
if (vid != 0x8086)
|
||||
goto get_next;
|
||||
|
||||
for (i = 0; pcitab_e1000[i] != 0; i++)
|
||||
{
|
||||
if (did != pcitab_e1000[i])
|
||||
continue;
|
||||
else
|
||||
if (!skip)
|
||||
break;
|
||||
}
|
||||
if (pcitab_e1000[i] != 0)
|
||||
{
|
||||
if (!skip)
|
||||
break;
|
||||
skip--;
|
||||
}
|
||||
skip--;
|
||||
|
||||
get_next:
|
||||
if (!(r = pci_next_dev(&devind, &vid, &did)))
|
||||
{
|
||||
return FALSE;
|
||||
|
@ -296,6 +273,7 @@ get_next:
|
|||
break;
|
||||
|
||||
case E1000_DEV_ID_82540EM:
|
||||
case E1000_DEV_ID_82545EM:
|
||||
e->eeprom_done_bit = (1 << 4);
|
||||
e->eeprom_addr_off = 8;
|
||||
break;
|
||||
|
@ -322,15 +300,26 @@ get_next:
|
|||
}
|
||||
/* Read PCI configuration. */
|
||||
e->irq = pci_attr_r8(devind, PCI_ILR);
|
||||
e->regs = vm_map_phys(SELF, (void *) pci_attr_r32(devind, PCI_BAR),
|
||||
0x20000);
|
||||
|
||||
/* Verify mapped registers. */
|
||||
|
||||
if ((r = pci_get_bar(devind, PCI_BAR, &base, &size, &ioflag)) != OK)
|
||||
panic("failed to get PCI BAR (%d)", r);
|
||||
if (ioflag) panic("PCI BAR is not for memory");
|
||||
|
||||
e->regs = vm_map_phys(SELF, (void *) base, size);
|
||||
if (e->regs == (u8_t *) -1) {
|
||||
panic("failed to map hardware registers from PCI");
|
||||
}
|
||||
|
||||
/* FIXME: enable DMA bus mastering if necessary. This is disabled by
|
||||
* default on VMware. Eventually, the PCI driver should deal with this.
|
||||
*/
|
||||
cr = pci_attr_r16(devind, PCI_CR);
|
||||
if (!(cr & PCI_CR_MAST_EN))
|
||||
pci_attr_w16(devind, PCI_CR, cr | PCI_CR_MAST_EN);
|
||||
|
||||
/* Optionally map flash memory. */
|
||||
if (did != E1000_DEV_ID_82540EM &&
|
||||
did != E1000_DEV_ID_82545EM &&
|
||||
did != E1000_DEV_ID_82540EP &&
|
||||
pci_attr_r32(devind, PCI_BAR_2))
|
||||
{
|
||||
|
@ -556,7 +545,7 @@ e1000_t *e;
|
|||
panic("failed to allocate TX buffers");
|
||||
}
|
||||
/* Setup transmit descriptors. */
|
||||
for (i = 0; i < E1000_RXDESC_NR; i++)
|
||||
for (i = 0; i < E1000_TXDESC_NR; i++)
|
||||
{
|
||||
e->tx_desc[i].buffer = tx_buff_p + (i * E1000_IOBUF_SIZE);
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ service e1000
|
|||
DEVIO # 21
|
||||
;
|
||||
pci device 8086/100e;
|
||||
pci device 8086/100f;
|
||||
pci device 8086/107c;
|
||||
pci device 8086/10cd;
|
||||
pci device 8086/10d3;
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#define E1000_DEV_ID_82544GC_COPPER 0x100C
|
||||
#define E1000_DEV_ID_82544GC_LOM 0x100D
|
||||
#define E1000_DEV_ID_82540EM 0x100E
|
||||
#define E1000_DEV_ID_82545EM 0x100F
|
||||
#define E1000_DEV_ID_82540EM_LOM 0x1015
|
||||
#define E1000_DEV_ID_82540EP_LOM 0x1016
|
||||
#define E1000_DEV_ID_82540EP 0x1017
|
||||
|
|
|
@ -133,6 +133,7 @@ struct pci_device pci_device_table[]=
|
|||
{ 0x5333, 0x8a01, "S3 Virge/DX or /GX" },
|
||||
{ 0x8086, 0x1004, "Intel 82543GC Gigabit Ethernet Controller" },
|
||||
{ 0x8086, 0x100E, "Intel PRO/1000 MT Desktop Adapter" },
|
||||
{ 0x8086, 0x100F, "Intel PRO/1000 MT 82545EM" },
|
||||
{ 0x8086, 0x1029, "Intel EtherExpressPro100 ID1029" },
|
||||
{ 0x8086, 0x1030, "Intel Corporation 82559 InBusiness 10/100" },
|
||||
{ 0x8086, 0x1031, "Intel Corporation 82801CAM PRO/100 VE" },
|
||||
|
|
Loading…
Reference in a new issue