Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -Narup a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
- --- a/drivers/net/ethernet/realtek/r8169.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/ethernet/realtek/r8169.c 2018-12-17 09:24:42.000000000 +0100
- @@ -13,29 +13,25 @@
- #include <linux/pci.h>
- #include <linux/netdevice.h>
- #include <linux/etherdevice.h>
- +#include <linux/clk.h>
- #include <linux/delay.h>
- #include <linux/ethtool.h>
- -#include <linux/mii.h>
- +#include <linux/phy.h>
- #include <linux/if_vlan.h>
- #include <linux/crc32.h>
- #include <linux/in.h>
- +#include <linux/io.h>
- #include <linux/ip.h>
- #include <linux/tcp.h>
- #include <linux/interrupt.h>
- #include <linux/dma-mapping.h>
- #include <linux/pm_runtime.h>
- #include <linux/firmware.h>
- -#include <linux/pci-aspm.h>
- #include <linux/prefetch.h>
- #include <linux/ipv6.h>
- #include <net/ip6_checksum.h>
- -#include <asm/io.h>
- -#include <asm/irq.h>
- -
- -#define RTL8169_VERSION "2.3LK-NAPI"
- #define MODULENAME "r8169"
- -#define PFX MODULENAME ": "
- #define FIRMWARE_8168D_1 "rtl_nic/rtl8168d-1.fw"
- #define FIRMWARE_8168D_2 "rtl_nic/rtl8168d-2.fw"
- @@ -57,19 +53,6 @@
- #define FIRMWARE_8107E_1 "rtl_nic/rtl8107e-1.fw"
- #define FIRMWARE_8107E_2 "rtl_nic/rtl8107e-2.fw"
- -#ifdef RTL8169_DEBUG
- -#define assert(expr) \
- - if (!(expr)) { \
- - printk( "Assertion failed! %s,%s,%s,line=%d\n", \
- - #expr,__FILE__,__func__,__LINE__); \
- - }
- -#define dprintk(fmt, args...) \
- - do { printk(KERN_DEBUG PFX fmt, ## args); } while (0)
- -#else
- -#define assert(expr) do {} while (0)
- -#define dprintk(fmt, args...) do {} while (0)
- -#endif /* RTL8169_DEBUG */
- -
- #define R8169_MSG_DEFAULT \
- (NETIF_MSG_DRV | NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN)
- @@ -95,7 +78,6 @@ static const int multicast_filter_limit
- #define R8169_RX_RING_BYTES (NUM_RX_DESC * sizeof(struct RxDesc))
- #define RTL8169_TX_TIMEOUT (6*HZ)
- -#define RTL8169_PHY_TIMEOUT (10*HZ)
- /* write/read MMIO register */
- #define RTL_W8(tp, reg, val8) writeb((val8), tp->mmio_addr + (reg))
- @@ -160,136 +142,70 @@ enum mac_version {
- RTL_GIGA_MAC_NONE = 0xff,
- };
- -enum rtl_tx_desc_version {
- - RTL_TD_0 = 0,
- - RTL_TD_1 = 1,
- -};
- -
- #define JUMBO_1K ETH_DATA_LEN
- #define JUMBO_4K (4*1024 - ETH_HLEN - 2)
- #define JUMBO_6K (6*1024 - ETH_HLEN - 2)
- #define JUMBO_7K (7*1024 - ETH_HLEN - 2)
- #define JUMBO_9K (9*1024 - ETH_HLEN - 2)
- -#define _R(NAME,TD,FW,SZ) { \
- - .name = NAME, \
- - .txd_version = TD, \
- - .fw_name = FW, \
- - .jumbo_max = SZ, \
- -}
- -
- static const struct {
- const char *name;
- - enum rtl_tx_desc_version txd_version;
- const char *fw_name;
- - u16 jumbo_max;
- } rtl_chip_infos[] = {
- /* PCI devices. */
- - [RTL_GIGA_MAC_VER_01] =
- - _R("RTL8169", RTL_TD_0, NULL, JUMBO_7K),
- - [RTL_GIGA_MAC_VER_02] =
- - _R("RTL8169s", RTL_TD_0, NULL, JUMBO_7K),
- - [RTL_GIGA_MAC_VER_03] =
- - _R("RTL8110s", RTL_TD_0, NULL, JUMBO_7K),
- - [RTL_GIGA_MAC_VER_04] =
- - _R("RTL8169sb/8110sb", RTL_TD_0, NULL, JUMBO_7K),
- - [RTL_GIGA_MAC_VER_05] =
- - _R("RTL8169sc/8110sc", RTL_TD_0, NULL, JUMBO_7K),
- - [RTL_GIGA_MAC_VER_06] =
- - _R("RTL8169sc/8110sc", RTL_TD_0, NULL, JUMBO_7K),
- + [RTL_GIGA_MAC_VER_01] = {"RTL8169" },
- + [RTL_GIGA_MAC_VER_02] = {"RTL8169s" },
- + [RTL_GIGA_MAC_VER_03] = {"RTL8110s" },
- + [RTL_GIGA_MAC_VER_04] = {"RTL8169sb/8110sb" },
- + [RTL_GIGA_MAC_VER_05] = {"RTL8169sc/8110sc" },
- + [RTL_GIGA_MAC_VER_06] = {"RTL8169sc/8110sc" },
- /* PCI-E devices. */
- - [RTL_GIGA_MAC_VER_07] =
- - _R("RTL8102e", RTL_TD_1, NULL, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_08] =
- - _R("RTL8102e", RTL_TD_1, NULL, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_09] =
- - _R("RTL8102e", RTL_TD_1, NULL, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_10] =
- - _R("RTL8101e", RTL_TD_0, NULL, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_11] =
- - _R("RTL8168b/8111b", RTL_TD_0, NULL, JUMBO_4K),
- - [RTL_GIGA_MAC_VER_12] =
- - _R("RTL8168b/8111b", RTL_TD_0, NULL, JUMBO_4K),
- - [RTL_GIGA_MAC_VER_13] =
- - _R("RTL8101e", RTL_TD_0, NULL, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_14] =
- - _R("RTL8100e", RTL_TD_0, NULL, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_15] =
- - _R("RTL8100e", RTL_TD_0, NULL, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_16] =
- - _R("RTL8101e", RTL_TD_0, NULL, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_17] =
- - _R("RTL8168b/8111b", RTL_TD_0, NULL, JUMBO_4K),
- - [RTL_GIGA_MAC_VER_18] =
- - _R("RTL8168cp/8111cp", RTL_TD_1, NULL, JUMBO_6K),
- - [RTL_GIGA_MAC_VER_19] =
- - _R("RTL8168c/8111c", RTL_TD_1, NULL, JUMBO_6K),
- - [RTL_GIGA_MAC_VER_20] =
- - _R("RTL8168c/8111c", RTL_TD_1, NULL, JUMBO_6K),
- - [RTL_GIGA_MAC_VER_21] =
- - _R("RTL8168c/8111c", RTL_TD_1, NULL, JUMBO_6K),
- - [RTL_GIGA_MAC_VER_22] =
- - _R("RTL8168c/8111c", RTL_TD_1, NULL, JUMBO_6K),
- - [RTL_GIGA_MAC_VER_23] =
- - _R("RTL8168cp/8111cp", RTL_TD_1, NULL, JUMBO_6K),
- - [RTL_GIGA_MAC_VER_24] =
- - _R("RTL8168cp/8111cp", RTL_TD_1, NULL, JUMBO_6K),
- - [RTL_GIGA_MAC_VER_25] =
- - _R("RTL8168d/8111d", RTL_TD_1, FIRMWARE_8168D_1, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_26] =
- - _R("RTL8168d/8111d", RTL_TD_1, FIRMWARE_8168D_2, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_27] =
- - _R("RTL8168dp/8111dp", RTL_TD_1, NULL, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_28] =
- - _R("RTL8168dp/8111dp", RTL_TD_1, NULL, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_29] =
- - _R("RTL8105e", RTL_TD_1, FIRMWARE_8105E_1, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_30] =
- - _R("RTL8105e", RTL_TD_1, FIRMWARE_8105E_1, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_31] =
- - _R("RTL8168dp/8111dp", RTL_TD_1, NULL, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_32] =
- - _R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_1, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_33] =
- - _R("RTL8168e/8111e", RTL_TD_1, FIRMWARE_8168E_2, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_34] =
- - _R("RTL8168evl/8111evl",RTL_TD_1, FIRMWARE_8168E_3, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_35] =
- - _R("RTL8168f/8111f", RTL_TD_1, FIRMWARE_8168F_1, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_36] =
- - _R("RTL8168f/8111f", RTL_TD_1, FIRMWARE_8168F_2, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_37] =
- - _R("RTL8402", RTL_TD_1, FIRMWARE_8402_1, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_38] =
- - _R("RTL8411", RTL_TD_1, FIRMWARE_8411_1, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_39] =
- - _R("RTL8106e", RTL_TD_1, FIRMWARE_8106E_1, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_40] =
- - _R("RTL8168g/8111g", RTL_TD_1, FIRMWARE_8168G_2, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_41] =
- - _R("RTL8168g/8111g", RTL_TD_1, NULL, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_42] =
- - _R("RTL8168g/8111g", RTL_TD_1, FIRMWARE_8168G_3, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_43] =
- - _R("RTL8106e", RTL_TD_1, FIRMWARE_8106E_2, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_44] =
- - _R("RTL8411", RTL_TD_1, FIRMWARE_8411_2, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_45] =
- - _R("RTL8168h/8111h", RTL_TD_1, FIRMWARE_8168H_1, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_46] =
- - _R("RTL8168h/8111h", RTL_TD_1, FIRMWARE_8168H_2, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_47] =
- - _R("RTL8107e", RTL_TD_1, FIRMWARE_8107E_1, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_48] =
- - _R("RTL8107e", RTL_TD_1, FIRMWARE_8107E_2, JUMBO_1K),
- - [RTL_GIGA_MAC_VER_49] =
- - _R("RTL8168ep/8111ep", RTL_TD_1, NULL, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_50] =
- - _R("RTL8168ep/8111ep", RTL_TD_1, NULL, JUMBO_9K),
- - [RTL_GIGA_MAC_VER_51] =
- - _R("RTL8168ep/8111ep", RTL_TD_1, NULL, JUMBO_9K),
- + [RTL_GIGA_MAC_VER_07] = {"RTL8102e" },
- + [RTL_GIGA_MAC_VER_08] = {"RTL8102e" },
- + [RTL_GIGA_MAC_VER_09] = {"RTL8102e" },
- + [RTL_GIGA_MAC_VER_10] = {"RTL8101e" },
- + [RTL_GIGA_MAC_VER_11] = {"RTL8168b/8111b" },
- + [RTL_GIGA_MAC_VER_12] = {"RTL8168b/8111b" },
- + [RTL_GIGA_MAC_VER_13] = {"RTL8101e" },
- + [RTL_GIGA_MAC_VER_14] = {"RTL8100e" },
- + [RTL_GIGA_MAC_VER_15] = {"RTL8100e" },
- + [RTL_GIGA_MAC_VER_16] = {"RTL8101e" },
- + [RTL_GIGA_MAC_VER_17] = {"RTL8168b/8111b" },
- + [RTL_GIGA_MAC_VER_18] = {"RTL8168cp/8111cp" },
- + [RTL_GIGA_MAC_VER_19] = {"RTL8168c/8111c" },
- + [RTL_GIGA_MAC_VER_20] = {"RTL8168c/8111c" },
- + [RTL_GIGA_MAC_VER_21] = {"RTL8168c/8111c" },
- + [RTL_GIGA_MAC_VER_22] = {"RTL8168c/8111c" },
- + [RTL_GIGA_MAC_VER_23] = {"RTL8168cp/8111cp" },
- + [RTL_GIGA_MAC_VER_24] = {"RTL8168cp/8111cp" },
- + [RTL_GIGA_MAC_VER_25] = {"RTL8168d/8111d", FIRMWARE_8168D_1},
- + [RTL_GIGA_MAC_VER_26] = {"RTL8168d/8111d", FIRMWARE_8168D_2},
- + [RTL_GIGA_MAC_VER_27] = {"RTL8168dp/8111dp" },
- + [RTL_GIGA_MAC_VER_28] = {"RTL8168dp/8111dp" },
- + [RTL_GIGA_MAC_VER_29] = {"RTL8105e", FIRMWARE_8105E_1},
- + [RTL_GIGA_MAC_VER_30] = {"RTL8105e", FIRMWARE_8105E_1},
- + [RTL_GIGA_MAC_VER_31] = {"RTL8168dp/8111dp" },
- + [RTL_GIGA_MAC_VER_32] = {"RTL8168e/8111e", FIRMWARE_8168E_1},
- + [RTL_GIGA_MAC_VER_33] = {"RTL8168e/8111e", FIRMWARE_8168E_2},
- + [RTL_GIGA_MAC_VER_34] = {"RTL8168evl/8111evl", FIRMWARE_8168E_3},
- + [RTL_GIGA_MAC_VER_35] = {"RTL8168f/8111f", FIRMWARE_8168F_1},
- + [RTL_GIGA_MAC_VER_36] = {"RTL8168f/8111f", FIRMWARE_8168F_2},
- + [RTL_GIGA_MAC_VER_37] = {"RTL8402", FIRMWARE_8402_1 },
- + [RTL_GIGA_MAC_VER_38] = {"RTL8411", FIRMWARE_8411_1 },
- + [RTL_GIGA_MAC_VER_39] = {"RTL8106e", FIRMWARE_8106E_1},
- + [RTL_GIGA_MAC_VER_40] = {"RTL8168g/8111g", FIRMWARE_8168G_2},
- + [RTL_GIGA_MAC_VER_41] = {"RTL8168g/8111g" },
- + [RTL_GIGA_MAC_VER_42] = {"RTL8168g/8111g", FIRMWARE_8168G_3},
- + [RTL_GIGA_MAC_VER_43] = {"RTL8106e", FIRMWARE_8106E_2},
- + [RTL_GIGA_MAC_VER_44] = {"RTL8411", FIRMWARE_8411_2 },
- + [RTL_GIGA_MAC_VER_45] = {"RTL8168h/8111h", FIRMWARE_8168H_1},
- + [RTL_GIGA_MAC_VER_46] = {"RTL8168h/8111h", FIRMWARE_8168H_2},
- + [RTL_GIGA_MAC_VER_47] = {"RTL8107e", FIRMWARE_8107E_1},
- + [RTL_GIGA_MAC_VER_48] = {"RTL8107e", FIRMWARE_8107E_2},
- + [RTL_GIGA_MAC_VER_49] = {"RTL8168ep/8111ep" },
- + [RTL_GIGA_MAC_VER_50] = {"RTL8168ep/8111ep" },
- + [RTL_GIGA_MAC_VER_51] = {"RTL8168ep/8111ep" },
- };
- -#undef _R
- enum cfg_version {
- RTL_CFG_0 = 0x00,
- @@ -400,12 +316,6 @@ enum rtl_registers {
- FuncForceEvent = 0xfc,
- };
- -enum rtl8110_registers {
- - TBICSR = 0x64,
- - TBI_ANAR = 0x68,
- - TBI_LPAR = 0x6a,
- -};
- -
- enum rtl8168_8101_registers {
- CSIDR = 0x64,
- CSIAR = 0x68,
- @@ -572,14 +482,6 @@ enum rtl_register_content {
- PMEStatus = (1 << 0), /* PME status can be reset by PCI RST# */
- ASPM_en = (1 << 0), /* ASPM enable */
- - /* TBICSR p.28 */
- - TBIReset = 0x80000000,
- - TBILoopback = 0x40000000,
- - TBINwEnable = 0x20000000,
- - TBINwRestart = 0x10000000,
- - TBILinkOk = 0x02000000,
- - TBINwComplete = 0x01000000,
- -
- /* CPlusCmd p.31 */
- EnableBist = (1 << 15), // 8168 8101
- Mac_dbgo_oe = (1 << 14), // 8168 8101
- @@ -733,7 +635,6 @@ enum rtl_flag {
- RTL_FLAG_TASK_ENABLED = 0,
- RTL_FLAG_TASK_SLOW_PENDING,
- RTL_FLAG_TASK_RESET_PENDING,
- - RTL_FLAG_TASK_PHY_PENDING,
- RTL_FLAG_MAX
- };
- @@ -761,11 +662,11 @@ struct rtl8169_private {
- dma_addr_t RxPhyAddr;
- void *Rx_databuff[NUM_RX_DESC]; /* Rx data buffers */
- struct ring_info tx_skb[NUM_TX_DESC]; /* Tx data buffers */
- - struct timer_list timer;
- u16 cp_cmd;
- u16 event_slow;
- const struct rtl_coalesce_info *coalesce_info;
- + struct clk *clk;
- struct mdio_ops {
- void (*write)(struct rtl8169_private *, int, int);
- @@ -777,14 +678,7 @@ struct rtl8169_private {
- void (*disable)(struct rtl8169_private *);
- } jumbo_ops;
- - int (*set_speed)(struct net_device *, u8 aneg, u16 sp, u8 dpx, u32 adv);
- - int (*get_link_ksettings)(struct net_device *,
- - struct ethtool_link_ksettings *);
- - void (*phy_reset_enable)(struct rtl8169_private *tp);
- void (*hw_start)(struct rtl8169_private *tp);
- - unsigned int (*phy_reset_pending)(struct rtl8169_private *tp);
- - unsigned int (*link_ok)(struct rtl8169_private *tp);
- - int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
- bool (*tso_csum)(struct rtl8169_private *, struct sk_buff *, u32 *);
- struct {
- @@ -793,7 +687,8 @@ struct rtl8169_private {
- struct work_struct work;
- } wk;
- - struct mii_if_info mii;
- + unsigned supports_gmii:1;
- + struct mii_bus *mii_bus;
- dma_addr_t counters_phys_addr;
- struct rtl8169_counters *counters;
- struct rtl8169_tc_offsets tc_offset;
- @@ -823,7 +718,6 @@ MODULE_PARM_DESC(use_dac, "Enable PCI DA
- module_param_named(debug, debug.msg_enable, int, 0);
- MODULE_PARM_DESC(debug, "Debug verbosity level (0=none, ..., 16=all)");
- MODULE_LICENSE("GPL");
- -MODULE_VERSION(RTL8169_VERSION);
- MODULE_FIRMWARE(FIRMWARE_8168D_1);
- MODULE_FIRMWARE(FIRMWARE_8168D_2);
- MODULE_FIRMWARE(FIRMWARE_8168E_1);
- @@ -1144,21 +1038,6 @@ static void rtl_w0w1_phy(struct rtl8169_
- rtl_writephy(tp, reg_addr, (val & ~m) | p);
- }
- -static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
- - int val)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- -
- - rtl_writephy(tp, location, val);
- -}
- -
- -static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- -
- - return rtl_readphy(tp, location);
- -}
- -
- DECLARE_RTL_COND(rtl_ephyar_cond)
- {
- return RTL_R32(tp, EPHYAR) & EPHYAR_FLAG;
- @@ -1479,54 +1358,22 @@ static void rtl8169_irq_mask_and_ack(str
- RTL_R8(tp, ChipCmd);
- }
- -static unsigned int rtl8169_tbi_reset_pending(struct rtl8169_private *tp)
- -{
- - return RTL_R32(tp, TBICSR) & TBIReset;
- -}
- -
- -static unsigned int rtl8169_xmii_reset_pending(struct rtl8169_private *tp)
- -{
- - return rtl_readphy(tp, MII_BMCR) & BMCR_RESET;
- -}
- -
- -static unsigned int rtl8169_tbi_link_ok(struct rtl8169_private *tp)
- -{
- - return RTL_R32(tp, TBICSR) & TBILinkOk;
- -}
- -
- -static unsigned int rtl8169_xmii_link_ok(struct rtl8169_private *tp)
- -{
- - return RTL_R8(tp, PHYstatus) & LinkStatus;
- -}
- -
- -static void rtl8169_tbi_reset_enable(struct rtl8169_private *tp)
- -{
- - RTL_W32(tp, TBICSR, RTL_R32(tp, TBICSR) | TBIReset);
- -}
- -
- -static void rtl8169_xmii_reset_enable(struct rtl8169_private *tp)
- -{
- - unsigned int val;
- -
- - val = rtl_readphy(tp, MII_BMCR) | BMCR_RESET;
- - rtl_writephy(tp, MII_BMCR, val & 0xffff);
- -}
- -
- static void rtl_link_chg_patch(struct rtl8169_private *tp)
- {
- struct net_device *dev = tp->dev;
- + struct phy_device *phydev = dev->phydev;
- if (!netif_running(dev))
- return;
- if (tp->mac_version == RTL_GIGA_MAC_VER_34 ||
- tp->mac_version == RTL_GIGA_MAC_VER_38) {
- - if (RTL_R8(tp, PHYstatus) & _1000bpsF) {
- + if (phydev->speed == SPEED_1000) {
- rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011,
- ERIAR_EXGMAC);
- rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005,
- ERIAR_EXGMAC);
- - } else if (RTL_R8(tp, PHYstatus) & _100bps) {
- + } else if (phydev->speed == SPEED_100) {
- rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f,
- ERIAR_EXGMAC);
- rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005,
- @@ -1544,7 +1391,7 @@ static void rtl_link_chg_patch(struct rt
- ERIAR_EXGMAC);
- } else if (tp->mac_version == RTL_GIGA_MAC_VER_35 ||
- tp->mac_version == RTL_GIGA_MAC_VER_36) {
- - if (RTL_R8(tp, PHYstatus) & _1000bpsF) {
- + if (phydev->speed == SPEED_1000) {
- rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011,
- ERIAR_EXGMAC);
- rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005,
- @@ -1556,7 +1403,7 @@ static void rtl_link_chg_patch(struct rt
- ERIAR_EXGMAC);
- }
- } else if (tp->mac_version == RTL_GIGA_MAC_VER_37) {
- - if (RTL_R8(tp, PHYstatus) & _10bps) {
- + if (phydev->speed == SPEED_10) {
- rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x4d02,
- ERIAR_EXGMAC);
- rtl_eri_write(tp, 0x1dc, ERIAR_MASK_0011, 0x0060,
- @@ -1568,25 +1415,6 @@ static void rtl_link_chg_patch(struct rt
- }
- }
- -static void rtl8169_check_link_status(struct net_device *dev,
- - struct rtl8169_private *tp)
- -{
- - struct device *d = tp_to_dev(tp);
- -
- - if (tp->link_ok(tp)) {
- - rtl_link_chg_patch(tp);
- - /* This is to cancel a scheduled suspend if there's one. */
- - pm_request_resume(d);
- - netif_carrier_on(dev);
- - if (net_ratelimit())
- - netif_info(tp, ifup, dev, "link up\n");
- - } else {
- - netif_carrier_off(dev);
- - netif_info(tp, ifdown, dev, "link down\n");
- - pm_runtime_idle(d);
- - }
- -}
- -
- #define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)
- static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
- @@ -1627,21 +1455,11 @@ static u32 __rtl8169_get_wol(struct rtl8
- static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
- {
- struct rtl8169_private *tp = netdev_priv(dev);
- - struct device *d = tp_to_dev(tp);
- -
- - pm_runtime_get_noresume(d);
- rtl_lock_work(tp);
- -
- wol->supported = WAKE_ANY;
- - if (pm_runtime_active(d))
- - wol->wolopts = __rtl8169_get_wol(tp);
- - else
- - wol->wolopts = tp->saved_wolopts;
- -
- + wol->wolopts = tp->saved_wolopts;
- rtl_unlock_work(tp);
- -
- - pm_runtime_put_noidle(d);
- }
- static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
- @@ -1717,18 +1535,21 @@ static int rtl8169_set_wol(struct net_de
- struct rtl8169_private *tp = netdev_priv(dev);
- struct device *d = tp_to_dev(tp);
- + if (wol->wolopts & ~WAKE_ANY)
- + return -EINVAL;
- +
- pm_runtime_get_noresume(d);
- rtl_lock_work(tp);
- + tp->saved_wolopts = wol->wolopts;
- +
- if (pm_runtime_active(d))
- - __rtl8169_set_wol(tp, wol->wolopts);
- - else
- - tp->saved_wolopts = wol->wolopts;
- + __rtl8169_set_wol(tp, tp->saved_wolopts);
- rtl_unlock_work(tp);
- - device_set_wakeup_enable(d, wol->wolopts);
- + device_set_wakeup_enable(d, tp->saved_wolopts);
- pm_runtime_put_noidle(d);
- @@ -1747,7 +1568,6 @@ static void rtl8169_get_drvinfo(struct n
- struct rtl_fw *rtl_fw = tp->rtl_fw;
- strlcpy(info->driver, MODULENAME, sizeof(info->driver));
- - strlcpy(info->version, RTL8169_VERSION, sizeof(info->version));
- strlcpy(info->bus_info, pci_name(tp->pci_dev), sizeof(info->bus_info));
- BUILD_BUG_ON(sizeof(info->fw_version) < sizeof(rtl_fw->version));
- if (!IS_ERR_OR_NULL(rtl_fw))
- @@ -1760,124 +1580,6 @@ static int rtl8169_get_regs_len(struct n
- return R8169_REGS_SIZE;
- }
- -static int rtl8169_set_speed_tbi(struct net_device *dev,
- - u8 autoneg, u16 speed, u8 duplex, u32 ignored)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- - int ret = 0;
- - u32 reg;
- -
- - reg = RTL_R32(tp, TBICSR);
- - if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
- - (duplex == DUPLEX_FULL)) {
- - RTL_W32(tp, TBICSR, reg & ~(TBINwEnable | TBINwRestart));
- - } else if (autoneg == AUTONEG_ENABLE)
- - RTL_W32(tp, TBICSR, reg | TBINwEnable | TBINwRestart);
- - else {
- - netif_warn(tp, link, dev,
- - "incorrect speed setting refused in TBI mode\n");
- - ret = -EOPNOTSUPP;
- - }
- -
- - return ret;
- -}
- -
- -static int rtl8169_set_speed_xmii(struct net_device *dev,
- - u8 autoneg, u16 speed, u8 duplex, u32 adv)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- - int giga_ctrl, bmcr;
- - int rc = -EINVAL;
- -
- - rtl_writephy(tp, 0x1f, 0x0000);
- -
- - if (autoneg == AUTONEG_ENABLE) {
- - int auto_nego;
- -
- - auto_nego = rtl_readphy(tp, MII_ADVERTISE);
- - auto_nego &= ~(ADVERTISE_10HALF | ADVERTISE_10FULL |
- - ADVERTISE_100HALF | ADVERTISE_100FULL);
- -
- - if (adv & ADVERTISED_10baseT_Half)
- - auto_nego |= ADVERTISE_10HALF;
- - if (adv & ADVERTISED_10baseT_Full)
- - auto_nego |= ADVERTISE_10FULL;
- - if (adv & ADVERTISED_100baseT_Half)
- - auto_nego |= ADVERTISE_100HALF;
- - if (adv & ADVERTISED_100baseT_Full)
- - auto_nego |= ADVERTISE_100FULL;
- -
- - auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
- -
- - giga_ctrl = rtl_readphy(tp, MII_CTRL1000);
- - giga_ctrl &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
- -
- - /* The 8100e/8101e/8102e do Fast Ethernet only. */
- - if (tp->mii.supports_gmii) {
- - if (adv & ADVERTISED_1000baseT_Half)
- - giga_ctrl |= ADVERTISE_1000HALF;
- - if (adv & ADVERTISED_1000baseT_Full)
- - giga_ctrl |= ADVERTISE_1000FULL;
- - } else if (adv & (ADVERTISED_1000baseT_Half |
- - ADVERTISED_1000baseT_Full)) {
- - netif_info(tp, link, dev,
- - "PHY does not support 1000Mbps\n");
- - goto out;
- - }
- -
- - bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
- -
- - rtl_writephy(tp, MII_ADVERTISE, auto_nego);
- - rtl_writephy(tp, MII_CTRL1000, giga_ctrl);
- - } else {
- - if (speed == SPEED_10)
- - bmcr = 0;
- - else if (speed == SPEED_100)
- - bmcr = BMCR_SPEED100;
- - else
- - goto out;
- -
- - if (duplex == DUPLEX_FULL)
- - bmcr |= BMCR_FULLDPLX;
- - }
- -
- - rtl_writephy(tp, MII_BMCR, bmcr);
- -
- - if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
- - tp->mac_version == RTL_GIGA_MAC_VER_03) {
- - if ((speed == SPEED_100) && (autoneg != AUTONEG_ENABLE)) {
- - rtl_writephy(tp, 0x17, 0x2138);
- - rtl_writephy(tp, 0x0e, 0x0260);
- - } else {
- - rtl_writephy(tp, 0x17, 0x2108);
- - rtl_writephy(tp, 0x0e, 0x0000);
- - }
- - }
- -
- - rc = 0;
- -out:
- - return rc;
- -}
- -
- -static int rtl8169_set_speed(struct net_device *dev,
- - u8 autoneg, u16 speed, u8 duplex, u32 advertising)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- - int ret;
- -
- - ret = tp->set_speed(dev, autoneg, speed, duplex, advertising);
- - if (ret < 0)
- - goto out;
- -
- - if (netif_running(dev) && (autoneg == AUTONEG_ENABLE) &&
- - (advertising & ADVERTISED_1000baseT_Full) &&
- - !pci_is_pcie(tp->pci_dev)) {
- - mod_timer(&tp->timer, jiffies + RTL8169_PHY_TIMEOUT);
- - }
- -out:
- - return ret;
- -}
- -
- static netdev_features_t rtl8169_fix_features(struct net_device *dev,
- netdev_features_t features)
- {
- @@ -1941,76 +1643,6 @@ static void rtl8169_rx_vlan_tag(struct R
- __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff));
- }
- -static int rtl8169_get_link_ksettings_tbi(struct net_device *dev,
- - struct ethtool_link_ksettings *cmd)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- - u32 status;
- - u32 supported, advertising;
- -
- - supported =
- - SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
- - cmd->base.port = PORT_FIBRE;
- -
- - status = RTL_R32(tp, TBICSR);
- - advertising = (status & TBINwEnable) ? ADVERTISED_Autoneg : 0;
- - cmd->base.autoneg = !!(status & TBINwEnable);
- -
- - cmd->base.speed = SPEED_1000;
- - cmd->base.duplex = DUPLEX_FULL; /* Always set */
- -
- - ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
- - supported);
- - ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
- - advertising);
- -
- - return 0;
- -}
- -
- -static int rtl8169_get_link_ksettings_xmii(struct net_device *dev,
- - struct ethtool_link_ksettings *cmd)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- -
- - mii_ethtool_get_link_ksettings(&tp->mii, cmd);
- -
- - return 0;
- -}
- -
- -static int rtl8169_get_link_ksettings(struct net_device *dev,
- - struct ethtool_link_ksettings *cmd)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- - int rc;
- -
- - rtl_lock_work(tp);
- - rc = tp->get_link_ksettings(dev, cmd);
- - rtl_unlock_work(tp);
- -
- - return rc;
- -}
- -
- -static int rtl8169_set_link_ksettings(struct net_device *dev,
- - const struct ethtool_link_ksettings *cmd)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- - int rc;
- - u32 advertising;
- -
- - if (!ethtool_convert_link_mode_to_legacy_u32(&advertising,
- - cmd->link_modes.advertising))
- - return -EINVAL;
- -
- - del_timer_sync(&tp->timer);
- -
- - rtl_lock_work(tp);
- - rc = rtl8169_set_speed(dev, cmd->base.autoneg, cmd->base.speed,
- - cmd->base.duplex, advertising);
- - rtl_unlock_work(tp);
- -
- - return rc;
- -}
- -
- static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
- void *p)
- {
- @@ -2186,13 +1818,6 @@ static void rtl8169_get_strings(struct n
- }
- }
- -static int rtl8169_nway_reset(struct net_device *dev)
- -{
- - struct rtl8169_private *tp = netdev_priv(dev);
- -
- - return mii_nway_restart(&tp->mii);
- -}
- -
- /*
- * Interrupt coalescing
- *
- @@ -2265,7 +1890,7 @@ static const struct rtl_coalesce_info *r
- const struct rtl_coalesce_info *ci;
- int rc;
- - rc = rtl8169_get_link_ksettings(dev, &ecmd);
- + rc = phy_ethtool_get_link_ksettings(dev, &ecmd);
- if (rc < 0)
- return ERR_PTR(rc);
- @@ -2423,9 +2048,9 @@ static const struct ethtool_ops rtl8169_
- .get_sset_count = rtl8169_get_sset_count,
- .get_ethtool_stats = rtl8169_get_ethtool_stats,
- .get_ts_info = ethtool_op_get_ts_info,
- - .nway_reset = rtl8169_nway_reset,
- - .get_link_ksettings = rtl8169_get_link_ksettings,
- - .set_link_ksettings = rtl8169_set_link_ksettings,
- + .nway_reset = phy_ethtool_nway_reset,
- + .get_link_ksettings = phy_ethtool_get_link_ksettings,
- + .set_link_ksettings = phy_ethtool_set_link_ksettings,
- };
- static void rtl8169_get_mac_version(struct rtl8169_private *tp,
- @@ -2538,15 +2163,15 @@ static void rtl8169_get_mac_version(stru
- "unknown MAC, using family default\n");
- tp->mac_version = default_version;
- } else if (tp->mac_version == RTL_GIGA_MAC_VER_42) {
- - tp->mac_version = tp->mii.supports_gmii ?
- + tp->mac_version = tp->supports_gmii ?
- RTL_GIGA_MAC_VER_42 :
- RTL_GIGA_MAC_VER_43;
- } else if (tp->mac_version == RTL_GIGA_MAC_VER_45) {
- - tp->mac_version = tp->mii.supports_gmii ?
- + tp->mac_version = tp->supports_gmii ?
- RTL_GIGA_MAC_VER_45 :
- RTL_GIGA_MAC_VER_47;
- } else if (tp->mac_version == RTL_GIGA_MAC_VER_46) {
- - tp->mac_version = tp->mii.supports_gmii ?
- + tp->mac_version = tp->supports_gmii ?
- RTL_GIGA_MAC_VER_46 :
- RTL_GIGA_MAC_VER_48;
- }
- @@ -2554,7 +2179,7 @@ static void rtl8169_get_mac_version(stru
- static void rtl8169_print_mac_version(struct rtl8169_private *tp)
- {
- - dprintk("mac_version = 0x%02x\n", tp->mac_version);
- + netif_dbg(tp, drv, tp->dev, "mac_version = 0x%02x\n", tp->mac_version);
- }
- struct phy_reg {
- @@ -4406,62 +4031,16 @@ static void rtl_hw_phy_config(struct net
- }
- }
- -static void rtl_phy_work(struct rtl8169_private *tp)
- -{
- - struct timer_list *timer = &tp->timer;
- - unsigned long timeout = RTL8169_PHY_TIMEOUT;
- -
- - assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
- -
- - if (tp->phy_reset_pending(tp)) {
- - /*
- - * A busy loop could burn quite a few cycles on nowadays CPU.
- - * Let's delay the execution of the timer for a few ticks.
- - */
- - timeout = HZ/10;
- - goto out_mod_timer;
- - }
- -
- - if (tp->link_ok(tp))
- - return;
- -
- - netif_dbg(tp, link, tp->dev, "PHY reset until link up\n");
- -
- - tp->phy_reset_enable(tp);
- -
- -out_mod_timer:
- - mod_timer(timer, jiffies + timeout);
- -}
- -
- static void rtl_schedule_task(struct rtl8169_private *tp, enum rtl_flag flag)
- {
- if (!test_and_set_bit(flag, tp->wk.flags))
- schedule_work(&tp->wk.work);
- }
- -static void rtl8169_phy_timer(struct timer_list *t)
- -{
- - struct rtl8169_private *tp = from_timer(tp, t, timer);
- -
- - rtl_schedule_task(tp, RTL_FLAG_TASK_PHY_PENDING);
- -}
- -
- -DECLARE_RTL_COND(rtl_phy_reset_cond)
- -{
- - return tp->phy_reset_pending(tp);
- -}
- -
- -static void rtl8169_phy_reset(struct net_device *dev,
- - struct rtl8169_private *tp)
- -{
- - tp->phy_reset_enable(tp);
- - rtl_msleep_loop_wait_low(tp, &rtl_phy_reset_cond, 1, 100);
- -}
- -
- static bool rtl_tbi_enabled(struct rtl8169_private *tp)
- {
- return (tp->mac_version == RTL_GIGA_MAC_VER_01) &&
- - (RTL_R8(tp, PHYstatus) & TBI_Enable);
- + (RTL_R8(tp, PHYstatus) & TBI_Enable);
- }
- static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
- @@ -4469,7 +4048,8 @@ static void rtl8169_init_phy(struct net_
- rtl_hw_phy_config(dev);
- if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
- - dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
- + netif_dbg(tp, drv, dev,
- + "Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
- RTL_W8(tp, 0x82, 0x01);
- }
- @@ -4479,23 +4059,26 @@ static void rtl8169_init_phy(struct net_
- pci_write_config_byte(tp->pci_dev, PCI_CACHE_LINE_SIZE, 0x08);
- if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
- - dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
- + netif_dbg(tp, drv, dev,
- + "Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
- RTL_W8(tp, 0x82, 0x01);
- - dprintk("Set PHY Reg 0x0bh = 0x00h\n");
- + netif_dbg(tp, drv, dev,
- + "Set PHY Reg 0x0bh = 0x00h\n");
- rtl_writephy(tp, 0x0b, 0x0000); //w 0x0b 15 0 0
- }
- - rtl8169_phy_reset(dev, tp);
- + /* We may have called phy_speed_down before */
- + phy_speed_up(dev->phydev);
- - rtl8169_set_speed(dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL,
- - ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
- - ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
- - (tp->mii.supports_gmii ?
- - ADVERTISED_1000baseT_Half |
- - ADVERTISED_1000baseT_Full : 0));
- + genphy_soft_reset(dev->phydev);
- - if (rtl_tbi_enabled(tp))
- - netif_info(tp, link, dev, "TBI auto-negotiating\n");
- + /* It was reported that several chips end up with 10MBit/Half on a
- + * 1GBit link after resuming from S3. For whatever reason the PHY on
- + * these chips doesn't properly start a renegotiation when soft-reset.
- + * Explicitly requesting a renegotiation fixes this.
- + */
- + if (dev->phydev->autoneg == AUTONEG_ENABLE)
- + phy_restart_aneg(dev->phydev);
- }
- static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
- @@ -4540,34 +4123,10 @@ static int rtl_set_mac_address(struct ne
- static int rtl8169_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
- {
- - struct rtl8169_private *tp = netdev_priv(dev);
- - struct mii_ioctl_data *data = if_mii(ifr);
- -
- - return netif_running(dev) ? tp->do_ioctl(tp, data, cmd) : -ENODEV;
- -}
- -
- -static int rtl_xmii_ioctl(struct rtl8169_private *tp,
- - struct mii_ioctl_data *data, int cmd)
- -{
- - switch (cmd) {
- - case SIOCGMIIPHY:
- - data->phy_id = 32; /* Internal PHY */
- - return 0;
- -
- - case SIOCGMIIREG:
- - data->val_out = rtl_readphy(tp, data->reg_num & 0x1f);
- - return 0;
- -
- - case SIOCSMIIREG:
- - rtl_writephy(tp, data->reg_num & 0x1f, data->val_in);
- - return 0;
- - }
- - return -EOPNOTSUPP;
- -}
- + if (!netif_running(dev))
- + return -ENODEV;
- -static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd)
- -{
- - return -EOPNOTSUPP;
- + return phy_mii_ioctl(dev->phydev, ifr, cmd);
- }
- static void rtl_init_mdio_ops(struct rtl8169_private *tp)
- @@ -4595,30 +4154,6 @@ static void rtl_init_mdio_ops(struct rtl
- }
- }
- -static void rtl_speed_down(struct rtl8169_private *tp)
- -{
- - u32 adv;
- - int lpa;
- -
- - rtl_writephy(tp, 0x1f, 0x0000);
- - lpa = rtl_readphy(tp, MII_LPA);
- -
- - if (lpa & (LPA_10HALF | LPA_10FULL))
- - adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full;
- - else if (lpa & (LPA_100HALF | LPA_100FULL))
- - adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
- - ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full;
- - else
- - adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full |
- - ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full |
- - (tp->mii.supports_gmii ?
- - ADVERTISED_1000baseT_Half |
- - ADVERTISED_1000baseT_Full : 0);
- -
- - rtl8169_set_speed(tp->dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL,
- - adv);
- -}
- -
- static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
- {
- switch (tp->mac_version) {
- @@ -4640,56 +4175,20 @@ static void rtl_wol_suspend_quirk(struct
- static bool rtl_wol_pll_power_down(struct rtl8169_private *tp)
- {
- - if (!(__rtl8169_get_wol(tp) & WAKE_ANY))
- + struct phy_device *phydev;
- +
- + if (!__rtl8169_get_wol(tp))
- return false;
- - rtl_speed_down(tp);
- + /* phydev may not be attached to netdevice */
- + phydev = mdiobus_get_phy(tp->mii_bus, 0);
- +
- + phy_speed_down(phydev, false);
- rtl_wol_suspend_quirk(tp);
- return true;
- }
- -static void r8168_phy_power_up(struct rtl8169_private *tp)
- -{
- - rtl_writephy(tp, 0x1f, 0x0000);
- - switch (tp->mac_version) {
- - case RTL_GIGA_MAC_VER_11:
- - case RTL_GIGA_MAC_VER_12:
- - case RTL_GIGA_MAC_VER_17 ... RTL_GIGA_MAC_VER_28:
- - case RTL_GIGA_MAC_VER_31:
- - rtl_writephy(tp, 0x0e, 0x0000);
- - break;
- - default:
- - break;
- - }
- - rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE);
- -
- - /* give MAC/PHY some time to resume */
- - msleep(20);
- -}
- -
- -static void r8168_phy_power_down(struct rtl8169_private *tp)
- -{
- - rtl_writephy(tp, 0x1f, 0x0000);
- - switch (tp->mac_version) {
- - case RTL_GIGA_MAC_VER_32:
- - case RTL_GIGA_MAC_VER_33:
- - case RTL_GIGA_MAC_VER_40:
- - case RTL_GIGA_MAC_VER_41:
- - rtl_writephy(tp, MII_BMCR, BMCR_ANENABLE | BMCR_PDOWN);
- - break;
- -
- - case RTL_GIGA_MAC_VER_11:
- - case RTL_GIGA_MAC_VER_12:
- - case RTL_GIGA_MAC_VER_17 ... RTL_GIGA_MAC_VER_28:
- - case RTL_GIGA_MAC_VER_31:
- - rtl_writephy(tp, 0x0e, 0x0200);
- - default:
- - rtl_writephy(tp, MII_BMCR, BMCR_PDOWN);
- - break;
- - }
- -}
- -
- static void r8168_pll_power_down(struct rtl8169_private *tp)
- {
- if (r8168_check_dash(tp))
- @@ -4702,8 +4201,6 @@ static void r8168_pll_power_down(struct
- if (rtl_wol_pll_power_down(tp))
- return;
- - r8168_phy_power_down(tp);
- -
- switch (tp->mac_version) {
- case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_33:
- case RTL_GIGA_MAC_VER_37:
- @@ -4755,7 +4252,9 @@ static void r8168_pll_power_up(struct rt
- break;
- }
- - r8168_phy_power_up(tp);
- + phy_resume(tp->dev->phydev);
- + /* give MAC/PHY some time to resume */
- + msleep(20);
- }
- static void rtl_pll_power_down(struct rtl8169_private *tp)
- @@ -5180,8 +4679,8 @@ static void rtl_hw_start_8169(struct rtl
- if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
- tp->mac_version == RTL_GIGA_MAC_VER_03) {
- - dprintk("Set MAC Reg C+CR Offset 0xe0. "
- - "Bit-3 and bit-14 MUST be 1\n");
- + netif_dbg(tp, drv, tp->dev,
- + "Set MAC Reg C+CR Offset 0xe0. Bit 3 and Bit 14 MUST be 1\n");
- tp->cp_cmd |= (1 << 14);
- }
- @@ -5244,12 +4743,7 @@ static void rtl_csi_access_enable(struct
- rtl_csi_write(tp, 0x070c, csi | val << 24);
- }
- -static void rtl_csi_access_enable_1(struct rtl8169_private *tp)
- -{
- - rtl_csi_access_enable(tp, 0x17);
- -}
- -
- -static void rtl_csi_access_enable_2(struct rtl8169_private *tp)
- +static void rtl_set_def_aspm_entry_latency(struct rtl8169_private *tp)
- {
- rtl_csi_access_enable(tp, 0x27);
- }
- @@ -5298,6 +4792,19 @@ static void rtl_pcie_state_l2l3_enable(s
- RTL_W8(tp, Config3, data);
- }
- +static void rtl_hw_aspm_clkreq_enable(struct rtl8169_private *tp, bool enable)
- +{
- + if (enable) {
- + RTL_W8(tp, Config5, RTL_R8(tp, Config5) | ASPM_en);
- + RTL_W8(tp, Config2, RTL_R8(tp, Config2) | ClkReqEn);
- + } else {
- + RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
- + RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
- + }
- +
- + udelay(10);
- +}
- +
- static void rtl_hw_start_8168bb(struct rtl8169_private *tp)
- {
- RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
- @@ -5345,7 +4852,7 @@ static void rtl_hw_start_8168cp_1(struct
- { 0x07, 0, 0x2000 }
- };
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_ephy_init(tp, e_info_8168cp, ARRAY_SIZE(e_info_8168cp));
- @@ -5354,7 +4861,7 @@ static void rtl_hw_start_8168cp_1(struct
- static void rtl_hw_start_8168cp_2(struct rtl8169_private *tp)
- {
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
- @@ -5367,7 +4874,7 @@ static void rtl_hw_start_8168cp_2(struct
- static void rtl_hw_start_8168cp_3(struct rtl8169_private *tp)
- {
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
- @@ -5391,7 +4898,7 @@ static void rtl_hw_start_8168c_1(struct
- { 0x06, 0x0080, 0x0000 }
- };
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- RTL_W8(tp, DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
- @@ -5407,7 +4914,7 @@ static void rtl_hw_start_8168c_2(struct
- { 0x03, 0x0400, 0x0220 }
- };
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_ephy_init(tp, e_info_8168c_2, ARRAY_SIZE(e_info_8168c_2));
- @@ -5421,14 +4928,14 @@ static void rtl_hw_start_8168c_3(struct
- static void rtl_hw_start_8168c_4(struct rtl8169_private *tp)
- {
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- __rtl_hw_start_8168cp(tp);
- }
- static void rtl_hw_start_8168d(struct rtl8169_private *tp)
- {
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_disable_clock_request(tp);
- @@ -5443,7 +4950,7 @@ static void rtl_hw_start_8168d(struct rt
- static void rtl_hw_start_8168dp(struct rtl8169_private *tp)
- {
- - rtl_csi_access_enable_1(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- if (tp->dev->mtu <= ETH_DATA_LEN)
- rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
- @@ -5461,7 +4968,7 @@ static void rtl_hw_start_8168d_4(struct
- { 0x0c, 0x0100, 0x0020 }
- };
- - rtl_csi_access_enable_1(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
- @@ -5490,7 +4997,7 @@ static void rtl_hw_start_8168e_1(struct
- { 0x0a, 0x0000, 0x0040 }
- };
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_ephy_init(tp, e_info_8168e_1, ARRAY_SIZE(e_info_8168e_1));
- @@ -5515,7 +5022,7 @@ static void rtl_hw_start_8168e_2(struct
- { 0x19, 0x0000, 0x0224 }
- };
- - rtl_csi_access_enable_1(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_ephy_init(tp, e_info_8168e_2, ARRAY_SIZE(e_info_8168e_2));
- @@ -5543,11 +5050,13 @@ static void rtl_hw_start_8168e_2(struct
- RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) | PFM_EN);
- RTL_W32(tp, MISC, RTL_R32(tp, MISC) | PWM_EN);
- RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~Spi_en);
- +
- + rtl_hw_aspm_clkreq_enable(tp, true);
- }
- static void rtl_hw_start_8168f(struct rtl8169_private *tp)
- {
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
- @@ -5615,7 +5124,7 @@ static void rtl_hw_start_8168g(struct rt
- rtl_eri_write(tp, 0xd0, ERIAR_MASK_0001, 0x48, ERIAR_EXGMAC);
- rtl_eri_write(tp, 0xe8, ERIAR_MASK_1111, 0x00100006, ERIAR_EXGMAC);
- - rtl_csi_access_enable_1(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
- @@ -5650,9 +5159,9 @@ static void rtl_hw_start_8168g_1(struct
- rtl_hw_start_8168g(tp);
- /* disable aspm and clock request before access ephy */
- - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
- - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
- + rtl_hw_aspm_clkreq_enable(tp, false);
- rtl_ephy_init(tp, e_info_8168g_1, ARRAY_SIZE(e_info_8168g_1));
- + rtl_hw_aspm_clkreq_enable(tp, true);
- }
- static void rtl_hw_start_8168g_2(struct rtl8169_private *tp)
- @@ -5685,9 +5194,9 @@ static void rtl_hw_start_8411_2(struct r
- rtl_hw_start_8168g(tp);
- /* disable aspm and clock request before access ephy */
- - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
- - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
- + rtl_hw_aspm_clkreq_enable(tp, false);
- rtl_ephy_init(tp, e_info_8411_2, ARRAY_SIZE(e_info_8411_2));
- + rtl_hw_aspm_clkreq_enable(tp, true);
- }
- static void rtl_hw_start_8168h_1(struct rtl8169_private *tp)
- @@ -5704,8 +5213,7 @@ static void rtl_hw_start_8168h_1(struct
- };
- /* disable aspm and clock request before access ephy */
- - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
- - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
- + rtl_hw_aspm_clkreq_enable(tp, false);
- rtl_ephy_init(tp, e_info_8168h_1, ARRAY_SIZE(e_info_8168h_1));
- rtl_eri_write(tp, 0xc8, ERIAR_MASK_0101, 0x00080002, ERIAR_EXGMAC);
- @@ -5713,7 +5221,7 @@ static void rtl_hw_start_8168h_1(struct
- rtl_eri_write(tp, 0xd0, ERIAR_MASK_0001, 0x48, ERIAR_EXGMAC);
- rtl_eri_write(tp, 0xe8, ERIAR_MASK_1111, 0x00100006, ERIAR_EXGMAC);
- - rtl_csi_access_enable_1(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
- @@ -5782,6 +5290,8 @@ static void rtl_hw_start_8168h_1(struct
- r8168_mac_ocp_write(tp, 0xe63e, 0x0000);
- r8168_mac_ocp_write(tp, 0xc094, 0x0000);
- r8168_mac_ocp_write(tp, 0xc09e, 0x0000);
- +
- + rtl_hw_aspm_clkreq_enable(tp, true);
- }
- static void rtl_hw_start_8168ep(struct rtl8169_private *tp)
- @@ -5793,7 +5303,7 @@ static void rtl_hw_start_8168ep(struct r
- rtl_eri_write(tp, 0xd0, ERIAR_MASK_0001, 0x5f, ERIAR_EXGMAC);
- rtl_eri_write(tp, 0xe8, ERIAR_MASK_1111, 0x00100006, ERIAR_EXGMAC);
- - rtl_csi_access_enable_1(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
- @@ -5831,11 +5341,12 @@ static void rtl_hw_start_8168ep_1(struct
- };
- /* disable aspm and clock request before access ephy */
- - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
- - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
- + rtl_hw_aspm_clkreq_enable(tp, false);
- rtl_ephy_init(tp, e_info_8168ep_1, ARRAY_SIZE(e_info_8168ep_1));
- rtl_hw_start_8168ep(tp);
- +
- + rtl_hw_aspm_clkreq_enable(tp, true);
- }
- static void rtl_hw_start_8168ep_2(struct rtl8169_private *tp)
- @@ -5847,14 +5358,15 @@ static void rtl_hw_start_8168ep_2(struct
- };
- /* disable aspm and clock request before access ephy */
- - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
- - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
- + rtl_hw_aspm_clkreq_enable(tp, false);
- rtl_ephy_init(tp, e_info_8168ep_2, ARRAY_SIZE(e_info_8168ep_2));
- rtl_hw_start_8168ep(tp);
- RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
- RTL_W8(tp, MISC_1, RTL_R8(tp, MISC_1) & ~PFM_D3COLD_EN);
- +
- + rtl_hw_aspm_clkreq_enable(tp, true);
- }
- static void rtl_hw_start_8168ep_3(struct rtl8169_private *tp)
- @@ -5868,8 +5380,7 @@ static void rtl_hw_start_8168ep_3(struct
- };
- /* disable aspm and clock request before access ephy */
- - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
- - RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
- + rtl_hw_aspm_clkreq_enable(tp, false);
- rtl_ephy_init(tp, e_info_8168ep_3, ARRAY_SIZE(e_info_8168ep_3));
- rtl_hw_start_8168ep(tp);
- @@ -5889,6 +5400,8 @@ static void rtl_hw_start_8168ep_3(struct
- data = r8168_mac_ocp_read(tp, 0xe860);
- data |= 0x0080;
- r8168_mac_ocp_write(tp, 0xe860, data);
- +
- + rtl_hw_aspm_clkreq_enable(tp, true);
- }
- static void rtl_hw_start_8168(struct rtl8169_private *tp)
- @@ -6006,8 +5519,9 @@ static void rtl_hw_start_8168(struct rtl
- break;
- default:
- - printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
- - tp->dev->name, tp->mac_version);
- + netif_err(tp, drv, tp->dev,
- + "unknown chipset (mac_version = %d)\n",
- + tp->mac_version);
- break;
- }
- }
- @@ -6026,7 +5540,7 @@ static void rtl_hw_start_8102e_1(struct
- };
- u8 cfg1;
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- RTL_W8(tp, DBG_REG, FIX_NAK_1);
- @@ -6045,7 +5559,7 @@ static void rtl_hw_start_8102e_1(struct
- static void rtl_hw_start_8102e_2(struct rtl8169_private *tp)
- {
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_4096B);
- @@ -6100,7 +5614,7 @@ static void rtl_hw_start_8402(struct rtl
- { 0x1e, 0, 0x4000 }
- };
- - rtl_csi_access_enable_2(tp);
- + rtl_set_def_aspm_entry_latency(tp);
- /* Force LAN exit from ASPM if Rx/Tx are not idle */
- RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
- @@ -6124,6 +5638,8 @@ static void rtl_hw_start_8402(struct rtl
- static void rtl_hw_start_8106(struct rtl8169_private *tp)
- {
- + rtl_hw_aspm_clkreq_enable(tp, false);
- +
- /* Force LAN exit from ASPM if Rx/Tx are not idle */
- RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
- @@ -6132,6 +5648,7 @@ static void rtl_hw_start_8106(struct rtl
- RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
- rtl_pcie_state_l2l3_enable(tp, false);
- + rtl_hw_aspm_clkreq_enable(tp, true);
- }
- static void rtl_hw_start_8101(struct rtl8169_private *tp)
- @@ -6383,7 +5900,6 @@ static void rtl_reset_work(struct rtl816
- napi_enable(&tp->napi);
- rtl_hw_start(tp);
- netif_wake_queue(dev);
- - rtl8169_check_link_status(dev, tp);
- }
- static void rtl8169_tx_timeout(struct net_device *dev)
- @@ -6957,20 +6473,15 @@ release_descriptor:
- static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
- {
- struct rtl8169_private *tp = dev_instance;
- - int handled = 0;
- - u16 status;
- + u16 status = rtl_get_events(tp);
- - status = rtl_get_events(tp);
- - if (status && status != 0xffff) {
- - status &= RTL_EVENT_NAPI | tp->event_slow;
- - if (status) {
- - handled = 1;
- + if (status == 0xffff || !(status & (RTL_EVENT_NAPI | tp->event_slow)))
- + return IRQ_NONE;
- - rtl_irq_disable(tp);
- - napi_schedule_irqoff(&tp->napi);
- - }
- - }
- - return IRQ_RETVAL(handled);
- + rtl_irq_disable(tp);
- + napi_schedule_irqoff(&tp->napi);
- +
- + return IRQ_HANDLED;
- }
- /*
- @@ -7000,7 +6511,7 @@ static void rtl_slow_event_work(struct r
- rtl8169_pcierr_interrupt(dev);
- if (status & LinkChg)
- - rtl8169_check_link_status(dev, tp);
- + phy_mac_interrupt(dev->phydev);
- rtl_irq_enable_all(tp);
- }
- @@ -7014,7 +6525,6 @@ static void rtl_task(struct work_struct
- /* XXX - keep rtl_slow_event_work() as first element. */
- { RTL_FLAG_TASK_SLOW_PENDING, rtl_slow_event_work },
- { RTL_FLAG_TASK_RESET_PENDING, rtl_reset_work },
- - { RTL_FLAG_TASK_PHY_PENDING, rtl_phy_work }
- };
- struct rtl8169_private *tp =
- container_of(work, struct rtl8169_private, wk.work);
- @@ -7081,11 +6591,51 @@ static void rtl8169_rx_missed(struct net
- RTL_W32(tp, RxMissed, 0);
- }
- +static void r8169_phylink_handler(struct net_device *ndev)
- +{
- + struct rtl8169_private *tp = netdev_priv(ndev);
- +
- + if (netif_carrier_ok(ndev)) {
- + rtl_link_chg_patch(tp);
- + pm_request_resume(&tp->pci_dev->dev);
- + } else {
- + pm_runtime_idle(&tp->pci_dev->dev);
- + }
- +
- + if (net_ratelimit())
- + phy_print_status(ndev->phydev);
- +}
- +
- +static int r8169_phy_connect(struct rtl8169_private *tp)
- +{
- + struct phy_device *phydev = mdiobus_get_phy(tp->mii_bus, 0);
- + phy_interface_t phy_mode;
- + int ret;
- +
- + phy_mode = tp->supports_gmii ? PHY_INTERFACE_MODE_GMII :
- + PHY_INTERFACE_MODE_MII;
- +
- + ret = phy_connect_direct(tp->dev, phydev, r8169_phylink_handler,
- + phy_mode);
- + if (ret)
- + return ret;
- +
- + if (!tp->supports_gmii)
- + phy_set_max_speed(phydev, SPEED_100);
- +
- + /* Ensure to advertise everything, incl. pause */
- + phydev->advertising = phydev->supported;
- +
- + phy_attached_info(phydev);
- +
- + return 0;
- +}
- +
- static void rtl8169_down(struct net_device *dev)
- {
- struct rtl8169_private *tp = netdev_priv(dev);
- - del_timer_sync(&tp->timer);
- + phy_stop(dev->phydev);
- napi_disable(&tp->napi);
- netif_stop_queue(dev);
- @@ -7127,6 +6677,8 @@ static int rtl8169_close(struct net_devi
- cancel_work_sync(&tp->wk.work);
- + phy_disconnect(dev->phydev);
- +
- pci_free_irq(pdev, 0, tp);
- dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
- @@ -7187,6 +6739,10 @@ static int rtl_open(struct net_device *d
- if (retval < 0)
- goto err_release_fw_2;
- + retval = r8169_phy_connect(tp);
- + if (retval)
- + goto err_free_irq;
- +
- rtl_lock_work(tp);
- set_bit(RTL_FLAG_TASK_ENABLED, tp->wk.flags);
- @@ -7202,17 +6758,17 @@ static int rtl_open(struct net_device *d
- if (!rtl8169_init_counter_offsets(tp))
- netif_warn(tp, hw, dev, "counter reset/update failed\n");
- + phy_start(dev->phydev);
- netif_start_queue(dev);
- rtl_unlock_work(tp);
- - tp->saved_wolopts = 0;
- pm_runtime_put_sync(&pdev->dev);
- -
- - rtl8169_check_link_status(dev, tp);
- out:
- return retval;
- +err_free_irq:
- + pci_free_irq(pdev, 0, tp);
- err_release_fw_2:
- rtl_release_firmware(tp);
- rtl8169_rx_clear(tp);
- @@ -7291,6 +6847,7 @@ static void rtl8169_net_suspend(struct n
- if (!netif_running(dev))
- return;
- + phy_stop(dev->phydev);
- netif_device_detach(dev);
- netif_stop_queue(dev);
- @@ -7310,8 +6867,10 @@ static int rtl8169_suspend(struct device
- {
- struct pci_dev *pdev = to_pci_dev(device);
- struct net_device *dev = pci_get_drvdata(pdev);
- + struct rtl8169_private *tp = netdev_priv(dev);
- rtl8169_net_suspend(dev);
- + clk_disable_unprepare(tp->clk);
- return 0;
- }
- @@ -7323,6 +6882,9 @@ static void __rtl8169_resume(struct net_
- netif_device_attach(dev);
- rtl_pll_power_up(tp);
- + rtl8169_init_phy(dev, tp);
- +
- + phy_start(tp->dev->phydev);
- rtl_lock_work(tp);
- napi_enable(&tp->napi);
- @@ -7338,7 +6900,7 @@ static int rtl8169_resume(struct device
- struct net_device *dev = pci_get_drvdata(pdev);
- struct rtl8169_private *tp = netdev_priv(dev);
- - rtl8169_init_phy(dev, tp);
- + clk_prepare_enable(tp->clk);
- if (netif_running(dev))
- __rtl8169_resume(dev);
- @@ -7352,13 +6914,10 @@ static int rtl8169_runtime_suspend(struc
- struct net_device *dev = pci_get_drvdata(pdev);
- struct rtl8169_private *tp = netdev_priv(dev);
- - if (!tp->TxDescArray) {
- - rtl_pll_power_down(tp);
- + if (!tp->TxDescArray)
- return 0;
- - }
- rtl_lock_work(tp);
- - tp->saved_wolopts = __rtl8169_get_wol(tp);
- __rtl8169_set_wol(tp, WAKE_ANY);
- rtl_unlock_work(tp);
- @@ -7383,11 +6942,8 @@ static int rtl8169_runtime_resume(struct
- rtl_lock_work(tp);
- __rtl8169_set_wol(tp, tp->saved_wolopts);
- - tp->saved_wolopts = 0;
- rtl_unlock_work(tp);
- - rtl8169_init_phy(dev, tp);
- -
- __rtl8169_resume(dev);
- return 0;
- @@ -7455,7 +7011,7 @@ static void rtl_shutdown(struct pci_dev
- rtl8169_hw_reset(tp);
- if (system_state == SYSTEM_POWER_OFF) {
- - if (__rtl8169_get_wol(tp) & WAKE_ANY) {
- + if (tp->saved_wolopts) {
- rtl_wol_suspend_quirk(tp);
- rtl_wol_shutdown_quirk(tp);
- }
- @@ -7476,6 +7032,7 @@ static void rtl_remove_one(struct pci_de
- netif_napi_del(&tp->napi);
- unregister_netdev(dev);
- + mdiobus_unregister(tp->mii_bus);
- rtl_release_firmware(tp);
- @@ -7561,6 +7118,68 @@ DECLARE_RTL_COND(rtl_rxtx_empty_cond)
- return (RTL_R8(tp, MCU) & RXTX_EMPTY) == RXTX_EMPTY;
- }
- +static int r8169_mdio_read_reg(struct mii_bus *mii_bus, int phyaddr, int phyreg)
- +{
- + struct rtl8169_private *tp = mii_bus->priv;
- +
- + if (phyaddr > 0)
- + return -ENODEV;
- +
- + return rtl_readphy(tp, phyreg);
- +}
- +
- +static int r8169_mdio_write_reg(struct mii_bus *mii_bus, int phyaddr,
- + int phyreg, u16 val)
- +{
- + struct rtl8169_private *tp = mii_bus->priv;
- +
- + if (phyaddr > 0)
- + return -ENODEV;
- +
- + rtl_writephy(tp, phyreg, val);
- +
- + return 0;
- +}
- +
- +static int r8169_mdio_register(struct rtl8169_private *tp)
- +{
- + struct pci_dev *pdev = tp->pci_dev;
- + struct phy_device *phydev;
- + struct mii_bus *new_bus;
- + int ret;
- +
- + new_bus = devm_mdiobus_alloc(&pdev->dev);
- + if (!new_bus)
- + return -ENOMEM;
- +
- + new_bus->name = "r8169";
- + new_bus->priv = tp;
- + new_bus->parent = &pdev->dev;
- + new_bus->irq[0] = PHY_IGNORE_INTERRUPT;
- + snprintf(new_bus->id, MII_BUS_ID_SIZE, "r8169-%x",
- + PCI_DEVID(pdev->bus->number, pdev->devfn));
- +
- + new_bus->read = r8169_mdio_read_reg;
- + new_bus->write = r8169_mdio_write_reg;
- +
- + ret = mdiobus_register(new_bus);
- + if (ret)
- + return ret;
- +
- + phydev = mdiobus_get_phy(new_bus, 0);
- + if (!phydev) {
- + mdiobus_unregister(new_bus);
- + return -ENODEV;
- + }
- +
- + /* PHY will be woken up in rtl_open() */
- + phy_suspend(phydev);
- +
- + tp->mii_bus = new_bus;
- +
- + return 0;
- +}
- +
- static void rtl_hw_init_8168g(struct rtl8169_private *tp)
- {
- u32 data;
- @@ -7614,19 +7233,53 @@ static void rtl_hw_initialize(struct rtl
- }
- }
- +/* Versions RTL8102e and from RTL8168c onwards support csum_v2 */
- +static bool rtl_chip_supports_csum_v2(struct rtl8169_private *tp)
- +{
- + switch (tp->mac_version) {
- + case RTL_GIGA_MAC_VER_01 ... RTL_GIGA_MAC_VER_06:
- + case RTL_GIGA_MAC_VER_10 ... RTL_GIGA_MAC_VER_17:
- + return false;
- + default:
- + return true;
- + }
- +}
- +
- +static int rtl_jumbo_max(struct rtl8169_private *tp)
- +{
- + /* Non-GBit versions don't support jumbo frames */
- + if (!tp->supports_gmii)
- + return JUMBO_1K;
- +
- + switch (tp->mac_version) {
- + /* RTL8169 */
- + case RTL_GIGA_MAC_VER_01 ... RTL_GIGA_MAC_VER_06:
- + return JUMBO_7K;
- + /* RTL8168b */
- + case RTL_GIGA_MAC_VER_11:
- + case RTL_GIGA_MAC_VER_12:
- + case RTL_GIGA_MAC_VER_17:
- + return JUMBO_4K;
- + /* RTL8168c */
- + case RTL_GIGA_MAC_VER_18 ... RTL_GIGA_MAC_VER_24:
- + return JUMBO_6K;
- + default:
- + return JUMBO_9K;
- + }
- +}
- +
- +static void rtl_disable_clk(void *data)
- +{
- + clk_disable_unprepare(data);
- +}
- +
- static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
- {
- const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
- struct rtl8169_private *tp;
- - struct mii_if_info *mii;
- struct net_device *dev;
- int chipset, region, i;
- - int rc;
- -
- - if (netif_msg_drv(&debug)) {
- - printk(KERN_INFO "%s Gigabit Ethernet driver %s loaded\n",
- - MODULENAME, RTL8169_VERSION);
- - }
- + int jumbo_max, rc;
- dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp));
- if (!dev)
- @@ -7638,19 +7291,33 @@ static int rtl_init_one(struct pci_dev *
- tp->dev = dev;
- tp->pci_dev = pdev;
- tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
- + tp->supports_gmii = cfg->has_gmii;
- +
- + /* Get the *optional* external "ether_clk" used on some boards */
- + tp->clk = devm_clk_get(&pdev->dev, "ether_clk");
- + if (IS_ERR(tp->clk)) {
- + rc = PTR_ERR(tp->clk);
- + if (rc == -ENOENT) {
- + /* clk-core allows NULL (for suspend / resume) */
- + tp->clk = NULL;
- + } else if (rc == -EPROBE_DEFER) {
- + return rc;
- + } else {
- + dev_err(&pdev->dev, "failed to get clk: %d\n", rc);
- + return rc;
- + }
- + } else {
- + rc = clk_prepare_enable(tp->clk);
- + if (rc) {
- + dev_err(&pdev->dev, "failed to enable clk: %d\n", rc);
- + return rc;
- + }
- - mii = &tp->mii;
- - mii->dev = dev;
- - mii->mdio_read = rtl_mdio_read;
- - mii->mdio_write = rtl_mdio_write;
- - mii->phy_id_mask = 0x1f;
- - mii->reg_num_mask = 0x1f;
- - mii->supports_gmii = cfg->has_gmii;
- -
- - /* disable ASPM completely as that cause random device stop working
- - * problems as well as full system hangs for some PCIe devices users */
- - pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
- - PCIE_LINK_STATE_CLKPM);
- + rc = devm_add_action_or_reset(&pdev->dev, rtl_disable_clk,
- + tp->clk);
- + if (rc)
- + return rc;
- + }
- /* enable device (incl. PCI PM wakeup and hotplug setup) */
- rc = pcim_enable_device(pdev);
- @@ -7689,6 +7356,11 @@ static int rtl_init_one(struct pci_dev *
- /* Identify chip attached to board */
- rtl8169_get_mac_version(tp, cfg->default_ver);
- + if (rtl_tbi_enabled(tp)) {
- + dev_err(&pdev->dev, "TBI fiber mode not supported\n");
- + return -ENODEV;
- + }
- +
- tp->cp_cmd = RTL_R16(tp, CPlusCmd);
- if ((sizeof(dma_addr_t) > 4) &&
- @@ -7736,22 +7408,6 @@ static int rtl_init_one(struct pci_dev *
- tp->saved_wolopts = __rtl8169_get_wol(tp);
- - if (rtl_tbi_enabled(tp)) {
- - tp->set_speed = rtl8169_set_speed_tbi;
- - tp->get_link_ksettings = rtl8169_get_link_ksettings_tbi;
- - tp->phy_reset_enable = rtl8169_tbi_reset_enable;
- - tp->phy_reset_pending = rtl8169_tbi_reset_pending;
- - tp->link_ok = rtl8169_tbi_link_ok;
- - tp->do_ioctl = rtl_tbi_ioctl;
- - } else {
- - tp->set_speed = rtl8169_set_speed_xmii;
- - tp->get_link_ksettings = rtl8169_get_link_ksettings_xmii;
- - tp->phy_reset_enable = rtl8169_xmii_reset_enable;
- - tp->phy_reset_pending = rtl8169_xmii_reset_pending;
- - tp->link_ok = rtl8169_xmii_link_ok;
- - tp->do_ioctl = rtl_xmii_ioctl;
- - }
- -
- mutex_init(&tp->wk.mutex);
- u64_stats_init(&tp->rx_stats.syncp);
- u64_stats_init(&tp->tx_stats.syncp);
- @@ -7800,16 +7456,11 @@ static int rtl_init_one(struct pci_dev *
- /* Disallow toggling */
- dev->hw_features &= ~NETIF_F_HW_VLAN_CTAG_RX;
- - switch (rtl_chip_infos[chipset].txd_version) {
- - case RTL_TD_0:
- - tp->tso_csum = rtl8169_tso_csum_v1;
- - break;
- - case RTL_TD_1:
- + if (rtl_chip_supports_csum_v2(tp)) {
- tp->tso_csum = rtl8169_tso_csum_v2;
- dev->hw_features |= NETIF_F_IPV6_CSUM | NETIF_F_TSO6;
- - break;
- - default:
- - WARN_ON_ONCE(1);
- + } else {
- + tp->tso_csum = rtl8169_tso_csum_v1;
- }
- dev->hw_features |= NETIF_F_RXALL;
- @@ -7817,14 +7468,13 @@ static int rtl_init_one(struct pci_dev *
- /* MTU range: 60 - hw-specific max */
- dev->min_mtu = ETH_ZLEN;
- - dev->max_mtu = rtl_chip_infos[chipset].jumbo_max;
- + jumbo_max = rtl_jumbo_max(tp);
- + dev->max_mtu = jumbo_max;
- tp->hw_start = cfg->hw_start;
- tp->event_slow = cfg->event_slow;
- tp->coalesce_info = cfg->coalesce_info;
- - timer_setup(&tp->timer, rtl8169_phy_timer, 0);
- -
- tp->rtl_fw = RTL_FIRMWARE_UNKNOWN;
- tp->counters = dmam_alloc_coherent (&pdev->dev, sizeof(*tp->counters),
- @@ -7835,30 +7485,39 @@ static int rtl_init_one(struct pci_dev *
- pci_set_drvdata(pdev, dev);
- - rc = register_netdev(dev);
- - if (rc < 0)
- + rc = r8169_mdio_register(tp);
- + if (rc)
- return rc;
- + /* chip gets powered up in rtl_open() */
- + rtl_pll_power_down(tp);
- +
- + rc = register_netdev(dev);
- + if (rc)
- + goto err_mdio_unregister;
- +
- netif_info(tp, probe, dev, "%s, %pM, XID %08x, IRQ %d\n",
- rtl_chip_infos[chipset].name, dev->dev_addr,
- (u32)(RTL_R32(tp, TxConfig) & 0xfcf0f8ff),
- pci_irq_vector(pdev, 0));
- - if (rtl_chip_infos[chipset].jumbo_max != JUMBO_1K) {
- - netif_info(tp, probe, dev, "jumbo features [frames: %d bytes, "
- - "tx checksumming: %s]\n",
- - rtl_chip_infos[chipset].jumbo_max,
- - tp->mac_version <= RTL_GIGA_MAC_VER_06 ? "ok" : "ko");
- - }
- +
- + if (jumbo_max > JUMBO_1K)
- + netif_info(tp, probe, dev,
- + "jumbo features [frames: %d bytes, tx checksumming: %s]\n",
- + jumbo_max, tp->mac_version <= RTL_GIGA_MAC_VER_06 ?
- + "ok" : "ko");
- if (r8168_check_dash(tp))
- rtl8168_driver_start(tp);
- - netif_carrier_off(dev);
- -
- if (pci_dev_run_wake(pdev))
- pm_runtime_put_sync(&pdev->dev);
- return 0;
- +
- +err_mdio_unregister:
- + mdiobus_unregister(tp->mii_bus);
- + return rc;
- }
- static struct pci_driver rtl8169_pci_driver = {
- diff -Narup a/drivers/net/wireless/ath/ath9k/ahb.c b/drivers/net/wireless/ath/ath9k/ahb.c
- --- a/drivers/net/wireless/ath/ath9k/ahb.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/ahb.c 2018-12-17 09:24:42.000000000 +0100
- @@ -19,6 +19,7 @@
- #include <linux/nl80211.h>
- #include <linux/platform_device.h>
- #include <linux/module.h>
- +#include <linux/mod_devicetable.h>
- #include "ath9k.h"
- static const struct platform_device_id ath9k_platform_id_table[] = {
- diff -Narup a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
- --- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c 2018-12-17 09:24:42.000000000 +0100
- @@ -583,12 +583,14 @@ static void ar5008_hw_init_chain_masks(s
- case 0x5:
- REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP,
- AR_PHY_SWAP_ALT_CHAIN);
- + /* fall through */
- case 0x3:
- if (ah->hw_version.macVersion == AR_SREV_REVISION_5416_10) {
- REG_WRITE(ah, AR_PHY_RX_CHAINMASK, 0x7);
- REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, 0x7);
- break;
- }
- + /* else: fall through */
- case 0x1:
- case 0x2:
- case 0x7:
- diff -Narup a/drivers/net/wireless/ath/ath9k/ar9002_calib.c b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
- --- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c 2018-12-17 09:24:42.000000000 +0100
- @@ -676,10 +676,10 @@ static int ar9002_hw_calibrate(struct at
- return 0;
- ah->cal_list_curr = currCal = currCal->calNext;
- - if (currCal->calState == CAL_WAITING) {
- + if (currCal->calState == CAL_WAITING)
- ath9k_hw_reset_calibration(ah, currCal);
- - return 0;
- - }
- +
- + return 0;
- }
- /* Do NF cal only at longer intervals */
- diff -Narup a/drivers/net/wireless/ath/ath9k/ar9002_phy.c b/drivers/net/wireless/ath/ath9k/ar9002_phy.c
- --- a/drivers/net/wireless/ath/ath9k/ar9002_phy.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c 2018-12-17 09:24:42.000000000 +0100
- @@ -119,6 +119,7 @@ static int ar9002_hw_set_channel(struct
- aModeRefSel = 2;
- if (aModeRefSel)
- break;
- + /* else: fall through */
- case 1:
- default:
- aModeRefSel = 0;
- diff -Narup a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
- --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c 2018-12-17 09:24:42.000000000 +0100
- @@ -1800,6 +1800,8 @@ static void ar9003_hw_spectral_scan_conf
- static void ar9003_hw_spectral_scan_trigger(struct ath_hw *ah)
- {
- + REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN,
- + AR_PHY_SPECTRAL_SCAN_ENABLE);
- /* Activate spectral scan */
- REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN,
- AR_PHY_SPECTRAL_SCAN_ACTIVE);
- diff -Narup a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
- --- a/drivers/net/wireless/ath/ath9k/ath9k.h 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/ath9k.h 2018-12-17 09:24:42.000000000 +0100
- @@ -342,7 +342,7 @@ struct ath_chanctx {
- struct ath_beacon_config beacon;
- struct ath9k_hw_cal_data caldata;
- - struct timespec tsf_ts;
- + struct timespec64 tsf_ts;
- u64 tsf_val;
- u32 last_beacon;
- @@ -1021,7 +1021,7 @@ struct ath_softc {
- struct ath_offchannel offchannel;
- struct ath_chanctx *next_chan;
- struct completion go_beacon;
- - struct timespec last_event_time;
- + struct timespec64 last_event_time;
- #endif
- unsigned long driver_data;
- diff -Narup a/drivers/net/wireless/ath/ath9k/channel.c b/drivers/net/wireless/ath/ath9k/channel.c
- --- a/drivers/net/wireless/ath/ath9k/channel.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/channel.c 2018-12-17 09:24:42.000000000 +0100
- @@ -233,9 +233,9 @@ static const char *chanctx_state_string(
- static u32 chanctx_event_delta(struct ath_softc *sc)
- {
- u64 ms;
- - struct timespec ts, *old;
- + struct timespec64 ts, *old;
- - getrawmonotonic(&ts);
- + ktime_get_raw_ts64(&ts);
- old = &sc->last_event_time;
- ms = ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
- ms -= old->tv_sec * 1000 + old->tv_nsec / 1000000;
- @@ -334,7 +334,7 @@ ath_chanctx_get_next(struct ath_softc *s
- static void ath_chanctx_adjust_tbtt_delta(struct ath_softc *sc)
- {
- struct ath_chanctx *prev, *cur;
- - struct timespec ts;
- + struct timespec64 ts;
- u32 cur_tsf, prev_tsf, beacon_int;
- s32 offset;
- @@ -346,7 +346,7 @@ static void ath_chanctx_adjust_tbtt_delt
- if (!prev->switch_after_beacon)
- return;
- - getrawmonotonic(&ts);
- + ktime_get_raw_ts64(&ts);
- cur_tsf = (u32) cur->tsf_val +
- ath9k_hw_get_tsf_offset(&cur->tsf_ts, &ts);
- @@ -1230,7 +1230,7 @@ void ath_chanctx_set_next(struct ath_sof
- {
- struct ath_common *common = ath9k_hw_common(sc->sc_ah);
- struct ath_chanctx *old_ctx;
- - struct timespec ts;
- + struct timespec64 ts;
- bool measure_time = false;
- bool send_ps = false;
- bool queues_stopped = false;
- @@ -1260,7 +1260,7 @@ void ath_chanctx_set_next(struct ath_sof
- spin_unlock_bh(&sc->chan_lock);
- if (sc->next_chan == &sc->offchannel.chan) {
- - getrawmonotonic(&ts);
- + ktime_get_raw_ts64(&ts);
- measure_time = true;
- }
- @@ -1277,7 +1277,7 @@ void ath_chanctx_set_next(struct ath_sof
- spin_lock_bh(&sc->chan_lock);
- if (sc->cur_chan != &sc->offchannel.chan) {
- - getrawmonotonic(&sc->cur_chan->tsf_ts);
- + ktime_get_raw_ts64(&sc->cur_chan->tsf_ts);
- sc->cur_chan->tsf_val = ath9k_hw_gettsf64(sc->sc_ah);
- }
- }
- diff -Narup a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c
- --- a/drivers/net/wireless/ath/ath9k/debug.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/debug.c 2018-12-17 09:24:42.000000000 +0100
- @@ -538,7 +538,7 @@ static int read_file_interrupt(struct se
- if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
- PR_IS("RXLP", rxlp);
- PR_IS("RXHP", rxhp);
- - PR_IS("WATHDOG", bb_watchdog);
- + PR_IS("WATCHDOG", bb_watchdog);
- } else {
- PR_IS("RX", rxok);
- }
- diff -Narup a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
- --- a/drivers/net/wireless/ath/ath9k/hif_usb.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c 2018-12-17 09:24:42.000000000 +0100
- @@ -138,6 +138,7 @@ static void hif_usb_mgmt_cb(struct urb *
- {
- struct cmd_buf *cmd = (struct cmd_buf *)urb->context;
- struct hif_device_usb *hif_dev;
- + unsigned long flags;
- bool txok = true;
- if (!cmd || !cmd->skb || !cmd->hif_dev)
- @@ -158,14 +159,14 @@ static void hif_usb_mgmt_cb(struct urb *
- * If the URBs are being flushed, no need to complete
- * this packet.
- */
- - spin_lock(&hif_dev->tx.tx_lock);
- + spin_lock_irqsave(&hif_dev->tx.tx_lock, flags);
- if (hif_dev->tx.flags & HIF_USB_TX_FLUSH) {
- - spin_unlock(&hif_dev->tx.tx_lock);
- + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
- dev_kfree_skb_any(cmd->skb);
- kfree(cmd);
- return;
- }
- - spin_unlock(&hif_dev->tx.tx_lock);
- + spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags);
- break;
- default:
- diff -Narup a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
- --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c 2018-12-17 09:24:42.000000000 +0100
- @@ -1107,25 +1107,26 @@ void ath9k_htc_rxep(void *drv_priv, stru
- struct ath_hw *ah = priv->ah;
- struct ath_common *common = ath9k_hw_common(ah);
- struct ath9k_htc_rxbuf *rxbuf = NULL, *tmp_buf = NULL;
- + unsigned long flags;
- - spin_lock(&priv->rx.rxbuflock);
- + spin_lock_irqsave(&priv->rx.rxbuflock, flags);
- list_for_each_entry(tmp_buf, &priv->rx.rxbuf, list) {
- if (!tmp_buf->in_process) {
- rxbuf = tmp_buf;
- break;
- }
- }
- - spin_unlock(&priv->rx.rxbuflock);
- + spin_unlock_irqrestore(&priv->rx.rxbuflock, flags);
- if (rxbuf == NULL) {
- ath_dbg(common, ANY, "No free RX buffer\n");
- goto err;
- }
- - spin_lock(&priv->rx.rxbuflock);
- + spin_lock_irqsave(&priv->rx.rxbuflock, flags);
- rxbuf->skb = skb;
- rxbuf->in_process = true;
- - spin_unlock(&priv->rx.rxbuflock);
- + spin_unlock_irqrestore(&priv->rx.rxbuflock, flags);
- tasklet_schedule(&priv->rx_tasklet);
- return;
- diff -Narup a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
- --- a/drivers/net/wireless/ath/ath9k/hw.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/hw.c 2018-12-17 09:24:42.000000000 +0100
- @@ -496,7 +496,7 @@ static void ath9k_hw_init_macaddr(struct
- ath_err(common, "eeprom contains invalid mac address: %pM\n",
- common->macaddr);
- - random_ether_addr(common->macaddr);
- + eth_random_addr(common->macaddr);
- ath_err(common, "random mac address will be used: %pM\n",
- common->macaddr);
- @@ -1835,13 +1835,13 @@ fail:
- return -EINVAL;
- }
- -u32 ath9k_hw_get_tsf_offset(struct timespec *last, struct timespec *cur)
- +u32 ath9k_hw_get_tsf_offset(struct timespec64 *last, struct timespec64 *cur)
- {
- - struct timespec ts;
- + struct timespec64 ts;
- s64 usec;
- if (!cur) {
- - getrawmonotonic(&ts);
- + ktime_get_raw_ts64(&ts);
- cur = &ts;
- }
- @@ -1859,7 +1859,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
- u32 saveLedState;
- u32 saveDefAntenna;
- u32 macStaId1;
- - struct timespec tsf_ts;
- + struct timespec64 tsf_ts;
- u32 tsf_offset;
- u64 tsf = 0;
- int r;
- @@ -1905,7 +1905,7 @@ int ath9k_hw_reset(struct ath_hw *ah, st
- macStaId1 = REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B;
- /* Save TSF before chip reset, a cold reset clears it */
- - getrawmonotonic(&tsf_ts);
- + ktime_get_raw_ts64(&tsf_ts);
- tsf = ath9k_hw_gettsf64(ah);
- saveLedState = REG_READ(ah, AR_CFG_LED) &
- diff -Narup a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
- --- a/drivers/net/wireless/ath/ath9k/hw.h 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/hw.h 2018-12-17 09:24:42.000000000 +0100
- @@ -1060,7 +1060,7 @@ u32 ath9k_hw_gettsf32(struct ath_hw *ah)
- u64 ath9k_hw_gettsf64(struct ath_hw *ah);
- void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64);
- void ath9k_hw_reset_tsf(struct ath_hw *ah);
- -u32 ath9k_hw_get_tsf_offset(struct timespec *last, struct timespec *cur);
- +u32 ath9k_hw_get_tsf_offset(struct timespec64 *last, struct timespec64 *cur);
- void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set);
- void ath9k_hw_init_global_settings(struct ath_hw *ah);
- u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah);
- diff -Narup a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
- --- a/drivers/net/wireless/ath/ath9k/main.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/main.c 2018-12-17 09:24:42.000000000 +0100
- @@ -1865,7 +1865,7 @@ static void ath9k_set_tsf(struct ieee802
- mutex_lock(&sc->mutex);
- ath9k_ps_wakeup(sc);
- tsf -= le64_to_cpu(avp->tsf_adjust);
- - getrawmonotonic(&avp->chanctx->tsf_ts);
- + ktime_get_raw_ts64(&avp->chanctx->tsf_ts);
- if (sc->cur_chan == avp->chanctx)
- ath9k_hw_settsf64(sc->sc_ah, tsf);
- avp->chanctx->tsf_val = tsf;
- @@ -1881,7 +1881,7 @@ static void ath9k_reset_tsf(struct ieee8
- mutex_lock(&sc->mutex);
- ath9k_ps_wakeup(sc);
- - getrawmonotonic(&avp->chanctx->tsf_ts);
- + ktime_get_raw_ts64(&avp->chanctx->tsf_ts);
- if (sc->cur_chan == avp->chanctx)
- ath9k_hw_reset_tsf(sc->sc_ah);
- avp->chanctx->tsf_val = 0;
- @@ -1928,6 +1928,7 @@ static int ath9k_ampdu_action(struct iee
- case IEEE80211_AMPDU_TX_STOP_FLUSH:
- case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
- flush = true;
- + /* fall through */
- case IEEE80211_AMPDU_TX_STOP_CONT:
- ath9k_ps_wakeup(sc);
- ath_tx_aggr_stop(sc, sta, tid);
- diff -Narup a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c
- --- a/drivers/net/wireless/ath/ath9k/pci.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/pci.c 2018-12-17 09:24:42.000000000 +0100
- @@ -18,7 +18,6 @@
- #include <linux/nl80211.h>
- #include <linux/pci.h>
- -#include <linux/pci-aspm.h>
- #include <linux/module.h>
- #include "ath9k.h"
- diff -Narup a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c
- --- a/drivers/net/wireless/ath/ath9k/wmi.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/wmi.c 2018-12-17 09:24:42.000000000 +0100
- @@ -209,6 +209,7 @@ static void ath9k_wmi_ctrl_rx(void *priv
- {
- struct wmi *wmi = priv;
- struct wmi_cmd_hdr *hdr;
- + unsigned long flags;
- u16 cmd_id;
- if (unlikely(wmi->stopped))
- @@ -218,20 +219,20 @@ static void ath9k_wmi_ctrl_rx(void *priv
- cmd_id = be16_to_cpu(hdr->command_id);
- if (cmd_id & 0x1000) {
- - spin_lock(&wmi->wmi_lock);
- + spin_lock_irqsave(&wmi->wmi_lock, flags);
- __skb_queue_tail(&wmi->wmi_event_queue, skb);
- - spin_unlock(&wmi->wmi_lock);
- + spin_unlock_irqrestore(&wmi->wmi_lock, flags);
- tasklet_schedule(&wmi->wmi_event_tasklet);
- return;
- }
- /* Check if there has been a timeout. */
- - spin_lock(&wmi->wmi_lock);
- + spin_lock_irqsave(&wmi->wmi_lock, flags);
- if (be16_to_cpu(hdr->seq_no) != wmi->last_seq_id) {
- - spin_unlock(&wmi->wmi_lock);
- + spin_unlock_irqrestore(&wmi->wmi_lock, flags);
- goto free_skb;
- }
- - spin_unlock(&wmi->wmi_lock);
- + spin_unlock_irqrestore(&wmi->wmi_lock, flags);
- /* WMI command response */
- ath9k_wmi_rsp_callback(wmi, skb);
- diff -Narup a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
- --- a/drivers/net/wireless/ath/ath9k/xmit.c 2018-11-21 09:22:14.000000000 +0100
- +++ b/drivers/net/wireless/ath/ath9k/xmit.c 2018-12-17 09:24:42.000000000 +0100
- @@ -62,7 +62,7 @@ static void ath_tx_rc_status(struct ath_
- struct ath_tx_status *ts, int nframes, int nbad,
- int txok);
- static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
- - int seqno);
- + struct ath_buf *bf);
- static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,
- struct ath_txq *txq,
- struct ath_atx_tid *tid,
- @@ -296,7 +296,7 @@ static void ath_tx_flush_tid(struct ath_
- }
- if (fi->baw_tracked) {
- - ath_tx_update_baw(sc, tid, bf->bf_state.seqno);
- + ath_tx_update_baw(sc, tid, bf);
- sendbar = true;
- }
- @@ -312,10 +312,15 @@ static void ath_tx_flush_tid(struct ath_
- }
- static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid,
- - int seqno)
- + struct ath_buf *bf)
- {
- + struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu);
- + u16 seqno = bf->bf_state.seqno;
- int index, cindex;
- + if (!fi->baw_tracked)
- + return;
- +
- index = ATH_BA_INDEX(tid->seq_start, seqno);
- cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1);
- @@ -336,6 +341,9 @@ static void ath_tx_addto_baw(struct ath_
- u16 seqno = bf->bf_state.seqno;
- int index, cindex;
- + if (fi->baw_tracked)
- + return;
- +
- index = ATH_BA_INDEX(tid->seq_start, seqno);
- cindex = (tid->baw_head + index) & (ATH_TID_MAX_BUFS - 1);
- __set_bit(cindex, tid->tx_buf);
- @@ -612,7 +620,7 @@ static void ath_tx_complete_aggr(struct
- * complete the acked-ones/xretried ones; update
- * block-ack window
- */
- - ath_tx_update_baw(sc, tid, seqno);
- + ath_tx_update_baw(sc, tid, bf);
- if (rc_update && (acked_cnt == 1 || txfail_cnt == 1)) {
- memcpy(tx_info->control.rates, rates, sizeof(rates));
- @@ -642,7 +650,7 @@ static void ath_tx_complete_aggr(struct
- * run out of tx buf.
- */
- if (!tbf) {
- - ath_tx_update_baw(sc, tid, seqno);
- + ath_tx_update_baw(sc, tid, bf);
- ath_tx_complete_buf(sc, bf, txq,
- &bf_head, NULL, ts,
- @@ -970,7 +978,8 @@ ath_tx_get_tid_subframe(struct ath_softc
- bf->bf_lastbf = bf;
- tx_info = IEEE80211_SKB_CB(skb);
- - tx_info->flags &= ~IEEE80211_TX_CTL_CLEAR_PS_FILT;
- + tx_info->flags &= ~(IEEE80211_TX_CTL_CLEAR_PS_FILT |
- + IEEE80211_TX_STATUS_EOSP);
- /*
- * No aggregation session is running, but there may be frames
- @@ -1010,11 +1019,14 @@ ath_tx_get_tid_subframe(struct ath_softc
- INIT_LIST_HEAD(&bf_head);
- list_add(&bf->list, &bf_head);
- - ath_tx_update_baw(sc, tid, seqno);
- + ath_tx_update_baw(sc, tid, bf);
- ath_tx_complete_buf(sc, bf, txq, &bf_head, NULL, &ts, 0);
- continue;
- }
- + if (bf_isampdu(bf))
- + ath_tx_addto_baw(sc, tid, bf);
- +
- return bf;
- }
- @@ -1072,8 +1084,6 @@ ath_tx_form_aggr(struct ath_softc *sc, s
- bf->bf_next = NULL;
- /* link buffers of this frame to the aggregate */
- - if (!fi->baw_tracked)
- - ath_tx_addto_baw(sc, tid, bf);
- bf->bf_state.ndelim = ndelim;
- list_add_tail(&bf->list, bf_q);
- @@ -1660,6 +1670,22 @@ void ath_tx_aggr_wakeup(struct ath_softc
- }
- }
- +
- +static void
- +ath9k_set_moredata(struct ath_softc *sc, struct ath_buf *bf, bool val)
- +{
- + struct ieee80211_hdr *hdr;
- + u16 mask = cpu_to_le16(IEEE80211_FCTL_MOREDATA);
- + u16 mask_val = mask * val;
- +
- + hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data;
- + if ((hdr->frame_control & mask) != mask_val) {
- + hdr->frame_control = (hdr->frame_control & ~mask) | mask_val;
- + dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
- + sizeof(*hdr), DMA_TO_DEVICE);
- + }
- +}
- +
- void ath9k_release_buffered_frames(struct ieee80211_hw *hw,
- struct ieee80211_sta *sta,
- u16 tids, int nframes,
- @@ -1690,12 +1716,11 @@ void ath9k_release_buffered_frames(struc
- if (!bf)
- break;
- + ath9k_set_moredata(sc, bf, true);
- list_add_tail(&bf->list, &bf_q);
- ath_set_rates(tid->an->vif, tid->an->sta, bf);
- - if (bf_isampdu(bf)) {
- - ath_tx_addto_baw(sc, tid, bf);
- + if (bf_isampdu(bf))
- bf->bf_state.bf_type &= ~BUF_AGGR;
- - }
- if (bf_tail)
- bf_tail->bf_next = bf;
- @@ -1713,6 +1738,9 @@ void ath9k_release_buffered_frames(struc
- if (list_empty(&bf_q))
- return;
- + if (!more_data)
- + ath9k_set_moredata(sc, bf_tail, false);
- +
- info = IEEE80211_SKB_CB(bf_tail->bf_mpdu);
- info->flags |= IEEE80211_TX_STATUS_EOSP;
- @@ -2408,7 +2436,6 @@ void ath_tx_cabq(struct ieee80211_hw *hw
- .txq = sc->beacon.cabq
- };
- struct ath_tx_info info = {};
- - struct ieee80211_hdr *hdr;
- struct ath_buf *bf_tail = NULL;
- struct ath_buf *bf;
- LIST_HEAD(bf_q);
- @@ -2452,15 +2479,10 @@ void ath_tx_cabq(struct ieee80211_hw *hw
- if (list_empty(&bf_q))
- return;
- - bf = list_first_entry(&bf_q, struct ath_buf, list);
- - hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data;
- -
- - if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) {
- - hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA);
- - dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
- - sizeof(*hdr), DMA_TO_DEVICE);
- - }
- + bf = list_last_entry(&bf_q, struct ath_buf, list);
- + ath9k_set_moredata(sc, bf, false);
- + bf = list_first_entry(&bf_q, struct ath_buf, list);
- ath_txq_lock(sc, txctl.txq);
- ath_tx_fill_desc(sc, bf, txctl.txq, 0);
- ath_tx_txqaddbuf(sc, txctl.txq, &bf_q, false);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement