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
35#ifndef ALX_HW_H_
36#define ALX_HW_H_
37#include <linux/types.h>
38#include <linux/mdio.h>
39#include <linux/pci.h>
40#include "reg.h"
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100struct alx_txd {
101 __le16 len;
102 __le16 vlan_tag;
103 __le32 word1;
104 union {
105 __le64 addr;
106 struct {
107 __le32 pkt_len;
108 __le32 resvd;
109 } l;
110 } adrl;
111} __packed;
112
113
114#define TPD_CXSUMSTART_MASK 0x00FF
115#define TPD_CXSUMSTART_SHIFT 0
116#define TPD_L4HDROFFSET_MASK 0x00FF
117#define TPD_L4HDROFFSET_SHIFT 0
118#define TPD_CXSUM_EN_MASK 0x0001
119#define TPD_CXSUM_EN_SHIFT 8
120#define TPD_IP_XSUM_MASK 0x0001
121#define TPD_IP_XSUM_SHIFT 9
122#define TPD_TCP_XSUM_MASK 0x0001
123#define TPD_TCP_XSUM_SHIFT 10
124#define TPD_UDP_XSUM_MASK 0x0001
125#define TPD_UDP_XSUM_SHIFT 11
126#define TPD_LSO_EN_MASK 0x0001
127#define TPD_LSO_EN_SHIFT 12
128#define TPD_LSO_V2_MASK 0x0001
129#define TPD_LSO_V2_SHIFT 13
130#define TPD_VLTAGGED_MASK 0x0001
131#define TPD_VLTAGGED_SHIFT 14
132#define TPD_INS_VLTAG_MASK 0x0001
133#define TPD_INS_VLTAG_SHIFT 15
134#define TPD_IPV4_MASK 0x0001
135#define TPD_IPV4_SHIFT 16
136#define TPD_ETHTYPE_MASK 0x0001
137#define TPD_ETHTYPE_SHIFT 17
138#define TPD_CXSUMOFFSET_MASK 0x00FF
139#define TPD_CXSUMOFFSET_SHIFT 18
140#define TPD_MSS_MASK 0x1FFF
141#define TPD_MSS_SHIFT 18
142#define TPD_EOP_MASK 0x0001
143#define TPD_EOP_SHIFT 31
144
145#define DESC_GET(_x, _name) ((_x) >> _name##SHIFT & _name##MASK)
146
147
148struct alx_rfd {
149 __le64 addr;
150
151
152
153} __packed;
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238struct alx_rrd {
239 __le32 word0;
240 __le32 rss_hash;
241 __le32 word2;
242 __le32 word3;
243} __packed;
244
245
246#define RRD_XSUM_MASK 0xFFFF
247#define RRD_XSUM_SHIFT 0
248#define RRD_NOR_MASK 0x000F
249#define RRD_NOR_SHIFT 16
250#define RRD_SI_MASK 0x0FFF
251#define RRD_SI_SHIFT 20
252
253
254#define RRD_VLTAG_MASK 0xFFFF
255#define RRD_VLTAG_SHIFT 0
256#define RRD_PID_MASK 0x00FF
257#define RRD_PID_SHIFT 16
258
259#define RRD_PID_NONIP 0
260
261#define RRD_PID_IPV4 1
262
263#define RRD_PID_IPV6TCP 2
264
265#define RRD_PID_IPV4TCP 3
266
267#define RRD_PID_IPV6UDP 4
268
269#define RRD_PID_IPV4UDP 5
270
271#define RRD_PID_IPV6 6
272
273#define RRD_PID_LLDP 7
274
275#define RRD_PID_1588 8
276#define RRD_RSSQ_MASK 0x0007
277#define RRD_RSSQ_SHIFT 25
278#define RRD_RSSALG_MASK 0x000F
279#define RRD_RSSALG_SHIFT 28
280#define RRD_RSSALG_TCPV6 0x1
281#define RRD_RSSALG_IPV6 0x2
282#define RRD_RSSALG_TCPV4 0x4
283#define RRD_RSSALG_IPV4 0x8
284
285
286#define RRD_PKTLEN_MASK 0x3FFF
287#define RRD_PKTLEN_SHIFT 0
288#define RRD_ERR_L4_MASK 0x0001
289#define RRD_ERR_L4_SHIFT 14
290#define RRD_ERR_IPV4_MASK 0x0001
291#define RRD_ERR_IPV4_SHIFT 15
292#define RRD_VLTAGGED_MASK 0x0001
293#define RRD_VLTAGGED_SHIFT 16
294#define RRD_OLD_PID_MASK 0x0007
295#define RRD_OLD_PID_SHIFT 17
296#define RRD_ERR_RES_MASK 0x0001
297#define RRD_ERR_RES_SHIFT 20
298#define RRD_ERR_FCS_MASK 0x0001
299#define RRD_ERR_FCS_SHIFT 21
300#define RRD_ERR_FAE_MASK 0x0001
301#define RRD_ERR_FAE_SHIFT 22
302#define RRD_ERR_TRUNC_MASK 0x0001
303#define RRD_ERR_TRUNC_SHIFT 23
304#define RRD_ERR_RUNT_MASK 0x0001
305#define RRD_ERR_RUNT_SHIFT 24
306#define RRD_ERR_ICMP_MASK 0x0001
307#define RRD_ERR_ICMP_SHIFT 25
308#define RRD_BCAST_MASK 0x0001
309#define RRD_BCAST_SHIFT 26
310#define RRD_MCAST_MASK 0x0001
311#define RRD_MCAST_SHIFT 27
312#define RRD_ETHTYPE_MASK 0x0001
313#define RRD_ETHTYPE_SHIFT 28
314#define RRD_ERR_FIFOV_MASK 0x0001
315#define RRD_ERR_FIFOV_SHIFT 29
316#define RRD_ERR_LEN_MASK 0x0001
317#define RRD_ERR_LEN_SHIFT 30
318#define RRD_UPDATED_MASK 0x0001
319#define RRD_UPDATED_SHIFT 31
320
321
322#define ALX_MAX_SETUP_LNK_CYCLE 50
323
324
325#define ALX_FC_RX 0x01
326#define ALX_FC_TX 0x02
327#define ALX_FC_ANEG 0x04
328
329
330#define ALX_SLEEP_WOL_PHY 0x00000001
331#define ALX_SLEEP_WOL_MAGIC 0x00000002
332#define ALX_SLEEP_CIFS 0x00000004
333#define ALX_SLEEP_ACTIVE (ALX_SLEEP_WOL_PHY | \
334 ALX_SLEEP_WOL_MAGIC | \
335 ALX_SLEEP_CIFS)
336
337
338#define ALX_RSS_HASH_TYPE_IPV4 0x1
339#define ALX_RSS_HASH_TYPE_IPV4_TCP 0x2
340#define ALX_RSS_HASH_TYPE_IPV6 0x4
341#define ALX_RSS_HASH_TYPE_IPV6_TCP 0x8
342#define ALX_RSS_HASH_TYPE_ALL (ALX_RSS_HASH_TYPE_IPV4 | \
343 ALX_RSS_HASH_TYPE_IPV4_TCP | \
344 ALX_RSS_HASH_TYPE_IPV6 | \
345 ALX_RSS_HASH_TYPE_IPV6_TCP)
346#define ALX_DEF_RXBUF_SIZE 1536
347#define ALX_MAX_JUMBO_PKT_SIZE (9*1024)
348#define ALX_MAX_TSO_PKT_SIZE (7*1024)
349#define ALX_MAX_FRAME_SIZE ALX_MAX_JUMBO_PKT_SIZE
350#define ALX_MIN_FRAME_SIZE 68
351#define ALX_RAW_MTU(_mtu) (_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN)
352
353#define ALX_MAX_RX_QUEUES 8
354#define ALX_MAX_TX_QUEUES 4
355#define ALX_MAX_HANDLED_INTRS 5
356
357#define ALX_ISR_MISC (ALX_ISR_PCIE_LNKDOWN | \
358 ALX_ISR_DMAW | \
359 ALX_ISR_DMAR | \
360 ALX_ISR_SMB | \
361 ALX_ISR_MANU | \
362 ALX_ISR_TIMER)
363
364#define ALX_ISR_FATAL (ALX_ISR_PCIE_LNKDOWN | \
365 ALX_ISR_DMAW | ALX_ISR_DMAR)
366
367#define ALX_ISR_ALERT (ALX_ISR_RXF_OV | \
368 ALX_ISR_TXF_UR | \
369 ALX_ISR_RFD_UR)
370
371#define ALX_ISR_ALL_QUEUES (ALX_ISR_TX_Q0 | \
372 ALX_ISR_TX_Q1 | \
373 ALX_ISR_TX_Q2 | \
374 ALX_ISR_TX_Q3 | \
375 ALX_ISR_RX_Q0 | \
376 ALX_ISR_RX_Q1 | \
377 ALX_ISR_RX_Q2 | \
378 ALX_ISR_RX_Q3 | \
379 ALX_ISR_RX_Q4 | \
380 ALX_ISR_RX_Q5 | \
381 ALX_ISR_RX_Q6 | \
382 ALX_ISR_RX_Q7)
383
384
385
386
387
388
389
390struct alx_hw_stats {
391
392 u64 rx_ok;
393 u64 rx_bcast;
394 u64 rx_mcast;
395 u64 rx_pause;
396 u64 rx_ctrl;
397 u64 rx_fcs_err;
398 u64 rx_len_err;
399 u64 rx_byte_cnt;
400 u64 rx_runt;
401 u64 rx_frag;
402 u64 rx_sz_64B;
403 u64 rx_sz_127B;
404 u64 rx_sz_255B;
405 u64 rx_sz_511B;
406 u64 rx_sz_1023B;
407 u64 rx_sz_1518B;
408 u64 rx_sz_max;
409 u64 rx_ov_sz;
410 u64 rx_ov_rxf;
411 u64 rx_ov_rrd;
412 u64 rx_align_err;
413 u64 rx_bc_byte_cnt;
414 u64 rx_mc_byte_cnt;
415 u64 rx_err_addr;
416
417
418 u64 tx_ok;
419 u64 tx_bcast;
420 u64 tx_mcast;
421 u64 tx_pause;
422 u64 tx_exc_defer;
423 u64 tx_ctrl;
424 u64 tx_defer;
425 u64 tx_byte_cnt;
426 u64 tx_sz_64B;
427 u64 tx_sz_127B;
428 u64 tx_sz_255B;
429 u64 tx_sz_511B;
430 u64 tx_sz_1023B;
431 u64 tx_sz_1518B;
432 u64 tx_sz_max;
433 u64 tx_single_col;
434 u64 tx_multi_col;
435 u64 tx_late_col;
436 u64 tx_abort_col;
437 u64 tx_underrun;
438
439
440 u64 tx_trd_eop;
441
442
443 u64 tx_len_err;
444 u64 tx_trunc;
445 u64 tx_bc_byte_cnt;
446 u64 tx_mc_byte_cnt;
447 u64 update;
448};
449
450
451
452#define ALX_MAX_MSIX_INTRS 16
453
454#define ALX_GET_FIELD(_data, _field) \
455 (((_data) >> _field ## _SHIFT) & _field ## _MASK)
456
457#define ALX_SET_FIELD(_data, _field, _value) do { \
458 (_data) &= ~(_field ## _MASK << _field ## _SHIFT); \
459 (_data) |= ((_value) & _field ## _MASK) << _field ## _SHIFT;\
460 } while (0)
461
462struct alx_hw {
463 struct pci_dev *pdev;
464 u8 __iomem *hw_addr;
465
466
467 u8 mac_addr[ETH_ALEN];
468 u8 perm_addr[ETH_ALEN];
469
470 u16 mtu;
471 u16 imt;
472 u8 dma_chnl;
473 u8 max_dma_chnl;
474
475 u32 ith_tpd;
476 u32 rx_ctrl;
477 u32 mc_hash[2];
478
479 u32 smb_timer;
480
481 int link_speed;
482 u8 duplex;
483
484
485 u8 flowctrl;
486 u32 adv_cfg;
487
488 spinlock_t mdio_lock;
489 struct mdio_if_info mdio;
490 u16 phy_id[2];
491
492
493 bool lnk_patch;
494
495
496 struct alx_hw_stats stats;
497};
498
499static inline int alx_hw_revision(struct alx_hw *hw)
500{
501 return hw->pdev->revision >> ALX_PCI_REVID_SHIFT;
502}
503
504static inline bool alx_hw_with_cr(struct alx_hw *hw)
505{
506 return hw->pdev->revision & 1;
507}
508
509static inline bool alx_hw_giga(struct alx_hw *hw)
510{
511 return hw->pdev->device & 1;
512}
513
514static inline void alx_write_mem8(struct alx_hw *hw, u32 reg, u8 val)
515{
516 writeb(val, hw->hw_addr + reg);
517}
518
519static inline void alx_write_mem16(struct alx_hw *hw, u32 reg, u16 val)
520{
521 writew(val, hw->hw_addr + reg);
522}
523
524static inline u16 alx_read_mem16(struct alx_hw *hw, u32 reg)
525{
526 return readw(hw->hw_addr + reg);
527}
528
529static inline void alx_write_mem32(struct alx_hw *hw, u32 reg, u32 val)
530{
531 writel(val, hw->hw_addr + reg);
532}
533
534static inline u32 alx_read_mem32(struct alx_hw *hw, u32 reg)
535{
536 return readl(hw->hw_addr + reg);
537}
538
539static inline void alx_post_write(struct alx_hw *hw)
540{
541 readl(hw->hw_addr);
542}
543
544int alx_get_perm_macaddr(struct alx_hw *hw, u8 *addr);
545void alx_reset_phy(struct alx_hw *hw);
546void alx_reset_pcie(struct alx_hw *hw);
547void alx_enable_aspm(struct alx_hw *hw, bool l0s_en, bool l1_en);
548int alx_setup_speed_duplex(struct alx_hw *hw, u32 ethadv, u8 flowctrl);
549void alx_post_phy_link(struct alx_hw *hw);
550int alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data);
551int alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data);
552int alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata);
553int alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data);
554int alx_read_phy_link(struct alx_hw *hw);
555int alx_clear_phy_intr(struct alx_hw *hw);
556void alx_cfg_mac_flowcontrol(struct alx_hw *hw, u8 fc);
557void alx_start_mac(struct alx_hw *hw);
558int alx_reset_mac(struct alx_hw *hw);
559void alx_set_macaddr(struct alx_hw *hw, const u8 *addr);
560bool alx_phy_configured(struct alx_hw *hw);
561void alx_configure_basic(struct alx_hw *hw);
562void alx_disable_rss(struct alx_hw *hw);
563bool alx_get_phy_info(struct alx_hw *hw);
564void alx_update_hw_stats(struct alx_hw *hw);
565
566static inline u32 alx_speed_to_ethadv(int speed, u8 duplex)
567{
568 if (speed == SPEED_1000 && duplex == DUPLEX_FULL)
569 return ADVERTISED_1000baseT_Full;
570 if (speed == SPEED_100 && duplex == DUPLEX_FULL)
571 return ADVERTISED_100baseT_Full;
572 if (speed == SPEED_100 && duplex== DUPLEX_HALF)
573 return ADVERTISED_100baseT_Half;
574 if (speed == SPEED_10 && duplex == DUPLEX_FULL)
575 return ADVERTISED_10baseT_Full;
576 if (speed == SPEED_10 && duplex == DUPLEX_HALF)
577 return ADVERTISED_10baseT_Half;
578 return 0;
579}
580
581#endif
582