cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hw.c (32348B)


      1/*
      2 * Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net>
      3 *
      4 *  This file is free software: you may copy, redistribute and/or modify it
      5 *  under the terms of the GNU General Public License as published by the
      6 *  Free Software Foundation, either version 2 of the License, or (at your
      7 *  option) any later version.
      8 *
      9 *  This file is distributed in the hope that it will be useful, but
     10 *  WITHOUT ANY WARRANTY; without even the implied warranty of
     11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12 *  General Public License for more details.
     13 *
     14 *  You should have received a copy of the GNU General Public License
     15 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
     16 *
     17 * This file incorporates work covered by the following copyright and
     18 * permission notice:
     19 *
     20 * Copyright (c) 2012 Qualcomm Atheros, Inc.
     21 *
     22 * Permission to use, copy, modify, and/or distribute this software for any
     23 * purpose with or without fee is hereby granted, provided that the above
     24 * copyright notice and this permission notice appear in all copies.
     25 *
     26 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     27 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     28 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     29 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     30 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     31 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     32 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     33 */
     34#include <linux/etherdevice.h>
     35#include <linux/delay.h>
     36#include <linux/pci.h>
     37#include <linux/mdio.h>
     38#include "reg.h"
     39#include "hw.h"
     40
     41static inline bool alx_is_rev_a(u8 rev)
     42{
     43	return rev == ALX_REV_A0 || rev == ALX_REV_A1;
     44}
     45
     46static int alx_wait_mdio_idle(struct alx_hw *hw)
     47{
     48	u32 val;
     49	int i;
     50
     51	for (i = 0; i < ALX_MDIO_MAX_AC_TO; i++) {
     52		val = alx_read_mem32(hw, ALX_MDIO);
     53		if (!(val & ALX_MDIO_BUSY))
     54			return 0;
     55		udelay(10);
     56	}
     57
     58	return -ETIMEDOUT;
     59}
     60
     61static int alx_read_phy_core(struct alx_hw *hw, bool ext, u8 dev,
     62			     u16 reg, u16 *phy_data)
     63{
     64	u32 val, clk_sel;
     65	int err;
     66
     67	*phy_data = 0;
     68
     69	/* use slow clock when it's in hibernation status */
     70	clk_sel = hw->link_speed != SPEED_UNKNOWN ?
     71			ALX_MDIO_CLK_SEL_25MD4 :
     72			ALX_MDIO_CLK_SEL_25MD128;
     73
     74	if (ext) {
     75		val = dev << ALX_MDIO_EXTN_DEVAD_SHIFT |
     76		      reg << ALX_MDIO_EXTN_REG_SHIFT;
     77		alx_write_mem32(hw, ALX_MDIO_EXTN, val);
     78
     79		val = ALX_MDIO_SPRES_PRMBL | ALX_MDIO_START |
     80		      ALX_MDIO_MODE_EXT | ALX_MDIO_OP_READ |
     81		      clk_sel << ALX_MDIO_CLK_SEL_SHIFT;
     82	} else {
     83		val = ALX_MDIO_SPRES_PRMBL |
     84		      clk_sel << ALX_MDIO_CLK_SEL_SHIFT |
     85		      reg << ALX_MDIO_REG_SHIFT |
     86		      ALX_MDIO_START | ALX_MDIO_OP_READ;
     87	}
     88	alx_write_mem32(hw, ALX_MDIO, val);
     89
     90	err = alx_wait_mdio_idle(hw);
     91	if (err)
     92		return err;
     93	val = alx_read_mem32(hw, ALX_MDIO);
     94	*phy_data = ALX_GET_FIELD(val, ALX_MDIO_DATA);
     95	return 0;
     96}
     97
     98static int alx_write_phy_core(struct alx_hw *hw, bool ext, u8 dev,
     99			      u16 reg, u16 phy_data)
    100{
    101	u32 val, clk_sel;
    102
    103	/* use slow clock when it's in hibernation status */
    104	clk_sel = hw->link_speed != SPEED_UNKNOWN ?
    105			ALX_MDIO_CLK_SEL_25MD4 :
    106			ALX_MDIO_CLK_SEL_25MD128;
    107
    108	if (ext) {
    109		val = dev << ALX_MDIO_EXTN_DEVAD_SHIFT |
    110		      reg << ALX_MDIO_EXTN_REG_SHIFT;
    111		alx_write_mem32(hw, ALX_MDIO_EXTN, val);
    112
    113		val = ALX_MDIO_SPRES_PRMBL |
    114		      clk_sel << ALX_MDIO_CLK_SEL_SHIFT |
    115		      phy_data << ALX_MDIO_DATA_SHIFT |
    116		      ALX_MDIO_START | ALX_MDIO_MODE_EXT;
    117	} else {
    118		val = ALX_MDIO_SPRES_PRMBL |
    119		      clk_sel << ALX_MDIO_CLK_SEL_SHIFT |
    120		      reg << ALX_MDIO_REG_SHIFT |
    121		      phy_data << ALX_MDIO_DATA_SHIFT |
    122		      ALX_MDIO_START;
    123	}
    124	alx_write_mem32(hw, ALX_MDIO, val);
    125
    126	return alx_wait_mdio_idle(hw);
    127}
    128
    129static int __alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data)
    130{
    131	return alx_read_phy_core(hw, false, 0, reg, phy_data);
    132}
    133
    134static int __alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data)
    135{
    136	return alx_write_phy_core(hw, false, 0, reg, phy_data);
    137}
    138
    139static int __alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata)
    140{
    141	return alx_read_phy_core(hw, true, dev, reg, pdata);
    142}
    143
    144static int __alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data)
    145{
    146	return alx_write_phy_core(hw, true, dev, reg, data);
    147}
    148
    149static int __alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata)
    150{
    151	int err;
    152
    153	err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg);
    154	if (err)
    155		return err;
    156
    157	return __alx_read_phy_reg(hw, ALX_MII_DBG_DATA, pdata);
    158}
    159
    160static int __alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data)
    161{
    162	int err;
    163
    164	err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg);
    165	if (err)
    166		return err;
    167
    168	return __alx_write_phy_reg(hw, ALX_MII_DBG_DATA, data);
    169}
    170
    171int alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data)
    172{
    173	int err;
    174
    175	spin_lock(&hw->mdio_lock);
    176	err = __alx_read_phy_reg(hw, reg, phy_data);
    177	spin_unlock(&hw->mdio_lock);
    178
    179	return err;
    180}
    181
    182int alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data)
    183{
    184	int err;
    185
    186	spin_lock(&hw->mdio_lock);
    187	err = __alx_write_phy_reg(hw, reg, phy_data);
    188	spin_unlock(&hw->mdio_lock);
    189
    190	return err;
    191}
    192
    193int alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata)
    194{
    195	int err;
    196
    197	spin_lock(&hw->mdio_lock);
    198	err = __alx_read_phy_ext(hw, dev, reg, pdata);
    199	spin_unlock(&hw->mdio_lock);
    200
    201	return err;
    202}
    203
    204int alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data)
    205{
    206	int err;
    207
    208	spin_lock(&hw->mdio_lock);
    209	err = __alx_write_phy_ext(hw, dev, reg, data);
    210	spin_unlock(&hw->mdio_lock);
    211
    212	return err;
    213}
    214
    215static int alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata)
    216{
    217	int err;
    218
    219	spin_lock(&hw->mdio_lock);
    220	err = __alx_read_phy_dbg(hw, reg, pdata);
    221	spin_unlock(&hw->mdio_lock);
    222
    223	return err;
    224}
    225
    226static int alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data)
    227{
    228	int err;
    229
    230	spin_lock(&hw->mdio_lock);
    231	err = __alx_write_phy_dbg(hw, reg, data);
    232	spin_unlock(&hw->mdio_lock);
    233
    234	return err;
    235}
    236
    237static u16 alx_get_phy_config(struct alx_hw *hw)
    238{
    239	u32 val;
    240	u16 phy_val;
    241
    242	val = alx_read_mem32(hw, ALX_PHY_CTRL);
    243	/* phy in reset */
    244	if ((val & ALX_PHY_CTRL_DSPRST_OUT) == 0)
    245		return ALX_DRV_PHY_UNKNOWN;
    246
    247	val = alx_read_mem32(hw, ALX_DRV);
    248	val = ALX_GET_FIELD(val, ALX_DRV_PHY);
    249	if (ALX_DRV_PHY_UNKNOWN == val)
    250		return ALX_DRV_PHY_UNKNOWN;
    251
    252	alx_read_phy_reg(hw, ALX_MII_DBG_ADDR, &phy_val);
    253	if (ALX_PHY_INITED == phy_val)
    254		return val;
    255
    256	return ALX_DRV_PHY_UNKNOWN;
    257}
    258
    259static bool alx_wait_reg(struct alx_hw *hw, u32 reg, u32 wait, u32 *val)
    260{
    261	u32 read;
    262	int i;
    263
    264	for (i = 0; i < ALX_SLD_MAX_TO; i++) {
    265		read = alx_read_mem32(hw, reg);
    266		if ((read & wait) == 0) {
    267			if (val)
    268				*val = read;
    269			return true;
    270		}
    271		mdelay(1);
    272	}
    273
    274	return false;
    275}
    276
    277static bool alx_read_macaddr(struct alx_hw *hw, u8 *addr)
    278{
    279	u32 mac0, mac1;
    280
    281	mac0 = alx_read_mem32(hw, ALX_STAD0);
    282	mac1 = alx_read_mem32(hw, ALX_STAD1);
    283
    284	/* addr should be big-endian */
    285	put_unaligned(cpu_to_be32(mac0), (__be32 *)(addr + 2));
    286	put_unaligned(cpu_to_be16(mac1), (__be16 *)addr);
    287
    288	return is_valid_ether_addr(addr);
    289}
    290
    291int alx_get_perm_macaddr(struct alx_hw *hw, u8 *addr)
    292{
    293	u32 val;
    294
    295	/* try to get it from register first */
    296	if (alx_read_macaddr(hw, addr))
    297		return 0;
    298
    299	/* try to load from efuse */
    300	if (!alx_wait_reg(hw, ALX_SLD, ALX_SLD_STAT | ALX_SLD_START, &val))
    301		return -EIO;
    302	alx_write_mem32(hw, ALX_SLD, val | ALX_SLD_START);
    303	if (!alx_wait_reg(hw, ALX_SLD, ALX_SLD_START, NULL))
    304		return -EIO;
    305	if (alx_read_macaddr(hw, addr))
    306		return 0;
    307
    308	/* try to load from flash/eeprom (if present) */
    309	val = alx_read_mem32(hw, ALX_EFLD);
    310	if (val & (ALX_EFLD_F_EXIST | ALX_EFLD_E_EXIST)) {
    311		if (!alx_wait_reg(hw, ALX_EFLD,
    312				  ALX_EFLD_STAT | ALX_EFLD_START, &val))
    313			return -EIO;
    314		alx_write_mem32(hw, ALX_EFLD, val | ALX_EFLD_START);
    315		if (!alx_wait_reg(hw, ALX_EFLD, ALX_EFLD_START, NULL))
    316			return -EIO;
    317		if (alx_read_macaddr(hw, addr))
    318			return 0;
    319	}
    320
    321	return -EIO;
    322}
    323
    324void alx_set_macaddr(struct alx_hw *hw, const u8 *addr)
    325{
    326	u32 val;
    327
    328	/* for example: 00-0B-6A-F6-00-DC * STAD0=6AF600DC, STAD1=000B */
    329	val = be32_to_cpu(get_unaligned((__be32 *)(addr + 2)));
    330	alx_write_mem32(hw, ALX_STAD0, val);
    331	val = be16_to_cpu(get_unaligned((__be16 *)addr));
    332	alx_write_mem32(hw, ALX_STAD1, val);
    333}
    334
    335static void alx_reset_osc(struct alx_hw *hw, u8 rev)
    336{
    337	u32 val, val2;
    338
    339	/* clear Internal OSC settings, switching OSC by hw itself */
    340	val = alx_read_mem32(hw, ALX_MISC3);
    341	alx_write_mem32(hw, ALX_MISC3,
    342			(val & ~ALX_MISC3_25M_BY_SW) |
    343			ALX_MISC3_25M_NOTO_INTNL);
    344
    345	/* 25M clk from chipset may be unstable 1s after de-assert of
    346	 * PERST, driver need re-calibrate before enter Sleep for WoL
    347	 */
    348	val = alx_read_mem32(hw, ALX_MISC);
    349	if (rev >= ALX_REV_B0) {
    350		/* restore over current protection def-val,
    351		 * this val could be reset by MAC-RST
    352		 */
    353		ALX_SET_FIELD(val, ALX_MISC_PSW_OCP, ALX_MISC_PSW_OCP_DEF);
    354		/* a 0->1 change will update the internal val of osc */
    355		val &= ~ALX_MISC_INTNLOSC_OPEN;
    356		alx_write_mem32(hw, ALX_MISC, val);
    357		alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN);
    358		/* hw will automatically dis OSC after cab. */
    359		val2 = alx_read_mem32(hw, ALX_MSIC2);
    360		val2 &= ~ALX_MSIC2_CALB_START;
    361		alx_write_mem32(hw, ALX_MSIC2, val2);
    362		alx_write_mem32(hw, ALX_MSIC2, val2 | ALX_MSIC2_CALB_START);
    363	} else {
    364		val &= ~ALX_MISC_INTNLOSC_OPEN;
    365		/* disable isolate for rev A devices */
    366		if (alx_is_rev_a(rev))
    367			val &= ~ALX_MISC_ISO_EN;
    368
    369		alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN);
    370		alx_write_mem32(hw, ALX_MISC, val);
    371	}
    372
    373	udelay(20);
    374}
    375
    376static int alx_stop_mac(struct alx_hw *hw)
    377{
    378	u32 rxq, txq, val;
    379	u16 i;
    380
    381	rxq = alx_read_mem32(hw, ALX_RXQ0);
    382	alx_write_mem32(hw, ALX_RXQ0, rxq & ~ALX_RXQ0_EN);
    383	txq = alx_read_mem32(hw, ALX_TXQ0);
    384	alx_write_mem32(hw, ALX_TXQ0, txq & ~ALX_TXQ0_EN);
    385
    386	udelay(40);
    387
    388	hw->rx_ctrl &= ~(ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN);
    389	alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
    390
    391	for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) {
    392		val = alx_read_mem32(hw, ALX_MAC_STS);
    393		if (!(val & ALX_MAC_STS_IDLE))
    394			return 0;
    395		udelay(10);
    396	}
    397
    398	return -ETIMEDOUT;
    399}
    400
    401int alx_reset_mac(struct alx_hw *hw)
    402{
    403	u32 val, pmctrl;
    404	int i, ret;
    405	u8 rev;
    406	bool a_cr;
    407
    408	pmctrl = 0;
    409	rev = alx_hw_revision(hw);
    410	a_cr = alx_is_rev_a(rev) && alx_hw_with_cr(hw);
    411
    412	/* disable all interrupts, RXQ/TXQ */
    413	alx_write_mem32(hw, ALX_MSIX_MASK, 0xFFFFFFFF);
    414	alx_write_mem32(hw, ALX_IMR, 0);
    415	alx_write_mem32(hw, ALX_ISR, ALX_ISR_DIS);
    416
    417	ret = alx_stop_mac(hw);
    418	if (ret)
    419		return ret;
    420
    421	/* mac reset workaroud */
    422	alx_write_mem32(hw, ALX_RFD_PIDX, 1);
    423
    424	/* dis l0s/l1 before mac reset */
    425	if (a_cr) {
    426		pmctrl = alx_read_mem32(hw, ALX_PMCTRL);
    427		if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN))
    428			alx_write_mem32(hw, ALX_PMCTRL,
    429					pmctrl & ~(ALX_PMCTRL_L1_EN |
    430						   ALX_PMCTRL_L0S_EN));
    431	}
    432
    433	/* reset whole mac safely */
    434	val = alx_read_mem32(hw, ALX_MASTER);
    435	alx_write_mem32(hw, ALX_MASTER,
    436			val | ALX_MASTER_DMA_MAC_RST | ALX_MASTER_OOB_DIS);
    437
    438	/* make sure it's real idle */
    439	udelay(10);
    440	for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) {
    441		val = alx_read_mem32(hw, ALX_RFD_PIDX);
    442		if (val == 0)
    443			break;
    444		udelay(10);
    445	}
    446	for (; i < ALX_DMA_MAC_RST_TO; i++) {
    447		val = alx_read_mem32(hw, ALX_MASTER);
    448		if ((val & ALX_MASTER_DMA_MAC_RST) == 0)
    449			break;
    450		udelay(10);
    451	}
    452	if (i == ALX_DMA_MAC_RST_TO)
    453		return -EIO;
    454	udelay(10);
    455
    456	if (a_cr) {
    457		alx_write_mem32(hw, ALX_MASTER, val | ALX_MASTER_PCLKSEL_SRDS);
    458		/* restore l0s / l1 */
    459		if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN))
    460			alx_write_mem32(hw, ALX_PMCTRL, pmctrl);
    461	}
    462
    463	alx_reset_osc(hw, rev);
    464
    465	/* clear Internal OSC settings, switching OSC by hw itself,
    466	 * disable isolate for rev A devices
    467	 */
    468	val = alx_read_mem32(hw, ALX_MISC3);
    469	alx_write_mem32(hw, ALX_MISC3,
    470			(val & ~ALX_MISC3_25M_BY_SW) |
    471			ALX_MISC3_25M_NOTO_INTNL);
    472	val = alx_read_mem32(hw, ALX_MISC);
    473	val &= ~ALX_MISC_INTNLOSC_OPEN;
    474	if (alx_is_rev_a(rev))
    475		val &= ~ALX_MISC_ISO_EN;
    476	alx_write_mem32(hw, ALX_MISC, val);
    477	udelay(20);
    478
    479	/* driver control speed/duplex, hash-alg */
    480	alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
    481
    482	val = alx_read_mem32(hw, ALX_SERDES);
    483	alx_write_mem32(hw, ALX_SERDES,
    484			val | ALX_SERDES_MACCLK_SLWDWN |
    485			ALX_SERDES_PHYCLK_SLWDWN);
    486
    487	return 0;
    488}
    489
    490void alx_reset_phy(struct alx_hw *hw)
    491{
    492	int i;
    493	u32 val;
    494	u16 phy_val;
    495
    496	/* (DSP)reset PHY core */
    497	val = alx_read_mem32(hw, ALX_PHY_CTRL);
    498	val &= ~(ALX_PHY_CTRL_DSPRST_OUT | ALX_PHY_CTRL_IDDQ |
    499		 ALX_PHY_CTRL_GATE_25M | ALX_PHY_CTRL_POWER_DOWN |
    500		 ALX_PHY_CTRL_CLS);
    501	val |= ALX_PHY_CTRL_RST_ANALOG;
    502
    503	val |= (ALX_PHY_CTRL_HIB_PULSE | ALX_PHY_CTRL_HIB_EN);
    504	alx_write_mem32(hw, ALX_PHY_CTRL, val);
    505	udelay(10);
    506	alx_write_mem32(hw, ALX_PHY_CTRL, val | ALX_PHY_CTRL_DSPRST_OUT);
    507
    508	for (i = 0; i < ALX_PHY_CTRL_DSPRST_TO; i++)
    509		udelay(10);
    510
    511	/* phy power saving & hib */
    512	alx_write_phy_dbg(hw, ALX_MIIDBG_LEGCYPS, ALX_LEGCYPS_DEF);
    513	alx_write_phy_dbg(hw, ALX_MIIDBG_SYSMODCTRL,
    514			  ALX_SYSMODCTRL_IECHOADJ_DEF);
    515	alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_VDRVBIAS,
    516			  ALX_VDRVBIAS_DEF);
    517
    518	/* EEE advertisement */
    519	val = alx_read_mem32(hw, ALX_LPI_CTRL);
    520	alx_write_mem32(hw, ALX_LPI_CTRL, val & ~ALX_LPI_CTRL_EN);
    521	alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_LOCAL_EEEADV, 0);
    522
    523	/* phy power saving */
    524	alx_write_phy_dbg(hw, ALX_MIIDBG_TST10BTCFG, ALX_TST10BTCFG_DEF);
    525	alx_write_phy_dbg(hw, ALX_MIIDBG_SRDSYSMOD, ALX_SRDSYSMOD_DEF);
    526	alx_write_phy_dbg(hw, ALX_MIIDBG_TST100BTCFG, ALX_TST100BTCFG_DEF);
    527	alx_write_phy_dbg(hw, ALX_MIIDBG_ANACTRL, ALX_ANACTRL_DEF);
    528	alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val);
    529	alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2,
    530			  phy_val & ~ALX_GREENCFG2_GATE_DFSE_EN);
    531	/* rtl8139c, 120m issue */
    532	alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_NLP78,
    533			  ALX_MIIEXT_NLP78_120M_DEF);
    534	alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_S3DIG10,
    535			  ALX_MIIEXT_S3DIG10_DEF);
    536
    537	if (hw->lnk_patch) {
    538		/* Turn off half amplitude */
    539		alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3,
    540				 &phy_val);
    541		alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3,
    542				  phy_val | ALX_CLDCTRL3_BP_CABLE1TH_DET_GT);
    543		/* Turn off Green feature */
    544		alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val);
    545		alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2,
    546				  phy_val | ALX_GREENCFG2_BP_GREEN);
    547		/* Turn off half Bias */
    548		alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5,
    549				 &phy_val);
    550		alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5,
    551				  phy_val | ALX_CLDCTRL5_BP_VD_HLFBIAS);
    552	}
    553
    554	/* set phy interrupt mask */
    555	alx_write_phy_reg(hw, ALX_MII_IER, ALX_IER_LINK_UP | ALX_IER_LINK_DOWN);
    556}
    557
    558#define ALX_PCI_CMD (PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY | PCI_COMMAND_IO)
    559
    560void alx_reset_pcie(struct alx_hw *hw)
    561{
    562	u8 rev = alx_hw_revision(hw);
    563	u32 val;
    564	u16 val16;
    565
    566	/* Workaround for PCI problem when BIOS sets MMRBC incorrectly. */
    567	pci_read_config_word(hw->pdev, PCI_COMMAND, &val16);
    568	if (!(val16 & ALX_PCI_CMD) || (val16 & PCI_COMMAND_INTX_DISABLE)) {
    569		val16 = (val16 | ALX_PCI_CMD) & ~PCI_COMMAND_INTX_DISABLE;
    570		pci_write_config_word(hw->pdev, PCI_COMMAND, val16);
    571	}
    572
    573	/* clear WoL setting/status */
    574	val = alx_read_mem32(hw, ALX_WOL0);
    575	alx_write_mem32(hw, ALX_WOL0, 0);
    576
    577	val = alx_read_mem32(hw, ALX_PDLL_TRNS1);
    578	alx_write_mem32(hw, ALX_PDLL_TRNS1, val & ~ALX_PDLL_TRNS1_D3PLLOFF_EN);
    579
    580	/* mask some pcie error bits */
    581	val = alx_read_mem32(hw, ALX_UE_SVRT);
    582	val &= ~(ALX_UE_SVRT_DLPROTERR | ALX_UE_SVRT_FCPROTERR);
    583	alx_write_mem32(hw, ALX_UE_SVRT, val);
    584
    585	/* wol 25M & pclk */
    586	val = alx_read_mem32(hw, ALX_MASTER);
    587	if (alx_is_rev_a(rev) && alx_hw_with_cr(hw)) {
    588		if ((val & ALX_MASTER_WAKEN_25M) == 0 ||
    589		    (val & ALX_MASTER_PCLKSEL_SRDS) == 0)
    590			alx_write_mem32(hw, ALX_MASTER,
    591					val | ALX_MASTER_PCLKSEL_SRDS |
    592					ALX_MASTER_WAKEN_25M);
    593	} else {
    594		if ((val & ALX_MASTER_WAKEN_25M) == 0 ||
    595		    (val & ALX_MASTER_PCLKSEL_SRDS) != 0)
    596			alx_write_mem32(hw, ALX_MASTER,
    597					(val & ~ALX_MASTER_PCLKSEL_SRDS) |
    598					ALX_MASTER_WAKEN_25M);
    599	}
    600
    601	/* ASPM setting */
    602	alx_enable_aspm(hw, true, true);
    603
    604	udelay(10);
    605}
    606
    607void alx_start_mac(struct alx_hw *hw)
    608{
    609	u32 mac, txq, rxq;
    610
    611	rxq = alx_read_mem32(hw, ALX_RXQ0);
    612	alx_write_mem32(hw, ALX_RXQ0, rxq | ALX_RXQ0_EN);
    613	txq = alx_read_mem32(hw, ALX_TXQ0);
    614	alx_write_mem32(hw, ALX_TXQ0, txq | ALX_TXQ0_EN);
    615
    616	mac = hw->rx_ctrl;
    617	if (hw->duplex == DUPLEX_FULL)
    618		mac |= ALX_MAC_CTRL_FULLD;
    619	else
    620		mac &= ~ALX_MAC_CTRL_FULLD;
    621	ALX_SET_FIELD(mac, ALX_MAC_CTRL_SPEED,
    622		      hw->link_speed == SPEED_1000 ? ALX_MAC_CTRL_SPEED_1000 :
    623						     ALX_MAC_CTRL_SPEED_10_100);
    624	mac |= ALX_MAC_CTRL_TX_EN | ALX_MAC_CTRL_RX_EN;
    625	hw->rx_ctrl = mac;
    626	alx_write_mem32(hw, ALX_MAC_CTRL, mac);
    627}
    628
    629void alx_cfg_mac_flowcontrol(struct alx_hw *hw, u8 fc)
    630{
    631	if (fc & ALX_FC_RX)
    632		hw->rx_ctrl |= ALX_MAC_CTRL_RXFC_EN;
    633	else
    634		hw->rx_ctrl &= ~ALX_MAC_CTRL_RXFC_EN;
    635
    636	if (fc & ALX_FC_TX)
    637		hw->rx_ctrl |= ALX_MAC_CTRL_TXFC_EN;
    638	else
    639		hw->rx_ctrl &= ~ALX_MAC_CTRL_TXFC_EN;
    640
    641	alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
    642}
    643
    644void alx_enable_aspm(struct alx_hw *hw, bool l0s_en, bool l1_en)
    645{
    646	u32 pmctrl;
    647	u8 rev = alx_hw_revision(hw);
    648
    649	pmctrl = alx_read_mem32(hw, ALX_PMCTRL);
    650
    651	ALX_SET_FIELD(pmctrl, ALX_PMCTRL_LCKDET_TIMER,
    652		      ALX_PMCTRL_LCKDET_TIMER_DEF);
    653	pmctrl |= ALX_PMCTRL_RCVR_WT_1US |
    654		  ALX_PMCTRL_L1_CLKSW_EN |
    655		  ALX_PMCTRL_L1_SRDSRX_PWD;
    656	ALX_SET_FIELD(pmctrl, ALX_PMCTRL_L1REQ_TO, ALX_PMCTRL_L1REG_TO_DEF);
    657	ALX_SET_FIELD(pmctrl, ALX_PMCTRL_L1_TIMER, ALX_PMCTRL_L1_TIMER_16US);
    658	pmctrl &= ~(ALX_PMCTRL_L1_SRDS_EN |
    659		    ALX_PMCTRL_L1_SRDSPLL_EN |
    660		    ALX_PMCTRL_L1_BUFSRX_EN |
    661		    ALX_PMCTRL_SADLY_EN |
    662		    ALX_PMCTRL_HOTRST_WTEN|
    663		    ALX_PMCTRL_L0S_EN |
    664		    ALX_PMCTRL_L1_EN |
    665		    ALX_PMCTRL_ASPM_FCEN |
    666		    ALX_PMCTRL_TXL1_AFTER_L0S |
    667		    ALX_PMCTRL_RXL1_AFTER_L0S);
    668	if (alx_is_rev_a(rev) && alx_hw_with_cr(hw))
    669		pmctrl |= ALX_PMCTRL_L1_SRDS_EN | ALX_PMCTRL_L1_SRDSPLL_EN;
    670
    671	if (l0s_en)
    672		pmctrl |= (ALX_PMCTRL_L0S_EN | ALX_PMCTRL_ASPM_FCEN);
    673	if (l1_en)
    674		pmctrl |= (ALX_PMCTRL_L1_EN | ALX_PMCTRL_ASPM_FCEN);
    675
    676	alx_write_mem32(hw, ALX_PMCTRL, pmctrl);
    677}
    678
    679
    680static u32 ethadv_to_hw_cfg(struct alx_hw *hw, u32 ethadv_cfg)
    681{
    682	u32 cfg = 0;
    683
    684	if (ethadv_cfg & ADVERTISED_Autoneg) {
    685		cfg |= ALX_DRV_PHY_AUTO;
    686		if (ethadv_cfg & ADVERTISED_10baseT_Half)
    687			cfg |= ALX_DRV_PHY_10;
    688		if (ethadv_cfg & ADVERTISED_10baseT_Full)
    689			cfg |= ALX_DRV_PHY_10 | ALX_DRV_PHY_DUPLEX;
    690		if (ethadv_cfg & ADVERTISED_100baseT_Half)
    691			cfg |= ALX_DRV_PHY_100;
    692		if (ethadv_cfg & ADVERTISED_100baseT_Full)
    693			cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX;
    694		if (ethadv_cfg & ADVERTISED_1000baseT_Half)
    695			cfg |= ALX_DRV_PHY_1000;
    696		if (ethadv_cfg & ADVERTISED_1000baseT_Full)
    697			cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX;
    698		if (ethadv_cfg & ADVERTISED_Pause)
    699			cfg |= ADVERTISE_PAUSE_CAP;
    700		if (ethadv_cfg & ADVERTISED_Asym_Pause)
    701			cfg |= ADVERTISE_PAUSE_ASYM;
    702	} else {
    703		switch (ethadv_cfg) {
    704		case ADVERTISED_10baseT_Half:
    705			cfg |= ALX_DRV_PHY_10;
    706			break;
    707		case ADVERTISED_100baseT_Half:
    708			cfg |= ALX_DRV_PHY_100;
    709			break;
    710		case ADVERTISED_10baseT_Full:
    711			cfg |= ALX_DRV_PHY_10 | ALX_DRV_PHY_DUPLEX;
    712			break;
    713		case ADVERTISED_100baseT_Full:
    714			cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX;
    715			break;
    716		}
    717	}
    718
    719	return cfg;
    720}
    721
    722int alx_setup_speed_duplex(struct alx_hw *hw, u32 ethadv, u8 flowctrl)
    723{
    724	u16 adv, giga, cr;
    725	u32 val;
    726	int err = 0;
    727
    728	alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, 0);
    729	val = alx_read_mem32(hw, ALX_DRV);
    730	ALX_SET_FIELD(val, ALX_DRV_PHY, 0);
    731
    732	if (ethadv & ADVERTISED_Autoneg) {
    733		adv = ADVERTISE_CSMA;
    734		adv |= ethtool_adv_to_mii_adv_t(ethadv);
    735
    736		if (flowctrl & ALX_FC_ANEG) {
    737			if (flowctrl & ALX_FC_RX) {
    738				adv |= ADVERTISED_Pause;
    739				if (!(flowctrl & ALX_FC_TX))
    740					adv |= ADVERTISED_Asym_Pause;
    741			} else if (flowctrl & ALX_FC_TX) {
    742				adv |= ADVERTISED_Asym_Pause;
    743			}
    744		}
    745		giga = 0;
    746		if (alx_hw_giga(hw))
    747			giga = ethtool_adv_to_mii_ctrl1000_t(ethadv);
    748
    749		cr = BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART;
    750
    751		if (alx_write_phy_reg(hw, MII_ADVERTISE, adv) ||
    752		    alx_write_phy_reg(hw, MII_CTRL1000, giga) ||
    753		    alx_write_phy_reg(hw, MII_BMCR, cr))
    754			err = -EBUSY;
    755	} else {
    756		cr = BMCR_RESET;
    757		if (ethadv == ADVERTISED_100baseT_Half ||
    758		    ethadv == ADVERTISED_100baseT_Full)
    759			cr |= BMCR_SPEED100;
    760		if (ethadv == ADVERTISED_10baseT_Full ||
    761		    ethadv == ADVERTISED_100baseT_Full)
    762			cr |= BMCR_FULLDPLX;
    763
    764		err = alx_write_phy_reg(hw, MII_BMCR, cr);
    765	}
    766
    767	if (!err) {
    768		alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, ALX_PHY_INITED);
    769		val |= ethadv_to_hw_cfg(hw, ethadv);
    770	}
    771
    772	alx_write_mem32(hw, ALX_DRV, val);
    773
    774	return err;
    775}
    776
    777
    778void alx_post_phy_link(struct alx_hw *hw)
    779{
    780	u16 phy_val, len, agc;
    781	u8 revid = alx_hw_revision(hw);
    782	bool adj_th = revid == ALX_REV_B0;
    783
    784	if (revid != ALX_REV_B0 && !alx_is_rev_a(revid))
    785		return;
    786
    787	/* 1000BT/AZ, wrong cable length */
    788	if (hw->link_speed != SPEED_UNKNOWN) {
    789		alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL6,
    790				 &phy_val);
    791		len = ALX_GET_FIELD(phy_val, ALX_CLDCTRL6_CAB_LEN);
    792		alx_read_phy_dbg(hw, ALX_MIIDBG_AGC, &phy_val);
    793		agc = ALX_GET_FIELD(phy_val, ALX_AGC_2_VGA);
    794
    795		if ((hw->link_speed == SPEED_1000 &&
    796		     (len > ALX_CLDCTRL6_CAB_LEN_SHORT1G ||
    797		      (len == 0 && agc > ALX_AGC_LONG1G_LIMT))) ||
    798		    (hw->link_speed == SPEED_100 &&
    799		     (len > ALX_CLDCTRL6_CAB_LEN_SHORT100M ||
    800		      (len == 0 && agc > ALX_AGC_LONG100M_LIMT)))) {
    801			alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT,
    802					  ALX_AZ_ANADECT_LONG);
    803			alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
    804					 &phy_val);
    805			alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
    806					  phy_val | ALX_AFE_10BT_100M_TH);
    807		} else {
    808			alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT,
    809					  ALX_AZ_ANADECT_DEF);
    810			alx_read_phy_ext(hw, ALX_MIIEXT_ANEG,
    811					 ALX_MIIEXT_AFE, &phy_val);
    812			alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
    813					  phy_val & ~ALX_AFE_10BT_100M_TH);
    814		}
    815
    816		/* threshold adjust */
    817		if (adj_th && hw->lnk_patch) {
    818			if (hw->link_speed == SPEED_100) {
    819				alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB,
    820						  ALX_MSE16DB_UP);
    821			} else if (hw->link_speed == SPEED_1000) {
    822				/*
    823				 * Giga link threshold, raise the tolerance of
    824				 * noise 50%
    825				 */
    826				alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB,
    827						 &phy_val);
    828				ALX_SET_FIELD(phy_val, ALX_MSE20DB_TH,
    829					      ALX_MSE20DB_TH_HI);
    830				alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB,
    831						  phy_val);
    832			}
    833		}
    834	} else {
    835		alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
    836				 &phy_val);
    837		alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
    838				  phy_val & ~ALX_AFE_10BT_100M_TH);
    839
    840		if (adj_th && hw->lnk_patch) {
    841			alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB,
    842					  ALX_MSE16DB_DOWN);
    843			alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB, &phy_val);
    844			ALX_SET_FIELD(phy_val, ALX_MSE20DB_TH,
    845				      ALX_MSE20DB_TH_DEF);
    846			alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB, phy_val);
    847		}
    848	}
    849}
    850
    851bool alx_phy_configured(struct alx_hw *hw)
    852{
    853	u32 cfg, hw_cfg;
    854
    855	cfg = ethadv_to_hw_cfg(hw, hw->adv_cfg);
    856	cfg = ALX_GET_FIELD(cfg, ALX_DRV_PHY);
    857	hw_cfg = alx_get_phy_config(hw);
    858
    859	if (hw_cfg == ALX_DRV_PHY_UNKNOWN)
    860		return false;
    861
    862	return cfg == hw_cfg;
    863}
    864
    865int alx_read_phy_link(struct alx_hw *hw)
    866{
    867	struct pci_dev *pdev = hw->pdev;
    868	u16 bmsr, giga;
    869	int err;
    870
    871	err = alx_read_phy_reg(hw, MII_BMSR, &bmsr);
    872	if (err)
    873		return err;
    874
    875	err = alx_read_phy_reg(hw, MII_BMSR, &bmsr);
    876	if (err)
    877		return err;
    878
    879	if (!(bmsr & BMSR_LSTATUS)) {
    880		hw->link_speed = SPEED_UNKNOWN;
    881		hw->duplex = DUPLEX_UNKNOWN;
    882		return 0;
    883	}
    884
    885	/* speed/duplex result is saved in PHY Specific Status Register */
    886	err = alx_read_phy_reg(hw, ALX_MII_GIGA_PSSR, &giga);
    887	if (err)
    888		return err;
    889
    890	if (!(giga & ALX_GIGA_PSSR_SPD_DPLX_RESOLVED))
    891		goto wrong_speed;
    892
    893	switch (giga & ALX_GIGA_PSSR_SPEED) {
    894	case ALX_GIGA_PSSR_1000MBS:
    895		hw->link_speed = SPEED_1000;
    896		break;
    897	case ALX_GIGA_PSSR_100MBS:
    898		hw->link_speed = SPEED_100;
    899		break;
    900	case ALX_GIGA_PSSR_10MBS:
    901		hw->link_speed = SPEED_10;
    902		break;
    903	default:
    904		goto wrong_speed;
    905	}
    906
    907	hw->duplex = (giga & ALX_GIGA_PSSR_DPLX) ? DUPLEX_FULL : DUPLEX_HALF;
    908	return 0;
    909
    910wrong_speed:
    911	dev_err(&pdev->dev, "invalid PHY speed/duplex: 0x%x\n", giga);
    912	return -EINVAL;
    913}
    914
    915int alx_clear_phy_intr(struct alx_hw *hw)
    916{
    917	u16 isr;
    918
    919	/* clear interrupt status by reading it */
    920	return alx_read_phy_reg(hw, ALX_MII_ISR, &isr);
    921}
    922
    923void alx_disable_rss(struct alx_hw *hw)
    924{
    925	u32 ctrl = alx_read_mem32(hw, ALX_RXQ0);
    926
    927	ctrl &= ~ALX_RXQ0_RSS_HASH_EN;
    928	alx_write_mem32(hw, ALX_RXQ0, ctrl);
    929}
    930
    931void alx_configure_basic(struct alx_hw *hw)
    932{
    933	u32 val, raw_mtu, max_payload;
    934	u16 val16;
    935	u8 chip_rev = alx_hw_revision(hw);
    936
    937	alx_set_macaddr(hw, hw->mac_addr);
    938
    939	alx_write_mem32(hw, ALX_CLK_GATE, ALX_CLK_GATE_ALL);
    940
    941	/* idle timeout to switch clk_125M */
    942	if (chip_rev >= ALX_REV_B0)
    943		alx_write_mem32(hw, ALX_IDLE_DECISN_TIMER,
    944				ALX_IDLE_DECISN_TIMER_DEF);
    945
    946	alx_write_mem32(hw, ALX_SMB_TIMER, hw->smb_timer * 500UL);
    947
    948	val = alx_read_mem32(hw, ALX_MASTER);
    949	val |= ALX_MASTER_IRQMOD2_EN |
    950	       ALX_MASTER_IRQMOD1_EN |
    951	       ALX_MASTER_SYSALVTIMER_EN;
    952	alx_write_mem32(hw, ALX_MASTER, val);
    953	alx_write_mem32(hw, ALX_IRQ_MODU_TIMER,
    954			(hw->imt >> 1) << ALX_IRQ_MODU_TIMER1_SHIFT);
    955	/* intr re-trig timeout */
    956	alx_write_mem32(hw, ALX_INT_RETRIG, ALX_INT_RETRIG_TO);
    957	/* tpd threshold to trig int */
    958	alx_write_mem32(hw, ALX_TINT_TPD_THRSHLD, hw->ith_tpd);
    959	alx_write_mem32(hw, ALX_TINT_TIMER, hw->imt);
    960
    961	raw_mtu = ALX_RAW_MTU(hw->mtu);
    962	alx_write_mem32(hw, ALX_MTU, raw_mtu);
    963	if (raw_mtu > (ALX_MTU_JUMBO_TH + ETH_FCS_LEN + VLAN_HLEN))
    964		hw->rx_ctrl &= ~ALX_MAC_CTRL_FAST_PAUSE;
    965
    966	if (raw_mtu < ALX_TXQ1_JUMBO_TSO_TH)
    967		val = (raw_mtu + 7) >> 3;
    968	else
    969		val = ALX_TXQ1_JUMBO_TSO_TH >> 3;
    970	alx_write_mem32(hw, ALX_TXQ1, val | ALX_TXQ1_ERRLGPKT_DROP_EN);
    971
    972	max_payload = pcie_get_readrq(hw->pdev) >> 8;
    973	/*
    974	 * if BIOS had changed the default dma read max length,
    975	 * restore it to default value
    976	 */
    977	if (max_payload < ALX_DEV_CTRL_MAXRRS_MIN)
    978		pcie_set_readrq(hw->pdev, 128 << ALX_DEV_CTRL_MAXRRS_MIN);
    979
    980	val = ALX_TXQ_TPD_BURSTPREF_DEF << ALX_TXQ0_TPD_BURSTPREF_SHIFT |
    981	      ALX_TXQ0_MODE_ENHANCE | ALX_TXQ0_LSO_8023_EN |
    982	      ALX_TXQ0_SUPT_IPOPT |
    983	      ALX_TXQ_TXF_BURST_PREF_DEF << ALX_TXQ0_TXF_BURST_PREF_SHIFT;
    984	alx_write_mem32(hw, ALX_TXQ0, val);
    985	val = ALX_TXQ_TPD_BURSTPREF_DEF << ALX_HQTPD_Q1_NUMPREF_SHIFT |
    986	      ALX_TXQ_TPD_BURSTPREF_DEF << ALX_HQTPD_Q2_NUMPREF_SHIFT |
    987	      ALX_TXQ_TPD_BURSTPREF_DEF << ALX_HQTPD_Q3_NUMPREF_SHIFT |
    988	      ALX_HQTPD_BURST_EN;
    989	alx_write_mem32(hw, ALX_HQTPD, val);
    990
    991	/* rxq, flow control */
    992	val = alx_read_mem32(hw, ALX_SRAM5);
    993	val = ALX_GET_FIELD(val, ALX_SRAM_RXF_LEN) << 3;
    994	if (val > ALX_SRAM_RXF_LEN_8K) {
    995		val16 = ALX_MTU_STD_ALGN >> 3;
    996		val = (val - ALX_RXQ2_RXF_FLOW_CTRL_RSVD) >> 3;
    997	} else {
    998		val16 = ALX_MTU_STD_ALGN >> 3;
    999		val = (val - ALX_MTU_STD_ALGN) >> 3;
   1000	}
   1001	alx_write_mem32(hw, ALX_RXQ2,
   1002			val16 << ALX_RXQ2_RXF_XOFF_THRESH_SHIFT |
   1003			val << ALX_RXQ2_RXF_XON_THRESH_SHIFT);
   1004	val = ALX_RXQ0_NUM_RFD_PREF_DEF << ALX_RXQ0_NUM_RFD_PREF_SHIFT |
   1005	      ALX_RXQ0_RSS_MODE_DIS << ALX_RXQ0_RSS_MODE_SHIFT |
   1006	      ALX_RXQ0_IDT_TBL_SIZE_DEF << ALX_RXQ0_IDT_TBL_SIZE_SHIFT |
   1007	      ALX_RXQ0_RSS_HSTYP_ALL | ALX_RXQ0_RSS_HASH_EN |
   1008	      ALX_RXQ0_IPV6_PARSE_EN;
   1009
   1010	if (alx_hw_giga(hw))
   1011		ALX_SET_FIELD(val, ALX_RXQ0_ASPM_THRESH,
   1012			      ALX_RXQ0_ASPM_THRESH_100M);
   1013
   1014	alx_write_mem32(hw, ALX_RXQ0, val);
   1015
   1016	val = alx_read_mem32(hw, ALX_DMA);
   1017	val = ALX_DMA_RORDER_MODE_OUT << ALX_DMA_RORDER_MODE_SHIFT |
   1018	      ALX_DMA_RREQ_PRI_DATA |
   1019	      max_payload << ALX_DMA_RREQ_BLEN_SHIFT |
   1020	      ALX_DMA_WDLY_CNT_DEF << ALX_DMA_WDLY_CNT_SHIFT |
   1021	      ALX_DMA_RDLY_CNT_DEF << ALX_DMA_RDLY_CNT_SHIFT |
   1022	      (hw->dma_chnl - 1) << ALX_DMA_RCHNL_SEL_SHIFT;
   1023	alx_write_mem32(hw, ALX_DMA, val);
   1024
   1025	/* default multi-tx-q weights */
   1026	val = ALX_WRR_PRI_RESTRICT_NONE << ALX_WRR_PRI_SHIFT |
   1027	      4 << ALX_WRR_PRI0_SHIFT |
   1028	      4 << ALX_WRR_PRI1_SHIFT |
   1029	      4 << ALX_WRR_PRI2_SHIFT |
   1030	      4 << ALX_WRR_PRI3_SHIFT;
   1031	alx_write_mem32(hw, ALX_WRR, val);
   1032}
   1033
   1034void alx_mask_msix(struct alx_hw *hw, int index, bool mask)
   1035{
   1036	u32 reg, val;
   1037
   1038	reg = ALX_MSIX_ENTRY_BASE + index * PCI_MSIX_ENTRY_SIZE +
   1039		PCI_MSIX_ENTRY_VECTOR_CTRL;
   1040
   1041	val = mask ? PCI_MSIX_ENTRY_CTRL_MASKBIT : 0;
   1042
   1043	alx_write_mem32(hw, reg, val);
   1044	alx_post_write(hw);
   1045}
   1046
   1047
   1048bool alx_get_phy_info(struct alx_hw *hw)
   1049{
   1050	u16  devs1, devs2;
   1051
   1052	if (alx_read_phy_reg(hw, MII_PHYSID1, &hw->phy_id[0]) ||
   1053	    alx_read_phy_reg(hw, MII_PHYSID2, &hw->phy_id[1]))
   1054		return false;
   1055
   1056	/* since we haven't PMA/PMD status2 register, we can't
   1057	 * use mdio45_probe function for prtad and mmds.
   1058	 * use fixed MMD3 to get mmds.
   1059	 */
   1060	if (alx_read_phy_ext(hw, 3, MDIO_DEVS1, &devs1) ||
   1061	    alx_read_phy_ext(hw, 3, MDIO_DEVS2, &devs2))
   1062		return false;
   1063	hw->mdio.mmds = devs1 | devs2 << 16;
   1064
   1065	return true;
   1066}
   1067
   1068void alx_update_hw_stats(struct alx_hw *hw)
   1069{
   1070	/* RX stats */
   1071	hw->stats.rx_ok          += alx_read_mem32(hw, ALX_MIB_RX_OK);
   1072	hw->stats.rx_bcast       += alx_read_mem32(hw, ALX_MIB_RX_BCAST);
   1073	hw->stats.rx_mcast       += alx_read_mem32(hw, ALX_MIB_RX_MCAST);
   1074	hw->stats.rx_pause       += alx_read_mem32(hw, ALX_MIB_RX_PAUSE);
   1075	hw->stats.rx_ctrl        += alx_read_mem32(hw, ALX_MIB_RX_CTRL);
   1076	hw->stats.rx_fcs_err     += alx_read_mem32(hw, ALX_MIB_RX_FCS_ERR);
   1077	hw->stats.rx_len_err     += alx_read_mem32(hw, ALX_MIB_RX_LEN_ERR);
   1078	hw->stats.rx_byte_cnt    += alx_read_mem32(hw, ALX_MIB_RX_BYTE_CNT);
   1079	hw->stats.rx_runt        += alx_read_mem32(hw, ALX_MIB_RX_RUNT);
   1080	hw->stats.rx_frag        += alx_read_mem32(hw, ALX_MIB_RX_FRAG);
   1081	hw->stats.rx_sz_64B      += alx_read_mem32(hw, ALX_MIB_RX_SZ_64B);
   1082	hw->stats.rx_sz_127B     += alx_read_mem32(hw, ALX_MIB_RX_SZ_127B);
   1083	hw->stats.rx_sz_255B     += alx_read_mem32(hw, ALX_MIB_RX_SZ_255B);
   1084	hw->stats.rx_sz_511B     += alx_read_mem32(hw, ALX_MIB_RX_SZ_511B);
   1085	hw->stats.rx_sz_1023B    += alx_read_mem32(hw, ALX_MIB_RX_SZ_1023B);
   1086	hw->stats.rx_sz_1518B    += alx_read_mem32(hw, ALX_MIB_RX_SZ_1518B);
   1087	hw->stats.rx_sz_max      += alx_read_mem32(hw, ALX_MIB_RX_SZ_MAX);
   1088	hw->stats.rx_ov_sz       += alx_read_mem32(hw, ALX_MIB_RX_OV_SZ);
   1089	hw->stats.rx_ov_rxf      += alx_read_mem32(hw, ALX_MIB_RX_OV_RXF);
   1090	hw->stats.rx_ov_rrd      += alx_read_mem32(hw, ALX_MIB_RX_OV_RRD);
   1091	hw->stats.rx_align_err   += alx_read_mem32(hw, ALX_MIB_RX_ALIGN_ERR);
   1092	hw->stats.rx_bc_byte_cnt += alx_read_mem32(hw, ALX_MIB_RX_BCCNT);
   1093	hw->stats.rx_mc_byte_cnt += alx_read_mem32(hw, ALX_MIB_RX_MCCNT);
   1094	hw->stats.rx_err_addr    += alx_read_mem32(hw, ALX_MIB_RX_ERRADDR);
   1095
   1096	/* TX stats */
   1097	hw->stats.tx_ok          += alx_read_mem32(hw, ALX_MIB_TX_OK);
   1098	hw->stats.tx_bcast       += alx_read_mem32(hw, ALX_MIB_TX_BCAST);
   1099	hw->stats.tx_mcast       += alx_read_mem32(hw, ALX_MIB_TX_MCAST);
   1100	hw->stats.tx_pause       += alx_read_mem32(hw, ALX_MIB_TX_PAUSE);
   1101	hw->stats.tx_exc_defer   += alx_read_mem32(hw, ALX_MIB_TX_EXC_DEFER);
   1102	hw->stats.tx_ctrl        += alx_read_mem32(hw, ALX_MIB_TX_CTRL);
   1103	hw->stats.tx_defer       += alx_read_mem32(hw, ALX_MIB_TX_DEFER);
   1104	hw->stats.tx_byte_cnt    += alx_read_mem32(hw, ALX_MIB_TX_BYTE_CNT);
   1105	hw->stats.tx_sz_64B      += alx_read_mem32(hw, ALX_MIB_TX_SZ_64B);
   1106	hw->stats.tx_sz_127B     += alx_read_mem32(hw, ALX_MIB_TX_SZ_127B);
   1107	hw->stats.tx_sz_255B     += alx_read_mem32(hw, ALX_MIB_TX_SZ_255B);
   1108	hw->stats.tx_sz_511B     += alx_read_mem32(hw, ALX_MIB_TX_SZ_511B);
   1109	hw->stats.tx_sz_1023B    += alx_read_mem32(hw, ALX_MIB_TX_SZ_1023B);
   1110	hw->stats.tx_sz_1518B    += alx_read_mem32(hw, ALX_MIB_TX_SZ_1518B);
   1111	hw->stats.tx_sz_max      += alx_read_mem32(hw, ALX_MIB_TX_SZ_MAX);
   1112	hw->stats.tx_single_col  += alx_read_mem32(hw, ALX_MIB_TX_SINGLE_COL);
   1113	hw->stats.tx_multi_col   += alx_read_mem32(hw, ALX_MIB_TX_MULTI_COL);
   1114	hw->stats.tx_late_col    += alx_read_mem32(hw, ALX_MIB_TX_LATE_COL);
   1115	hw->stats.tx_abort_col   += alx_read_mem32(hw, ALX_MIB_TX_ABORT_COL);
   1116	hw->stats.tx_underrun    += alx_read_mem32(hw, ALX_MIB_TX_UNDERRUN);
   1117	hw->stats.tx_trd_eop     += alx_read_mem32(hw, ALX_MIB_TX_TRD_EOP);
   1118	hw->stats.tx_len_err     += alx_read_mem32(hw, ALX_MIB_TX_LEN_ERR);
   1119	hw->stats.tx_trunc       += alx_read_mem32(hw, ALX_MIB_TX_TRUNC);
   1120	hw->stats.tx_bc_byte_cnt += alx_read_mem32(hw, ALX_MIB_TX_BCCNT);
   1121	hw->stats.tx_mc_byte_cnt += alx_read_mem32(hw, ALX_MIB_TX_MCCNT);
   1122
   1123	hw->stats.update         += alx_read_mem32(hw, ALX_MIB_UPDATE);
   1124}