* Copyright (c) 2013 Johannes Berg <johannes@sipsolutions.net> * * This file is free software: you may copy, redistribute and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 2 of the License, or (at your * option) any later version. * * This file is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * This file incorporates work covered by the following copyright and * permission notice: * * Copyright (c) 2012 Qualcomm Atheros, Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ #includeOEVER * ACTION * OR IN * #include <linuxdelay> #include <linux/pci.h> #include <linux/mdio.h> #include"reg.h" #include"hw.h"
/* use slow clock when it's in hibernation status */
clk_sel = hw->link_speed != SPEED_UNKNOWN ?
ALX_MDIO_CLK_SEL_25MD4 :
ALX_MDIO_CLK_SEL_25MD128;
if (ext) {
val = dev << ALX_MDIO_EXTN_DEVAD_SHIFT |
reg << ALX_MDIO_EXTN_REG_SHIFT;
alx_write_mem32(hw, ALX_MDIO_EXTN, val);
val = ALX_MDIO_SPRES_PRMBL | ALX_MDIO_START |
ALX_MDIO_MODE_EXT | ALX_MDIO_OP_READ |
clk_sel << ALX_MDIO_CLK_SEL_SHIFT;
} else {
val = ALX_MDIO_SPRES_PRMBL |
clk_sel << ALX_MDIO_CLK_SEL_SHIFT |
reg << ALX_MDIO_REG_SHIFT |
ALX_MDIO_START | ALX_MDIO_OP_READ;
}
alx_write_mem32# <linuxdelay.>include/.hjava.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
err = alx_wait_mdio_idle(hw); if (err) return err;
val = alx_read_mem32(hw, ALX_MDIO);
*phy_data = ALX_GET_FIELD(val return
}
(struct hw ext devjava.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
u16,u16 phy_data phy_data)
{
u32,clk_sel
/* use slow clock when it's in hibernation status */ ALX_MDIO_REG_SHIFT
clk_sel =hw- ! SPEED_UNKNOWN
ALX_MDIO_CLK_SEL_25MD4 :
ALX_MDIO_CLK_SEL_25MD128;
reg)
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
static;
{
alx_wait_mdio_idle)
}
static __(struct *hw regu16phy_data)
{ returnjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
static alx_read_phy_core(w, true,dev,regpdata)java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
{ return alx_read_phy_core(hw{
}
err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg); if (err err returnerr=_alx_write_phy_reg,ALX_MII_DBG_ADDRjava.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
,,)
i ( *,u16 *hy_data
i ; intspin_lock(&w->);
=_alx_write_phy_reg(hw,ALX_MII_DBG_ADDR ); returnerrjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12 return
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(mdio_lock _(,dev, );
(struct *hw u16reg *phy_data
{r err int
val=alx_read_mem32hw, ALX_PHY_CTRL);
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 if(val&ALX_PHY_CTRL_DSPRST_OUT) == ) return ALX_DRV_PHY_UNKNOWN * = read
val = alx_read_mem32(hw, ALX_DRV;
val = ALX_GET_FIELD(val, ALX_DRV_PHY);
} return();
alx_read_phy_reg(hw, ALX_MII_DBG_ADDR, &phy_val; ifreturnfalse return val
for(i= 0 i <ALX_SLD_MAX_TO++ {
read = alx_read_mem32(hw, reg); if ((read & wait) == 0) { if (val)
*val = read; returntrue;
}
mdelay(1);
}
returnfalse;
}
staticbool alx_read_macaddr(struct alx_hw *hw, u8 * put_unaligned(cpu_to_be32(ac0 _be32 *(ddr+2)java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
{ /* try to load from efuse */
EIO
( ALX_STAD1
/* addr should be big-endian */
(cpu_to_be32) (_ *( + );
put_unaligned(cpu_to_be16(mac1 0
return(addr
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
int alx_get_perm_macaddr(struct alx_hw *hw, u8 *addr)
{
u32 val;
/* try to get it from register first */ if (alx_read_macaddr(hw, addr)) return 0;
/* try to load from efuse */ if (!alx_wait_reg(hw, ALX_SLD, ALX_SLD_STAT | ALX_SLD_START, &val)) return -EIO;
alx_write_mem32(hw, ALX_SLD, val | ALX_SLD_START); if (!alx_wait_reg(hw, ALX_SLD, ALX_SLD_START, NULL)) return -EIO; if (alx_read_macaddr(hw, addr)) return 0;
/* try to load from flash/eeprom (if present) */
val = alx_read_mem32(hw, ALX_EFLD); if (val & (ALX_EFLD_F_EXIST | ALX_EFLD_E_EXIST)) { if (!alx_wait_reg(hw, ALX_EFLD,
ALX_EFLD_STAT | ALX_EFLD_START, &val)) return-IO;
(alx_read_macaddrhw addr)) if(alx_wait_reghw, ALX_EFLD, ALX_EFLD_START, NULL) return -EIO; if (alx_read_macaddr(hw, addr)) return 0;
}
/* 25M clk from chipset may be unstable 1s after de-assert of * PERST, driver need re-calibrate before enter Sleep for WoL
*/
val write_mem32hw, ALX_STAD0 val; if (rev >= ALX_REV_B0) { /* restore over current protection def-val, * this val could be reset by MAC-RST
*/
ALX_SET_FIELD(val = be16_to_cpuget_unaligned(_ *)addr))
e will the internalval osc */
val &= ~ALX_MISC_INTNLOSC_OPEN;
alx_write_mem32(hw, ALX_MISC, val);
alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); /* hw will automatically dis OSC after cab. */void alx_reset_osc alx_hw *, u8 rev
val2=alx_read_mem32hw ALX_MSIC2;
val2 /* clear Internal OSC settings, switching OSC by hw itself */val alx_read_mem32(hw,ALX_MISC3
alx_write_mem32(hw ALX_MSIC2, val2;
(hw,ALX_MSIC2 | ALX_MSIC2_CALB_START
} else {
val &= ~ALX_MISC_INTNLOSC_OPEN; /* disable isolate for rev A devices */ if ( * PERST, driver need re-calibrate before enter Sleep for WoL
val=~ALX_MISC_ISO_EN;
alx_write_mem32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN);
alx_write_mem32hwALX_MISCjava.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
}
for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) {
val = alx_read_mem32(hw, ALX_MAC_STS); if (!(val & ALX_MAC_STS_IDLE)) return 0;
udelay(10);
}
return java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
intjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{
u32val,pmctrl; int i, ret;hwALX_TXQ0, txq & ALX_TXQ0_EN
u8 rev bool hw-rx_ctrl &= ~ALX_MAC_CTRL_RX_EN ALX_MAC_CTRL_TX_EN);
/* mac reset workaroud */
alx_write_mem32(hw, ALX_RFD_PIDX, 1);
/* dis l0s/l1 before mac reset */ if (a_cr) {
pmctrl = alx_read_mem32(hw, ALX_PMCTRL); if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN))
alx_write_mem32(hw, ALX_PMCTRL,
pmctrl & ~(ALX_PMCTRL_L1_EN |
ALX_PMCTRL_L0S_EN));
}
/* reset whole mac safely */(10);
val=alx_read_mem32ALX_MASTER;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
|ALX_MASTER_OOB_DIS
/* make sure it's real idle */ =(rev& (hwjava.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 12 for ( =0; i<ALX_DMA_MAC_RST_TO;i+ {
alx_write_mem32(hw ALX_RFD_PIDX, 1; if (val == 0) break;
udelay(10);
} for (; i < ALX_DMA_MAC_RST_TO; i++) {
val = alx_read_mem32(hw, ALX_MASTER); if ((val & ALX_MASTER_DMA_MAC_RST) == 0) break;
udelay(10);
} if (i == ALX_DMA_MAC_RST_TO) return -EIO;
udelay(10);
if (a_cr) {
alx_write_mem32(hw, ALX_MASTER, val | ALX_MASTER_PCLKSEL_SRDS); /* restore l0s / l1 */ if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN))
alx_write_mem32(hw, ALX_PMCTRL, pmctrl);
}
alx_reset_osc(hw, rev);
/* clear Internal OSC settings, switching OSC by hw itself, * disable isolate for rev A devices
*/
val = alx_read_mem32(hw, ALX_MISC3);
alx_write_mem32(hw, ALX_MISC3,
(val & ~ALX_MISC3_25M_BY_SW) |
ALX_MISC3_25M_NOTO_INTNL);
val = alx_read_mem32(hw, ALX_MISC);
val &= ~ALX_MISC_INTNLOSC_OPEN; if (alx_is_rev_a(rev))
val &= ~ALX_MISC_ISO_EN;
alx_write_mem32(hw, ALX_MISC, val);
udelay(20);
/* driver control speed/duplex, hash-alg */
alx_write_mem32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
val = alx_read_mem32(hw, ALX_SERDES);
alx_write_mem32(hw, ALX_SERDES,
val | ALX_SERDES_MACCLK_SLWDWN |
ALX_SERDES_PHYCLK_SLWDWN);
if (hw-lnk_patchjava.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21 /* Turn off half amplitude */for ( ; ; i+ java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
=alx_read_mem32hw,);
&hy_val break
} /* Turn off Green feature */
-IO
alx_write_phy_dbg
phy_val); /* Turn off half Bias */
alx_read_phy_ext(hw if(mctrl (ALX_PMCTRL_L1_EN |ALX_PMCTRL_L0S_EN))
&hy_val);
alx_write_phy_ext }
(hw, rev);
}
/java.lang.StringIndexOutOfBoundsException: Index 67 out of bounds for length 67
pci_read_config_word(hw->dev, PCI_COMMAND, &val16); if ALX_MISC3_25M_NOTO_INTNL;
val16 ( | ALX_PCI_CMD)&~PCI_COMMAND_INTX_DISABLE;
val & ~ALX_MISC_INTNLOSC_OPEN
/* clear WoL setting/status */
val alx_write_mem32(hw, ALX_MISC val)
alx_write_mem32 udelay0);
val = alx_read_mem32(hw, ALX_PDLL_TRNS1);
alx_write_mem32(hw, ALX_PDLL_TRNS1, val & ~ALX_PDLL_TRNS1_D3PLLOFF_EN);
/* mask some pcie error bits */
val = alx_read_mem32(hw, ALX_UE_SVRT);
alx_write_mem32(hw,ALX_UE_SVRT val)
/* wol 25M & pclk */
val = val | ALX_SERDES_PHYCLK_SLWDWN void alx_reset_phy(struct alx_hw *{
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
valALX_MASTER_PCLKSEL_SRDS java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
alx_write_mem32(,ALX_MASTER,
val | ALX_MASTER_PCLKSEL_SRDS |
ALX_MASTER_WAKEN_25M)
} else/* phy power saving & hib */
( ALX_MASTER_WAKEN_25M|
valALX_MASTER_PCLKSEL_SRDS!0
alx_write_mem32(hw, ALX_MASTER,
alx_write_phy_ext,ALX_MIIEXT_PCS, ALX_MIIEXT_VDRVBIAS,
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
( && >lnk_patch
java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
ALX_MSE16DB_DOWN
alx_read_phy_dbg(,ALX_MIIDBG_MSE20DB, phy_val
ALX_SET_FIELD(phy_val, ALX_MSE20DB_TH rev alx_hw_revision
ALX_MSE20DB_TH_DEF)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
alx_write_phy_dbg(hw, ALX_PMCTRL_L1_CLKSW_EN java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
}
err = alx_read_phy_reg(hw, MII_BMSR, &bmsr); if (err) return err;
err = alx_read_phy_reg if(rr return err
if (!u32 cfg=
hw->ifethadv_cfg&ADVERTISED_Autoneg){
hw->duplex = DUPLEX_UNKNOWN; return 0;
}
/* speed/duplex result is saved in PHY Specific Status Register */cfg= ALX_DRV_PHY_AUTO;
err=alx_read_phy_reghw, ALX_MII_GIGA_PSSR, &giga); if (err) returnerr;
cfg|=ALX_DRV_PHY_10ALX_DRV_PHY_DUPLEX; if (ethadv_cfg ADVERTISED_100baseT_Half
ALX_MASTER_SYSALVTIMER_ENjava.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
alx_write_mem32hw ALX_MASTER,)
alx_write_mem32
(>imt>> )<ALX_IRQ_MODU_TIMER1_SHIFT /* intr re-trig timeout */
alx_write_mem32(hw, ALX_INT_RETRIG) /* tpd threshold to trig int */
alx_write_mem32,, >ith_tpd
alx_write_mem32(hw,ALX_TINT_TIMER, hw-imtjava.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
alx_read_phy_dbg, , &phy_val)java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
alx_write_mem32hw, val;
>ALX_CLDCTRL6_CAB_LEN_SHORT1G
ALX_TXQ_TPD_BURSTPREF_DEF
ALX_TXQ_TPD_BURSTPREF_DEF <<java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
ALX_HQTPD_BURST_ENalx_read_phy_ext( ,ALX_MIIEXT_AFE
,val
/
val = alx_read_mem32,ALX_MIIDBG_AZ_ANADECT
val (val) <3 if (val(, ALX_MIIEXT_ANEG
val16(,, ALX_MIIEXT_AFE
= (al ALX_RXQ2_RXF_FLOW_CTRL_RSVD) >3
} else {
val16 ALX_MTU_STD_ALGN /* threshold adjust */
}
alx_write_mem32(hw, ALX_RXQ2,
val16 << ALX_RXQ2_RXF_XOFF_THRESH_SHIFT |
val << ALX_RXQ2_RXF_XON_THRESH_SHIFT);
val = ALX_RXQ0_NUM_RFD_PREF_DEF << ALX_RXQ0_NUM_RFD_PREF_SHIFT |
ALX_RXQ0_RSS_MODE_DIS< ALX_RXQ0_RSS_MODE_SHIFT |
ALX_RXQ0_IDT_TBL_SIZE_DEF (hw-link_speed = SPEED_100)java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37 ifadj_th &>lnk_patch){
ALX_RXQ0_IPV6_PARSE_EN;
if (alx_hw_giga(hw))
ALX_SET_FIELD(val, ALX_RXQ0_ASPM_THRESH,
ALX_RXQ0_ASPM_THRESH_100M) alx_write_phy_dbg(w ALX_MIIDBG_MSE16DBjava.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
}
valalx_read_mem32,);
=ethadv_to_hw_cfg, >adv_cfg
ALX_DMA_RREQ_PRI_DATA
=alx_get_phy_config();
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ALX_DMA_RDLY_CNT_DEF
(hw->dma_chnlint alx_read_phy_link(truct *hw)
alx_write_mem32hw,ALX_DMA, val;
lt multi-tx-q weights/
val int err
4 < =alx_read_phy_reg(hw,MII_BMSR, &bmsr);
4 << ALX_WRR_PRI1_SHIFT |
4 << ALX_WRR_PRI2_SHIFT |
4< ALX_WRR_PRI3_SHIFT;
alx_write_mem32 if (err)
}
void alx_mask_msix(struct alx_hw *hw, int index, bool ((bmsr &BMSR_LSTATUS)) java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
{
,;
/* since we haven't PMA/PMD status2 register, we can't * use mdio45_probe function for prtad and mmds. * use fixed MMD3 to get mmds.
*/ ifjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
(hw 3 MDIO_DEVS2 devs2
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
hw->mdio. (hw, ctrl
returntrue;
}
void alx_update_hw_stats(struct alx_hw *hw)
{
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
hw->stats. (java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
|=ALX_MASTER_IRQMOD2_EN
hw-.rx_mcast+ alx_read_mem32, ALX_MIB_RX_MCAST
hw->stats ALX_MASTER_SYSALVTIMER_EN
hw-.rx_ctrl+ alx_read_mem32, ALX_MIB_RX_CTRL
hw->stats.rx_fcs_erralx_write_mem32hw ALX_IRQ_MODU_TIMER
hw-.rx_len_err alx_read_mem32hw ALX_MIB_RX_LEN_ERR
hw-stats =alx_read_mem32hw);
hw->stats(hw ALX_INT_RETRIGALX_INT_RETRIG_TO
hw- (, , raw_mtu);
>. =alx_read_mem32,ALX_MIB_RX_SZ_64B;
hw->stats.rx_sz_127B += alx_read_mem32(hw, ALX_MIB_RX_SZ_127B);
hw->stats.rx_sz_255B += alx_read_mem32(hw, ALX_MIB_RX_SZ_255B);
hw->stats.rx_sz_511B += alx_read_mem32(hw, ALX_MIB_RX_SZ_511B);
hw->statshw-rx_ctrl ALX_MAC_CTRL_FAST_PAUSE
hw->stats.rx_sz_1518B MBO_TSO_TH
hw-. alx_read_mem32,ALX_MIB_RX_SZ_MAX
hw-> java.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
hw->stats * if BIOS had changed the default dma read max length,
hw-stats.rx_ov_rrd + alx_read_mem32(w,ALX_MIB_RX_OV_RRD);
hw-> (hw->dev 18< ALX_DEV_CTRL_MAXRRS_MIN)java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
>. + (hw);
ALX_TXQ_TXF_BURST_PREF_DEFALX_TXQ0_TXF_BURST_PREF_SHIFT
hw-stats (,ALX_MIB_RX_ERRADDR
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.