Index: if_em.c =================================================================== RCS file: /home/ncvs/src/sys/dev/em/if_em.c,v retrieving revision 1.114 retrieving revision 1.115 diff -u -r1.114 -r1.115 --- if_em.c 22 Feb 2006 14:11:16 -0000 1.114 +++ if_em.c 6 Apr 2006 17:09:02 -0000 1.115 @@ -31,7 +31,7 @@ ***************************************************************************/ -/*$FreeBSD: src/sys/dev/em/if_em.c,v 1.114 2006/02/22 14:11:16 glebius Exp $*/ +/*$FreeBSD: src/sys/dev/em/if_em.c,v 1.115 2006/04/06 17:09:02 glebius Exp $*/ #ifdef HAVE_KERNEL_OPTION_HEADERS #include "opt_device_polling.h" @@ -85,7 +85,7 @@ * Driver version *********************************************************************/ -char em_driver_version[] = "Version - 3.2.18"; +char em_driver_version[] = "Version - 5.1.5"; /********************************************************************* @@ -139,6 +139,8 @@ { 0x8086, E1000_DEV_ID_82546GB_SERDES, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82546GB_PCIE, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82546GB_QUAD_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_82546GB_QUAD_COPPER_KSP3, + PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82547EI, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82547EI_MOBILE, PCI_ANY_ID, PCI_ANY_ID, 0}, @@ -151,10 +153,15 @@ { 0x8086, E1000_DEV_ID_82572EI_COPPER, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82572EI_FIBER, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82572EI_SERDES, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_82572EI, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82573E, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82573E_IAMT, PCI_ANY_ID, PCI_ANY_ID, 0}, { 0x8086, E1000_DEV_ID_82573L, PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_80003ES2LAN_COPPER_DPT, + PCI_ANY_ID, PCI_ANY_ID, 0}, + { 0x8086, E1000_DEV_ID_80003ES2LAN_SERDES_DPT, + PCI_ANY_ID, PCI_ANY_ID, 0}, /* required last entry */ { 0, 0, 0, 0, 0} @@ -536,6 +543,11 @@ sc->hw.get_link_status = 1; em_update_link_status(sc); + /* Indicate SOL/IDER usage */ + if (em_check_phy_reset_block(&sc->hw)) + device_printf(dev, + "PHY reset is blocked due to SOL/IDER session.\n"); + /* Identify 82544 on PCIX */ em_get_bus_info(&sc->hw); if(sc->hw.bus_type == em_bus_type_pcix && sc->hw.mac_type == em_82544) @@ -730,7 +742,7 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data) { struct em_softc *sc = ifp->if_softc; - struct ifreq *ifr = (struct ifreq *)data; + struct ifreq *ifr = (struct ifreq *)data; int error = 0; if (sc->in_detach) @@ -745,17 +757,27 @@ case SIOCSIFMTU: { int max_frame_size; + uint16_t eeprom_data = 0; IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFMTU (Set Interface MTU)"); switch (sc->hw.mac_type) { + case em_82573: + /* + * 82573 only supports jumbo frames + * if ASPM is disabled. + */ + em_read_eeprom(&sc->hw, EEPROM_INIT_3GIO_3, 1, + &eeprom_data); + if (eeprom_data & EEPROM_WORD1A_ASPM_MASK) { + max_frame_size = ETHER_MAX_LEN; + break; + } + /* Allow Jumbo frames - fall thru */ case em_82571: case em_82572: - max_frame_size = 10500; - break; - case em_82573: - /* 82573 does not support jumbo frames. */ - max_frame_size = ETHER_MAX_LEN; + case em_80003es2lan: /* Limit Jumbo Frame size */ + max_frame_size = 9234; break; default: max_frame_size = MAX_JUMBO_FRAME_SIZE; @@ -933,6 +955,7 @@ sc->tx_head_addr = pba << EM_TX_HEAD_ADDR_SHIFT; sc->tx_fifo_size = (E1000_PBA_40K - pba) << EM_PBA_BYTES_SHIFT; break; + case em_80003es2lan: /* 80003es2lan: Total Packet Buffer is 48K */ case em_82571: /* 82571: Total Packet Buffer is 48K */ case em_82572: /* 82572: Total Packet Buffer is 48K */ pba = E1000_PBA_32K; /* 32K for Rx, 16K for Tx */ @@ -2078,7 +2101,10 @@ sc->hw.fc_high_water = rx_buffer_size - roundup2(sc->hw.max_frame_size, 1024); sc->hw.fc_low_water = sc->hw.fc_high_water - 1500; - sc->hw.fc_pause_time = 0x1000; + if (sc->hw.mac_type == em_80003es2lan) + sc->hw.fc_pause_time = 0xFFFF; + else + sc->hw.fc_pause_time = 0x1000; sc->hw.fc_send_xon = TRUE; sc->hw.fc = em_fc_full; @@ -2402,7 +2428,7 @@ static void em_initialize_transmit_unit(struct em_softc *sc) { - uint32_t reg_tctl; + uint32_t reg_tctl, tarc; uint32_t reg_tipg = 0; uint64_t bus_addr; @@ -2430,6 +2456,11 @@ reg_tipg |= DEFAULT_82542_TIPG_IPGR1 << E1000_TIPG_IPGR1_SHIFT; reg_tipg |= DEFAULT_82542_TIPG_IPGR2 << E1000_TIPG_IPGR2_SHIFT; break; + case em_80003es2lan: + reg_tipg = DEFAULT_82543_TIPG_IPGR1; + reg_tipg |= DEFAULT_80003ES2LAN_TIPG_IPGR2 << + E1000_TIPG_IPGR2_SHIFT; + break; default: if (sc->hw.media_type == em_media_type_fiber) reg_tipg = DEFAULT_82543_TIPG_IPGT_FIBER; @@ -2456,6 +2487,28 @@ } E1000_WRITE_REG(&sc->hw, TCTL, reg_tctl); + if (sc->hw.mac_type == em_82571 || sc->hw.mac_type == em_82572) { + tarc = E1000_READ_REG(&sc->hw, TARC0); + tarc |= ((1 << 25) | (1 << 21)); + E1000_WRITE_REG(&sc->hw, TARC0, tarc); + tarc = E1000_READ_REG(&sc->hw, TARC1); + tarc |= (1 << 25); + if (reg_tctl & E1000_TCTL_MULR) + tarc &= ~(1 << 28); + else + tarc |= (1 << 28); + E1000_WRITE_REG(&sc->hw, TARC1, tarc); + } else if (sc->hw.mac_type == em_80003es2lan) { + tarc = E1000_READ_REG(&sc->hw, TARC0); + tarc |= 1; + if (sc->hw.media_type == em_media_type_internal_serdes) + tarc |= (1 << 20); + E1000_WRITE_REG(&sc->hw, TARC0, tarc); + tarc = E1000_READ_REG(&sc->hw, TARC1); + tarc |= 1; + E1000_WRITE_REG(&sc->hw, TARC1, tarc); + } + /* Setup Transmit Descriptor Settings for this adapter */ sc->txd_cmd = E1000_TXD_CMD_IFCS | E1000_TXD_CMD_RS;