1 /* Synopsys DesignWare Core Enterprise Ethernet (XLGMAC) Driver
3 * Copyright (c) 2017 Synopsys, Inc. (www.synopsys.com)
5 * This program is dual-licensed; you may select either version 2 of
6 * the GNU General Public License ("GPL") or BSD license ("BSD").
8 * This Synopsys DWC XLGMAC software driver and associated documentation
9 * (hereinafter the "Software") is an unsupported proprietary work of
10 * Synopsys, Inc. unless otherwise expressly agreed to in writing between
11 * Synopsys and you. The Software IS NOT an item of Licensed Software or a
12 * Licensed Product under any End User Software License Agreement or
13 * Agreement for Licensed Products with Synopsys or any supplement thereto.
14 * Synopsys is a registered trademark of Synopsys, Inc. Other names included
15 * in the SOFTWARE may be the trademarks of their respective owners.
18 #ifndef __DWC_XLGMAC_H__
19 #define __DWC_XLGMAC_H__
21 #include <linux/dma-mapping.h>
22 #include <linux/netdevice.h>
23 #include <linux/workqueue.h>
24 #include <linux/phy.h>
25 #include <linux/if_vlan.h>
26 #include <linux/bitops.h>
27 #include <linux/timecounter.h>
29 #define XLGMAC_DRV_NAME "dwc-xlgmac"
30 #define XLGMAC_DRV_VERSION "1.0.0"
31 #define XLGMAC_DRV_DESC "Synopsys DWC XLGMAC Driver"
33 /* Descriptor related parameters */
34 #define XLGMAC_TX_DESC_CNT 1024
35 #define XLGMAC_TX_DESC_MIN_FREE (XLGMAC_TX_DESC_CNT >> 3)
36 #define XLGMAC_TX_DESC_MAX_PROC (XLGMAC_TX_DESC_CNT >> 1)
37 #define XLGMAC_RX_DESC_CNT 1024
38 #define XLGMAC_RX_DESC_MAX_DIRTY (XLGMAC_RX_DESC_CNT >> 3)
40 /* Descriptors required for maximum contiguous TSO/GSO packet */
41 #define XLGMAC_TX_MAX_SPLIT ((GSO_MAX_SIZE / XLGMAC_TX_MAX_BUF_SIZE) + 1)
43 /* Maximum possible descriptors needed for a SKB */
44 #define XLGMAC_TX_MAX_DESC_NR (MAX_SKB_FRAGS + XLGMAC_TX_MAX_SPLIT + 2)
46 #define XLGMAC_TX_MAX_BUF_SIZE (0x3fff & ~(64 - 1))
47 #define XLGMAC_RX_MIN_BUF_SIZE (ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN)
48 #define XLGMAC_RX_BUF_ALIGN 64
50 /* Maximum Size for Splitting the Header Data
51 * Keep in sync with SKB_ALLOC_SIZE
52 * 3'b000: 64 bytes, 3'b001: 128 bytes
53 * 3'b010: 256 bytes, 3'b011: 512 bytes
54 * 3'b100: 1023 bytes , 3'b101'3'b111: Reserved
56 #define XLGMAC_SPH_HDSMS_SIZE 3
57 #define XLGMAC_SKB_ALLOC_SIZE 512
59 #define XLGMAC_MAX_FIFO 81920
61 #define XLGMAC_MAX_DMA_CHANNELS 16
62 #define XLGMAC_DMA_STOP_TIMEOUT 5
63 #define XLGMAC_DMA_INTERRUPT_MASK 0x31c7
65 /* Default coalescing parameters */
66 #define XLGMAC_INIT_DMA_TX_USECS 1000
67 #define XLGMAC_INIT_DMA_TX_FRAMES 25
68 #define XLGMAC_INIT_DMA_RX_USECS 30
69 #define XLGMAC_INIT_DMA_RX_FRAMES 25
70 #define XLGMAC_MAX_DMA_RIWT 0xff
71 #define XLGMAC_MIN_DMA_RIWT 0x01
73 /* Flow control queue count */
74 #define XLGMAC_MAX_FLOW_CONTROL_QUEUES 8
76 /* System clock is 125 MHz */
77 #define XLGMAC_SYSCLOCK 125000000
79 /* Maximum MAC address hash table size (256 bits = 8 bytes) */
80 #define XLGMAC_MAC_HASH_TABLE_SIZE 8
82 /* Receive Side Scaling */
83 #define XLGMAC_RSS_HASH_KEY_SIZE 40
84 #define XLGMAC_RSS_MAX_TABLE_SIZE 256
85 #define XLGMAC_RSS_LOOKUP_TABLE_TYPE 0
86 #define XLGMAC_RSS_HASH_KEY_TYPE 1
88 #define XLGMAC_STD_PACKET_MTU 1500
89 #define XLGMAC_JUMBO_PACKET_MTU 9000
91 /* Helper macro for descriptor handling
92 * Always use XLGMAC_GET_DESC_DATA to access the descriptor data
94 #define XLGMAC_GET_DESC_DATA(ring, idx) ({ \
95 typeof(ring) _ring = (ring); \
96 ((_ring)->desc_data_head + \
97 ((idx) & ((_ring)->dma_desc_count - 1))); \
100 #define XLGMAC_GET_REG_BITS(var, pos, len) ({ \
101 typeof(pos) _pos = (pos); \
102 typeof(len) _len = (len); \
103 ((var) & GENMASK(_pos + _len - 1, _pos)) >> (_pos); \
106 #define XLGMAC_GET_REG_BITS_LE(var, pos, len) ({ \
107 typeof(pos) _pos = (pos); \
108 typeof(len) _len = (len); \
109 typeof(var) _var = le32_to_cpu((var)); \
110 ((_var) & GENMASK(_pos + _len - 1, _pos)) >> (_pos); \
113 #define XLGMAC_SET_REG_BITS(var, pos, len, val) ({ \
114 typeof(var) _var = (var); \
115 typeof(pos) _pos = (pos); \
116 typeof(len) _len = (len); \
117 typeof(val) _val = (val); \
118 _val = (_val << _pos) & GENMASK(_pos + _len - 1, _pos); \
119 _var = (_var & ~GENMASK(_pos + _len - 1, _pos)) | _val; \
122 #define XLGMAC_SET_REG_BITS_LE(var, pos, len, val) ({ \
123 typeof(var) _var = (var); \
124 typeof(pos) _pos = (pos); \
125 typeof(len) _len = (len); \
126 typeof(val) _val = (val); \
127 _val = (_val << _pos) & GENMASK(_pos + _len - 1, _pos); \
128 _var = (_var & ~GENMASK(_pos + _len - 1, _pos)) | _val; \
135 XLGMAC_INT_DMA_CH_SR_TI
,
136 XLGMAC_INT_DMA_CH_SR_TPS
,
137 XLGMAC_INT_DMA_CH_SR_TBU
,
138 XLGMAC_INT_DMA_CH_SR_RI
,
139 XLGMAC_INT_DMA_CH_SR_RBU
,
140 XLGMAC_INT_DMA_CH_SR_RPS
,
141 XLGMAC_INT_DMA_CH_SR_TI_RI
,
142 XLGMAC_INT_DMA_CH_SR_FBE
,
146 struct xlgmac_stats
{
147 /* MMC TX counters */
150 u64 txbroadcastframes_g
;
151 u64 txmulticastframes_g
;
153 u64 tx65to127octets_gb
;
154 u64 tx128to255octets_gb
;
155 u64 tx256to511octets_gb
;
156 u64 tx512to1023octets_gb
;
157 u64 tx1024tomaxoctets_gb
;
158 u64 txunicastframes_gb
;
159 u64 txmulticastframes_gb
;
160 u64 txbroadcastframes_gb
;
161 u64 txunderflowerror
;
167 /* MMC RX counters */
171 u64 rxbroadcastframes_g
;
172 u64 rxmulticastframes_g
;
179 u64 rx65to127octets_gb
;
180 u64 rx128to255octets_gb
;
181 u64 rx256to511octets_gb
;
182 u64 rx512to1023octets_gb
;
183 u64 rx1024tomaxoctets_gb
;
184 u64 rxunicastframes_g
;
186 u64 rxoutofrangetype
;
194 u64 rx_split_header_packets
;
195 u64 tx_process_stopped
;
196 u64 rx_process_stopped
;
197 u64 tx_buffer_unavailable
;
198 u64 rx_buffer_unavailable
;
203 u64 napi_poll_txtimer
;
206 struct xlgmac_ring_buf
{
209 unsigned int skb_len
;
212 /* Common Tx and Rx DMA hardware descriptor */
213 struct xlgmac_dma_desc
{
220 /* Page allocation related values */
221 struct xlgmac_page_alloc
{
223 unsigned int pages_len
;
224 unsigned int pages_offset
;
226 dma_addr_t pages_dma
;
229 /* Ring entry buffer data */
230 struct xlgmac_buffer_data
{
231 struct xlgmac_page_alloc pa
;
232 struct xlgmac_page_alloc pa_unmap
;
235 unsigned long dma_off
;
236 unsigned int dma_len
;
239 /* Tx-related desc data */
240 struct xlgmac_tx_desc_data
{
241 unsigned int packets
; /* BQL packet count */
242 unsigned int bytes
; /* BQL byte count */
245 /* Rx-related desc data */
246 struct xlgmac_rx_desc_data
{
247 struct xlgmac_buffer_data hdr
; /* Header locations */
248 struct xlgmac_buffer_data buf
; /* Payload locations */
250 unsigned short hdr_len
; /* Length of received header */
251 unsigned short len
; /* Length of received packet */
254 struct xlgmac_pkt_info
{
257 unsigned int attributes
;
261 /* descriptors needed for this packet */
262 unsigned int desc_count
;
265 unsigned int tx_packets
;
266 unsigned int tx_bytes
;
268 unsigned int header_len
;
269 unsigned int tcp_header_len
;
270 unsigned int tcp_payload_len
;
273 unsigned short vlan_ctag
;
278 enum pkt_hash_types rss_hash_type
;
281 struct xlgmac_desc_data
{
282 /* dma_desc: Virtual address of descriptor
283 * dma_desc_addr: DMA address of descriptor
285 struct xlgmac_dma_desc
*dma_desc
;
286 dma_addr_t dma_desc_addr
;
288 /* skb: Virtual address of SKB
289 * skb_dma: DMA address of SKB data
290 * skb_dma_len: Length of SKB DMA area
294 unsigned int skb_dma_len
;
296 /* Tx/Rx -related data */
297 struct xlgmac_tx_desc_data tx
;
298 struct xlgmac_rx_desc_data rx
;
300 unsigned int mapped_as_page
;
302 /* Incomplete receive save location. If the budget is exhausted
303 * or the last descriptor (last normal descriptor or a following
304 * context descriptor) has not been DMA'd yet the current state
305 * of the receive processing needs to be saved.
307 unsigned int state_saved
;
316 /* Per packet related information */
317 struct xlgmac_pkt_info pkt_info
;
319 /* Virtual/DMA addresses of DMA descriptor list and the total count */
320 struct xlgmac_dma_desc
*dma_desc_head
;
321 dma_addr_t dma_desc_head_addr
;
322 unsigned int dma_desc_count
;
324 /* Array of descriptor data corresponding the DMA descriptor
325 * (always use the XLGMAC_GET_DESC_DATA macro to access this data)
327 struct xlgmac_desc_data
*desc_data_head
;
329 /* Page allocation for RX buffers */
330 struct xlgmac_page_alloc rx_hdr_pa
;
331 struct xlgmac_page_alloc rx_buf_pa
;
334 * cur - Tx: index of descriptor to be used for current transfer
335 * Rx: index of descriptor to check for packet availability
336 * dirty - Tx: index of descriptor to check for transfer complete
337 * Rx: index of descriptor to check for buffer reallocation
342 /* Coalesce frame count used for interrupt bit setting */
343 unsigned int coalesce_count
;
347 unsigned int xmit_more
;
348 unsigned int queue_stopped
;
349 unsigned short cur_mss
;
350 unsigned short cur_vlan_ctag
;
353 } ____cacheline_aligned
;
355 struct xlgmac_channel
{
358 /* Address of private data area for device */
359 struct xlgmac_pdata
*pdata
;
361 /* Queue index and base address of queue's DMA registers */
362 unsigned int queue_index
;
363 void __iomem
*dma_regs
;
365 /* Per channel interrupt irq number */
367 char dma_irq_name
[IFNAMSIZ
+ 32];
369 /* Netdev related settings */
370 struct napi_struct napi
;
372 unsigned int saved_ier
;
374 unsigned int tx_timer_active
;
375 struct timer_list tx_timer
;
377 struct xlgmac_ring
*tx_ring
;
378 struct xlgmac_ring
*rx_ring
;
379 } ____cacheline_aligned
;
381 struct xlgmac_desc_ops
{
382 int (*alloc_channles_and_rings
)(struct xlgmac_pdata
*pdata
);
383 void (*free_channels_and_rings
)(struct xlgmac_pdata
*pdata
);
384 int (*map_tx_skb
)(struct xlgmac_channel
*channel
,
385 struct sk_buff
*skb
);
386 int (*map_rx_buffer
)(struct xlgmac_pdata
*pdata
,
387 struct xlgmac_ring
*ring
,
388 struct xlgmac_desc_data
*desc_data
);
389 void (*unmap_desc_data
)(struct xlgmac_pdata
*pdata
,
390 struct xlgmac_desc_data
*desc_data
);
391 void (*tx_desc_init
)(struct xlgmac_pdata
*pdata
);
392 void (*rx_desc_init
)(struct xlgmac_pdata
*pdata
);
395 struct xlgmac_hw_ops
{
396 int (*init
)(struct xlgmac_pdata
*pdata
);
397 int (*exit
)(struct xlgmac_pdata
*pdata
);
399 int (*tx_complete
)(struct xlgmac_dma_desc
*dma_desc
);
401 void (*enable_tx
)(struct xlgmac_pdata
*pdata
);
402 void (*disable_tx
)(struct xlgmac_pdata
*pdata
);
403 void (*enable_rx
)(struct xlgmac_pdata
*pdata
);
404 void (*disable_rx
)(struct xlgmac_pdata
*pdata
);
406 int (*enable_int
)(struct xlgmac_channel
*channel
,
407 enum xlgmac_int int_id
);
408 int (*disable_int
)(struct xlgmac_channel
*channel
,
409 enum xlgmac_int int_id
);
410 void (*dev_xmit
)(struct xlgmac_channel
*channel
);
411 int (*dev_read
)(struct xlgmac_channel
*channel
);
413 int (*set_mac_address
)(struct xlgmac_pdata
*pdata
, u8
*addr
);
414 int (*config_rx_mode
)(struct xlgmac_pdata
*pdata
);
415 int (*enable_rx_csum
)(struct xlgmac_pdata
*pdata
);
416 int (*disable_rx_csum
)(struct xlgmac_pdata
*pdata
);
418 /* For MII speed configuration */
419 int (*set_xlgmii_25000_speed
)(struct xlgmac_pdata
*pdata
);
420 int (*set_xlgmii_40000_speed
)(struct xlgmac_pdata
*pdata
);
421 int (*set_xlgmii_50000_speed
)(struct xlgmac_pdata
*pdata
);
422 int (*set_xlgmii_100000_speed
)(struct xlgmac_pdata
*pdata
);
424 /* For descriptor related operation */
425 void (*tx_desc_init
)(struct xlgmac_channel
*channel
);
426 void (*rx_desc_init
)(struct xlgmac_channel
*channel
);
427 void (*tx_desc_reset
)(struct xlgmac_desc_data
*desc_data
);
428 void (*rx_desc_reset
)(struct xlgmac_pdata
*pdata
,
429 struct xlgmac_desc_data
*desc_data
,
431 int (*is_last_desc
)(struct xlgmac_dma_desc
*dma_desc
);
432 int (*is_context_desc
)(struct xlgmac_dma_desc
*dma_desc
);
433 void (*tx_start_xmit
)(struct xlgmac_channel
*channel
,
434 struct xlgmac_ring
*ring
);
436 /* For Flow Control */
437 int (*config_tx_flow_control
)(struct xlgmac_pdata
*pdata
);
438 int (*config_rx_flow_control
)(struct xlgmac_pdata
*pdata
);
440 /* For Vlan related config */
441 int (*enable_rx_vlan_stripping
)(struct xlgmac_pdata
*pdata
);
442 int (*disable_rx_vlan_stripping
)(struct xlgmac_pdata
*pdata
);
443 int (*enable_rx_vlan_filtering
)(struct xlgmac_pdata
*pdata
);
444 int (*disable_rx_vlan_filtering
)(struct xlgmac_pdata
*pdata
);
445 int (*update_vlan_hash_table
)(struct xlgmac_pdata
*pdata
);
447 /* For RX coalescing */
448 int (*config_rx_coalesce
)(struct xlgmac_pdata
*pdata
);
449 int (*config_tx_coalesce
)(struct xlgmac_pdata
*pdata
);
450 unsigned int (*usec_to_riwt
)(struct xlgmac_pdata
*pdata
,
452 unsigned int (*riwt_to_usec
)(struct xlgmac_pdata
*pdata
,
455 /* For RX and TX threshold config */
456 int (*config_rx_threshold
)(struct xlgmac_pdata
*pdata
,
458 int (*config_tx_threshold
)(struct xlgmac_pdata
*pdata
,
461 /* For RX and TX Store and Forward Mode config */
462 int (*config_rsf_mode
)(struct xlgmac_pdata
*pdata
,
464 int (*config_tsf_mode
)(struct xlgmac_pdata
*pdata
,
467 /* For TX DMA Operate on Second Frame config */
468 int (*config_osp_mode
)(struct xlgmac_pdata
*pdata
);
470 /* For RX and TX PBL config */
471 int (*config_rx_pbl_val
)(struct xlgmac_pdata
*pdata
);
472 int (*get_rx_pbl_val
)(struct xlgmac_pdata
*pdata
);
473 int (*config_tx_pbl_val
)(struct xlgmac_pdata
*pdata
);
474 int (*get_tx_pbl_val
)(struct xlgmac_pdata
*pdata
);
475 int (*config_pblx8
)(struct xlgmac_pdata
*pdata
);
477 /* For MMC statistics */
478 void (*rx_mmc_int
)(struct xlgmac_pdata
*pdata
);
479 void (*tx_mmc_int
)(struct xlgmac_pdata
*pdata
);
480 void (*read_mmc_stats
)(struct xlgmac_pdata
*pdata
);
482 /* For Receive Side Scaling */
483 int (*enable_rss
)(struct xlgmac_pdata
*pdata
);
484 int (*disable_rss
)(struct xlgmac_pdata
*pdata
);
485 int (*set_rss_hash_key
)(struct xlgmac_pdata
*pdata
,
487 int (*set_rss_lookup_table
)(struct xlgmac_pdata
*pdata
,
491 /* This structure contains flags that indicate what hardware features
492 * or configurations are present in the device.
494 struct xlgmac_hw_features
{
496 unsigned int version
;
498 /* HW Feature Register0 */
499 unsigned int phyifsel
; /* PHY interface support */
500 unsigned int vlhash
; /* VLAN Hash Filter */
501 unsigned int sma
; /* SMA(MDIO) Interface */
502 unsigned int rwk
; /* PMT remote wake-up packet */
503 unsigned int mgk
; /* PMT magic packet */
504 unsigned int mmc
; /* RMON module */
505 unsigned int aoe
; /* ARP Offload */
506 unsigned int ts
; /* IEEE 1588-2008 Advanced Timestamp */
507 unsigned int eee
; /* Energy Efficient Ethernet */
508 unsigned int tx_coe
; /* Tx Checksum Offload */
509 unsigned int rx_coe
; /* Rx Checksum Offload */
510 unsigned int addn_mac
; /* Additional MAC Addresses */
511 unsigned int ts_src
; /* Timestamp Source */
512 unsigned int sa_vlan_ins
; /* Source Address or VLAN Insertion */
514 /* HW Feature Register1 */
515 unsigned int rx_fifo_size
; /* MTL Receive FIFO Size */
516 unsigned int tx_fifo_size
; /* MTL Transmit FIFO Size */
517 unsigned int adv_ts_hi
; /* Advance Timestamping High Word */
518 unsigned int dma_width
; /* DMA width */
519 unsigned int dcb
; /* DCB Feature */
520 unsigned int sph
; /* Split Header Feature */
521 unsigned int tso
; /* TCP Segmentation Offload */
522 unsigned int dma_debug
; /* DMA Debug Registers */
523 unsigned int rss
; /* Receive Side Scaling */
524 unsigned int tc_cnt
; /* Number of Traffic Classes */
525 unsigned int hash_table_size
; /* Hash Table Size */
526 unsigned int l3l4_filter_num
; /* Number of L3-L4 Filters */
528 /* HW Feature Register2 */
529 unsigned int rx_q_cnt
; /* Number of MTL Receive Queues */
530 unsigned int tx_q_cnt
; /* Number of MTL Transmit Queues */
531 unsigned int rx_ch_cnt
; /* Number of DMA Receive Channels */
532 unsigned int tx_ch_cnt
; /* Number of DMA Transmit Channels */
533 unsigned int pps_out_num
; /* Number of PPS outputs */
534 unsigned int aux_snap_num
; /* Number of Aux snapshot inputs */
537 struct xlgmac_resources
{
542 struct xlgmac_pdata
{
543 struct net_device
*netdev
;
546 struct xlgmac_hw_ops hw_ops
;
547 struct xlgmac_desc_ops desc_ops
;
549 /* Device statistics */
550 struct xlgmac_stats stats
;
554 /* MAC registers base */
555 void __iomem
*mac_regs
;
557 /* Hardware features of the device */
558 struct xlgmac_hw_features hw_feat
;
560 struct work_struct restart_work
;
562 /* Rings for Tx/Rx on a DMA channel */
563 struct xlgmac_channel
*channel_head
;
564 unsigned int channel_count
;
565 unsigned int tx_ring_count
;
566 unsigned int rx_ring_count
;
567 unsigned int tx_desc_count
;
568 unsigned int rx_desc_count
;
569 unsigned int tx_q_count
;
570 unsigned int rx_q_count
;
572 /* Tx/Rx common settings */
576 unsigned int tx_sf_mode
;
577 unsigned int tx_threshold
;
579 unsigned int tx_osp_mode
;
582 unsigned int rx_sf_mode
;
583 unsigned int rx_threshold
;
586 /* Tx coalescing settings */
587 unsigned int tx_usecs
;
588 unsigned int tx_frames
;
590 /* Rx coalescing settings */
591 unsigned int rx_riwt
;
592 unsigned int rx_usecs
;
593 unsigned int rx_frames
;
595 /* Current Rx buffer size */
596 unsigned int rx_buf_size
;
598 /* Flow control settings */
599 unsigned int tx_pause
;
600 unsigned int rx_pause
;
602 /* Device interrupt number */
604 unsigned int per_channel_irq
;
605 int channel_irq
[XLGMAC_MAX_DMA_CHANNELS
];
607 /* Netdev related settings */
608 unsigned char mac_addr
[ETH_ALEN
];
609 netdev_features_t netdev_features
;
610 struct napi_struct napi
;
612 /* Filtering support */
613 unsigned long active_vlans
[BITS_TO_LONGS(VLAN_N_VID
)];
616 unsigned long sysclk_rate
;
618 /* RSS addressing mutex */
619 struct mutex rss_mutex
;
621 /* Receive Side Scaling settings */
622 u8 rss_key
[XLGMAC_RSS_HASH_KEY_SIZE
];
623 u32 rss_table
[XLGMAC_RSS_MAX_TABLE_SIZE
];
632 void xlgmac_init_desc_ops(struct xlgmac_desc_ops
*desc_ops
);
633 void xlgmac_init_hw_ops(struct xlgmac_hw_ops
*hw_ops
);
634 const struct net_device_ops
*xlgmac_get_netdev_ops(void);
635 const struct ethtool_ops
*xlgmac_get_ethtool_ops(void);
636 void xlgmac_dump_tx_desc(struct xlgmac_pdata
*pdata
,
637 struct xlgmac_ring
*ring
,
641 void xlgmac_dump_rx_desc(struct xlgmac_pdata
*pdata
,
642 struct xlgmac_ring
*ring
,
644 void xlgmac_print_pkt(struct net_device
*netdev
,
645 struct sk_buff
*skb
, bool tx_rx
);
646 void xlgmac_get_all_hw_features(struct xlgmac_pdata
*pdata
);
647 void xlgmac_print_all_hw_features(struct xlgmac_pdata
*pdata
);
648 int xlgmac_drv_probe(struct device
*dev
,
649 struct xlgmac_resources
*res
);
650 int xlgmac_drv_remove(struct device
*dev
);
652 /* For debug prints */
654 #define XLGMAC_PR(fmt, args...) \
655 pr_alert("[%s,%d]:" fmt, __func__, __LINE__, ## args)
657 #define XLGMAC_PR(x...) do { } while (0)
660 #endif /* __DWC_XLGMAC_H__ */