Commit 12a6f871 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'r8169-further-improvements'

Heiner Kallweit says:

====================
r8169: further improvements

Series includes further smaller improvements.
====================

Link: https://lore.kernel.org/r/1bc3b7ef-b54a-d517-df54-27d61ca7ba94@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents f0791b92 e0d38b58
Loading
Loading
Loading
Loading
+31 −50
Original line number Diff line number Diff line
@@ -533,6 +533,9 @@ enum rtl_rx_desc_bit {
	IPFail		= (1 << 16), /* IP checksum failed */
	UDPFail		= (1 << 15), /* UDP/IP checksum failed */
	TCPFail		= (1 << 14), /* TCP/IP checksum failed */

#define RxCSFailMask	(IPFail | UDPFail | TCPFail)

	RxVlanTag	= (1 << 16), /* VLAN tag available */
};

@@ -588,6 +591,12 @@ enum rtl_flag {
	RTL_FLAG_MAX
};

enum rtl_dash_type {
	RTL_DASH_NONE,
	RTL_DASH_DP,
	RTL_DASH_EP,
};

struct rtl8169_private {
	void __iomem *mmio_addr;	/* memory map physical address */
	struct pci_dev *pci_dev;
@@ -595,6 +604,7 @@ struct rtl8169_private {
	struct phy_device *phydev;
	struct napi_struct napi;
	enum mac_version mac_version;
	enum rtl_dash_type dash_type;
	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_tx;
@@ -1181,19 +1191,10 @@ static void rtl8168ep_driver_start(struct rtl8169_private *tp)

static void rtl8168_driver_start(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
	if (tp->dash_type == RTL_DASH_DP)
		rtl8168dp_driver_start(tp);
		break;
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
	else
		rtl8168ep_driver_start(tp);
		break;
	default:
		BUG();
		break;
	}
}

static void rtl8168dp_driver_stop(struct rtl8169_private *tp)
@@ -1212,44 +1213,35 @@ static void rtl8168ep_driver_stop(struct rtl8169_private *tp)

static void rtl8168_driver_stop(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
	if (tp->dash_type == RTL_DASH_DP)
		rtl8168dp_driver_stop(tp);
		break;
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
	else
		rtl8168ep_driver_stop(tp);
		break;
	default:
		BUG();
		break;
	}
}

static bool r8168dp_check_dash(struct rtl8169_private *tp)
{
	u16 reg = rtl8168_get_ocp_reg(tp);

	return !!(r8168dp_ocp_read(tp, reg) & 0x00008000);
	return r8168dp_ocp_read(tp, reg) & BIT(15);
}

static bool r8168ep_check_dash(struct rtl8169_private *tp)
{
	return r8168ep_ocp_read(tp, 0x128) & 0x00000001;
	return r8168ep_ocp_read(tp, 0x128) & BIT(0);
}

static bool r8168_check_dash(struct rtl8169_private *tp)
static enum rtl_dash_type rtl_check_dash(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_27:
	case RTL_GIGA_MAC_VER_28:
	case RTL_GIGA_MAC_VER_31:
		return r8168dp_check_dash(tp);
		return r8168dp_check_dash(tp) ? RTL_DASH_DP : RTL_DASH_NONE;
	case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
		return r8168ep_check_dash(tp);
		return r8168ep_check_dash(tp) ? RTL_DASH_EP : RTL_DASH_NONE;
	default:
		return false;
		return RTL_DASH_NONE;
	}
}

@@ -2210,28 +2202,16 @@ static int rtl_set_mac_address(struct net_device *dev, void *p)
	return 0;
}

static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
static void rtl_wol_enable_rx(struct rtl8169_private *tp)
{
	switch (tp->mac_version) {
	case RTL_GIGA_MAC_VER_25:
	case RTL_GIGA_MAC_VER_26:
	case RTL_GIGA_MAC_VER_29:
	case RTL_GIGA_MAC_VER_30:
	case RTL_GIGA_MAC_VER_32:
	case RTL_GIGA_MAC_VER_33:
	case RTL_GIGA_MAC_VER_34:
	case RTL_GIGA_MAC_VER_37 ... RTL_GIGA_MAC_VER_63:
	if (tp->mac_version >= RTL_GIGA_MAC_VER_25)
		RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) |
			AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
		break;
	default:
		break;
	}
}

static void rtl_prepare_power_down(struct rtl8169_private *tp)
{
	if (r8168_check_dash(tp))
	if (tp->dash_type != RTL_DASH_NONE)
		return;

	if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
@@ -2240,7 +2220,7 @@ static void rtl_prepare_power_down(struct rtl8169_private *tp)

	if (device_may_wakeup(tp_to_dev(tp))) {
		phy_speed_down(tp->phydev, false);
		rtl_wol_suspend_quirk(tp);
		rtl_wol_enable_rx(tp);
	}
}

@@ -4389,10 +4369,9 @@ static inline int rtl8169_fragmented_frame(u32 status)

static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1)
{
	u32 status = opts1 & RxProtoMask;
	u32 status = opts1 & (RxProtoMask | RxCSFailMask);

	if (((status == RxProtoTCP) && !(opts1 & TCPFail)) ||
	    ((status == RxProtoUDP) && !(opts1 & UDPFail)))
	if (status == RxProtoTCP || status == RxProtoUDP)
		skb->ip_summed = CHECKSUM_UNNECESSARY;
	else
		skb_checksum_none_assert(skb);
@@ -4872,7 +4851,7 @@ static void rtl_shutdown(struct pci_dev *pdev)

	if (system_state == SYSTEM_POWER_OFF) {
		if (tp->saved_wolopts) {
			rtl_wol_suspend_quirk(tp);
			rtl_wol_enable_rx(tp);
			rtl_wol_shutdown_quirk(tp);
		}

@@ -4890,7 +4869,7 @@ static void rtl_remove_one(struct pci_dev *pdev)

	unregister_netdev(tp->dev);

	if (r8168_check_dash(tp))
	if (tp->dash_type != RTL_DASH_NONE)
		rtl8168_driver_stop(tp);

	rtl_release_firmware(tp);
@@ -5250,6 +5229,8 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)

	tp->mac_version = chipset;

	tp->dash_type = rtl_check_dash(tp);

	tp->cp_cmd = RTL_R16(tp, CPlusCmd) & CPCMD_MASK;

	if (sizeof(dma_addr_t) > 4 && tp->mac_version >= RTL_GIGA_MAC_VER_18 &&
@@ -5354,7 +5335,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
			    jumbo_max, tp->mac_version <= RTL_GIGA_MAC_VER_06 ?
			    "ok" : "ko");

	if (r8168_check_dash(tp)) {
	if (tp->dash_type != RTL_DASH_NONE) {
		netdev_info(dev, "DASH enabled\n");
		rtl8168_driver_start(tp);
	}