diff options
Diffstat (limited to 'drivers/net/ethernet/realtek/r8169.c')
| -rw-r--r-- | drivers/net/ethernet/realtek/r8169.c | 121 | 
1 files changed, 29 insertions, 92 deletions
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index ed96f309bca..8900398ba10 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -83,7 +83,7 @@ static const int multicast_filter_limit = 32;  #define R8169_REGS_SIZE		256  #define R8169_NAPI_WEIGHT	64  #define NUM_TX_DESC	64	/* Number of Tx descriptor registers */ -#define NUM_RX_DESC	256	/* Number of Rx descriptor registers */ +#define NUM_RX_DESC	256U	/* Number of Rx descriptor registers */  #define R8169_TX_RING_BYTES	(NUM_TX_DESC * sizeof(struct TxDesc))  #define R8169_RX_RING_BYTES	(NUM_RX_DESC * sizeof(struct RxDesc)) @@ -450,7 +450,6 @@ enum rtl8168_registers {  #define PWM_EN				(1 << 22)  #define RXDV_GATED_EN			(1 << 19)  #define EARLY_TALLY_EN			(1 << 16) -#define FORCE_CLK			(1 << 15) /* force clock request */  };  enum rtl_register_content { @@ -514,7 +513,6 @@ enum rtl_register_content {  	PMEnable	= (1 << 0),	/* Power Management Enable */  	/* Config2 register p. 25 */ -	ClkReqEn	= (1 << 7),	/* Clock Request Enable */  	MSIEnable	= (1 << 5),	/* 8169 only. Reserved in the 8168. */  	PCI_Clock_66MHz = 0x01,  	PCI_Clock_33MHz = 0x00, @@ -535,7 +533,6 @@ enum rtl_register_content {  	Spi_en		= (1 << 3),  	LanWake		= (1 << 1),	/* LanWake enable/disable */  	PMEStatus	= (1 << 0),	/* PME status can be reset by PCI RST# */ -	ASPM_en		= (1 << 0),	/* ASPM enable */  	/* TBICSR p.28 */  	TBIReset	= 0x80000000, @@ -684,7 +681,6 @@ enum features {  	RTL_FEATURE_WOL		= (1 << 0),  	RTL_FEATURE_MSI		= (1 << 1),  	RTL_FEATURE_GMII	= (1 << 2), -	RTL_FEATURE_FW_LOADED	= (1 << 3),  };  struct rtl8169_counters { @@ -727,7 +723,6 @@ struct rtl8169_private {  	u16 mac_version;  	u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */  	u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */ -	u32 dirty_rx;  	u32 dirty_tx;  	struct rtl8169_stats rx_stats;  	struct rtl8169_stats tx_stats; @@ -1826,8 +1821,6 @@ static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)  	if (opts2 & RxVlanTag)  		__vlan_hwaccel_put_tag(skb, swab16(opts2 & 0xffff)); - -	desc->opts2 = 0;  }  static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd) @@ -2391,10 +2384,8 @@ static void rtl_apply_firmware(struct rtl8169_private *tp)  	struct rtl_fw *rtl_fw = tp->rtl_fw;  	/* TODO: release firmware once rtl_phy_write_fw signals failures. */ -	if (!IS_ERR_OR_NULL(rtl_fw)) { +	if (!IS_ERR_OR_NULL(rtl_fw))  		rtl_phy_write_fw(tp, rtl_fw); -		tp->features |= RTL_FEATURE_FW_LOADED; -	}  }  static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) @@ -2405,31 +2396,6 @@ static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)  		rtl_apply_firmware(tp);  } -static void r810x_aldps_disable(struct rtl8169_private *tp) -{ -	rtl_writephy(tp, 0x1f, 0x0000); -	rtl_writephy(tp, 0x18, 0x0310); -	msleep(100); -} - -static void r810x_aldps_enable(struct rtl8169_private *tp) -{ -	if (!(tp->features & RTL_FEATURE_FW_LOADED)) -		return; - -	rtl_writephy(tp, 0x1f, 0x0000); -	rtl_writephy(tp, 0x18, 0x8310); -} - -static void r8168_aldps_enable_1(struct rtl8169_private *tp) -{ -	if (!(tp->features & RTL_FEATURE_FW_LOADED)) -		return; - -	rtl_writephy(tp, 0x1f, 0x0000); -	rtl_w1w0_phy(tp, 0x15, 0x1000, 0x0000); -} -  static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)  {  	static const struct phy_reg phy_reg_init[] = { @@ -3220,8 +3186,6 @@ static void rtl8168e_2_hw_phy_config(struct rtl8169_private *tp)  	rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);  	rtl_writephy(tp, 0x1f, 0x0000); -	r8168_aldps_enable_1(tp); -  	/* Broken BIOS workaround: feed GigaMAC registers with MAC address. */  	rtl_rar_exgmac_set(tp, tp->dev->dev_addr);  } @@ -3296,8 +3260,6 @@ static void rtl8168f_1_hw_phy_config(struct rtl8169_private *tp)  	rtl_writephy(tp, 0x05, 0x8b85);  	rtl_w1w0_phy(tp, 0x06, 0x4000, 0x0000);  	rtl_writephy(tp, 0x1f, 0x0000); - -	r8168_aldps_enable_1(tp);  }  static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp) @@ -3305,8 +3267,6 @@ static void rtl8168f_2_hw_phy_config(struct rtl8169_private *tp)  	rtl_apply_firmware(tp);  	rtl8168f_hw_phy_config(tp); - -	r8168_aldps_enable_1(tp);  }  static void rtl8411_hw_phy_config(struct rtl8169_private *tp) @@ -3404,8 +3364,6 @@ static void rtl8411_hw_phy_config(struct rtl8169_private *tp)  	rtl_w1w0_phy(tp, 0x19, 0x0000, 0x0001);  	rtl_w1w0_phy(tp, 0x10, 0x0000, 0x0400);  	rtl_writephy(tp, 0x1f, 0x0000); - -	r8168_aldps_enable_1(tp);  }  static void rtl8168g_1_hw_phy_config(struct rtl8169_private *tp) @@ -3491,19 +3449,21 @@ static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)  	};  	/* Disable ALDPS before ram code */ -	r810x_aldps_disable(tp); +	rtl_writephy(tp, 0x1f, 0x0000); +	rtl_writephy(tp, 0x18, 0x0310); +	msleep(100);  	rtl_apply_firmware(tp);  	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); - -	r810x_aldps_enable(tp);  }  static void rtl8402_hw_phy_config(struct rtl8169_private *tp)  {  	/* Disable ALDPS before setting firmware */ -	r810x_aldps_disable(tp); +	rtl_writephy(tp, 0x1f, 0x0000); +	rtl_writephy(tp, 0x18, 0x0310); +	msleep(20);  	rtl_apply_firmware(tp); @@ -3513,8 +3473,6 @@ static void rtl8402_hw_phy_config(struct rtl8169_private *tp)  	rtl_writephy(tp, 0x10, 0x401f);  	rtl_writephy(tp, 0x19, 0x7030);  	rtl_writephy(tp, 0x1f, 0x0000); - -	r810x_aldps_enable(tp);  }  static void rtl8106e_hw_phy_config(struct rtl8169_private *tp) @@ -3527,7 +3485,9 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)  	};  	/* Disable ALDPS before ram code */ -	r810x_aldps_disable(tp); +	rtl_writephy(tp, 0x1f, 0x0000); +	rtl_writephy(tp, 0x18, 0x0310); +	msleep(100);  	rtl_apply_firmware(tp); @@ -3535,8 +3495,6 @@ static void rtl8106e_hw_phy_config(struct rtl8169_private *tp)  	rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init));  	rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); - -	r810x_aldps_enable(tp);  }  static void rtl_hw_phy_config(struct net_device *dev) @@ -4177,7 +4135,7 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp)  static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)  { -	tp->dirty_tx = tp->dirty_rx = tp->cur_tx = tp->cur_rx = 0; +	tp->dirty_tx = tp->cur_tx = tp->cur_rx = 0;  }  static void rtl_hw_jumbo_enable(struct rtl8169_private *tp) @@ -5053,6 +5011,8 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)  	RTL_W8(MaxTxPacketSize, EarlySize); +	rtl_disable_clock_request(pdev); +  	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);  	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); @@ -5061,8 +5021,7 @@ static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)  	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);  	RTL_W32(MISC, RTL_R32(MISC) | PWM_EN); -	RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en); -	RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); +	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);  }  static void rtl_hw_start_8168f(struct rtl8169_private *tp) @@ -5087,12 +5046,13 @@ static void rtl_hw_start_8168f(struct rtl8169_private *tp)  	RTL_W8(MaxTxPacketSize, EarlySize); +	rtl_disable_clock_request(pdev); +  	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);  	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);  	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); -	RTL_W32(MISC, RTL_R32(MISC) | PWM_EN | FORCE_CLK); -	RTL_W8(Config5, (RTL_R8(Config5) & ~Spi_en) | ASPM_en); -	RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); +	RTL_W32(MISC, RTL_R32(MISC) | PWM_EN); +	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);  }  static void rtl_hw_start_8168f_1(struct rtl8169_private *tp) @@ -5149,10 +5109,8 @@ static void rtl_hw_start_8168g_1(struct rtl8169_private *tp)  	rtl_w1w0_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC);  	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb); -	RTL_W32(MISC, (RTL_R32(MISC) | FORCE_CLK) & ~RXDV_GATED_EN); +	RTL_W32(MISC, RTL_R32(MISC) & ~RXDV_GATED_EN);  	RTL_W8(MaxTxPacketSize, EarlySize); -	RTL_W8(Config5, RTL_R8(Config5) | ASPM_en); -	RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn);  	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);  	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC); @@ -5368,9 +5326,6 @@ static void rtl_hw_start_8105e_1(struct rtl8169_private *tp)  	RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);  	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN); -	RTL_W8(Config5, RTL_R8(Config5) | ASPM_en); -	RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); -	RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK);  	rtl_ephy_init(tp, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));  } @@ -5396,9 +5351,6 @@ static void rtl_hw_start_8402(struct rtl8169_private *tp)  	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);  	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB); -	RTL_W8(Config5, RTL_R8(Config5) | ASPM_en); -	RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); -	RTL_W32(MISC, RTL_R32(MISC) | FORCE_CLK);  	rtl_ephy_init(tp, e_info_8402, ARRAY_SIZE(e_info_8402)); @@ -5420,10 +5372,7 @@ static void rtl_hw_start_8106(struct rtl8169_private *tp)  	/* Force LAN exit from ASPM if Rx/Tx are not idle */  	RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800); -	RTL_W32(MISC, -		(RTL_R32(MISC) | DISABLE_LAN_EN | FORCE_CLK) & ~EARLY_TALLY_EN); -	RTL_W8(Config5, RTL_R8(Config5) | ASPM_en); -	RTL_W8(Config2, RTL_R8(Config2) | ClkReqEn); +	RTL_W32(MISC, (RTL_R32(MISC) | DISABLE_LAN_EN) & ~EARLY_TALLY_EN);  	RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);  	RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN);  } @@ -5920,7 +5869,7 @@ static void rtl8169_pcierr_interrupt(struct net_device *dev)  		PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_SIG_TARGET_ABORT));  	/* The infamous DAC f*ckup only happens at boot time */ -	if ((tp->cp_cmd & PCIDAC) && !tp->dirty_rx && !tp->cur_rx) { +	if ((tp->cp_cmd & PCIDAC) && !tp->cur_rx) {  		void __iomem *ioaddr = tp->mmio_addr;  		netif_info(tp, intr, dev, "disabling PCI DAC\n"); @@ -6035,10 +5984,8 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget  	unsigned int count;  	cur_rx = tp->cur_rx; -	rx_left = NUM_RX_DESC + tp->dirty_rx - cur_rx; -	rx_left = min(rx_left, budget); -	for (; rx_left > 0; rx_left--, cur_rx++) { +	for (rx_left = min(budget, NUM_RX_DESC); rx_left > 0; rx_left--, cur_rx++) {  		unsigned int entry = cur_rx % NUM_RX_DESC;  		struct RxDesc *desc = tp->RxDescArray + entry;  		u32 status; @@ -6064,8 +6011,6 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget  			    !(status & (RxRWT | RxFOVF)) &&  			    (dev->features & NETIF_F_RXALL))  				goto process_pkt; - -			rtl8169_mark_to_asic(desc, rx_buf_sz);  		} else {  			struct sk_buff *skb;  			dma_addr_t addr; @@ -6086,16 +6031,14 @@ process_pkt:  			if (unlikely(rtl8169_fragmented_frame(status))) {  				dev->stats.rx_dropped++;  				dev->stats.rx_length_errors++; -				rtl8169_mark_to_asic(desc, rx_buf_sz); -				continue; +				goto release_descriptor;  			}  			skb = rtl8169_try_rx_copy(tp->Rx_databuff[entry],  						  tp, pkt_size, addr); -			rtl8169_mark_to_asic(desc, rx_buf_sz);  			if (!skb) {  				dev->stats.rx_dropped++; -				continue; +				goto release_descriptor;  			}  			rtl8169_rx_csum(skb, status); @@ -6111,20 +6054,15 @@ process_pkt:  			tp->rx_stats.bytes += pkt_size;  			u64_stats_update_end(&tp->rx_stats.syncp);  		} - -		/* Work around for AMD plateform. */ -		if ((desc->opts2 & cpu_to_le32(0xfffe000)) && -		    (tp->mac_version == RTL_GIGA_MAC_VER_05)) { -			desc->opts2 = 0; -			cur_rx++; -		} +release_descriptor: +		desc->opts2 = 0; +		wmb(); +		rtl8169_mark_to_asic(desc, rx_buf_sz);  	}  	count = cur_rx - tp->cur_rx;  	tp->cur_rx = cur_rx; -	tp->dirty_rx += count; -  	return count;  } @@ -6948,7 +6886,6 @@ rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)  	/* Get MAC address */  	for (i = 0; i < ETH_ALEN; i++)  		dev->dev_addr[i] = RTL_R8(MAC0 + i); -	memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);  	SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);  	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;  |