资源简介

新增功能 在较新的内核(4.19 +)上修复构建 Backport 到上游: e1f65b0d70 (e1000e:允许非单调 SYSTIM 读数) 初始支持以下设备: 以太网连接(11) I219-LM 以太网连接(11) I219-V 以太网连接(12) I219-LM 以太网连接(12) I219-V 添加了对 PCIm 功能状态的支持: 由于提交:5d8682588605 ("[misc] mei: me:允许运行时 面向 D0i3 的平台的 pm ") 当拔下电缆并重新连接时,网卡进入 DMoff 状态。这导致了错误的链路指示和双工不匹配。此错误 decribed 在: https://bugzilla.redhat.com/show_bug.cgi?id=1689436 在监测任务中检查 PCIm 功能状态和执行 PHY 重置后,解决了这一问题。 旨在 该驱动程序包括对基于英特尔®安腾®2的支持,以及英特尔® EM64T 系统。此版本支持最新的2.4 系列内核以及2.6、x.x.x.x 和版本。 e1000e 的 gz 设计为在 Linux * 下与 Intel®82563/82566/82567 千兆位以太网 PHY、英特尔®82571/82572/82573/82574/82577/82578/82579/82583 千兆位 Ethernet 控制器和 I217/I218 控制器搭配使用。SourceForge * 提供了该驱动程序的最新版本和更早版本。 如果您的适配器/连接不是82563、82566、82567、82571、82572、82573、82574、82577、82578、82579或基于82583的设备,则应使用以下驱动程序之一: igb-x * gz 驱动程序支持所有英特尔®82575、82576、82580、I350、I210 或基于 I211 的千兆位网络适配器/连接 e1000-x * gz 驱动程序支持所有基于8254x 的所有®英特尔架构 PCI 和 PCI-X 千兆位网络适配器/连接

资源截图

代码片段和文件信息

// SPDX-License-Identifier: GPL-2.0
/* Copyright(c) 1999 - 2019 Intel Corporation. */

/* 80003ES2LAN Gigabit Ethernet Controller (Copper)
 * 80003ES2LAN Gigabit Ethernet Controller (Serdes)
 */

#include “e1000.h“

/* A table for the GG82563 cable length where the range is defined
 * with a lower bound at “index“ and the upper bound at
 * “index + 5“.
 */
static const u16 e1000_gg82563_cable_length_table[] = {
0 60 115 150 150 60 115 150 180 180 0xFF
};

#define GG82563_CABLE_LENGTH_TABLE_SIZE \
(sizeof(e1000_gg82563_cable_length_table) / \
 sizeof(e1000_gg82563_cable_length_table[0]))

static s32 e1000_setup_copper_link_80003es2lan(struct e1000_hw *hw);
static s32 e1000_acquire_swfw_sync_80003es2lan(struct e1000_hw *hw u16 mask);
static void e1000_release_swfw_sync_80003es2lan(struct e1000_hw *hw u16 mask);
static void e1000_initialize_hw_bits_80003es2lan(struct e1000_hw *hw);
static void e1000_clear_hw_cntrs_80003es2lan(struct e1000_hw *hw);
static s32 e1000_cfg_kmrn_1000_80003es2lan(struct e1000_hw *hw);
static s32 e1000_cfg_kmrn_10_100_80003es2lan(struct e1000_hw *hw u16 duplex);
static s32 e1000_read_kmrn_reg_80003es2lan(struct e1000_hw *hw u32 offset
   u16 *data);
static s32 e1000_write_kmrn_reg_80003es2lan(struct e1000_hw *hw u32 offset
    u16 data);
static void e1000_power_down_phy_copper_80003es2lan(struct e1000_hw *hw);

/**
 *  e1000_init_phy_params_80003es2lan - Init ESB2 PHY func ptrs.
 *  @hw: pointer to the HW structure
 **/
static s32 e1000_init_phy_params_80003es2lan(struct e1000_hw *hw)
{
struct e1000_phy_info *phy = &hw->phy;
s32 ret_val;

if (hw->phy.media_type != e1000_media_type_copper) {
phy->type = e1000_phy_none;
return 0;
} else {
phy->ops.power_up = e1000_power_up_phy_copper;
phy->ops.power_down = e1000_power_down_phy_copper_80003es2lan;
}

phy->addr = 1;
phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT;
phy->reset_delay_us = 100;
phy->type = e1000_phy_gg82563;

/* This can only be done after all function pointers are setup. */
ret_val = e1000e_get_phy_id(hw);

/* Verify phy id */
if (phy->id != GG82563_E_PHY_ID)
return -E1000_ERR_PHY;

return ret_val;
}

/**
 *  e1000_init_nvm_params_80003es2lan - Init ESB2 NVM func ptrs.
 *  @hw: pointer to the HW structure
 **/
static s32 e1000_init_nvm_params_80003es2lan(struct e1000_hw *hw)
{
struct e1000_nvm_info *nvm = &hw->nvm;
u32 eecd = er32(EECD);
u16 size;

nvm->opcode_bits = 8;
nvm->delay_usec = 1;
switch (nvm->override) {
case e1000_nvm_override_spi_large:
nvm->page_size = 32;
nvm->address_bits = 16;
break;
case e1000_nvm_override_spi_small:
nvm->page_size = 8;
nvm->address_bits = 8;
break;
default:
nvm->page_size = eecd & E1000_EECD_ADDR_BITS ? 32 : 8;
nvm->address_bits = eecd & E1000_EECD_ADDR_BITS ? 16 : 8;
break;
}

nvm->type = e1000_nvm_eeprom_spi;

size = (u16)((eecd & E1000_EECD_SIZE_EX_MASK) >>
     E1000_EECD_SIZE_EX_SHIFT);

/* Added to a constant “size“ becomes the le

评论

共有 条评论