1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
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
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
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
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
296 if (alx_read_macaddr(hw, addr))
297 return 0;
298
299
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
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
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
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
346
347
348 val = alx_read_mem32(hw, ALX_MISC);
349 if (rev >= ALX_REV_B0) {
350
351
352
353 ALX_SET_FIELD(val, ALX_MISC_PSW_OCP, ALX_MISC_PSW_OCP_DEF);
354
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
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
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
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
422 alx_write_mem32(hw, ALX_RFD_PIDX, 1);
423
424
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
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
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
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
466
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
824
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
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
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
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
956 alx_write_mem32(hw, ALX_INT_RETRIG, ALX_INT_RETRIG_TO);
957
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 = hw->mtu + ETH_HLEN;
962 alx_write_mem32(hw, ALX_MTU, raw_mtu + 8);
963 if (raw_mtu > ALX_MTU_JUMBO_TH)
964 hw->rx_ctrl &= ~ALX_MAC_CTRL_FAST_PAUSE;
965
966 if ((raw_mtu + 8) < ALX_TXQ1_JUMBO_TSO_TH)
967 val = (raw_mtu + 8 + 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
975
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
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
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
1034bool alx_get_phy_info(struct alx_hw *hw)
1035{
1036 u16 devs1, devs2;
1037
1038 if (alx_read_phy_reg(hw, MII_PHYSID1, &hw->phy_id[0]) ||
1039 alx_read_phy_reg(hw, MII_PHYSID2, &hw->phy_id[1]))
1040 return false;
1041
1042
1043
1044
1045
1046 if (alx_read_phy_ext(hw, 3, MDIO_DEVS1, &devs1) ||
1047 alx_read_phy_ext(hw, 3, MDIO_DEVS2, &devs2))
1048 return false;
1049 hw->mdio.mmds = devs1 | devs2 << 16;
1050
1051 return true;
1052}
1053
1054void alx_update_hw_stats(struct alx_hw *hw)
1055{
1056
1057 hw->stats.rx_ok += alx_read_mem32(hw, ALX_MIB_RX_OK);
1058 hw->stats.rx_bcast += alx_read_mem32(hw, ALX_MIB_RX_BCAST);
1059 hw->stats.rx_mcast += alx_read_mem32(hw, ALX_MIB_RX_MCAST);
1060 hw->stats.rx_pause += alx_read_mem32(hw, ALX_MIB_RX_PAUSE);
1061 hw->stats.rx_ctrl += alx_read_mem32(hw, ALX_MIB_RX_CTRL);
1062 hw->stats.rx_fcs_err += alx_read_mem32(hw, ALX_MIB_RX_FCS_ERR);
1063 hw->stats.rx_len_err += alx_read_mem32(hw, ALX_MIB_RX_LEN_ERR);
1064 hw->stats.rx_byte_cnt += alx_read_mem32(hw, ALX_MIB_RX_BYTE_CNT);
1065 hw->stats.rx_runt += alx_read_mem32(hw, ALX_MIB_RX_RUNT);
1066 hw->stats.rx_frag += alx_read_mem32(hw, ALX_MIB_RX_FRAG);
1067 hw->stats.rx_sz_64B += alx_read_mem32(hw, ALX_MIB_RX_SZ_64B);
1068 hw->stats.rx_sz_127B += alx_read_mem32(hw, ALX_MIB_RX_SZ_127B);
1069 hw->stats.rx_sz_255B += alx_read_mem32(hw, ALX_MIB_RX_SZ_255B);
1070 hw->stats.rx_sz_511B += alx_read_mem32(hw, ALX_MIB_RX_SZ_511B);
1071 hw->stats.rx_sz_1023B += alx_read_mem32(hw, ALX_MIB_RX_SZ_1023B);
1072 hw->stats.rx_sz_1518B += alx_read_mem32(hw, ALX_MIB_RX_SZ_1518B);
1073 hw->stats.rx_sz_max += alx_read_mem32(hw, ALX_MIB_RX_SZ_MAX);
1074 hw->stats.rx_ov_sz += alx_read_mem32(hw, ALX_MIB_RX_OV_SZ);
1075 hw->stats.rx_ov_rxf += alx_read_mem32(hw, ALX_MIB_RX_OV_RXF);
1076 hw->stats.rx_ov_rrd += alx_read_mem32(hw, ALX_MIB_RX_OV_RRD);
1077 hw->stats.rx_align_err += alx_read_mem32(hw, ALX_MIB_RX_ALIGN_ERR);
1078 hw->stats.rx_bc_byte_cnt += alx_read_mem32(hw, ALX_MIB_RX_BCCNT);
1079 hw->stats.rx_mc_byte_cnt += alx_read_mem32(hw, ALX_MIB_RX_MCCNT);
1080 hw->stats.rx_err_addr += alx_read_mem32(hw, ALX_MIB_RX_ERRADDR);
1081
1082
1083 hw->stats.tx_ok += alx_read_mem32(hw, ALX_MIB_TX_OK);
1084 hw->stats.tx_bcast += alx_read_mem32(hw, ALX_MIB_TX_BCAST);
1085 hw->stats.tx_mcast += alx_read_mem32(hw, ALX_MIB_TX_MCAST);
1086 hw->stats.tx_pause += alx_read_mem32(hw, ALX_MIB_TX_PAUSE);
1087 hw->stats.tx_exc_defer += alx_read_mem32(hw, ALX_MIB_TX_EXC_DEFER);
1088 hw->stats.tx_ctrl += alx_read_mem32(hw, ALX_MIB_TX_CTRL);
1089 hw->stats.tx_defer += alx_read_mem32(hw, ALX_MIB_TX_DEFER);
1090 hw->stats.tx_byte_cnt += alx_read_mem32(hw, ALX_MIB_TX_BYTE_CNT);
1091 hw->stats.tx_sz_64B += alx_read_mem32(hw, ALX_MIB_TX_SZ_64B);
1092 hw->stats.tx_sz_127B += alx_read_mem32(hw, ALX_MIB_TX_SZ_127B);
1093 hw->stats.tx_sz_255B += alx_read_mem32(hw, ALX_MIB_TX_SZ_255B);
1094 hw->stats.tx_sz_511B += alx_read_mem32(hw, ALX_MIB_TX_SZ_511B);
1095 hw->stats.tx_sz_1023B += alx_read_mem32(hw, ALX_MIB_TX_SZ_1023B);
1096 hw->stats.tx_sz_1518B += alx_read_mem32(hw, ALX_MIB_TX_SZ_1518B);
1097 hw->stats.tx_sz_max += alx_read_mem32(hw, ALX_MIB_TX_SZ_MAX);
1098 hw->stats.tx_single_col += alx_read_mem32(hw, ALX_MIB_TX_SINGLE_COL);
1099 hw->stats.tx_multi_col += alx_read_mem32(hw, ALX_MIB_TX_MULTI_COL);
1100 hw->stats.tx_late_col += alx_read_mem32(hw, ALX_MIB_TX_LATE_COL);
1101 hw->stats.tx_abort_col += alx_read_mem32(hw, ALX_MIB_TX_ABORT_COL);
1102 hw->stats.tx_underrun += alx_read_mem32(hw, ALX_MIB_TX_UNDERRUN);
1103 hw->stats.tx_trd_eop += alx_read_mem32(hw, ALX_MIB_TX_TRD_EOP);
1104 hw->stats.tx_len_err += alx_read_mem32(hw, ALX_MIB_TX_LEN_ERR);
1105 hw->stats.tx_trunc += alx_read_mem32(hw, ALX_MIB_TX_TRUNC);
1106 hw->stats.tx_bc_byte_cnt += alx_read_mem32(hw, ALX_MIB_TX_BCCNT);
1107 hw->stats.tx_mc_byte_cnt += alx_read_mem32(hw, ALX_MIB_TX_MCCNT);
1108
1109 hw->stats.update += alx_read_mem32(hw, ALX_MIB_UPDATE);
1110}
1111