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

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.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents f0791b92 e0d38b58
...@@ -533,6 +533,9 @@ enum rtl_rx_desc_bit { ...@@ -533,6 +533,9 @@ enum rtl_rx_desc_bit {
IPFail = (1 << 16), /* IP checksum failed */ IPFail = (1 << 16), /* IP checksum failed */
UDPFail = (1 << 15), /* UDP/IP checksum failed */ UDPFail = (1 << 15), /* UDP/IP checksum failed */
TCPFail = (1 << 14), /* TCP/IP checksum failed */ TCPFail = (1 << 14), /* TCP/IP checksum failed */
#define RxCSFailMask (IPFail | UDPFail | TCPFail)
RxVlanTag = (1 << 16), /* VLAN tag available */ RxVlanTag = (1 << 16), /* VLAN tag available */
}; };
...@@ -588,6 +591,12 @@ enum rtl_flag { ...@@ -588,6 +591,12 @@ enum rtl_flag {
RTL_FLAG_MAX RTL_FLAG_MAX
}; };
enum rtl_dash_type {
RTL_DASH_NONE,
RTL_DASH_DP,
RTL_DASH_EP,
};
struct rtl8169_private { struct rtl8169_private {
void __iomem *mmio_addr; /* memory map physical address */ void __iomem *mmio_addr; /* memory map physical address */
struct pci_dev *pci_dev; struct pci_dev *pci_dev;
...@@ -595,6 +604,7 @@ struct rtl8169_private { ...@@ -595,6 +604,7 @@ struct rtl8169_private {
struct phy_device *phydev; struct phy_device *phydev;
struct napi_struct napi; struct napi_struct napi;
enum mac_version mac_version; 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_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 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
u32 dirty_tx; u32 dirty_tx;
...@@ -1181,19 +1191,10 @@ static void rtl8168ep_driver_start(struct rtl8169_private *tp) ...@@ -1181,19 +1191,10 @@ static void rtl8168ep_driver_start(struct rtl8169_private *tp)
static void rtl8168_driver_start(struct rtl8169_private *tp) static void rtl8168_driver_start(struct rtl8169_private *tp)
{ {
switch (tp->mac_version) { if (tp->dash_type == RTL_DASH_DP)
case RTL_GIGA_MAC_VER_27:
case RTL_GIGA_MAC_VER_28:
case RTL_GIGA_MAC_VER_31:
rtl8168dp_driver_start(tp); rtl8168dp_driver_start(tp);
break; else
case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
rtl8168ep_driver_start(tp); rtl8168ep_driver_start(tp);
break;
default:
BUG();
break;
}
} }
static void rtl8168dp_driver_stop(struct rtl8169_private *tp) static void rtl8168dp_driver_stop(struct rtl8169_private *tp)
...@@ -1212,44 +1213,35 @@ static void rtl8168ep_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) static void rtl8168_driver_stop(struct rtl8169_private *tp)
{ {
switch (tp->mac_version) { if (tp->dash_type == RTL_DASH_DP)
case RTL_GIGA_MAC_VER_27:
case RTL_GIGA_MAC_VER_28:
case RTL_GIGA_MAC_VER_31:
rtl8168dp_driver_stop(tp); rtl8168dp_driver_stop(tp);
break; else
case RTL_GIGA_MAC_VER_49 ... RTL_GIGA_MAC_VER_52:
rtl8168ep_driver_stop(tp); rtl8168ep_driver_stop(tp);
break;
default:
BUG();
break;
}
} }
static bool r8168dp_check_dash(struct rtl8169_private *tp) static bool r8168dp_check_dash(struct rtl8169_private *tp)
{ {
u16 reg = rtl8168_get_ocp_reg(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) 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) { switch (tp->mac_version) {
case RTL_GIGA_MAC_VER_27: case RTL_GIGA_MAC_VER_27:
case RTL_GIGA_MAC_VER_28: case RTL_GIGA_MAC_VER_28:
case RTL_GIGA_MAC_VER_31: 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: 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: default:
return false; return RTL_DASH_NONE;
} }
} }
...@@ -2210,28 +2202,16 @@ static int rtl_set_mac_address(struct net_device *dev, void *p) ...@@ -2210,28 +2202,16 @@ static int rtl_set_mac_address(struct net_device *dev, void *p)
return 0; 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) { if (tp->mac_version >= RTL_GIGA_MAC_VER_25)
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:
RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) | RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) |
AcceptBroadcast | AcceptMulticast | AcceptMyPhys); AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
break;
default:
break;
}
} }
static void rtl_prepare_power_down(struct rtl8169_private *tp) static void rtl_prepare_power_down(struct rtl8169_private *tp)
{ {
if (r8168_check_dash(tp)) if (tp->dash_type != RTL_DASH_NONE)
return; return;
if (tp->mac_version == RTL_GIGA_MAC_VER_32 || if (tp->mac_version == RTL_GIGA_MAC_VER_32 ||
...@@ -2240,7 +2220,7 @@ static void rtl_prepare_power_down(struct rtl8169_private *tp) ...@@ -2240,7 +2220,7 @@ static void rtl_prepare_power_down(struct rtl8169_private *tp)
if (device_may_wakeup(tp_to_dev(tp))) { if (device_may_wakeup(tp_to_dev(tp))) {
phy_speed_down(tp->phydev, false); 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) ...@@ -4389,10 +4369,9 @@ static inline int rtl8169_fragmented_frame(u32 status)
static inline void rtl8169_rx_csum(struct sk_buff *skb, u32 opts1) 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)) || if (status == RxProtoTCP || status == RxProtoUDP)
((status == RxProtoUDP) && !(opts1 & UDPFail)))
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
else else
skb_checksum_none_assert(skb); skb_checksum_none_assert(skb);
...@@ -4872,7 +4851,7 @@ static void rtl_shutdown(struct pci_dev *pdev) ...@@ -4872,7 +4851,7 @@ static void rtl_shutdown(struct pci_dev *pdev)
if (system_state == SYSTEM_POWER_OFF) { if (system_state == SYSTEM_POWER_OFF) {
if (tp->saved_wolopts) { if (tp->saved_wolopts) {
rtl_wol_suspend_quirk(tp); rtl_wol_enable_rx(tp);
rtl_wol_shutdown_quirk(tp); rtl_wol_shutdown_quirk(tp);
} }
...@@ -4890,7 +4869,7 @@ static void rtl_remove_one(struct pci_dev *pdev) ...@@ -4890,7 +4869,7 @@ static void rtl_remove_one(struct pci_dev *pdev)
unregister_netdev(tp->dev); unregister_netdev(tp->dev);
if (r8168_check_dash(tp)) if (tp->dash_type != RTL_DASH_NONE)
rtl8168_driver_stop(tp); rtl8168_driver_stop(tp);
rtl_release_firmware(tp); rtl_release_firmware(tp);
...@@ -5250,6 +5229,8 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -5250,6 +5229,8 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
tp->mac_version = chipset; tp->mac_version = chipset;
tp->dash_type = rtl_check_dash(tp);
tp->cp_cmd = RTL_R16(tp, CPlusCmd) & CPCMD_MASK; tp->cp_cmd = RTL_R16(tp, CPlusCmd) & CPCMD_MASK;
if (sizeof(dma_addr_t) > 4 && tp->mac_version >= RTL_GIGA_MAC_VER_18 && 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) ...@@ -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 ? jumbo_max, tp->mac_version <= RTL_GIGA_MAC_VER_06 ?
"ok" : "ko"); "ok" : "ko");
if (r8168_check_dash(tp)) { if (tp->dash_type != RTL_DASH_NONE) {
netdev_info(dev, "DASH enabled\n"); netdev_info(dev, "DASH enabled\n");
rtl8168_driver_start(tp); rtl8168_driver_start(tp);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment