2
* Copyright (c) 2012 Qualcomm Atheros, Inc.
4
* Permission to use, copy, modify, and/or distribute this software for any
5
* purpose with or without fee is hereby granted, provided that the above
6
* copyright notice and this permission notice appear in all copies.
8
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
#include <linux/pci.h>
17
#include <linux/crc32.h>
18
#include <linux/etherdevice.h>
19
#include <linux/mdio.h>
24
#define ALX_REV_A(_r) ((_r) == ALX_REV_A0 || (_r) == ALX_REV_A1)
26
/* get permanent mac address from */
27
int alx_get_perm_macaddr(struct alx_hw *hw, u8 *addr)
32
#define INTN_LOADED 0x1
33
#define EXTN_LOADED 0x2
40
/* get it from register first */
41
ALX_MEM_R32(hw, ALX_STAD0, &mac0);
42
ALX_MEM_R32(hw, ALX_STAD1, &mac1);
44
/* addr should be big-endian */
45
*(__be32 *)(addr + 2) = cpu_to_be32(mac0);
46
*(__be16 *)addr = cpu_to_be16((u16)mac1);
48
if (is_valid_ether_addr(addr))
51
if ((flag & INTN_LOADED) == 0) {
52
/* load from efuse ? */
53
for (i = 0; i < ALX_SLD_MAX_TO; i++) {
54
ALX_MEM_R32(hw, ALX_SLD, &val);
55
if ((val & (ALX_SLD_STAT | ALX_SLD_START)) == 0)
59
if (i == ALX_SLD_MAX_TO)
61
ALX_MEM_W32(hw, ALX_SLD, val | ALX_SLD_START);
62
for (i = 0; i < ALX_SLD_MAX_TO; i++) {
64
ALX_MEM_R32(hw, ALX_SLD, &val);
65
if ((val & ALX_SLD_START) == 0)
68
if (i == ALX_SLD_MAX_TO)
74
if ((flag & EXTN_LOADED) == 0) {
75
ALX_MEM_R32(hw, ALX_EFLD, &val);
76
if ((val & (ALX_EFLD_F_EXIST | ALX_EFLD_E_EXIST)) != 0) {
77
/* load from eeprom/flash ? */
78
for (i = 0; i < ALX_SLD_MAX_TO; i++) {
79
ALX_MEM_R32(hw, ALX_EFLD, &val);
80
if ((val & (ALX_EFLD_STAT |
81
ALX_EFLD_START)) == 0) {
86
if (i == ALX_SLD_MAX_TO)
88
ALX_MEM_W32(hw, ALX_EFLD, val | ALX_EFLD_START);
89
for (i = 0; i < ALX_SLD_MAX_TO; i++) {
91
ALX_MEM_R32(hw, ALX_EFLD, &val);
92
if ((val & ALX_EFLD_START) == 0)
95
if (i == ALX_SLD_MAX_TO)
103
return ALX_ERR_ALOAD;
106
void alx_set_macaddr(struct alx_hw *hw, u8 *addr)
110
/* for example: 00-0B-6A-F6-00-DC * STAD0=6AF600DC, STAD1=000B */
111
val = be32_to_cpu(*(__be32 *)(addr + 2));
112
ALX_MEM_W32(hw, ALX_STAD0, val);
113
val = be16_to_cpu(*(__be16 *)addr);
114
ALX_MEM_W32(hw, ALX_STAD1, val);
117
void alx_add_mc_addr(struct alx_hw *hw, u8 *addr)
121
crc32 = ether_crc(ETH_ALEN, addr);
123
/* The HASH Table is a register array of 2 32-bit registers.
124
* It is treated like an array of 64 bits. We want to set
125
* bit BitArray[hash_value]. So we figure out what register
126
* the bit is in, read it, OR in the new bit, then write
127
* back the new value. The register is determined by the
128
* upper 7 bits of the hash value and the bit within that
129
* register are determined by the lower 5 bits of the value.
131
reg = (crc32 >> 31) & 0x1;
132
bit = (crc32 >> 26) & 0x1F;
134
hw->mc_hash[reg] |= (0x1 << bit);
137
void alx_enable_osc(struct alx_hw *hw)
142
ALX_MEM_R32(hw, ALX_MISC, &val);
143
ALX_MEM_W32(hw, ALX_MISC, val & ~ALX_MISC_INTNLOSC_OPEN);
144
ALX_MEM_W32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN);
147
void alx_reset_osc(struct alx_hw *hw, u8 rev)
151
/* clear Internal OSC settings, switching OSC by hw itself */
152
ALX_MEM_R32(hw, ALX_MISC3, &val);
153
ALX_MEM_W32(hw, ALX_MISC3,
154
(val & ~ALX_MISC3_25M_BY_SW) | ALX_MISC3_25M_NOTO_INTNL);
156
/* 25M clk from chipset may be unstable 1s after de-assert of
157
* PERST, driver need re-calibrate before enter Sleep for WoL
159
ALX_MEM_R32(hw, ALX_MISC, &val);
160
if (rev >= ALX_REV_B0) {
161
/* restore over current protection def-val,
162
* this val could be reset by MAC-RST
164
FIELD_SET32(val, ALX_MISC_PSW_OCP, ALX_MISC_PSW_OCP_DEF);
165
/* a 0->1 change will update the internal val of osc */
166
val &= ~ALX_MISC_INTNLOSC_OPEN;
167
ALX_MEM_W32(hw, ALX_MISC, val);
168
ALX_MEM_W32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN);
169
/* hw will automatically dis OSC after cab. */
170
ALX_MEM_R32(hw, ALX_MSIC2, &val2);
171
val2 &= ~ALX_MSIC2_CALB_START;
172
ALX_MEM_W32(hw, ALX_MSIC2, val2);
173
ALX_MEM_W32(hw, ALX_MSIC2, val2 | ALX_MSIC2_CALB_START);
175
val &= ~ALX_MISC_INTNLOSC_OPEN;
176
/* disable isoloate for A0 */
178
val &= ~ALX_MISC_ISO_EN;
180
ALX_MEM_W32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN);
181
ALX_MEM_W32(hw, ALX_MISC, val);
187
int alx_reset_mac(struct alx_hw *hw)
195
rev = (u8)ALX_REVID(hw);
196
a_cr = ALX_REV_A(rev) && ALX_WITH_CR(hw);
198
/* disable all interrupts, RXQ/TXQ */
199
ALX_MEM_W32(hw, ALX_MSIX_MASK, 0xFFFFFFFF);
200
ALX_MEM_W32(hw, ALX_IMR, 0);
201
ALX_MEM_W32(hw, ALX_ISR, ALX_ISR_DIS);
203
ret = alx_stop_mac(hw);
207
/* mac reset workaroud */
208
ALX_MEM_W32(hw, ALX_RFD_PIDX, 1);
210
/* dis l0s/l1 before mac reset */
212
ALX_MEM_R32(hw, ALX_PMCTRL, &pmctrl);
213
if ((pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN)) != 0) {
214
ALX_MEM_W32(hw, ALX_PMCTRL,
215
pmctrl & ~(ALX_PMCTRL_L1_EN |
220
/* reset whole mac safely */
221
ALX_MEM_R32(hw, ALX_MASTER, &val);
222
ALX_MEM_W32(hw, ALX_MASTER,
223
val | ALX_MASTER_DMA_MAC_RST | ALX_MASTER_OOB_DIS);
225
/* make sure it's real idle */
227
for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) {
228
ALX_MEM_R32(hw, ALX_RFD_PIDX, &val);
233
for (; i < ALX_DMA_MAC_RST_TO; i++) {
234
ALX_MEM_R32(hw, ALX_MASTER, &val);
235
if ((val & ALX_MASTER_DMA_MAC_RST) == 0)
239
if (i == ALX_DMA_MAC_RST_TO)
240
return ALX_ERR_RSTMAC;
244
/* set ALX_MASTER_PCLKSEL_SRDS (affect by soft-rst, PERST) */
245
ALX_MEM_W32(hw, ALX_MASTER, val | ALX_MASTER_PCLKSEL_SRDS);
246
/* resoter l0s / l1 */
247
if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN))
248
ALX_MEM_W32(hw, ALX_PMCTRL, pmctrl);
251
alx_reset_osc(hw, rev);
252
/* clear Internal OSC settings, switching OSC by hw itself,
253
* disable isoloate for A version
255
ALX_MEM_R32(hw, ALX_MISC3, &val);
256
ALX_MEM_W32(hw, ALX_MISC3,
257
(val & ~ALX_MISC3_25M_BY_SW) | ALX_MISC3_25M_NOTO_INTNL);
258
ALX_MEM_R32(hw, ALX_MISC, &val);
259
val &= ~ALX_MISC_INTNLOSC_OPEN;
261
val &= ~ALX_MISC_ISO_EN;
262
ALX_MEM_W32(hw, ALX_MISC, val);
265
/* driver control speed/duplex, hash-alg */
266
ALX_MEM_W32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
269
ALX_MEM_R32(hw, ALX_SERDES, &val);
270
ALX_MEM_W32(hw, ALX_SERDES,
271
val | ALX_SERDES_MACCLK_SLWDWN | ALX_SERDES_PHYCLK_SLWDWN);
273
/* mac reset cause MDIO ctrl restore non-polling status */
275
__alx_start_phy_polling(hw, ALX_MDIO_CLK_SEL_25MD128);
282
* completely reset phy, all settings/workaround will be re-configureed
283
* hib_en: enable/disable hibernation on PHY
285
void alx_reset_phy(struct alx_hw *hw, bool hib_en)
291
/* (DSP)reset PHY core */
292
ALX_MEM_R32(hw, ALX_PHY_CTRL, &val);
293
val &= ~(ALX_PHY_CTRL_DSPRST_OUT | ALX_PHY_CTRL_IDDQ |
294
ALX_PHY_CTRL_GATE_25M | ALX_PHY_CTRL_POWER_DOWN |
296
val |= ALX_PHY_CTRL_RST_ANALOG;
299
val |= (ALX_PHY_CTRL_HIB_PULSE | ALX_PHY_CTRL_HIB_EN);
301
val &= ~(ALX_PHY_CTRL_HIB_PULSE | ALX_PHY_CTRL_HIB_EN);
302
ALX_MEM_W32(hw, ALX_PHY_CTRL, val);
304
ALX_MEM_W32(hw, ALX_PHY_CTRL, val | ALX_PHY_CTRL_DSPRST_OUT);
307
for (i = 0; i < ALX_PHY_CTRL_DSPRST_TO; i++)
313
/* phy power saving & hib */
315
alx_write_phy_dbg(hw, ALX_MIIDBG_LEGCYPS, ALX_LEGCYPS_DEF);
316
alx_write_phy_dbg(hw, ALX_MIIDBG_SYSMODCTRL,
317
ALX_SYSMODCTRL_IECHOADJ_DEF);
318
alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_VDRVBIAS,
321
alx_write_phy_dbg(hw, ALX_MIIDBG_LEGCYPS,
322
ALX_LEGCYPS_DEF & ~ALX_LEGCYPS_EN);
323
alx_write_phy_dbg(hw, ALX_MIIDBG_HIBNEG, ALX_HIBNEG_NOHIB);
324
alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG, ALX_GREENCFG_DEF);
327
/* EEE advertisement */
328
if (ALX_CAP(hw, AZ)) {
329
alx_write_phy_ext(hw, ALX_MIIEXT_ANEG,
330
ALX_MIIEXT_LOCAL_EEEADV,
332
ALX_LOCAL_EEEADV_1000BT | ALX_LOCAL_EEEADV_100BT :
333
ALX_LOCAL_EEEADV_100BT);
335
alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT,
338
ALX_MEM_R32(hw, ALX_LPI_CTRL, &val);
339
ALX_MEM_W32(hw, ALX_LPI_CTRL, val & ~ALX_LPI_CTRL_EN);
340
alx_write_phy_ext(hw, ALX_MIIEXT_ANEG,
341
ALX_MIIEXT_LOCAL_EEEADV, 0);
344
/* phy power saving */
345
alx_write_phy_dbg(hw, ALX_MIIDBG_TST10BTCFG, ALX_TST10BTCFG_DEF);
346
alx_write_phy_dbg(hw, ALX_MIIDBG_SRDSYSMOD, ALX_SRDSYSMOD_DEF);
347
alx_write_phy_dbg(hw, ALX_MIIDBG_TST100BTCFG, ALX_TST100BTCFG_DEF);
348
alx_write_phy_dbg(hw, ALX_MIIDBG_ANACTRL, ALX_ANACTRL_DEF);
349
alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val);
350
alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2,
351
phy_val & ~ALX_GREENCFG2_GATE_DFSE_EN);
352
/* rtl8139c, 120m issue */
353
alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_NLP78,
354
ALX_MIIEXT_NLP78_120M_DEF);
355
alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_S3DIG10,
356
ALX_MIIEXT_S3DIG10_DEF);
359
/* Turn off half amplitude */
360
alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3,
362
alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3,
363
phy_val | ALX_CLDCTRL3_BP_CABLE1TH_DET_GT);
364
/* Turn off Green feature */
365
alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val);
366
alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2,
367
phy_val | ALX_GREENCFG2_BP_GREEN);
368
/* Turn off half Bias */
369
alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5,
371
alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5,
372
phy_val | ALX_CLDCTRL5_BP_VD_HLFBIAS);
376
/* set phy interrupt mask */
377
alx_write_phy_reg(hw, ALX_MII_IER,
378
ALX_IER_LINK_UP | ALX_IER_LINK_DOWN);
381
#define ALX_PCI_CMD (\
382
PCI_COMMAND_MASTER |\
383
PCI_COMMAND_MEMORY |\
387
* reset pcie relative registers (pci command, clk, aspm...)
389
void alx_reset_pcie(struct alx_hw *hw)
393
u8 rev = (u8)ALX_REVID(hw);
395
/* Workaround for PCI problem when BIOS sets MMRBC incorrectly. */
396
ALX_CFG_R16(hw, PCI_COMMAND, &val16);
397
if (!(val16 & ALX_PCI_CMD) || (val16 & PCI_COMMAND_INTX_DISABLE)) {
398
val16 = (val16 | ALX_PCI_CMD) & ~PCI_COMMAND_INTX_DISABLE;
399
ALX_CFG_W16(hw, PCI_COMMAND, val16);
402
/* clear WoL setting/status */
403
ALX_MEM_R32(hw, ALX_WOL0, &val);
404
ALX_MEM_W32(hw, ALX_WOL0, 0);
406
/* deflt val of PDLL D3PLLOFF */
407
ALX_MEM_R32(hw, ALX_PDLL_TRNS1, &val);
408
ALX_MEM_W32(hw, ALX_PDLL_TRNS1, val & ~ALX_PDLL_TRNS1_D3PLLOFF_EN);
410
/* mask some pcie error bits */
411
ALX_MEM_R32(hw, ALX_UE_SVRT, &val);
412
val &= ~(ALX_UE_SVRT_DLPROTERR | ALX_UE_SVRT_FCPROTERR);
413
ALX_MEM_W32(hw, ALX_UE_SVRT, val);
416
ALX_MEM_R32(hw, ALX_MASTER, &val);
417
if (ALX_REV_A(rev) && ALX_WITH_CR(hw)) {
418
if ((val & ALX_MASTER_WAKEN_25M) == 0 ||
419
(val & ALX_MASTER_PCLKSEL_SRDS) == 0) {
420
ALX_MEM_W32(hw, ALX_MASTER,
421
val | ALX_MASTER_PCLKSEL_SRDS |
422
ALX_MASTER_WAKEN_25M);
425
if ((val & ALX_MASTER_WAKEN_25M) == 0 ||
426
(val & ALX_MASTER_PCLKSEL_SRDS) != 0) {
427
ALX_MEM_W32(hw, ALX_MASTER,
428
(val & ~ALX_MASTER_PCLKSEL_SRDS) |
429
ALX_MASTER_WAKEN_25M);
434
alx_enable_aspm(hw, ALX_CAP(hw, L0S), ALX_CAP(hw, L1));
440
* stop the mac, transmit & receive modules
441
* return : 0 if ok, none-0 if busy
443
int alx_stop_mac(struct alx_hw *hw)
448
ALX_MEM_R32(hw, ALX_RXQ0, &rxq);
449
ALX_MEM_W32(hw, ALX_RXQ0, rxq & ~ALX_RXQ0_EN);
450
ALX_MEM_R32(hw, ALX_TXQ0, &txq);
451
ALX_MEM_W32(hw, ALX_TXQ0, txq & ~ALX_TXQ0_EN);
455
hw->rx_ctrl &= ~(ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN);
456
ALX_MEM_W32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
458
for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) {
459
ALX_MEM_R32(hw, ALX_MAC_STS, &val);
460
if (!(val & ALX_MAC_STS_IDLE))
465
return (ALX_DMA_MAC_RST_TO == i) ? ALX_ERR_RSTMAC : 0;
469
* enable rx/tx MAC module
471
void alx_start_mac(struct alx_hw *hw)
475
ALX_MEM_R32(hw, ALX_RXQ0, &rxq);
476
ALX_MEM_W32(hw, ALX_RXQ0, rxq | ALX_RXQ0_EN);
477
ALX_MEM_R32(hw, ALX_TXQ0, &txq);
478
ALX_MEM_W32(hw, ALX_TXQ0, txq | ALX_TXQ0_EN);
481
if (hw->link_duplex == FULL_DUPLEX)
482
mac |= ALX_MAC_CTRL_FULLD;
484
mac &= ~ALX_MAC_CTRL_FULLD;
485
FIELD_SET32(mac, ALX_MAC_CTRL_SPEED, hw->link_speed == SPEED_1000 ?
486
ALX_MAC_CTRL_SPEED_1000 : ALX_MAC_CTRL_SPEED_10_100);
487
mac |= ALX_MAC_CTRL_TX_EN | ALX_MAC_CTRL_RX_EN;
489
ALX_MEM_W32(hw, ALX_MAC_CTRL, mac);
492
/* set flow control on MAC side */
493
void alx_cfg_mac_fc(struct alx_hw *hw, u8 fc)
496
hw->rx_ctrl |= ALX_MAC_CTRL_RXFC_EN;
498
hw->rx_ctrl &= ~ALX_MAC_CTRL_RXFC_EN;
501
hw->rx_ctrl |= ALX_MAC_CTRL_TXFC_EN;
503
hw->rx_ctrl &= ~ALX_MAC_CTRL_TXFC_EN;
505
ALX_MEM_W32(hw, ALX_MAC_CTRL, hw->rx_ctrl);
508
/* enable/disable aspm support */
509
void alx_enable_aspm(struct alx_hw *hw, bool l0s_en, bool l1_en)
512
u8 rev = (u8)ALX_REVID(hw);
514
ALX_MEM_R32(hw, ALX_PMCTRL, &pmctrl);
516
FIELD_SET32(pmctrl, ALX_PMCTRL_LCKDET_TIMER,
517
ALX_PMCTRL_LCKDET_TIMER_DEF);
518
pmctrl |= ALX_PMCTRL_RCVR_WT_1US |
519
ALX_PMCTRL_L1_CLKSW_EN |
520
ALX_PMCTRL_L1_SRDSRX_PWD ;
521
FIELD_SET32(pmctrl, ALX_PMCTRL_L1REQ_TO, ALX_PMCTRL_L1REG_TO_DEF);
522
FIELD_SET32(pmctrl, ALX_PMCTRL_L1_TIMER, ALX_PMCTRL_L1_TIMER_16US);
523
pmctrl &= ~(ALX_PMCTRL_L1_SRDS_EN |
524
ALX_PMCTRL_L1_SRDSPLL_EN |
525
ALX_PMCTRL_L1_BUFSRX_EN |
526
ALX_PMCTRL_SADLY_EN |
527
ALX_PMCTRL_HOTRST_WTEN|
530
ALX_PMCTRL_ASPM_FCEN |
531
ALX_PMCTRL_TXL1_AFTER_L0S |
532
ALX_PMCTRL_RXL1_AFTER_L0S
534
if (ALX_REV_A(rev) && ALX_WITH_CR(hw))
535
pmctrl |= ALX_PMCTRL_L1_SRDS_EN | ALX_PMCTRL_L1_SRDSPLL_EN;
538
pmctrl |= (ALX_PMCTRL_L0S_EN | ALX_PMCTRL_ASPM_FCEN);
540
pmctrl |= (ALX_PMCTRL_L1_EN | ALX_PMCTRL_ASPM_FCEN);
542
ALX_MEM_W32(hw, ALX_PMCTRL, pmctrl);
546
/* translate ethtool adv /speed/duplex settting to hw specific value */
547
u32 ethadv_to_hw_cfg(struct alx_hw *hw, u32 ethadv_cfg)
551
if (ethadv_cfg & ADVERTISED_Autoneg) {
552
cfg |= ALX_DRV_PHY_AUTO;
553
if (ethadv_cfg & ADVERTISED_10baseT_Half)
554
cfg |= ALX_DRV_PHY_10;
555
if (ethadv_cfg & ADVERTISED_10baseT_Full)
556
cfg |= ALX_DRV_PHY_10 | ALX_DRV_PHY_DUPLEX;
557
if (ethadv_cfg & ADVERTISED_100baseT_Half)
558
cfg |= ALX_DRV_PHY_100;
559
if (ethadv_cfg & ADVERTISED_100baseT_Full)
560
cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX;
561
if (ethadv_cfg & ADVERTISED_1000baseT_Half)
562
cfg |= ALX_DRV_PHY_1000;
563
if (ethadv_cfg & ADVERTISED_1000baseT_Full)
564
cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX;
565
if (ethadv_cfg & ADVERTISED_Pause)
566
cfg |= ADVERTISE_PAUSE_CAP;
567
if (ethadv_cfg & ADVERTISED_Asym_Pause)
568
cfg |= ADVERTISE_PAUSE_ASYM;
570
cfg |= ALX_DRV_PHY_EEE;
572
switch (ethadv_cfg) {
573
case ADVERTISED_10baseT_Half:
574
cfg |= ALX_DRV_PHY_10;
576
case ADVERTISED_100baseT_Half:
577
cfg |= ALX_DRV_PHY_100;
579
case ADVERTISED_10baseT_Full:
580
cfg |= ALX_DRV_PHY_10 | ALX_DRV_PHY_DUPLEX;
582
case ADVERTISED_100baseT_Full:
583
cfg |= ALX_DRV_PHY_100 | ALX_DRV_PHY_DUPLEX;
591
/* initialize phy for speed / flow control
593
* format from ethtool, we use it for both autoneg and force mode
595
int alx_setup_speed_duplex(struct alx_hw *hw, u32 ethadv, u8 flowctrl)
602
alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, 0);
603
ALX_MEM_R32(hw, ALX_DRV, &val);
604
FIELD_SET32(val, ALX_DRV_PHY, 0);
606
if (ethadv & ADVERTISED_Autoneg) {
607
adv = ADVERTISE_CSMA;
608
adv |= ethtool_adv_to_mii_adv_t(ethadv);
610
if (flowctrl & ALX_FC_ANEG) {
611
if (flowctrl & ALX_FC_RX) {
612
adv |= ADVERTISED_Pause;
613
if (!(flowctrl & ALX_FC_TX))
614
adv |= ADVERTISED_Asym_Pause;
615
} else if (flowctrl & ALX_FC_TX)
616
adv |= ADVERTISED_Asym_Pause;
619
if (ALX_CAP(hw, GIGA))
620
giga = ethtool_adv_to_mii_ctrl1000_t(ethadv);
622
cr = BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART;
624
if (alx_write_phy_reg(hw, MII_ADVERTISE, adv) ||
625
alx_write_phy_reg(hw, MII_CTRL1000, giga) ||
626
alx_write_phy_reg(hw, MII_BMCR, cr))
627
err = ALX_ERR_MIIBUSY;
630
if (ethadv == ADVERTISED_100baseT_Half ||
631
ethadv == ADVERTISED_100baseT_Full)
633
if (ethadv == ADVERTISED_10baseT_Full ||
634
ethadv == ADVERTISED_100baseT_Full)
637
err = alx_write_phy_reg(hw, MII_BMCR, cr);
641
alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, ALX_PHY_INITED);
642
/* save config to HW */
643
val |= ethadv_to_hw_cfg(hw, ethadv);
646
ALX_MEM_W32(hw, ALX_DRV, val);
652
/* do post setting on phy if link up/down event occur */
653
void alx_post_phy_link(struct alx_hw *hw, u16 speed, bool az_en)
655
u16 phy_val, len, agc;
656
u8 revid = (u8)ALX_REVID(hw);
659
if (revid != ALX_REV_B0 &&
660
revid != ALX_REV_A1 &&
661
revid != ALX_REV_A0) {
664
adj_th = (revid == ALX_REV_B0) ? true : false;
666
/* 1000BT/AZ, wrong cable length */
667
if (speed != SPEED_0) {
668
alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL6,
670
len = FIELD_GETX(phy_val, ALX_CLDCTRL6_CAB_LEN);
671
alx_read_phy_dbg(hw, ALX_MIIDBG_AGC, &phy_val);
672
agc = FIELD_GETX(phy_val, ALX_AGC_2_VGA);
674
if ((speed == SPEED_1000 &&
675
(len > ALX_CLDCTRL6_CAB_LEN_SHORT1G ||
676
(0 == len && agc > ALX_AGC_LONG1G_LIMT))) ||
677
(speed == SPEED_100 &&
678
(len > ALX_CLDCTRL6_CAB_LEN_SHORT100M ||
679
(0 == len && agc > ALX_AGC_LONG100M_LIMT)))) {
680
alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT,
681
ALX_AZ_ANADECT_LONG);
682
alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
684
alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
685
phy_val | ALX_AFE_10BT_100M_TH);
687
alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT,
689
alx_read_phy_ext(hw, ALX_MIIEXT_ANEG,
690
ALX_MIIEXT_AFE, &phy_val);
691
alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
692
phy_val & ~ALX_AFE_10BT_100M_TH);
695
/* threashold adjust */
696
if (adj_th && hw->lnk_patch) {
697
if (speed == SPEED_100) {
698
alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB,
700
} else if (speed == SPEED_1000) {
702
* Giga link threshold, raise the tolerance of
705
alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB,
707
FIELD_SETS(phy_val, ALX_MSE20DB_TH,
709
alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB,
713
/* phy link-down in 1000BT/AZ mode */
714
if (az_en && revid == ALX_REV_B0 && speed == SPEED_1000) {
715
alx_write_phy_dbg(hw, ALX_MIIDBG_SRDSYSMOD,
716
ALX_SRDSYSMOD_DEF & ~ALX_SRDSYSMOD_DEEMP_EN);
719
alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
721
alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE,
722
phy_val & ~ALX_AFE_10BT_100M_TH);
724
if (adj_th && hw->lnk_patch) {
725
alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB,
727
alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB, &phy_val);
728
FIELD_SETS(phy_val, ALX_MSE20DB_TH, ALX_MSE20DB_TH_DEF);
729
alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB, phy_val);
731
if (az_en && revid == ALX_REV_B0) {
732
alx_write_phy_dbg(hw, ALX_MIIDBG_SRDSYSMOD,
739
/* do power saving setting befor enter suspend mode
741
* 1. phy link must be established before calling this function
742
* 2. wol option (pattern,magic,link,etc.) is configed before call it.
744
int alx_pre_suspend(struct alx_hw *hw, u16 speed)
746
u32 master, mac, phy, val;
749
ALX_MEM_R32(hw, ALX_MASTER, &master);
750
master &= ~ALX_MASTER_PCLKSEL_SRDS;
753
FIELD_SET32(mac, ALX_MAC_CTRL_SPEED, ALX_MAC_CTRL_SPEED_10_100);
754
mac &= ~(ALX_MAC_CTRL_FULLD | ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN);
756
ALX_MEM_R32(hw, ALX_PHY_CTRL, &phy);
757
phy &= ~(ALX_PHY_CTRL_DSPRST_OUT | ALX_PHY_CTRL_CLS);
758
phy |= ALX_PHY_CTRL_RST_ANALOG | ALX_PHY_CTRL_HIB_PULSE |
761
/* without any activity */
762
if (!(hw->sleep_ctrl & ALX_SLEEP_ACTIVE)) {
763
err = alx_write_phy_reg(hw, ALX_MII_IER, 0);
764
phy |= ALX_PHY_CTRL_IDDQ | ALX_PHY_CTRL_POWER_DOWN;
768
if (hw->sleep_ctrl & (ALX_SLEEP_WOL_MAGIC | ALX_SLEEP_CIFS))
769
mac |= ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_BRD_EN;
770
if (hw->sleep_ctrl & ALX_SLEEP_CIFS)
771
mac |= ALX_MAC_CTRL_TX_EN;
772
if (speed % 10 == FULL_DUPLEX)
773
mac |= ALX_MAC_CTRL_FULLD;
774
if (speed >= SPEED_1000)
775
FIELD_SET32(mac, ALX_MAC_CTRL_SPEED, ALX_MAC_CTRL_SPEED_1000);
776
phy |= ALX_PHY_CTRL_DSPRST_OUT;
777
err = alx_write_phy_ext(hw, ALX_MIIEXT_ANEG,
778
ALX_MIIEXT_S3DIG10, ALX_MIIEXT_S3DIG10_SL);
784
ALX_MEM_W32(hw, ALX_MASTER, master);
785
ALX_MEM_W32(hw, ALX_MAC_CTRL, mac);
786
ALX_MEM_W32(hw, ALX_PHY_CTRL, phy);
788
/* set val of PDLL D3PLLOFF */
789
ALX_MEM_R32(hw, ALX_PDLL_TRNS1, &val);
790
val |= ALX_PDLL_TRNS1_D3PLLOFF_EN;
791
ALX_MEM_W32(hw, ALX_PDLL_TRNS1, val);
797
/* wait mdio module to be idle */
798
bool __alx_wait_mdio_idle(struct alx_hw *hw)
803
for (i = 0; i < ALX_MDIO_MAX_AC_TO; i++) {
804
ALX_MEM_R32(hw, ALX_MDIO, &val);
805
if (!(val & ALX_MDIO_BUSY))
809
return i != ALX_MDIO_MAX_AC_TO;
812
void __alx_stop_phy_polling(struct alx_hw *hw)
817
ALX_MEM_W32(hw, ALX_MDIO, 0);
818
__alx_wait_mdio_idle(hw);
821
void __alx_start_phy_polling(struct alx_hw *hw, u16 clk_sel)
828
val = ALX_MDIO_SPRES_PRMBL |
829
FIELDX(ALX_MDIO_CLK_SEL, clk_sel) |
830
FIELDX(ALX_MDIO_REG, 1) |
833
ALX_MEM_W32(hw, ALX_MDIO, val);
834
__alx_wait_mdio_idle(hw);
835
val |= ALX_MDIO_AUTO_POLLING;
836
val &= ~ALX_MDIO_START;
837
ALX_MEM_W32(hw, ALX_MDIO, val);
841
/* __alx_read_phy_core
842
* core function to read register in PHY via MDIO interface
843
* ext: extension register (see IEEE 802.3)
844
* dev: device address (see IEEE 802.3 DEVAD, PRTAD is fixed to 0)
845
* reg: register to read
847
int __alx_read_phy_core(struct alx_hw *hw, bool ext, u8 dev,
848
u16 reg, u16 *phy_data)
853
__alx_stop_phy_polling(hw);
857
/* use slow clock when it's in hibernation status */
858
clk_sel = !hw->link_up ?
859
ALX_MDIO_CLK_SEL_25MD128 : ALX_MDIO_CLK_SEL_25MD4;
862
val = FIELDX(ALX_MDIO_EXTN_DEVAD, dev) |
863
FIELDX(ALX_MDIO_EXTN_REG, reg);
864
ALX_MEM_W32(hw, ALX_MDIO_EXTN, val);
866
val = ALX_MDIO_SPRES_PRMBL |
867
FIELDX(ALX_MDIO_CLK_SEL, clk_sel) |
872
val = ALX_MDIO_SPRES_PRMBL |
873
FIELDX(ALX_MDIO_CLK_SEL, clk_sel) |
874
FIELDX(ALX_MDIO_REG, reg) |
878
ALX_MEM_W32(hw, ALX_MDIO, val);
880
if (unlikely(!__alx_wait_mdio_idle(hw)))
881
err = ALX_ERR_MIIBUSY;
883
ALX_MEM_R32(hw, ALX_MDIO, &val);
884
*phy_data = (u16)FIELD_GETX(val, ALX_MDIO_DATA);
888
__alx_start_phy_polling(hw, clk_sel);
893
/* __alx_write_phy_core
894
* core function to write to register in PHY via MDIO interface
895
* ext: extension register (see IEEE 802.3)
896
* dev: device address (see IEEE 802.3 DEVAD, PRTAD is fixed to 0)
897
* reg: register to write
899
int __alx_write_phy_core(struct alx_hw *hw, bool ext, u8 dev,
900
u16 reg, u16 phy_data)
905
__alx_stop_phy_polling(hw);
907
/* use slow clock when it's in hibernation status */
908
clk_sel = !hw->link_up ?
909
ALX_MDIO_CLK_SEL_25MD128 : ALX_MDIO_CLK_SEL_25MD4;
912
val = FIELDX(ALX_MDIO_EXTN_DEVAD, dev) |
913
FIELDX(ALX_MDIO_EXTN_REG, reg);
914
ALX_MEM_W32(hw, ALX_MDIO_EXTN, val);
916
val = ALX_MDIO_SPRES_PRMBL |
917
FIELDX(ALX_MDIO_CLK_SEL, clk_sel) |
918
FIELDX(ALX_MDIO_DATA, phy_data) |
922
val = ALX_MDIO_SPRES_PRMBL |
923
FIELDX(ALX_MDIO_CLK_SEL, clk_sel) |
924
FIELDX(ALX_MDIO_REG, reg) |
925
FIELDX(ALX_MDIO_DATA, phy_data) |
928
ALX_MEM_W32(hw, ALX_MDIO, val);
930
if (unlikely(!__alx_wait_mdio_idle(hw)))
931
err = ALX_ERR_MIIBUSY;
933
__alx_start_phy_polling(hw, clk_sel);
938
/* read from PHY normal register */
939
int __alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data)
941
return __alx_read_phy_core(hw, false, 0, reg, phy_data);
944
/* write to PHY normal register */
945
int __alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data)
947
return __alx_write_phy_core(hw, false, 0, reg, phy_data);
950
/* read from PHY extension register */
951
int __alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata)
953
return __alx_read_phy_core(hw, true, dev, reg, pdata);
956
/* write to PHY extension register */
957
int __alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data)
959
return __alx_write_phy_core(hw, true, dev, reg, data);
962
/* read from PHY debug port */
963
int __alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata)
967
err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg);
971
err = __alx_read_phy_reg(hw, ALX_MII_DBG_DATA, pdata);
976
/* write to PHY debug port */
977
int __alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data)
981
err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg);
985
err = __alx_write_phy_reg(hw, ALX_MII_DBG_DATA, data);
990
int alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data)
994
spin_lock(&hw->mdio_lock);
995
err = __alx_read_phy_reg(hw, reg, phy_data);
996
spin_unlock(&hw->mdio_lock);
1001
int alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data)
1005
spin_lock(&hw->mdio_lock);
1006
err = __alx_write_phy_reg(hw, reg, phy_data);
1007
spin_unlock(&hw->mdio_lock);
1012
int alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata)
1016
spin_lock(&hw->mdio_lock);
1017
err = __alx_read_phy_ext(hw, dev, reg, pdata);
1018
spin_unlock(&hw->mdio_lock);
1023
int alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data)
1027
spin_lock(&hw->mdio_lock);
1028
err = __alx_write_phy_ext(hw, dev, reg, data);
1029
spin_unlock(&hw->mdio_lock);
1034
int alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata)
1038
spin_lock(&hw->mdio_lock);
1039
err = __alx_read_phy_dbg(hw, reg, pdata);
1040
spin_unlock(&hw->mdio_lock);
1045
int alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data)
1049
spin_lock(&hw->mdio_lock);
1050
err = __alx_write_phy_dbg(hw, reg, data);
1051
spin_unlock(&hw->mdio_lock);
1056
u16 alx_get_phy_config(struct alx_hw *hw)
1061
ALX_MEM_R32(hw, ALX_PHY_CTRL, &val);
1063
if ((val & ALX_PHY_CTRL_DSPRST_OUT) == 0)
1064
return ALX_DRV_PHY_UNKNOWN;
1066
ALX_MEM_R32(hw, ALX_DRV, &val);
1067
val = FIELD_GETX(val, ALX_DRV_PHY);
1068
if (ALX_DRV_PHY_UNKNOWN == val)
1069
return ALX_DRV_PHY_UNKNOWN;
1071
alx_read_phy_reg(hw, ALX_MII_DBG_ADDR, &phy_val);
1072
if (ALX_PHY_INITED == phy_val)
1075
return ALX_DRV_PHY_UNKNOWN;
1078
bool alx_phy_configed(struct alx_hw *hw)
1082
cfg = ethadv_to_hw_cfg(hw, hw->adv_cfg);
1083
cfg = FIELD_GETX(cfg, ALX_DRV_PHY);
1084
hw_cfg = alx_get_phy_config(hw);
1085
if (hw_cfg == ALX_DRV_PHY_UNKNOWN)
1088
return cfg == hw_cfg;
1091
int alx_get_phy_link(struct alx_hw *hw, bool *link_up, u16 *speed)
1093
struct pci_dev *pdev = hw->pdev;
1097
err = alx_read_phy_reg(hw, MII_BMSR, &bmsr);
1098
err = alx_read_phy_reg(hw, MII_BMSR, &bmsr);
1102
if (!(bmsr & BMSR_LSTATUS)) {
1109
/* speed/duplex result is saved in PHY Specific Status Register */
1110
err = alx_read_phy_reg(hw, ALX_MII_GIGA_PSSR, &giga);
1114
if (!(giga & ALX_GIGA_PSSR_SPD_DPLX_RESOLVED))
1117
switch (giga & ALX_GIGA_PSSR_SPEED) {
1118
case ALX_GIGA_PSSR_1000MBS:
1119
*speed = SPEED_1000;
1121
case ALX_GIGA_PSSR_100MBS:
1124
case ALX_GIGA_PSSR_10MBS:
1130
*speed += (giga & ALX_GIGA_PSSR_DPLX) ? FULL_DUPLEX : HALF_DUPLEX;
1134
dev_err(&pdev->dev, "PHY SPD/DPLX unresolved :%x\n", giga);
1140
int alx_clear_phy_intr(struct alx_hw *hw)
1144
/* clear interrupt status by read it */
1145
return alx_read_phy_reg(hw, ALX_MII_ISR, &isr);
1148
int alx_config_wol(struct alx_hw *hw)
1154
/* turn on magic packet event */
1155
if (hw->sleep_ctrl & ALX_SLEEP_WOL_MAGIC) {
1156
wol |= ALX_WOL0_MAGIC_EN | ALX_WOL0_PME_MAGIC_EN;
1157
/* magic packet maybe Broadcast&multicast&Unicast frame */
1158
/* mac |= MAC_CTRL_BC_EN; */
1161
/* turn on link up event */
1162
if (hw->sleep_ctrl & ALX_SLEEP_WOL_PHY) {
1163
wol |= ALX_WOL0_LINK_EN | ALX_WOL0_PME_LINK;
1164
/* only link up can wake up */
1165
err = alx_write_phy_reg(hw, ALX_MII_IER, ALX_IER_LINK_UP);
1167
ALX_MEM_W32(hw, ALX_WOL0, wol);
1172
void alx_configure_rss(struct alx_hw *hw, bool en)
1177
ALX_MEM_R32(hw, ALX_RXQ0, &ctrl);
1180
for (i = 0; i < sizeof(hw->rss_key); i++) {
1181
/* rss key should be saved in chip with
1184
int j = sizeof(hw->rss_key) - i - 1;
1186
ALX_MEM_W8(hw, ALX_RSS_KEY0 + j, hw->rss_key[i]);
1189
for (i = 0; i < ARRAY_SIZE(hw->rss_idt); i++)
1190
ALX_MEM_W32(hw, ALX_RSS_IDT_TBL0 + i * 4,
1193
FIELD_SET32(ctrl, ALX_RXQ0_RSS_HSTYP, hw->rss_hash_type);
1194
FIELD_SET32(ctrl, ALX_RXQ0_RSS_MODE, ALX_RXQ0_RSS_MODE_MQMI);
1195
FIELD_SET32(ctrl, ALX_RXQ0_IDT_TBL_SIZE, hw->rss_idt_size);
1196
ctrl |= ALX_RXQ0_RSS_HASH_EN;
1198
ctrl &= ~ALX_RXQ0_RSS_HASH_EN;
1201
ALX_MEM_W32(hw, ALX_RXQ0, ctrl);
1204
void alx_configure_basic(struct alx_hw *hw)
1206
u32 val, raw_mtu, max_payload;
1208
u8 chip_rev = ALX_REVID(hw);
1211
alx_set_macaddr(hw, hw->mac_addr);
1214
ALX_MEM_W32(hw, ALX_CLK_GATE, ALX_CLK_GATE_ALL_A0);
1216
/* idle timeout to switch clk_125M */
1217
if (chip_rev >= ALX_REV_B0) {
1218
ALX_MEM_W32(hw, ALX_IDLE_DECISN_TIMER,
1219
ALX_IDLE_DECISN_TIMER_DEF);
1222
/* stats refresh timeout */
1223
ALX_MEM_W32(hw, ALX_SMB_TIMER, hw->smb_timer * 500UL);
1225
/* intr moduration */
1226
ALX_MEM_R32(hw, ALX_MASTER, &val);
1227
val = val | ALX_MASTER_IRQMOD2_EN |
1228
ALX_MASTER_IRQMOD1_EN |
1229
ALX_MASTER_SYSALVTIMER_EN;
1230
ALX_MEM_W32(hw, ALX_MASTER, val);
1231
ALX_MEM_W32(hw, ALX_IRQ_MODU_TIMER,
1232
FIELDX(ALX_IRQ_MODU_TIMER1, hw->imt >> 1));
1233
/* intr re-trig timeout */
1234
ALX_MEM_W32(hw, ALX_INT_RETRIG, ALX_INT_RETRIG_TO);
1235
/* tpd threshold to trig int */
1236
ALX_MEM_W32(hw, ALX_TINT_TPD_THRSHLD, hw->ith_tpd);
1237
ALX_MEM_W32(hw, ALX_TINT_TIMER, hw->imt);
1239
/* mtu, 8:fcs+vlan */
1240
raw_mtu = hw->mtu + ETH_HLEN;
1241
ALX_MEM_W32(hw, ALX_MTU, raw_mtu + 8);
1242
if (raw_mtu > ALX_MTU_JUMBO_TH)
1243
hw->rx_ctrl &= ~ALX_MAC_CTRL_FAST_PAUSE;
1246
if ((raw_mtu + 8) < ALX_TXQ1_JUMBO_TSO_TH)
1247
val = (raw_mtu + 8 + 7) >> 3;
1249
val = ALX_TXQ1_JUMBO_TSO_TH >> 3;
1250
ALX_MEM_W32(hw, ALX_TXQ1, val | ALX_TXQ1_ERRLGPKT_DROP_EN);
1251
max_payload = alx_get_readrq(hw) >> 8;
1253
* if BIOS had changed the default dma read max length,
1254
* restore it to default value
1256
if (max_payload < ALX_DEV_CTRL_MAXRRS_MIN)
1257
alx_set_readrq(hw, 128 << ALX_DEV_CTRL_MAXRRS_MIN);
1259
val = FIELDX(ALX_TXQ0_TPD_BURSTPREF, ALX_TXQ_TPD_BURSTPREF_DEF) |
1260
ALX_TXQ0_MODE_ENHANCE |
1261
ALX_TXQ0_LSO_8023_EN |
1262
ALX_TXQ0_SUPT_IPOPT |
1263
FIELDX(ALX_TXQ0_TXF_BURST_PREF, ALX_TXQ_TXF_BURST_PREF_DEF);
1264
ALX_MEM_W32(hw, ALX_TXQ0, val);
1265
val = FIELDX(ALX_HQTPD_Q1_NUMPREF, ALX_TXQ_TPD_BURSTPREF_DEF) |
1266
FIELDX(ALX_HQTPD_Q2_NUMPREF, ALX_TXQ_TPD_BURSTPREF_DEF) |
1267
FIELDX(ALX_HQTPD_Q3_NUMPREF, ALX_TXQ_TPD_BURSTPREF_DEF) |
1269
ALX_MEM_W32(hw, ALX_HQTPD, val);
1271
/* rxq, flow control */
1272
ALX_MEM_R32(hw, ALX_SRAM5, &val);
1273
val = FIELD_GETX(val, ALX_SRAM_RXF_LEN) << 3;
1274
if (val > ALX_SRAM_RXF_LEN_8K) {
1275
val16 = ALX_MTU_STD_ALGN >> 3;
1276
val = (val - ALX_RXQ2_RXF_FLOW_CTRL_RSVD) >> 3;
1278
val16 = ALX_MTU_STD_ALGN >> 3;
1279
val = (val - ALX_MTU_STD_ALGN) >> 3;
1281
ALX_MEM_W32(hw, ALX_RXQ2,
1282
FIELDX(ALX_RXQ2_RXF_XOFF_THRESH, val16) |
1283
FIELDX(ALX_RXQ2_RXF_XON_THRESH, val));
1284
val = FIELDX(ALX_RXQ0_NUM_RFD_PREF, ALX_RXQ0_NUM_RFD_PREF_DEF) |
1285
FIELDX(ALX_RXQ0_RSS_MODE, ALX_RXQ0_RSS_MODE_DIS) |
1286
FIELDX(ALX_RXQ0_IDT_TBL_SIZE, ALX_RXQ0_IDT_TBL_SIZE_DEF) |
1287
ALX_RXQ0_RSS_HSTYP_ALL |
1288
ALX_RXQ0_RSS_HASH_EN |
1289
ALX_RXQ0_IPV6_PARSE_EN;
1290
if (ALX_CAP(hw, GIGA)) {
1291
FIELD_SET32(val, ALX_RXQ0_ASPM_THRESH,
1292
ALX_RXQ0_ASPM_THRESH_100M);
1294
ALX_MEM_W32(hw, ALX_RXQ0, val);
1297
ALX_MEM_R32(hw, ALX_DMA, &val);
1298
val = FIELDX(ALX_DMA_RORDER_MODE, ALX_DMA_RORDER_MODE_OUT) |
1299
ALX_DMA_RREQ_PRI_DATA |
1300
FIELDX(ALX_DMA_RREQ_BLEN, max_payload) |
1301
FIELDX(ALX_DMA_WDLY_CNT, ALX_DMA_WDLY_CNT_DEF) |
1302
FIELDX(ALX_DMA_RDLY_CNT, ALX_DMA_RDLY_CNT_DEF) |
1303
FIELDX(ALX_DMA_RCHNL_SEL, hw->dma_chnl - 1);
1304
ALX_MEM_W32(hw, ALX_DMA, val);
1306
/* multi-tx-q weight */
1307
if (ALX_CAP(hw, MTQ)) {
1308
val = FIELDX(ALX_WRR_PRI, hw->wrr_ctrl) |
1309
FIELDX(ALX_WRR_PRI0, hw->wrr[0]) |
1310
FIELDX(ALX_WRR_PRI1, hw->wrr[1]) |
1311
FIELDX(ALX_WRR_PRI2, hw->wrr[2]) |
1312
FIELDX(ALX_WRR_PRI3, hw->wrr[3]);
1313
ALX_MEM_W32(hw, ALX_WRR, val);
1317
void alx_mask_msix(struct alx_hw *hw, int index, bool mask)
1321
reg = ALX_MSIX_ENTRY_BASE + index * PCI_MSIX_ENTRY_SIZE +
1322
PCI_MSIX_ENTRY_VECTOR_CTRL;
1324
val = mask ? PCI_MSIX_ENTRY_CTRL_MASKBIT : 0;
1326
ALX_MEM_W32(hw, reg, val);
1330
int alx_select_powersaving_speed(struct alx_hw *hw, u16 *speed)
1336
err = alx_get_phy_link(hw, &linkup, &spd);
1345
err = alx_read_phy_reg(hw, MII_LPA, &lpa);
1349
if (!(lpa & LPA_LPACK)) {
1353
if (lpa & LPA_10FULL)
1354
*speed = SPEED_10 + FULL_DUPLEX;
1355
else if (lpa & LPA_10HALF)
1356
*speed = SPEED_10 + HALF_DUPLEX;
1357
else if (lpa & LPA_100FULL)
1358
*speed = SPEED_100 + FULL_DUPLEX;
1360
*speed = SPEED_100 + HALF_DUPLEX;
1362
if (*speed != spd) {
1363
err = alx_write_phy_reg(hw, ALX_MII_IER, 0);
1366
err = alx_setup_speed_duplex(hw,
1367
ALX_SPEED_TO_ETHADV(*speed) | ADVERTISED_Autoneg,
1368
ALX_FC_ANEG | ALX_FC_RX | ALX_FC_TX);
1372
/* wait for linkup */
1373
for (i = 0; i < ALX_MAX_SETUP_LNK_CYCLE; i++) {
1378
err = alx_get_phy_link(hw, &link_on, &speed2);
1384
if (i == ALX_MAX_SETUP_LNK_CYCLE) {
1385
err = ALX_LINK_TIMEOUT;
1394
void __alx_update_hw_stats(struct alx_hw *hw)
1401
reg = ALX_RX_STATS_BIN;
1402
p = &hw->stats.rx_ok;
1403
while (reg <= ALX_RX_STATS_END) {
1404
ALX_MEM_R32(hw, reg, &data);
1410
reg = ALX_TX_STATS_BIN;
1411
p = &hw->stats.tx_ok;
1412
while (reg <= ALX_TX_STATS_END) {
1413
ALX_MEM_R32(hw, reg, &data);
1419
static const struct alx_platform_patch plats[] = {
1420
{0x1091, 0x00, 0x1969, 0x0091, 0x1001},
1424
void alx_patch_assign(struct alx_hw *hw)
1428
while (plats[i].pci_did != 0) {
1429
if (plats[i].pci_did == ALX_DID(hw) &&
1430
plats[i].subsystem_vid == ALX_SUB_VID(hw) &&
1431
plats[i].subsystem_did == ALX_SUB_DID(hw) &&
1432
(plats[i].pflag & ALX_PF_ANY_REV ||
1433
plats[i].pci_rev == hw->revision)) {
1434
if (plats[i].pflag & ALX_PF_LINK)
1435
hw->lnk_patch = true;
1436
if (plats[i].pflag & ALX_PF_HIB)
1437
hw->hib_patch = true;
1443
bool alx_get_phy_info(struct alx_hw *hw)
1447
if (alx_read_phy_reg(hw, MII_PHYSID1, &hw->phy_id[0]) ||
1448
alx_read_phy_reg(hw, MII_PHYSID2, &hw->phy_id[1]))
1451
/* since we haven't PMA/PMD status2 register, we can't
1452
* use mdio45_probe function for prtad and mmds.
1453
* use fixed MMD3 to get mmds.
1455
if (alx_read_phy_ext(hw, 3, MDIO_DEVS1, &devs1) ||
1456
alx_read_phy_ext(hw, 3, MDIO_DEVS2, &devs2))
1458
hw->mdio.mmds = devs1 | devs2 << 16;