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 #include <linux/phy.h>
19 #include <linux/mdio.h>
20 #include <linux/clk.h>
21 #include <linux/bitrev.h>
22 #include <linux/crc32.h>
23 #include <linux/dcbnl.h>
25 #include "dwc-xlgmac.h"
26 #include "dwc-xlgmac-reg.h"
28 static int xlgmac_tx_complete(struct xlgmac_dma_desc
*dma_desc
)
30 return !XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
31 TX_NORMAL_DESC3_OWN_POS
,
32 TX_NORMAL_DESC3_OWN_LEN
);
35 static int xlgmac_disable_rx_csum(struct xlgmac_pdata
*pdata
)
39 regval
= readl(pdata
->mac_regs
+ MAC_RCR
);
40 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_IPC_POS
,
42 writel(regval
, pdata
->mac_regs
+ MAC_RCR
);
47 static int xlgmac_enable_rx_csum(struct xlgmac_pdata
*pdata
)
51 regval
= readl(pdata
->mac_regs
+ MAC_RCR
);
52 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_IPC_POS
,
54 writel(regval
, pdata
->mac_regs
+ MAC_RCR
);
59 static int xlgmac_set_mac_address(struct xlgmac_pdata
*pdata
, u8
*addr
)
61 unsigned int mac_addr_hi
, mac_addr_lo
;
63 mac_addr_hi
= (addr
[5] << 8) | (addr
[4] << 0);
64 mac_addr_lo
= (addr
[3] << 24) | (addr
[2] << 16) |
65 (addr
[1] << 8) | (addr
[0] << 0);
67 writel(mac_addr_hi
, pdata
->mac_regs
+ MAC_MACA0HR
);
68 writel(mac_addr_lo
, pdata
->mac_regs
+ MAC_MACA0LR
);
73 static void xlgmac_set_mac_reg(struct xlgmac_pdata
*pdata
,
74 struct netdev_hw_addr
*ha
,
75 unsigned int *mac_reg
)
77 unsigned int mac_addr_hi
, mac_addr_lo
;
84 mac_addr
= (u8
*)&mac_addr_lo
;
85 mac_addr
[0] = ha
->addr
[0];
86 mac_addr
[1] = ha
->addr
[1];
87 mac_addr
[2] = ha
->addr
[2];
88 mac_addr
[3] = ha
->addr
[3];
89 mac_addr
= (u8
*)&mac_addr_hi
;
90 mac_addr
[0] = ha
->addr
[4];
91 mac_addr
[1] = ha
->addr
[5];
93 netif_dbg(pdata
, drv
, pdata
->netdev
,
94 "adding mac address %pM at %#x\n",
97 mac_addr_hi
= XLGMAC_SET_REG_BITS(mac_addr_hi
,
103 writel(mac_addr_hi
, pdata
->mac_regs
+ *mac_reg
);
104 *mac_reg
+= MAC_MACA_INC
;
105 writel(mac_addr_lo
, pdata
->mac_regs
+ *mac_reg
);
106 *mac_reg
+= MAC_MACA_INC
;
109 static int xlgmac_enable_rx_vlan_stripping(struct xlgmac_pdata
*pdata
)
113 regval
= readl(pdata
->mac_regs
+ MAC_VLANTR
);
114 /* Put the VLAN tag in the Rx descriptor */
115 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_EVLRXS_POS
,
116 MAC_VLANTR_EVLRXS_LEN
, 1);
117 /* Don't check the VLAN type */
118 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_DOVLTC_POS
,
119 MAC_VLANTR_DOVLTC_LEN
, 1);
120 /* Check only C-TAG (0x8100) packets */
121 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_ERSVLM_POS
,
122 MAC_VLANTR_ERSVLM_LEN
, 0);
123 /* Don't consider an S-TAG (0x88A8) packet as a VLAN packet */
124 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_ESVL_POS
,
125 MAC_VLANTR_ESVL_LEN
, 0);
126 /* Enable VLAN tag stripping */
127 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_EVLS_POS
,
128 MAC_VLANTR_EVLS_LEN
, 0x3);
129 writel(regval
, pdata
->mac_regs
+ MAC_VLANTR
);
134 static int xlgmac_disable_rx_vlan_stripping(struct xlgmac_pdata
*pdata
)
138 regval
= readl(pdata
->mac_regs
+ MAC_VLANTR
);
139 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_EVLS_POS
,
140 MAC_VLANTR_EVLS_LEN
, 0);
141 writel(regval
, pdata
->mac_regs
+ MAC_VLANTR
);
146 static int xlgmac_enable_rx_vlan_filtering(struct xlgmac_pdata
*pdata
)
150 regval
= readl(pdata
->mac_regs
+ MAC_PFR
);
151 /* Enable VLAN filtering */
152 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_PFR_VTFE_POS
,
153 MAC_PFR_VTFE_LEN
, 1);
154 writel(regval
, pdata
->mac_regs
+ MAC_PFR
);
156 regval
= readl(pdata
->mac_regs
+ MAC_VLANTR
);
157 /* Enable VLAN Hash Table filtering */
158 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_VTHM_POS
,
159 MAC_VLANTR_VTHM_LEN
, 1);
160 /* Disable VLAN tag inverse matching */
161 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_VTIM_POS
,
162 MAC_VLANTR_VTIM_LEN
, 0);
163 /* Only filter on the lower 12-bits of the VLAN tag */
164 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_ETV_POS
,
165 MAC_VLANTR_ETV_LEN
, 1);
166 /* In order for the VLAN Hash Table filtering to be effective,
167 * the VLAN tag identifier in the VLAN Tag Register must not
168 * be zero. Set the VLAN tag identifier to "1" to enable the
169 * VLAN Hash Table filtering. This implies that a VLAN tag of
170 * 1 will always pass filtering.
172 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANTR_VL_POS
,
173 MAC_VLANTR_VL_LEN
, 1);
174 writel(regval
, pdata
->mac_regs
+ MAC_VLANTR
);
179 static int xlgmac_disable_rx_vlan_filtering(struct xlgmac_pdata
*pdata
)
183 regval
= readl(pdata
->mac_regs
+ MAC_PFR
);
184 /* Disable VLAN filtering */
185 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_PFR_VTFE_POS
,
186 MAC_PFR_VTFE_LEN
, 0);
187 writel(regval
, pdata
->mac_regs
+ MAC_PFR
);
192 static u32
xlgmac_vid_crc32_le(__le16 vid_le
)
194 unsigned char *data
= (unsigned char *)&vid_le
;
195 unsigned char data_byte
= 0;
196 u32 poly
= 0xedb88320;
201 bits
= get_bitmask_order(VLAN_VID_MASK
);
202 for (i
= 0; i
< bits
; i
++) {
204 data_byte
= data
[i
/ 8];
206 temp
= ((crc
& 1) ^ data_byte
) & 1;
217 static int xlgmac_update_vlan_hash_table(struct xlgmac_pdata
*pdata
)
219 u16 vlan_hash_table
= 0;
225 /* Generate the VLAN Hash Table value */
226 for_each_set_bit(vid
, pdata
->active_vlans
, VLAN_N_VID
) {
227 /* Get the CRC32 value of the VLAN ID */
228 vid_le
= cpu_to_le16(vid
);
229 crc
= bitrev32(~xlgmac_vid_crc32_le(vid_le
)) >> 28;
231 vlan_hash_table
|= (1 << crc
);
234 regval
= readl(pdata
->mac_regs
+ MAC_VLANHTR
);
235 /* Set the VLAN Hash Table filtering register */
236 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANHTR_VLHT_POS
,
237 MAC_VLANHTR_VLHT_LEN
, vlan_hash_table
);
238 writel(regval
, pdata
->mac_regs
+ MAC_VLANHTR
);
243 static int xlgmac_set_promiscuous_mode(struct xlgmac_pdata
*pdata
,
246 unsigned int val
= enable
? 1 : 0;
249 regval
= XLGMAC_GET_REG_BITS(readl(pdata
->mac_regs
+ MAC_PFR
),
250 MAC_PFR_PR_POS
, MAC_PFR_PR_LEN
);
254 netif_dbg(pdata
, drv
, pdata
->netdev
, "%s promiscuous mode\n",
255 enable
? "entering" : "leaving");
257 regval
= readl(pdata
->mac_regs
+ MAC_PFR
);
258 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_PFR_PR_POS
,
259 MAC_PFR_PR_LEN
, val
);
260 writel(regval
, pdata
->mac_regs
+ MAC_PFR
);
262 /* Hardware will still perform VLAN filtering in promiscuous mode */
264 xlgmac_disable_rx_vlan_filtering(pdata
);
266 if (pdata
->netdev
->features
& NETIF_F_HW_VLAN_CTAG_FILTER
)
267 xlgmac_enable_rx_vlan_filtering(pdata
);
273 static int xlgmac_set_all_multicast_mode(struct xlgmac_pdata
*pdata
,
276 unsigned int val
= enable
? 1 : 0;
279 regval
= XLGMAC_GET_REG_BITS(readl(pdata
->mac_regs
+ MAC_PFR
),
280 MAC_PFR_PM_POS
, MAC_PFR_PM_LEN
);
284 netif_dbg(pdata
, drv
, pdata
->netdev
, "%s allmulti mode\n",
285 enable
? "entering" : "leaving");
287 regval
= readl(pdata
->mac_regs
+ MAC_PFR
);
288 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_PFR_PM_POS
,
289 MAC_PFR_PM_LEN
, val
);
290 writel(regval
, pdata
->mac_regs
+ MAC_PFR
);
295 static void xlgmac_set_mac_addn_addrs(struct xlgmac_pdata
*pdata
)
297 struct net_device
*netdev
= pdata
->netdev
;
298 struct netdev_hw_addr
*ha
;
299 unsigned int addn_macs
;
300 unsigned int mac_reg
;
302 mac_reg
= MAC_MACA1HR
;
303 addn_macs
= pdata
->hw_feat
.addn_mac
;
305 if (netdev_uc_count(netdev
) > addn_macs
) {
306 xlgmac_set_promiscuous_mode(pdata
, 1);
308 netdev_for_each_uc_addr(ha
, netdev
) {
309 xlgmac_set_mac_reg(pdata
, ha
, &mac_reg
);
313 if (netdev_mc_count(netdev
) > addn_macs
) {
314 xlgmac_set_all_multicast_mode(pdata
, 1);
316 netdev_for_each_mc_addr(ha
, netdev
) {
317 xlgmac_set_mac_reg(pdata
, ha
, &mac_reg
);
323 /* Clear remaining additional MAC address entries */
325 xlgmac_set_mac_reg(pdata
, NULL
, &mac_reg
);
328 static void xlgmac_set_mac_hash_table(struct xlgmac_pdata
*pdata
)
330 unsigned int hash_table_shift
, hash_table_count
;
331 u32 hash_table
[XLGMAC_MAC_HASH_TABLE_SIZE
];
332 struct net_device
*netdev
= pdata
->netdev
;
333 struct netdev_hw_addr
*ha
;
334 unsigned int hash_reg
;
338 hash_table_shift
= 26 - (pdata
->hw_feat
.hash_table_size
>> 7);
339 hash_table_count
= pdata
->hw_feat
.hash_table_size
/ 32;
340 memset(hash_table
, 0, sizeof(hash_table
));
342 /* Build the MAC Hash Table register values */
343 netdev_for_each_uc_addr(ha
, netdev
) {
344 crc
= bitrev32(~crc32_le(~0, ha
->addr
, ETH_ALEN
));
345 crc
>>= hash_table_shift
;
346 hash_table
[crc
>> 5] |= (1 << (crc
& 0x1f));
349 netdev_for_each_mc_addr(ha
, netdev
) {
350 crc
= bitrev32(~crc32_le(~0, ha
->addr
, ETH_ALEN
));
351 crc
>>= hash_table_shift
;
352 hash_table
[crc
>> 5] |= (1 << (crc
& 0x1f));
355 /* Set the MAC Hash Table registers */
357 for (i
= 0; i
< hash_table_count
; i
++) {
358 writel(hash_table
[i
], pdata
->mac_regs
+ hash_reg
);
359 hash_reg
+= MAC_HTR_INC
;
363 static int xlgmac_add_mac_addresses(struct xlgmac_pdata
*pdata
)
365 if (pdata
->hw_feat
.hash_table_size
)
366 xlgmac_set_mac_hash_table(pdata
);
368 xlgmac_set_mac_addn_addrs(pdata
);
373 static void xlgmac_config_mac_address(struct xlgmac_pdata
*pdata
)
377 xlgmac_set_mac_address(pdata
, pdata
->netdev
->dev_addr
);
379 /* Filtering is done using perfect filtering and hash filtering */
380 if (pdata
->hw_feat
.hash_table_size
) {
381 regval
= readl(pdata
->mac_regs
+ MAC_PFR
);
382 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_PFR_HPF_POS
,
384 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_PFR_HUC_POS
,
386 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_PFR_HMC_POS
,
388 writel(regval
, pdata
->mac_regs
+ MAC_PFR
);
392 static void xlgmac_config_jumbo_enable(struct xlgmac_pdata
*pdata
)
397 val
= (pdata
->netdev
->mtu
> XLGMAC_STD_PACKET_MTU
) ? 1 : 0;
399 regval
= readl(pdata
->mac_regs
+ MAC_RCR
);
400 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_JE_POS
,
401 MAC_RCR_JE_LEN
, val
);
402 writel(regval
, pdata
->mac_regs
+ MAC_RCR
);
405 static void xlgmac_config_checksum_offload(struct xlgmac_pdata
*pdata
)
407 if (pdata
->netdev
->features
& NETIF_F_RXCSUM
)
408 xlgmac_enable_rx_csum(pdata
);
410 xlgmac_disable_rx_csum(pdata
);
413 static void xlgmac_config_vlan_support(struct xlgmac_pdata
*pdata
)
417 regval
= readl(pdata
->mac_regs
+ MAC_VLANIR
);
418 /* Indicate that VLAN Tx CTAGs come from context descriptors */
419 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANIR_CSVL_POS
,
420 MAC_VLANIR_CSVL_LEN
, 0);
421 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_VLANIR_VLTI_POS
,
422 MAC_VLANIR_VLTI_LEN
, 1);
423 writel(regval
, pdata
->mac_regs
+ MAC_VLANIR
);
425 /* Set the current VLAN Hash Table register value */
426 xlgmac_update_vlan_hash_table(pdata
);
428 if (pdata
->netdev
->features
& NETIF_F_HW_VLAN_CTAG_FILTER
)
429 xlgmac_enable_rx_vlan_filtering(pdata
);
431 xlgmac_disable_rx_vlan_filtering(pdata
);
433 if (pdata
->netdev
->features
& NETIF_F_HW_VLAN_CTAG_RX
)
434 xlgmac_enable_rx_vlan_stripping(pdata
);
436 xlgmac_disable_rx_vlan_stripping(pdata
);
439 static int xlgmac_config_rx_mode(struct xlgmac_pdata
*pdata
)
441 struct net_device
*netdev
= pdata
->netdev
;
442 unsigned int pr_mode
, am_mode
;
444 pr_mode
= ((netdev
->flags
& IFF_PROMISC
) != 0);
445 am_mode
= ((netdev
->flags
& IFF_ALLMULTI
) != 0);
447 xlgmac_set_promiscuous_mode(pdata
, pr_mode
);
448 xlgmac_set_all_multicast_mode(pdata
, am_mode
);
450 xlgmac_add_mac_addresses(pdata
);
455 static void xlgmac_prepare_tx_stop(struct xlgmac_pdata
*pdata
,
456 struct xlgmac_channel
*channel
)
458 unsigned int tx_dsr
, tx_pos
, tx_qidx
;
459 unsigned long tx_timeout
;
460 unsigned int tx_status
;
462 /* Calculate the status register to read and the position within */
463 if (channel
->queue_index
< DMA_DSRX_FIRST_QUEUE
) {
465 tx_pos
= (channel
->queue_index
* DMA_DSR_Q_LEN
) +
468 tx_qidx
= channel
->queue_index
- DMA_DSRX_FIRST_QUEUE
;
470 tx_dsr
= DMA_DSR1
+ ((tx_qidx
/ DMA_DSRX_QPR
) * DMA_DSRX_INC
);
471 tx_pos
= ((tx_qidx
% DMA_DSRX_QPR
) * DMA_DSR_Q_LEN
) +
475 /* The Tx engine cannot be stopped if it is actively processing
476 * descriptors. Wait for the Tx engine to enter the stopped or
477 * suspended state. Don't wait forever though...
479 tx_timeout
= jiffies
+ (XLGMAC_DMA_STOP_TIMEOUT
* HZ
);
480 while (time_before(jiffies
, tx_timeout
)) {
481 tx_status
= readl(pdata
->mac_regs
+ tx_dsr
);
482 tx_status
= XLGMAC_GET_REG_BITS(tx_status
, tx_pos
,
484 if ((tx_status
== DMA_TPS_STOPPED
) ||
485 (tx_status
== DMA_TPS_SUSPENDED
))
488 usleep_range(500, 1000);
491 if (!time_before(jiffies
, tx_timeout
))
492 netdev_info(pdata
->netdev
,
493 "timed out waiting for Tx DMA channel %u to stop\n",
494 channel
->queue_index
);
497 static void xlgmac_enable_tx(struct xlgmac_pdata
*pdata
)
499 struct xlgmac_channel
*channel
;
503 /* Enable each Tx DMA channel */
504 channel
= pdata
->channel_head
;
505 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
506 if (!channel
->tx_ring
)
509 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
510 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_TCR_ST_POS
,
511 DMA_CH_TCR_ST_LEN
, 1);
512 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
515 /* Enable each Tx queue */
516 for (i
= 0; i
< pdata
->tx_q_count
; i
++) {
517 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
518 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_TQOMR_TXQEN_POS
,
519 MTL_Q_TQOMR_TXQEN_LEN
,
521 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
525 regval
= readl(pdata
->mac_regs
+ MAC_TCR
);
526 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_TCR_TE_POS
,
528 writel(regval
, pdata
->mac_regs
+ MAC_TCR
);
531 static void xlgmac_disable_tx(struct xlgmac_pdata
*pdata
)
533 struct xlgmac_channel
*channel
;
537 /* Prepare for Tx DMA channel stop */
538 channel
= pdata
->channel_head
;
539 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
540 if (!channel
->tx_ring
)
543 xlgmac_prepare_tx_stop(pdata
, channel
);
547 regval
= readl(pdata
->mac_regs
+ MAC_TCR
);
548 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_TCR_TE_POS
,
550 writel(regval
, pdata
->mac_regs
+ MAC_TCR
);
552 /* Disable each Tx queue */
553 for (i
= 0; i
< pdata
->tx_q_count
; i
++) {
554 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
555 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_TQOMR_TXQEN_POS
,
556 MTL_Q_TQOMR_TXQEN_LEN
, 0);
557 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
560 /* Disable each Tx DMA channel */
561 channel
= pdata
->channel_head
;
562 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
563 if (!channel
->tx_ring
)
566 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
567 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_TCR_ST_POS
,
568 DMA_CH_TCR_ST_LEN
, 0);
569 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
573 static void xlgmac_prepare_rx_stop(struct xlgmac_pdata
*pdata
,
576 unsigned int rx_status
, prxq
, rxqsts
;
577 unsigned long rx_timeout
;
579 /* The Rx engine cannot be stopped if it is actively processing
580 * packets. Wait for the Rx queue to empty the Rx fifo. Don't
581 * wait forever though...
583 rx_timeout
= jiffies
+ (XLGMAC_DMA_STOP_TIMEOUT
* HZ
);
584 while (time_before(jiffies
, rx_timeout
)) {
585 rx_status
= readl(XLGMAC_MTL_REG(pdata
, queue
, MTL_Q_RQDR
));
586 prxq
= XLGMAC_GET_REG_BITS(rx_status
, MTL_Q_RQDR_PRXQ_POS
,
587 MTL_Q_RQDR_PRXQ_LEN
);
588 rxqsts
= XLGMAC_GET_REG_BITS(rx_status
, MTL_Q_RQDR_RXQSTS_POS
,
589 MTL_Q_RQDR_RXQSTS_LEN
);
590 if ((prxq
== 0) && (rxqsts
== 0))
593 usleep_range(500, 1000);
596 if (!time_before(jiffies
, rx_timeout
))
597 netdev_info(pdata
->netdev
,
598 "timed out waiting for Rx queue %u to empty\n",
602 static void xlgmac_enable_rx(struct xlgmac_pdata
*pdata
)
604 struct xlgmac_channel
*channel
;
605 unsigned int regval
, i
;
607 /* Enable each Rx DMA channel */
608 channel
= pdata
->channel_head
;
609 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
610 if (!channel
->rx_ring
)
613 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_RCR
));
614 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_RCR_SR_POS
,
615 DMA_CH_RCR_SR_LEN
, 1);
616 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_RCR
));
619 /* Enable each Rx queue */
621 for (i
= 0; i
< pdata
->rx_q_count
; i
++)
622 regval
|= (0x02 << (i
<< 1));
623 writel(regval
, pdata
->mac_regs
+ MAC_RQC0R
);
626 regval
= readl(pdata
->mac_regs
+ MAC_RCR
);
627 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_DCRCC_POS
,
628 MAC_RCR_DCRCC_LEN
, 1);
629 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_CST_POS
,
631 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_ACS_POS
,
633 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_RE_POS
,
635 writel(regval
, pdata
->mac_regs
+ MAC_RCR
);
638 static void xlgmac_disable_rx(struct xlgmac_pdata
*pdata
)
640 struct xlgmac_channel
*channel
;
645 regval
= readl(pdata
->mac_regs
+ MAC_RCR
);
646 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_DCRCC_POS
,
647 MAC_RCR_DCRCC_LEN
, 0);
648 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_CST_POS
,
650 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_ACS_POS
,
652 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_RE_POS
,
654 writel(regval
, pdata
->mac_regs
+ MAC_RCR
);
656 /* Prepare for Rx DMA channel stop */
657 for (i
= 0; i
< pdata
->rx_q_count
; i
++)
658 xlgmac_prepare_rx_stop(pdata
, i
);
660 /* Disable each Rx queue */
661 writel(0, pdata
->mac_regs
+ MAC_RQC0R
);
663 /* Disable each Rx DMA channel */
664 channel
= pdata
->channel_head
;
665 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
666 if (!channel
->rx_ring
)
669 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_RCR
));
670 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_RCR_SR_POS
,
671 DMA_CH_RCR_SR_LEN
, 0);
672 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_RCR
));
676 static void xlgmac_tx_start_xmit(struct xlgmac_channel
*channel
,
677 struct xlgmac_ring
*ring
)
679 struct xlgmac_pdata
*pdata
= channel
->pdata
;
680 struct xlgmac_desc_data
*desc_data
;
682 /* Make sure everything is written before the register write */
685 /* Issue a poll command to Tx DMA by writing address
686 * of next immediate free descriptor
688 desc_data
= XLGMAC_GET_DESC_DATA(ring
, ring
->cur
);
689 writel(lower_32_bits(desc_data
->dma_desc_addr
),
690 XLGMAC_DMA_REG(channel
, DMA_CH_TDTR_LO
));
692 /* Start the Tx timer */
693 if (pdata
->tx_usecs
&& !channel
->tx_timer_active
) {
694 channel
->tx_timer_active
= 1;
695 mod_timer(&channel
->tx_timer
,
696 jiffies
+ usecs_to_jiffies(pdata
->tx_usecs
));
699 ring
->tx
.xmit_more
= 0;
702 static void xlgmac_dev_xmit(struct xlgmac_channel
*channel
)
704 struct xlgmac_pdata
*pdata
= channel
->pdata
;
705 struct xlgmac_ring
*ring
= channel
->tx_ring
;
706 unsigned int tso_context
, vlan_context
;
707 struct xlgmac_desc_data
*desc_data
;
708 struct xlgmac_dma_desc
*dma_desc
;
709 struct xlgmac_pkt_info
*pkt_info
;
710 unsigned int csum
, tso
, vlan
;
711 int start_index
= ring
->cur
;
712 int cur_index
= ring
->cur
;
713 unsigned int tx_set_ic
;
716 pkt_info
= &ring
->pkt_info
;
717 csum
= XLGMAC_GET_REG_BITS(pkt_info
->attributes
,
718 TX_PACKET_ATTRIBUTES_CSUM_ENABLE_POS
,
719 TX_PACKET_ATTRIBUTES_CSUM_ENABLE_LEN
);
720 tso
= XLGMAC_GET_REG_BITS(pkt_info
->attributes
,
721 TX_PACKET_ATTRIBUTES_TSO_ENABLE_POS
,
722 TX_PACKET_ATTRIBUTES_TSO_ENABLE_LEN
);
723 vlan
= XLGMAC_GET_REG_BITS(pkt_info
->attributes
,
724 TX_PACKET_ATTRIBUTES_VLAN_CTAG_POS
,
725 TX_PACKET_ATTRIBUTES_VLAN_CTAG_LEN
);
727 if (tso
&& (pkt_info
->mss
!= ring
->tx
.cur_mss
))
732 if (vlan
&& (pkt_info
->vlan_ctag
!= ring
->tx
.cur_vlan_ctag
))
737 /* Determine if an interrupt should be generated for this Tx:
739 * - Tx frame count exceeds the frame count setting
740 * - Addition of Tx frame count to the frame count since the
741 * last interrupt was set exceeds the frame count setting
743 * - No frame count setting specified (ethtool -C ethX tx-frames 0)
744 * - Addition of Tx frame count to the frame count since the
745 * last interrupt was set does not exceed the frame count setting
747 ring
->coalesce_count
+= pkt_info
->tx_packets
;
748 if (!pdata
->tx_frames
)
750 else if (pkt_info
->tx_packets
> pdata
->tx_frames
)
752 else if ((ring
->coalesce_count
% pdata
->tx_frames
) <
753 pkt_info
->tx_packets
)
758 desc_data
= XLGMAC_GET_DESC_DATA(ring
, cur_index
);
759 dma_desc
= desc_data
->dma_desc
;
761 /* Create a context descriptor if this is a TSO pkt_info */
762 if (tso_context
|| vlan_context
) {
764 netif_dbg(pdata
, tx_queued
, pdata
->netdev
,
765 "TSO context descriptor, mss=%u\n",
768 /* Set the MSS size */
769 dma_desc
->desc2
= XLGMAC_SET_REG_BITS_LE(
771 TX_CONTEXT_DESC2_MSS_POS
,
772 TX_CONTEXT_DESC2_MSS_LEN
,
775 /* Mark it as a CONTEXT descriptor */
776 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
778 TX_CONTEXT_DESC3_CTXT_POS
,
779 TX_CONTEXT_DESC3_CTXT_LEN
,
782 /* Indicate this descriptor contains the MSS */
783 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
785 TX_CONTEXT_DESC3_TCMSSV_POS
,
786 TX_CONTEXT_DESC3_TCMSSV_LEN
,
789 ring
->tx
.cur_mss
= pkt_info
->mss
;
793 netif_dbg(pdata
, tx_queued
, pdata
->netdev
,
794 "VLAN context descriptor, ctag=%u\n",
795 pkt_info
->vlan_ctag
);
797 /* Mark it as a CONTEXT descriptor */
798 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
800 TX_CONTEXT_DESC3_CTXT_POS
,
801 TX_CONTEXT_DESC3_CTXT_LEN
,
804 /* Set the VLAN tag */
805 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
807 TX_CONTEXT_DESC3_VT_POS
,
808 TX_CONTEXT_DESC3_VT_LEN
,
809 pkt_info
->vlan_ctag
);
811 /* Indicate this descriptor contains the VLAN tag */
812 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
814 TX_CONTEXT_DESC3_VLTV_POS
,
815 TX_CONTEXT_DESC3_VLTV_LEN
,
818 ring
->tx
.cur_vlan_ctag
= pkt_info
->vlan_ctag
;
822 desc_data
= XLGMAC_GET_DESC_DATA(ring
, cur_index
);
823 dma_desc
= desc_data
->dma_desc
;
826 /* Update buffer address (for TSO this is the header) */
827 dma_desc
->desc0
= cpu_to_le32(lower_32_bits(desc_data
->skb_dma
));
828 dma_desc
->desc1
= cpu_to_le32(upper_32_bits(desc_data
->skb_dma
));
830 /* Update the buffer length */
831 dma_desc
->desc2
= XLGMAC_SET_REG_BITS_LE(
833 TX_NORMAL_DESC2_HL_B1L_POS
,
834 TX_NORMAL_DESC2_HL_B1L_LEN
,
835 desc_data
->skb_dma_len
);
837 /* VLAN tag insertion check */
839 dma_desc
->desc2
= XLGMAC_SET_REG_BITS_LE(
841 TX_NORMAL_DESC2_VTIR_POS
,
842 TX_NORMAL_DESC2_VTIR_LEN
,
843 TX_NORMAL_DESC2_VLAN_INSERT
);
844 pdata
->stats
.tx_vlan_packets
++;
847 /* Timestamp enablement check */
848 if (XLGMAC_GET_REG_BITS(pkt_info
->attributes
,
849 TX_PACKET_ATTRIBUTES_PTP_POS
,
850 TX_PACKET_ATTRIBUTES_PTP_LEN
))
851 dma_desc
->desc2
= XLGMAC_SET_REG_BITS_LE(
853 TX_NORMAL_DESC2_TTSE_POS
,
854 TX_NORMAL_DESC2_TTSE_LEN
,
857 /* Mark it as First Descriptor */
858 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
860 TX_NORMAL_DESC3_FD_POS
,
861 TX_NORMAL_DESC3_FD_LEN
,
864 /* Mark it as a NORMAL descriptor */
865 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
867 TX_NORMAL_DESC3_CTXT_POS
,
868 TX_NORMAL_DESC3_CTXT_LEN
,
871 /* Set OWN bit if not the first descriptor */
872 if (cur_index
!= start_index
)
873 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
875 TX_NORMAL_DESC3_OWN_POS
,
876 TX_NORMAL_DESC3_OWN_LEN
,
881 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
883 TX_NORMAL_DESC3_TSE_POS
,
884 TX_NORMAL_DESC3_TSE_LEN
, 1);
885 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
887 TX_NORMAL_DESC3_TCPPL_POS
,
888 TX_NORMAL_DESC3_TCPPL_LEN
,
889 pkt_info
->tcp_payload_len
);
890 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
892 TX_NORMAL_DESC3_TCPHDRLEN_POS
,
893 TX_NORMAL_DESC3_TCPHDRLEN_LEN
,
894 pkt_info
->tcp_header_len
/ 4);
896 pdata
->stats
.tx_tso_packets
++;
898 /* Enable CRC and Pad Insertion */
899 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
901 TX_NORMAL_DESC3_CPC_POS
,
902 TX_NORMAL_DESC3_CPC_LEN
, 0);
906 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
908 TX_NORMAL_DESC3_CIC_POS
,
909 TX_NORMAL_DESC3_CIC_LEN
,
912 /* Set the total length to be transmitted */
913 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
915 TX_NORMAL_DESC3_FL_POS
,
916 TX_NORMAL_DESC3_FL_LEN
,
920 for (i
= cur_index
- start_index
+ 1; i
< pkt_info
->desc_count
; i
++) {
922 desc_data
= XLGMAC_GET_DESC_DATA(ring
, cur_index
);
923 dma_desc
= desc_data
->dma_desc
;
925 /* Update buffer address */
927 cpu_to_le32(lower_32_bits(desc_data
->skb_dma
));
929 cpu_to_le32(upper_32_bits(desc_data
->skb_dma
));
931 /* Update the buffer length */
932 dma_desc
->desc2
= XLGMAC_SET_REG_BITS_LE(
934 TX_NORMAL_DESC2_HL_B1L_POS
,
935 TX_NORMAL_DESC2_HL_B1L_LEN
,
936 desc_data
->skb_dma_len
);
939 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
941 TX_NORMAL_DESC3_OWN_POS
,
942 TX_NORMAL_DESC3_OWN_LEN
, 1);
944 /* Mark it as NORMAL descriptor */
945 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
947 TX_NORMAL_DESC3_CTXT_POS
,
948 TX_NORMAL_DESC3_CTXT_LEN
, 0);
952 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
954 TX_NORMAL_DESC3_CIC_POS
,
955 TX_NORMAL_DESC3_CIC_LEN
,
959 /* Set LAST bit for the last descriptor */
960 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
962 TX_NORMAL_DESC3_LD_POS
,
963 TX_NORMAL_DESC3_LD_LEN
, 1);
965 /* Set IC bit based on Tx coalescing settings */
967 dma_desc
->desc2
= XLGMAC_SET_REG_BITS_LE(
969 TX_NORMAL_DESC2_IC_POS
,
970 TX_NORMAL_DESC2_IC_LEN
, 1);
972 /* Save the Tx info to report back during cleanup */
973 desc_data
->tx
.packets
= pkt_info
->tx_packets
;
974 desc_data
->tx
.bytes
= pkt_info
->tx_bytes
;
976 /* In case the Tx DMA engine is running, make sure everything
977 * is written to the descriptor(s) before setting the OWN bit
978 * for the first descriptor
982 /* Set OWN bit for the first descriptor */
983 desc_data
= XLGMAC_GET_DESC_DATA(ring
, start_index
);
984 dma_desc
= desc_data
->dma_desc
;
985 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
987 TX_NORMAL_DESC3_OWN_POS
,
988 TX_NORMAL_DESC3_OWN_LEN
, 1);
990 if (netif_msg_tx_queued(pdata
))
991 xlgmac_dump_tx_desc(pdata
, ring
, start_index
,
992 pkt_info
->desc_count
, 1);
994 /* Make sure ownership is written to the descriptor */
997 ring
->cur
= cur_index
+ 1;
998 if (!pkt_info
->skb
->xmit_more
||
999 netif_xmit_stopped(netdev_get_tx_queue(pdata
->netdev
,
1000 channel
->queue_index
)))
1001 xlgmac_tx_start_xmit(channel
, ring
);
1003 ring
->tx
.xmit_more
= 1;
1005 XLGMAC_PR("%s: descriptors %u to %u written\n",
1006 channel
->name
, start_index
& (ring
->dma_desc_count
- 1),
1007 (ring
->cur
- 1) & (ring
->dma_desc_count
- 1));
1010 static void xlgmac_get_rx_tstamp(struct xlgmac_pkt_info
*pkt_info
,
1011 struct xlgmac_dma_desc
*dma_desc
)
1016 tsa
= XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
1017 RX_CONTEXT_DESC3_TSA_POS
,
1018 RX_CONTEXT_DESC3_TSA_LEN
);
1019 tsd
= XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
1020 RX_CONTEXT_DESC3_TSD_POS
,
1021 RX_CONTEXT_DESC3_TSD_LEN
);
1023 nsec
= le32_to_cpu(dma_desc
->desc1
);
1025 nsec
|= le32_to_cpu(dma_desc
->desc0
);
1026 if (nsec
!= 0xffffffffffffffffULL
) {
1027 pkt_info
->rx_tstamp
= nsec
;
1028 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
1029 pkt_info
->attributes
,
1030 RX_PACKET_ATTRIBUTES_RX_TSTAMP_POS
,
1031 RX_PACKET_ATTRIBUTES_RX_TSTAMP_LEN
,
1037 static void xlgmac_tx_desc_reset(struct xlgmac_desc_data
*desc_data
)
1039 struct xlgmac_dma_desc
*dma_desc
= desc_data
->dma_desc
;
1041 /* Reset the Tx descriptor
1042 * Set buffer 1 (lo) address to zero
1043 * Set buffer 1 (hi) address to zero
1044 * Reset all other control bits (IC, TTSE, B2L & B1L)
1045 * Reset all other control bits (OWN, CTXT, FD, LD, CPC, CIC, etc)
1047 dma_desc
->desc0
= 0;
1048 dma_desc
->desc1
= 0;
1049 dma_desc
->desc2
= 0;
1050 dma_desc
->desc3
= 0;
1052 /* Make sure ownership is written to the descriptor */
1056 static void xlgmac_tx_desc_init(struct xlgmac_channel
*channel
)
1058 struct xlgmac_ring
*ring
= channel
->tx_ring
;
1059 struct xlgmac_desc_data
*desc_data
;
1060 int start_index
= ring
->cur
;
1063 /* Initialze all descriptors */
1064 for (i
= 0; i
< ring
->dma_desc_count
; i
++) {
1065 desc_data
= XLGMAC_GET_DESC_DATA(ring
, i
);
1067 /* Initialize Tx descriptor */
1068 xlgmac_tx_desc_reset(desc_data
);
1071 /* Update the total number of Tx descriptors */
1072 writel(ring
->dma_desc_count
- 1, XLGMAC_DMA_REG(channel
, DMA_CH_TDRLR
));
1074 /* Update the starting address of descriptor ring */
1075 desc_data
= XLGMAC_GET_DESC_DATA(ring
, start_index
);
1076 writel(upper_32_bits(desc_data
->dma_desc_addr
),
1077 XLGMAC_DMA_REG(channel
, DMA_CH_TDLR_HI
));
1078 writel(lower_32_bits(desc_data
->dma_desc_addr
),
1079 XLGMAC_DMA_REG(channel
, DMA_CH_TDLR_LO
));
1082 static void xlgmac_rx_desc_reset(struct xlgmac_pdata
*pdata
,
1083 struct xlgmac_desc_data
*desc_data
,
1086 struct xlgmac_dma_desc
*dma_desc
= desc_data
->dma_desc
;
1087 unsigned int rx_frames
= pdata
->rx_frames
;
1088 unsigned int rx_usecs
= pdata
->rx_usecs
;
1089 dma_addr_t hdr_dma
, buf_dma
;
1092 if (!rx_usecs
&& !rx_frames
) {
1093 /* No coalescing, interrupt for every descriptor */
1096 /* Set interrupt based on Rx frame coalescing setting */
1097 if (rx_frames
&& !((index
+ 1) % rx_frames
))
1103 /* Reset the Rx descriptor
1104 * Set buffer 1 (lo) address to header dma address (lo)
1105 * Set buffer 1 (hi) address to header dma address (hi)
1106 * Set buffer 2 (lo) address to buffer dma address (lo)
1107 * Set buffer 2 (hi) address to buffer dma address (hi) and
1108 * set control bits OWN and INTE
1110 hdr_dma
= desc_data
->rx
.hdr
.dma_base
+ desc_data
->rx
.hdr
.dma_off
;
1111 buf_dma
= desc_data
->rx
.buf
.dma_base
+ desc_data
->rx
.buf
.dma_off
;
1112 dma_desc
->desc0
= cpu_to_le32(lower_32_bits(hdr_dma
));
1113 dma_desc
->desc1
= cpu_to_le32(upper_32_bits(hdr_dma
));
1114 dma_desc
->desc2
= cpu_to_le32(lower_32_bits(buf_dma
));
1115 dma_desc
->desc3
= cpu_to_le32(upper_32_bits(buf_dma
));
1117 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
1119 RX_NORMAL_DESC3_INTE_POS
,
1120 RX_NORMAL_DESC3_INTE_LEN
,
1123 /* Since the Rx DMA engine is likely running, make sure everything
1124 * is written to the descriptor(s) before setting the OWN bit
1125 * for the descriptor
1129 dma_desc
->desc3
= XLGMAC_SET_REG_BITS_LE(
1131 RX_NORMAL_DESC3_OWN_POS
,
1132 RX_NORMAL_DESC3_OWN_LEN
,
1135 /* Make sure ownership is written to the descriptor */
1139 static void xlgmac_rx_desc_init(struct xlgmac_channel
*channel
)
1141 struct xlgmac_pdata
*pdata
= channel
->pdata
;
1142 struct xlgmac_ring
*ring
= channel
->rx_ring
;
1143 unsigned int start_index
= ring
->cur
;
1144 struct xlgmac_desc_data
*desc_data
;
1147 /* Initialize all descriptors */
1148 for (i
= 0; i
< ring
->dma_desc_count
; i
++) {
1149 desc_data
= XLGMAC_GET_DESC_DATA(ring
, i
);
1151 /* Initialize Rx descriptor */
1152 xlgmac_rx_desc_reset(pdata
, desc_data
, i
);
1155 /* Update the total number of Rx descriptors */
1156 writel(ring
->dma_desc_count
- 1, XLGMAC_DMA_REG(channel
, DMA_CH_RDRLR
));
1158 /* Update the starting address of descriptor ring */
1159 desc_data
= XLGMAC_GET_DESC_DATA(ring
, start_index
);
1160 writel(upper_32_bits(desc_data
->dma_desc_addr
),
1161 XLGMAC_DMA_REG(channel
, DMA_CH_RDLR_HI
));
1162 writel(lower_32_bits(desc_data
->dma_desc_addr
),
1163 XLGMAC_DMA_REG(channel
, DMA_CH_RDLR_LO
));
1165 /* Update the Rx Descriptor Tail Pointer */
1166 desc_data
= XLGMAC_GET_DESC_DATA(ring
, start_index
+
1167 ring
->dma_desc_count
- 1);
1168 writel(lower_32_bits(desc_data
->dma_desc_addr
),
1169 XLGMAC_DMA_REG(channel
, DMA_CH_RDTR_LO
));
1172 static int xlgmac_is_context_desc(struct xlgmac_dma_desc
*dma_desc
)
1174 /* Rx and Tx share CTXT bit, so check TDES3.CTXT bit */
1175 return XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
1176 TX_NORMAL_DESC3_CTXT_POS
,
1177 TX_NORMAL_DESC3_CTXT_LEN
);
1180 static int xlgmac_is_last_desc(struct xlgmac_dma_desc
*dma_desc
)
1182 /* Rx and Tx share LD bit, so check TDES3.LD bit */
1183 return XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
1184 TX_NORMAL_DESC3_LD_POS
,
1185 TX_NORMAL_DESC3_LD_LEN
);
1188 static int xlgmac_disable_tx_flow_control(struct xlgmac_pdata
*pdata
)
1190 unsigned int max_q_count
, q_count
;
1191 unsigned int reg
, regval
;
1194 /* Clear MTL flow control */
1195 for (i
= 0; i
< pdata
->rx_q_count
; i
++) {
1196 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1197 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_RQOMR_EHFC_POS
,
1198 MTL_Q_RQOMR_EHFC_LEN
, 0);
1199 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1202 /* Clear MAC flow control */
1203 max_q_count
= XLGMAC_MAX_FLOW_CONTROL_QUEUES
;
1204 q_count
= min_t(unsigned int, pdata
->tx_q_count
, max_q_count
);
1206 for (i
= 0; i
< q_count
; i
++) {
1207 regval
= readl(pdata
->mac_regs
+ reg
);
1208 regval
= XLGMAC_SET_REG_BITS(regval
,
1212 writel(regval
, pdata
->mac_regs
+ reg
);
1214 reg
+= MAC_QTFCR_INC
;
1220 static int xlgmac_enable_tx_flow_control(struct xlgmac_pdata
*pdata
)
1222 unsigned int max_q_count
, q_count
;
1223 unsigned int reg
, regval
;
1226 /* Set MTL flow control */
1227 for (i
= 0; i
< pdata
->rx_q_count
; i
++) {
1228 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1229 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_RQOMR_EHFC_POS
,
1230 MTL_Q_RQOMR_EHFC_LEN
, 1);
1231 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1234 /* Set MAC flow control */
1235 max_q_count
= XLGMAC_MAX_FLOW_CONTROL_QUEUES
;
1236 q_count
= min_t(unsigned int, pdata
->tx_q_count
, max_q_count
);
1238 for (i
= 0; i
< q_count
; i
++) {
1239 regval
= readl(pdata
->mac_regs
+ reg
);
1241 /* Enable transmit flow control */
1242 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_Q0TFCR_TFE_POS
,
1243 MAC_Q0TFCR_TFE_LEN
, 1);
1244 /* Set pause time */
1245 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_Q0TFCR_PT_POS
,
1246 MAC_Q0TFCR_PT_LEN
, 0xffff);
1248 writel(regval
, pdata
->mac_regs
+ reg
);
1250 reg
+= MAC_QTFCR_INC
;
1256 static int xlgmac_disable_rx_flow_control(struct xlgmac_pdata
*pdata
)
1260 regval
= readl(pdata
->mac_regs
+ MAC_RFCR
);
1261 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RFCR_RFE_POS
,
1262 MAC_RFCR_RFE_LEN
, 0);
1263 writel(regval
, pdata
->mac_regs
+ MAC_RFCR
);
1268 static int xlgmac_enable_rx_flow_control(struct xlgmac_pdata
*pdata
)
1272 regval
= readl(pdata
->mac_regs
+ MAC_RFCR
);
1273 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RFCR_RFE_POS
,
1274 MAC_RFCR_RFE_LEN
, 1);
1275 writel(regval
, pdata
->mac_regs
+ MAC_RFCR
);
1280 static int xlgmac_config_tx_flow_control(struct xlgmac_pdata
*pdata
)
1282 if (pdata
->tx_pause
)
1283 xlgmac_enable_tx_flow_control(pdata
);
1285 xlgmac_disable_tx_flow_control(pdata
);
1290 static int xlgmac_config_rx_flow_control(struct xlgmac_pdata
*pdata
)
1292 if (pdata
->rx_pause
)
1293 xlgmac_enable_rx_flow_control(pdata
);
1295 xlgmac_disable_rx_flow_control(pdata
);
1300 static int xlgmac_config_rx_coalesce(struct xlgmac_pdata
*pdata
)
1302 struct xlgmac_channel
*channel
;
1306 channel
= pdata
->channel_head
;
1307 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
1308 if (!channel
->rx_ring
)
1311 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_RIWT
));
1312 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_RIWT_RWT_POS
,
1313 DMA_CH_RIWT_RWT_LEN
,
1315 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_RIWT
));
1321 static void xlgmac_config_flow_control(struct xlgmac_pdata
*pdata
)
1323 xlgmac_config_tx_flow_control(pdata
);
1324 xlgmac_config_rx_flow_control(pdata
);
1327 static void xlgmac_config_rx_fep_enable(struct xlgmac_pdata
*pdata
)
1332 for (i
= 0; i
< pdata
->rx_q_count
; i
++) {
1333 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1334 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_RQOMR_FEP_POS
,
1335 MTL_Q_RQOMR_FEP_LEN
, 1);
1336 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1340 static void xlgmac_config_rx_fup_enable(struct xlgmac_pdata
*pdata
)
1345 for (i
= 0; i
< pdata
->rx_q_count
; i
++) {
1346 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1347 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_RQOMR_FUP_POS
,
1348 MTL_Q_RQOMR_FUP_LEN
, 1);
1349 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1353 static int xlgmac_config_tx_coalesce(struct xlgmac_pdata
*pdata
)
1358 static void xlgmac_config_rx_buffer_size(struct xlgmac_pdata
*pdata
)
1360 struct xlgmac_channel
*channel
;
1364 channel
= pdata
->channel_head
;
1365 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
1366 if (!channel
->rx_ring
)
1369 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_RCR
));
1370 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_RCR_RBSZ_POS
,
1371 DMA_CH_RCR_RBSZ_LEN
,
1372 pdata
->rx_buf_size
);
1373 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_RCR
));
1377 static void xlgmac_config_tso_mode(struct xlgmac_pdata
*pdata
)
1379 struct xlgmac_channel
*channel
;
1383 channel
= pdata
->channel_head
;
1384 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
1385 if (!channel
->tx_ring
)
1388 if (pdata
->hw_feat
.tso
) {
1389 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
1390 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_TCR_TSE_POS
,
1391 DMA_CH_TCR_TSE_LEN
, 1);
1392 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
1397 static void xlgmac_config_sph_mode(struct xlgmac_pdata
*pdata
)
1399 struct xlgmac_channel
*channel
;
1403 channel
= pdata
->channel_head
;
1404 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
1405 if (!channel
->rx_ring
)
1408 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_CR
));
1409 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_CR_SPH_POS
,
1410 DMA_CH_CR_SPH_LEN
, 1);
1411 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_CR
));
1414 regval
= readl(pdata
->mac_regs
+ MAC_RCR
);
1415 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RCR_HDSMS_POS
,
1417 XLGMAC_SPH_HDSMS_SIZE
);
1418 writel(regval
, pdata
->mac_regs
+ MAC_RCR
);
1421 static unsigned int xlgmac_usec_to_riwt(struct xlgmac_pdata
*pdata
,
1427 rate
= pdata
->sysclk_rate
;
1429 /* Convert the input usec value to the watchdog timer value. Each
1430 * watchdog timer value is equivalent to 256 clock cycles.
1431 * Calculate the required value as:
1432 * ( usec * ( system_clock_mhz / 10^6 ) / 256
1434 ret
= (usec
* (rate
/ 1000000)) / 256;
1439 static unsigned int xlgmac_riwt_to_usec(struct xlgmac_pdata
*pdata
,
1445 rate
= pdata
->sysclk_rate
;
1447 /* Convert the input watchdog timer value to the usec value. Each
1448 * watchdog timer value is equivalent to 256 clock cycles.
1449 * Calculate the required value as:
1450 * ( riwt * 256 ) / ( system_clock_mhz / 10^6 )
1452 ret
= (riwt
* 256) / (rate
/ 1000000);
1457 static int xlgmac_config_rx_threshold(struct xlgmac_pdata
*pdata
,
1463 for (i
= 0; i
< pdata
->rx_q_count
; i
++) {
1464 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1465 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_RQOMR_RTC_POS
,
1466 MTL_Q_RQOMR_RTC_LEN
, val
);
1467 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1473 static void xlgmac_config_mtl_mode(struct xlgmac_pdata
*pdata
)
1478 /* Set Tx to weighted round robin scheduling algorithm */
1479 regval
= readl(pdata
->mac_regs
+ MTL_OMR
);
1480 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_OMR_ETSALG_POS
,
1481 MTL_OMR_ETSALG_LEN
, MTL_ETSALG_WRR
);
1482 writel(regval
, pdata
->mac_regs
+ MTL_OMR
);
1484 /* Set Tx traffic classes to use WRR algorithm with equal weights */
1485 for (i
= 0; i
< pdata
->hw_feat
.tc_cnt
; i
++) {
1486 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_TC_ETSCR
));
1487 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_TC_ETSCR_TSA_POS
,
1488 MTL_TC_ETSCR_TSA_LEN
, MTL_TSA_ETS
);
1489 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_TC_ETSCR
));
1491 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_TC_QWR
));
1492 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_TC_QWR_QW_POS
,
1493 MTL_TC_QWR_QW_LEN
, 1);
1494 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_TC_QWR
));
1497 /* Set Rx to strict priority algorithm */
1498 regval
= readl(pdata
->mac_regs
+ MTL_OMR
);
1499 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_OMR_RAA_POS
,
1500 MTL_OMR_RAA_LEN
, MTL_RAA_SP
);
1501 writel(regval
, pdata
->mac_regs
+ MTL_OMR
);
1504 static void xlgmac_config_queue_mapping(struct xlgmac_pdata
*pdata
)
1506 unsigned int ppq
, ppq_extra
, prio
, prio_queues
;
1507 unsigned int qptc
, qptc_extra
, queue
;
1508 unsigned int reg
, regval
;
1512 /* Map the MTL Tx Queues to Traffic Classes
1513 * Note: Tx Queues >= Traffic Classes
1515 qptc
= pdata
->tx_q_count
/ pdata
->hw_feat
.tc_cnt
;
1516 qptc_extra
= pdata
->tx_q_count
% pdata
->hw_feat
.tc_cnt
;
1518 for (i
= 0, queue
= 0; i
< pdata
->hw_feat
.tc_cnt
; i
++) {
1519 for (j
= 0; j
< qptc
; j
++) {
1520 netif_dbg(pdata
, drv
, pdata
->netdev
,
1521 "TXq%u mapped to TC%u\n", queue
, i
);
1522 regval
= readl(XLGMAC_MTL_REG(pdata
, queue
,
1524 regval
= XLGMAC_SET_REG_BITS(regval
,
1525 MTL_Q_TQOMR_Q2TCMAP_POS
,
1526 MTL_Q_TQOMR_Q2TCMAP_LEN
,
1528 writel(regval
, XLGMAC_MTL_REG(pdata
, queue
,
1533 if (i
< qptc_extra
) {
1534 netif_dbg(pdata
, drv
, pdata
->netdev
,
1535 "TXq%u mapped to TC%u\n", queue
, i
);
1536 regval
= readl(XLGMAC_MTL_REG(pdata
, queue
,
1538 regval
= XLGMAC_SET_REG_BITS(regval
,
1539 MTL_Q_TQOMR_Q2TCMAP_POS
,
1540 MTL_Q_TQOMR_Q2TCMAP_LEN
,
1542 writel(regval
, XLGMAC_MTL_REG(pdata
, queue
,
1548 /* Map the 8 VLAN priority values to available MTL Rx queues */
1549 prio_queues
= min_t(unsigned int, IEEE_8021QAZ_MAX_TCS
,
1551 ppq
= IEEE_8021QAZ_MAX_TCS
/ prio_queues
;
1552 ppq_extra
= IEEE_8021QAZ_MAX_TCS
% prio_queues
;
1556 for (i
= 0, prio
= 0; i
< prio_queues
;) {
1558 for (j
= 0; j
< ppq
; j
++) {
1559 netif_dbg(pdata
, drv
, pdata
->netdev
,
1560 "PRIO%u mapped to RXq%u\n", prio
, i
);
1561 mask
|= (1 << prio
);
1565 if (i
< ppq_extra
) {
1566 netif_dbg(pdata
, drv
, pdata
->netdev
,
1567 "PRIO%u mapped to RXq%u\n", prio
, i
);
1568 mask
|= (1 << prio
);
1572 regval
|= (mask
<< ((i
++ % MAC_RQC2_Q_PER_REG
) << 3));
1574 if ((i
% MAC_RQC2_Q_PER_REG
) && (i
!= prio_queues
))
1577 writel(regval
, pdata
->mac_regs
+ reg
);
1578 reg
+= MAC_RQC2_INC
;
1582 /* Configure one to one, MTL Rx queue to DMA Rx channel mapping
1583 * ie Q0 <--> CH0, Q1 <--> CH1 ... Q11 <--> CH11
1586 regval
= readl(pdata
->mac_regs
+ reg
);
1587 regval
|= (MTL_RQDCM0R_Q0MDMACH
| MTL_RQDCM0R_Q1MDMACH
|
1588 MTL_RQDCM0R_Q2MDMACH
| MTL_RQDCM0R_Q3MDMACH
);
1589 writel(regval
, pdata
->mac_regs
+ reg
);
1591 reg
+= MTL_RQDCM_INC
;
1592 regval
= readl(pdata
->mac_regs
+ reg
);
1593 regval
|= (MTL_RQDCM1R_Q4MDMACH
| MTL_RQDCM1R_Q5MDMACH
|
1594 MTL_RQDCM1R_Q6MDMACH
| MTL_RQDCM1R_Q7MDMACH
);
1595 writel(regval
, pdata
->mac_regs
+ reg
);
1597 reg
+= MTL_RQDCM_INC
;
1598 regval
= readl(pdata
->mac_regs
+ reg
);
1599 regval
|= (MTL_RQDCM2R_Q8MDMACH
| MTL_RQDCM2R_Q9MDMACH
|
1600 MTL_RQDCM2R_Q10MDMACH
| MTL_RQDCM2R_Q11MDMACH
);
1601 writel(regval
, pdata
->mac_regs
+ reg
);
1604 static unsigned int xlgmac_calculate_per_queue_fifo(
1605 unsigned int fifo_size
,
1606 unsigned int queue_count
)
1608 unsigned int q_fifo_size
;
1609 unsigned int p_fifo
;
1611 /* Calculate the configured fifo size */
1612 q_fifo_size
= 1 << (fifo_size
+ 7);
1614 /* The configured value may not be the actual amount of fifo RAM */
1615 q_fifo_size
= min_t(unsigned int, XLGMAC_MAX_FIFO
, q_fifo_size
);
1617 q_fifo_size
= q_fifo_size
/ queue_count
;
1619 /* Each increment in the queue fifo size represents 256 bytes of
1620 * fifo, with 0 representing 256 bytes. Distribute the fifo equally
1621 * between the queues.
1623 p_fifo
= q_fifo_size
/ 256;
1630 static void xlgmac_config_tx_fifo_size(struct xlgmac_pdata
*pdata
)
1632 unsigned int fifo_size
;
1636 fifo_size
= xlgmac_calculate_per_queue_fifo(
1637 pdata
->hw_feat
.tx_fifo_size
,
1640 for (i
= 0; i
< pdata
->tx_q_count
; i
++) {
1641 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
1642 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_TQOMR_TQS_POS
,
1643 MTL_Q_TQOMR_TQS_LEN
, fifo_size
);
1644 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
1647 netif_info(pdata
, drv
, pdata
->netdev
,
1648 "%d Tx hardware queues, %d byte fifo per queue\n",
1649 pdata
->tx_q_count
, ((fifo_size
+ 1) * 256));
1652 static void xlgmac_config_rx_fifo_size(struct xlgmac_pdata
*pdata
)
1654 unsigned int fifo_size
;
1658 fifo_size
= xlgmac_calculate_per_queue_fifo(
1659 pdata
->hw_feat
.rx_fifo_size
,
1662 for (i
= 0; i
< pdata
->rx_q_count
; i
++) {
1663 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1664 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_RQOMR_RQS_POS
,
1665 MTL_Q_RQOMR_RQS_LEN
, fifo_size
);
1666 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1669 netif_info(pdata
, drv
, pdata
->netdev
,
1670 "%d Rx hardware queues, %d byte fifo per queue\n",
1671 pdata
->rx_q_count
, ((fifo_size
+ 1) * 256));
1674 static void xlgmac_config_flow_control_threshold(struct xlgmac_pdata
*pdata
)
1679 for (i
= 0; i
< pdata
->rx_q_count
; i
++) {
1680 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQFCR
));
1681 /* Activate flow control when less than 4k left in fifo */
1682 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_RQFCR_RFA_POS
,
1683 MTL_Q_RQFCR_RFA_LEN
, 2);
1684 /* De-activate flow control when more than 6k left in fifo */
1685 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_RQFCR_RFD_POS
,
1686 MTL_Q_RQFCR_RFD_LEN
, 4);
1687 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQFCR
));
1691 static int xlgmac_config_tx_threshold(struct xlgmac_pdata
*pdata
,
1697 for (i
= 0; i
< pdata
->tx_q_count
; i
++) {
1698 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
1699 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_TQOMR_TTC_POS
,
1700 MTL_Q_TQOMR_TTC_LEN
, val
);
1701 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
1707 static int xlgmac_config_rsf_mode(struct xlgmac_pdata
*pdata
,
1713 for (i
= 0; i
< pdata
->rx_q_count
; i
++) {
1714 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1715 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_RQOMR_RSF_POS
,
1716 MTL_Q_RQOMR_RSF_LEN
, val
);
1717 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_RQOMR
));
1723 static int xlgmac_config_tsf_mode(struct xlgmac_pdata
*pdata
,
1729 for (i
= 0; i
< pdata
->tx_q_count
; i
++) {
1730 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
1731 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_TQOMR_TSF_POS
,
1732 MTL_Q_TQOMR_TSF_LEN
, val
);
1733 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
1739 static int xlgmac_config_osp_mode(struct xlgmac_pdata
*pdata
)
1741 struct xlgmac_channel
*channel
;
1745 channel
= pdata
->channel_head
;
1746 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
1747 if (!channel
->tx_ring
)
1750 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
1751 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_TCR_OSP_POS
,
1753 pdata
->tx_osp_mode
);
1754 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
1760 static int xlgmac_config_pblx8(struct xlgmac_pdata
*pdata
)
1762 struct xlgmac_channel
*channel
;
1766 channel
= pdata
->channel_head
;
1767 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
1768 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_CR
));
1769 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_CR_PBLX8_POS
,
1770 DMA_CH_CR_PBLX8_LEN
,
1772 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_CR
));
1778 static int xlgmac_get_tx_pbl_val(struct xlgmac_pdata
*pdata
)
1782 regval
= readl(XLGMAC_DMA_REG(pdata
->channel_head
, DMA_CH_TCR
));
1783 regval
= XLGMAC_GET_REG_BITS(regval
, DMA_CH_TCR_PBL_POS
,
1784 DMA_CH_TCR_PBL_LEN
);
1788 static int xlgmac_config_tx_pbl_val(struct xlgmac_pdata
*pdata
)
1790 struct xlgmac_channel
*channel
;
1794 channel
= pdata
->channel_head
;
1795 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
1796 if (!channel
->tx_ring
)
1799 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
1800 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_TCR_PBL_POS
,
1803 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_TCR
));
1809 static int xlgmac_get_rx_pbl_val(struct xlgmac_pdata
*pdata
)
1813 regval
= readl(XLGMAC_DMA_REG(pdata
->channel_head
, DMA_CH_RCR
));
1814 regval
= XLGMAC_GET_REG_BITS(regval
, DMA_CH_RCR_PBL_POS
,
1815 DMA_CH_RCR_PBL_LEN
);
1819 static int xlgmac_config_rx_pbl_val(struct xlgmac_pdata
*pdata
)
1821 struct xlgmac_channel
*channel
;
1825 channel
= pdata
->channel_head
;
1826 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
1827 if (!channel
->rx_ring
)
1830 regval
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_RCR
));
1831 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_CH_RCR_PBL_POS
,
1834 writel(regval
, XLGMAC_DMA_REG(channel
, DMA_CH_RCR
));
1840 static u64
xlgmac_mmc_read(struct xlgmac_pdata
*pdata
, unsigned int reg_lo
)
1846 /* These registers are always 64 bit */
1847 case MMC_TXOCTETCOUNT_GB_LO
:
1848 case MMC_TXOCTETCOUNT_G_LO
:
1849 case MMC_RXOCTETCOUNT_GB_LO
:
1850 case MMC_RXOCTETCOUNT_G_LO
:
1858 val
= (u64
)readl(pdata
->mac_regs
+ reg_lo
);
1861 val
|= ((u64
)readl(pdata
->mac_regs
+ reg_lo
+ 4) << 32);
1866 static void xlgmac_tx_mmc_int(struct xlgmac_pdata
*pdata
)
1868 unsigned int mmc_isr
= readl(pdata
->mac_regs
+ MMC_TISR
);
1869 struct xlgmac_stats
*stats
= &pdata
->stats
;
1871 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1872 MMC_TISR_TXOCTETCOUNT_GB_POS
,
1873 MMC_TISR_TXOCTETCOUNT_GB_LEN
))
1874 stats
->txoctetcount_gb
+=
1875 xlgmac_mmc_read(pdata
, MMC_TXOCTETCOUNT_GB_LO
);
1877 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1878 MMC_TISR_TXFRAMECOUNT_GB_POS
,
1879 MMC_TISR_TXFRAMECOUNT_GB_LEN
))
1880 stats
->txframecount_gb
+=
1881 xlgmac_mmc_read(pdata
, MMC_TXFRAMECOUNT_GB_LO
);
1883 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1884 MMC_TISR_TXBROADCASTFRAMES_G_POS
,
1885 MMC_TISR_TXBROADCASTFRAMES_G_LEN
))
1886 stats
->txbroadcastframes_g
+=
1887 xlgmac_mmc_read(pdata
, MMC_TXBROADCASTFRAMES_G_LO
);
1889 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1890 MMC_TISR_TXMULTICASTFRAMES_G_POS
,
1891 MMC_TISR_TXMULTICASTFRAMES_G_LEN
))
1892 stats
->txmulticastframes_g
+=
1893 xlgmac_mmc_read(pdata
, MMC_TXMULTICASTFRAMES_G_LO
);
1895 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1896 MMC_TISR_TX64OCTETS_GB_POS
,
1897 MMC_TISR_TX64OCTETS_GB_LEN
))
1898 stats
->tx64octets_gb
+=
1899 xlgmac_mmc_read(pdata
, MMC_TX64OCTETS_GB_LO
);
1901 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1902 MMC_TISR_TX65TO127OCTETS_GB_POS
,
1903 MMC_TISR_TX65TO127OCTETS_GB_LEN
))
1904 stats
->tx65to127octets_gb
+=
1905 xlgmac_mmc_read(pdata
, MMC_TX65TO127OCTETS_GB_LO
);
1907 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1908 MMC_TISR_TX128TO255OCTETS_GB_POS
,
1909 MMC_TISR_TX128TO255OCTETS_GB_LEN
))
1910 stats
->tx128to255octets_gb
+=
1911 xlgmac_mmc_read(pdata
, MMC_TX128TO255OCTETS_GB_LO
);
1913 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1914 MMC_TISR_TX256TO511OCTETS_GB_POS
,
1915 MMC_TISR_TX256TO511OCTETS_GB_LEN
))
1916 stats
->tx256to511octets_gb
+=
1917 xlgmac_mmc_read(pdata
, MMC_TX256TO511OCTETS_GB_LO
);
1919 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1920 MMC_TISR_TX512TO1023OCTETS_GB_POS
,
1921 MMC_TISR_TX512TO1023OCTETS_GB_LEN
))
1922 stats
->tx512to1023octets_gb
+=
1923 xlgmac_mmc_read(pdata
, MMC_TX512TO1023OCTETS_GB_LO
);
1925 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1926 MMC_TISR_TX1024TOMAXOCTETS_GB_POS
,
1927 MMC_TISR_TX1024TOMAXOCTETS_GB_LEN
))
1928 stats
->tx1024tomaxoctets_gb
+=
1929 xlgmac_mmc_read(pdata
, MMC_TX1024TOMAXOCTETS_GB_LO
);
1931 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1932 MMC_TISR_TXUNICASTFRAMES_GB_POS
,
1933 MMC_TISR_TXUNICASTFRAMES_GB_LEN
))
1934 stats
->txunicastframes_gb
+=
1935 xlgmac_mmc_read(pdata
, MMC_TXUNICASTFRAMES_GB_LO
);
1937 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1938 MMC_TISR_TXMULTICASTFRAMES_GB_POS
,
1939 MMC_TISR_TXMULTICASTFRAMES_GB_LEN
))
1940 stats
->txmulticastframes_gb
+=
1941 xlgmac_mmc_read(pdata
, MMC_TXMULTICASTFRAMES_GB_LO
);
1943 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1944 MMC_TISR_TXBROADCASTFRAMES_GB_POS
,
1945 MMC_TISR_TXBROADCASTFRAMES_GB_LEN
))
1946 stats
->txbroadcastframes_g
+=
1947 xlgmac_mmc_read(pdata
, MMC_TXBROADCASTFRAMES_GB_LO
);
1949 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1950 MMC_TISR_TXUNDERFLOWERROR_POS
,
1951 MMC_TISR_TXUNDERFLOWERROR_LEN
))
1952 stats
->txunderflowerror
+=
1953 xlgmac_mmc_read(pdata
, MMC_TXUNDERFLOWERROR_LO
);
1955 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1956 MMC_TISR_TXOCTETCOUNT_G_POS
,
1957 MMC_TISR_TXOCTETCOUNT_G_LEN
))
1958 stats
->txoctetcount_g
+=
1959 xlgmac_mmc_read(pdata
, MMC_TXOCTETCOUNT_G_LO
);
1961 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1962 MMC_TISR_TXFRAMECOUNT_G_POS
,
1963 MMC_TISR_TXFRAMECOUNT_G_LEN
))
1964 stats
->txframecount_g
+=
1965 xlgmac_mmc_read(pdata
, MMC_TXFRAMECOUNT_G_LO
);
1967 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1968 MMC_TISR_TXPAUSEFRAMES_POS
,
1969 MMC_TISR_TXPAUSEFRAMES_LEN
))
1970 stats
->txpauseframes
+=
1971 xlgmac_mmc_read(pdata
, MMC_TXPAUSEFRAMES_LO
);
1973 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1974 MMC_TISR_TXVLANFRAMES_G_POS
,
1975 MMC_TISR_TXVLANFRAMES_G_LEN
))
1976 stats
->txvlanframes_g
+=
1977 xlgmac_mmc_read(pdata
, MMC_TXVLANFRAMES_G_LO
);
1980 static void xlgmac_rx_mmc_int(struct xlgmac_pdata
*pdata
)
1982 unsigned int mmc_isr
= readl(pdata
->mac_regs
+ MMC_RISR
);
1983 struct xlgmac_stats
*stats
= &pdata
->stats
;
1985 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1986 MMC_RISR_RXFRAMECOUNT_GB_POS
,
1987 MMC_RISR_RXFRAMECOUNT_GB_LEN
))
1988 stats
->rxframecount_gb
+=
1989 xlgmac_mmc_read(pdata
, MMC_RXFRAMECOUNT_GB_LO
);
1991 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1992 MMC_RISR_RXOCTETCOUNT_GB_POS
,
1993 MMC_RISR_RXOCTETCOUNT_GB_LEN
))
1994 stats
->rxoctetcount_gb
+=
1995 xlgmac_mmc_read(pdata
, MMC_RXOCTETCOUNT_GB_LO
);
1997 if (XLGMAC_GET_REG_BITS(mmc_isr
,
1998 MMC_RISR_RXOCTETCOUNT_G_POS
,
1999 MMC_RISR_RXOCTETCOUNT_G_LEN
))
2000 stats
->rxoctetcount_g
+=
2001 xlgmac_mmc_read(pdata
, MMC_RXOCTETCOUNT_G_LO
);
2003 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2004 MMC_RISR_RXBROADCASTFRAMES_G_POS
,
2005 MMC_RISR_RXBROADCASTFRAMES_G_LEN
))
2006 stats
->rxbroadcastframes_g
+=
2007 xlgmac_mmc_read(pdata
, MMC_RXBROADCASTFRAMES_G_LO
);
2009 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2010 MMC_RISR_RXMULTICASTFRAMES_G_POS
,
2011 MMC_RISR_RXMULTICASTFRAMES_G_LEN
))
2012 stats
->rxmulticastframes_g
+=
2013 xlgmac_mmc_read(pdata
, MMC_RXMULTICASTFRAMES_G_LO
);
2015 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2016 MMC_RISR_RXCRCERROR_POS
,
2017 MMC_RISR_RXCRCERROR_LEN
))
2018 stats
->rxcrcerror
+=
2019 xlgmac_mmc_read(pdata
, MMC_RXCRCERROR_LO
);
2021 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2022 MMC_RISR_RXRUNTERROR_POS
,
2023 MMC_RISR_RXRUNTERROR_LEN
))
2024 stats
->rxrunterror
+=
2025 xlgmac_mmc_read(pdata
, MMC_RXRUNTERROR
);
2027 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2028 MMC_RISR_RXJABBERERROR_POS
,
2029 MMC_RISR_RXJABBERERROR_LEN
))
2030 stats
->rxjabbererror
+=
2031 xlgmac_mmc_read(pdata
, MMC_RXJABBERERROR
);
2033 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2034 MMC_RISR_RXUNDERSIZE_G_POS
,
2035 MMC_RISR_RXUNDERSIZE_G_LEN
))
2036 stats
->rxundersize_g
+=
2037 xlgmac_mmc_read(pdata
, MMC_RXUNDERSIZE_G
);
2039 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2040 MMC_RISR_RXOVERSIZE_G_POS
,
2041 MMC_RISR_RXOVERSIZE_G_LEN
))
2042 stats
->rxoversize_g
+=
2043 xlgmac_mmc_read(pdata
, MMC_RXOVERSIZE_G
);
2045 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2046 MMC_RISR_RX64OCTETS_GB_POS
,
2047 MMC_RISR_RX64OCTETS_GB_LEN
))
2048 stats
->rx64octets_gb
+=
2049 xlgmac_mmc_read(pdata
, MMC_RX64OCTETS_GB_LO
);
2051 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2052 MMC_RISR_RX65TO127OCTETS_GB_POS
,
2053 MMC_RISR_RX65TO127OCTETS_GB_LEN
))
2054 stats
->rx65to127octets_gb
+=
2055 xlgmac_mmc_read(pdata
, MMC_RX65TO127OCTETS_GB_LO
);
2057 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2058 MMC_RISR_RX128TO255OCTETS_GB_POS
,
2059 MMC_RISR_RX128TO255OCTETS_GB_LEN
))
2060 stats
->rx128to255octets_gb
+=
2061 xlgmac_mmc_read(pdata
, MMC_RX128TO255OCTETS_GB_LO
);
2063 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2064 MMC_RISR_RX256TO511OCTETS_GB_POS
,
2065 MMC_RISR_RX256TO511OCTETS_GB_LEN
))
2066 stats
->rx256to511octets_gb
+=
2067 xlgmac_mmc_read(pdata
, MMC_RX256TO511OCTETS_GB_LO
);
2069 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2070 MMC_RISR_RX512TO1023OCTETS_GB_POS
,
2071 MMC_RISR_RX512TO1023OCTETS_GB_LEN
))
2072 stats
->rx512to1023octets_gb
+=
2073 xlgmac_mmc_read(pdata
, MMC_RX512TO1023OCTETS_GB_LO
);
2075 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2076 MMC_RISR_RX1024TOMAXOCTETS_GB_POS
,
2077 MMC_RISR_RX1024TOMAXOCTETS_GB_LEN
))
2078 stats
->rx1024tomaxoctets_gb
+=
2079 xlgmac_mmc_read(pdata
, MMC_RX1024TOMAXOCTETS_GB_LO
);
2081 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2082 MMC_RISR_RXUNICASTFRAMES_G_POS
,
2083 MMC_RISR_RXUNICASTFRAMES_G_LEN
))
2084 stats
->rxunicastframes_g
+=
2085 xlgmac_mmc_read(pdata
, MMC_RXUNICASTFRAMES_G_LO
);
2087 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2088 MMC_RISR_RXLENGTHERROR_POS
,
2089 MMC_RISR_RXLENGTHERROR_LEN
))
2090 stats
->rxlengtherror
+=
2091 xlgmac_mmc_read(pdata
, MMC_RXLENGTHERROR_LO
);
2093 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2094 MMC_RISR_RXOUTOFRANGETYPE_POS
,
2095 MMC_RISR_RXOUTOFRANGETYPE_LEN
))
2096 stats
->rxoutofrangetype
+=
2097 xlgmac_mmc_read(pdata
, MMC_RXOUTOFRANGETYPE_LO
);
2099 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2100 MMC_RISR_RXPAUSEFRAMES_POS
,
2101 MMC_RISR_RXPAUSEFRAMES_LEN
))
2102 stats
->rxpauseframes
+=
2103 xlgmac_mmc_read(pdata
, MMC_RXPAUSEFRAMES_LO
);
2105 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2106 MMC_RISR_RXFIFOOVERFLOW_POS
,
2107 MMC_RISR_RXFIFOOVERFLOW_LEN
))
2108 stats
->rxfifooverflow
+=
2109 xlgmac_mmc_read(pdata
, MMC_RXFIFOOVERFLOW_LO
);
2111 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2112 MMC_RISR_RXVLANFRAMES_GB_POS
,
2113 MMC_RISR_RXVLANFRAMES_GB_LEN
))
2114 stats
->rxvlanframes_gb
+=
2115 xlgmac_mmc_read(pdata
, MMC_RXVLANFRAMES_GB_LO
);
2117 if (XLGMAC_GET_REG_BITS(mmc_isr
,
2118 MMC_RISR_RXWATCHDOGERROR_POS
,
2119 MMC_RISR_RXWATCHDOGERROR_LEN
))
2120 stats
->rxwatchdogerror
+=
2121 xlgmac_mmc_read(pdata
, MMC_RXWATCHDOGERROR
);
2124 static void xlgmac_read_mmc_stats(struct xlgmac_pdata
*pdata
)
2126 struct xlgmac_stats
*stats
= &pdata
->stats
;
2129 /* Freeze counters */
2130 regval
= readl(pdata
->mac_regs
+ MMC_CR
);
2131 regval
= XLGMAC_SET_REG_BITS(regval
, MMC_CR_MCF_POS
,
2133 writel(regval
, pdata
->mac_regs
+ MMC_CR
);
2135 stats
->txoctetcount_gb
+=
2136 xlgmac_mmc_read(pdata
, MMC_TXOCTETCOUNT_GB_LO
);
2138 stats
->txframecount_gb
+=
2139 xlgmac_mmc_read(pdata
, MMC_TXFRAMECOUNT_GB_LO
);
2141 stats
->txbroadcastframes_g
+=
2142 xlgmac_mmc_read(pdata
, MMC_TXBROADCASTFRAMES_G_LO
);
2144 stats
->txmulticastframes_g
+=
2145 xlgmac_mmc_read(pdata
, MMC_TXMULTICASTFRAMES_G_LO
);
2147 stats
->tx64octets_gb
+=
2148 xlgmac_mmc_read(pdata
, MMC_TX64OCTETS_GB_LO
);
2150 stats
->tx65to127octets_gb
+=
2151 xlgmac_mmc_read(pdata
, MMC_TX65TO127OCTETS_GB_LO
);
2153 stats
->tx128to255octets_gb
+=
2154 xlgmac_mmc_read(pdata
, MMC_TX128TO255OCTETS_GB_LO
);
2156 stats
->tx256to511octets_gb
+=
2157 xlgmac_mmc_read(pdata
, MMC_TX256TO511OCTETS_GB_LO
);
2159 stats
->tx512to1023octets_gb
+=
2160 xlgmac_mmc_read(pdata
, MMC_TX512TO1023OCTETS_GB_LO
);
2162 stats
->tx1024tomaxoctets_gb
+=
2163 xlgmac_mmc_read(pdata
, MMC_TX1024TOMAXOCTETS_GB_LO
);
2165 stats
->txunicastframes_gb
+=
2166 xlgmac_mmc_read(pdata
, MMC_TXUNICASTFRAMES_GB_LO
);
2168 stats
->txmulticastframes_gb
+=
2169 xlgmac_mmc_read(pdata
, MMC_TXMULTICASTFRAMES_GB_LO
);
2171 stats
->txbroadcastframes_g
+=
2172 xlgmac_mmc_read(pdata
, MMC_TXBROADCASTFRAMES_GB_LO
);
2174 stats
->txunderflowerror
+=
2175 xlgmac_mmc_read(pdata
, MMC_TXUNDERFLOWERROR_LO
);
2177 stats
->txoctetcount_g
+=
2178 xlgmac_mmc_read(pdata
, MMC_TXOCTETCOUNT_G_LO
);
2180 stats
->txframecount_g
+=
2181 xlgmac_mmc_read(pdata
, MMC_TXFRAMECOUNT_G_LO
);
2183 stats
->txpauseframes
+=
2184 xlgmac_mmc_read(pdata
, MMC_TXPAUSEFRAMES_LO
);
2186 stats
->txvlanframes_g
+=
2187 xlgmac_mmc_read(pdata
, MMC_TXVLANFRAMES_G_LO
);
2189 stats
->rxframecount_gb
+=
2190 xlgmac_mmc_read(pdata
, MMC_RXFRAMECOUNT_GB_LO
);
2192 stats
->rxoctetcount_gb
+=
2193 xlgmac_mmc_read(pdata
, MMC_RXOCTETCOUNT_GB_LO
);
2195 stats
->rxoctetcount_g
+=
2196 xlgmac_mmc_read(pdata
, MMC_RXOCTETCOUNT_G_LO
);
2198 stats
->rxbroadcastframes_g
+=
2199 xlgmac_mmc_read(pdata
, MMC_RXBROADCASTFRAMES_G_LO
);
2201 stats
->rxmulticastframes_g
+=
2202 xlgmac_mmc_read(pdata
, MMC_RXMULTICASTFRAMES_G_LO
);
2204 stats
->rxcrcerror
+=
2205 xlgmac_mmc_read(pdata
, MMC_RXCRCERROR_LO
);
2207 stats
->rxrunterror
+=
2208 xlgmac_mmc_read(pdata
, MMC_RXRUNTERROR
);
2210 stats
->rxjabbererror
+=
2211 xlgmac_mmc_read(pdata
, MMC_RXJABBERERROR
);
2213 stats
->rxundersize_g
+=
2214 xlgmac_mmc_read(pdata
, MMC_RXUNDERSIZE_G
);
2216 stats
->rxoversize_g
+=
2217 xlgmac_mmc_read(pdata
, MMC_RXOVERSIZE_G
);
2219 stats
->rx64octets_gb
+=
2220 xlgmac_mmc_read(pdata
, MMC_RX64OCTETS_GB_LO
);
2222 stats
->rx65to127octets_gb
+=
2223 xlgmac_mmc_read(pdata
, MMC_RX65TO127OCTETS_GB_LO
);
2225 stats
->rx128to255octets_gb
+=
2226 xlgmac_mmc_read(pdata
, MMC_RX128TO255OCTETS_GB_LO
);
2228 stats
->rx256to511octets_gb
+=
2229 xlgmac_mmc_read(pdata
, MMC_RX256TO511OCTETS_GB_LO
);
2231 stats
->rx512to1023octets_gb
+=
2232 xlgmac_mmc_read(pdata
, MMC_RX512TO1023OCTETS_GB_LO
);
2234 stats
->rx1024tomaxoctets_gb
+=
2235 xlgmac_mmc_read(pdata
, MMC_RX1024TOMAXOCTETS_GB_LO
);
2237 stats
->rxunicastframes_g
+=
2238 xlgmac_mmc_read(pdata
, MMC_RXUNICASTFRAMES_G_LO
);
2240 stats
->rxlengtherror
+=
2241 xlgmac_mmc_read(pdata
, MMC_RXLENGTHERROR_LO
);
2243 stats
->rxoutofrangetype
+=
2244 xlgmac_mmc_read(pdata
, MMC_RXOUTOFRANGETYPE_LO
);
2246 stats
->rxpauseframes
+=
2247 xlgmac_mmc_read(pdata
, MMC_RXPAUSEFRAMES_LO
);
2249 stats
->rxfifooverflow
+=
2250 xlgmac_mmc_read(pdata
, MMC_RXFIFOOVERFLOW_LO
);
2252 stats
->rxvlanframes_gb
+=
2253 xlgmac_mmc_read(pdata
, MMC_RXVLANFRAMES_GB_LO
);
2255 stats
->rxwatchdogerror
+=
2256 xlgmac_mmc_read(pdata
, MMC_RXWATCHDOGERROR
);
2258 /* Un-freeze counters */
2259 regval
= readl(pdata
->mac_regs
+ MMC_CR
);
2260 regval
= XLGMAC_SET_REG_BITS(regval
, MMC_CR_MCF_POS
,
2262 writel(regval
, pdata
->mac_regs
+ MMC_CR
);
2265 static void xlgmac_config_mmc(struct xlgmac_pdata
*pdata
)
2269 regval
= readl(pdata
->mac_regs
+ MMC_CR
);
2270 /* Set counters to reset on read */
2271 regval
= XLGMAC_SET_REG_BITS(regval
, MMC_CR_ROR_POS
,
2273 /* Reset the counters */
2274 regval
= XLGMAC_SET_REG_BITS(regval
, MMC_CR_CR_POS
,
2276 writel(regval
, pdata
->mac_regs
+ MMC_CR
);
2279 static int xlgmac_write_rss_reg(struct xlgmac_pdata
*pdata
, unsigned int type
,
2280 unsigned int index
, unsigned int val
)
2286 mutex_lock(&pdata
->rss_mutex
);
2288 regval
= XLGMAC_GET_REG_BITS(readl(pdata
->mac_regs
+ MAC_RSSAR
),
2289 MAC_RSSAR_OB_POS
, MAC_RSSAR_OB_LEN
);
2295 writel(val
, pdata
->mac_regs
+ MAC_RSSDR
);
2297 regval
= readl(pdata
->mac_regs
+ MAC_RSSAR
);
2298 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RSSAR_RSSIA_POS
,
2299 MAC_RSSAR_RSSIA_LEN
, index
);
2300 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RSSAR_ADDRT_POS
,
2301 MAC_RSSAR_ADDRT_LEN
, type
);
2302 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RSSAR_CT_POS
,
2303 MAC_RSSAR_CT_LEN
, 0);
2304 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RSSAR_OB_POS
,
2305 MAC_RSSAR_OB_LEN
, 1);
2306 writel(regval
, pdata
->mac_regs
+ MAC_RSSAR
);
2310 regval
= XLGMAC_GET_REG_BITS(readl(pdata
->mac_regs
+ MAC_RSSAR
),
2316 usleep_range(1000, 1500);
2322 mutex_unlock(&pdata
->rss_mutex
);
2327 static int xlgmac_write_rss_hash_key(struct xlgmac_pdata
*pdata
)
2329 unsigned int key_regs
= sizeof(pdata
->rss_key
) / sizeof(u32
);
2330 unsigned int *key
= (unsigned int *)&pdata
->rss_key
;
2333 while (key_regs
--) {
2334 ret
= xlgmac_write_rss_reg(pdata
, XLGMAC_RSS_HASH_KEY_TYPE
,
2343 static int xlgmac_write_rss_lookup_table(struct xlgmac_pdata
*pdata
)
2348 for (i
= 0; i
< ARRAY_SIZE(pdata
->rss_table
); i
++) {
2349 ret
= xlgmac_write_rss_reg(pdata
,
2350 XLGMAC_RSS_LOOKUP_TABLE_TYPE
, i
,
2351 pdata
->rss_table
[i
]);
2359 static int xlgmac_set_rss_hash_key(struct xlgmac_pdata
*pdata
, const u8
*key
)
2361 memcpy(pdata
->rss_key
, key
, sizeof(pdata
->rss_key
));
2363 return xlgmac_write_rss_hash_key(pdata
);
2366 static int xlgmac_set_rss_lookup_table(struct xlgmac_pdata
*pdata
,
2372 for (i
= 0; i
< ARRAY_SIZE(pdata
->rss_table
); i
++) {
2374 pdata
->rss_table
[i
] = XLGMAC_SET_REG_BITS(
2375 pdata
->rss_table
[i
],
2381 return xlgmac_write_rss_lookup_table(pdata
);
2384 static int xlgmac_enable_rss(struct xlgmac_pdata
*pdata
)
2389 if (!pdata
->hw_feat
.rss
)
2392 /* Program the hash key */
2393 ret
= xlgmac_write_rss_hash_key(pdata
);
2397 /* Program the lookup table */
2398 ret
= xlgmac_write_rss_lookup_table(pdata
);
2402 /* Set the RSS options */
2403 writel(pdata
->rss_options
, pdata
->mac_regs
+ MAC_RSSCR
);
2406 regval
= readl(pdata
->mac_regs
+ MAC_RSSCR
);
2407 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RSSCR_RSSE_POS
,
2408 MAC_RSSCR_RSSE_LEN
, 1);
2409 writel(regval
, pdata
->mac_regs
+ MAC_RSSCR
);
2414 static int xlgmac_disable_rss(struct xlgmac_pdata
*pdata
)
2418 if (!pdata
->hw_feat
.rss
)
2421 regval
= readl(pdata
->mac_regs
+ MAC_RSSCR
);
2422 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_RSSCR_RSSE_POS
,
2423 MAC_RSSCR_RSSE_LEN
, 0);
2424 writel(regval
, pdata
->mac_regs
+ MAC_RSSCR
);
2429 static void xlgmac_config_rss(struct xlgmac_pdata
*pdata
)
2433 if (!pdata
->hw_feat
.rss
)
2436 if (pdata
->netdev
->features
& NETIF_F_RXHASH
)
2437 ret
= xlgmac_enable_rss(pdata
);
2439 ret
= xlgmac_disable_rss(pdata
);
2442 netdev_err(pdata
->netdev
,
2443 "error configuring RSS, RSS disabled\n");
2446 static void xlgmac_enable_dma_interrupts(struct xlgmac_pdata
*pdata
)
2448 unsigned int dma_ch_isr
, dma_ch_ier
;
2449 struct xlgmac_channel
*channel
;
2452 channel
= pdata
->channel_head
;
2453 for (i
= 0; i
< pdata
->channel_count
; i
++, channel
++) {
2454 /* Clear all the interrupts which are set */
2455 dma_ch_isr
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_SR
));
2456 writel(dma_ch_isr
, XLGMAC_DMA_REG(channel
, DMA_CH_SR
));
2458 /* Clear all interrupt enable bits */
2461 /* Enable following interrupts
2462 * NIE - Normal Interrupt Summary Enable
2463 * AIE - Abnormal Interrupt Summary Enable
2464 * FBEE - Fatal Bus Error Enable
2466 dma_ch_ier
= XLGMAC_SET_REG_BITS(dma_ch_ier
,
2468 DMA_CH_IER_NIE_LEN
, 1);
2469 dma_ch_ier
= XLGMAC_SET_REG_BITS(dma_ch_ier
,
2471 DMA_CH_IER_AIE_LEN
, 1);
2472 dma_ch_ier
= XLGMAC_SET_REG_BITS(dma_ch_ier
,
2473 DMA_CH_IER_FBEE_POS
,
2474 DMA_CH_IER_FBEE_LEN
, 1);
2476 if (channel
->tx_ring
) {
2477 /* Enable the following Tx interrupts
2478 * TIE - Transmit Interrupt Enable (unless using
2479 * per channel interrupts)
2481 if (!pdata
->per_channel_irq
)
2482 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2488 if (channel
->rx_ring
) {
2489 /* Enable following Rx interrupts
2490 * RBUE - Receive Buffer Unavailable Enable
2491 * RIE - Receive Interrupt Enable (unless using
2492 * per channel interrupts)
2494 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2496 DMA_CH_IER_RBUE_POS
,
2497 DMA_CH_IER_RBUE_LEN
,
2499 if (!pdata
->per_channel_irq
)
2500 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2507 writel(dma_ch_isr
, XLGMAC_DMA_REG(channel
, DMA_CH_IER
));
2511 static void xlgmac_enable_mtl_interrupts(struct xlgmac_pdata
*pdata
)
2513 unsigned int q_count
, i
;
2514 unsigned int mtl_q_isr
;
2516 q_count
= max(pdata
->hw_feat
.tx_q_cnt
, pdata
->hw_feat
.rx_q_cnt
);
2517 for (i
= 0; i
< q_count
; i
++) {
2518 /* Clear all the interrupts which are set */
2519 mtl_q_isr
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_ISR
));
2520 writel(mtl_q_isr
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_ISR
));
2522 /* No MTL interrupts to be enabled */
2523 writel(0, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_IER
));
2527 static void xlgmac_enable_mac_interrupts(struct xlgmac_pdata
*pdata
)
2529 unsigned int mac_ier
= 0;
2532 /* Enable Timestamp interrupt */
2533 mac_ier
= XLGMAC_SET_REG_BITS(mac_ier
, MAC_IER_TSIE_POS
,
2534 MAC_IER_TSIE_LEN
, 1);
2536 writel(mac_ier
, pdata
->mac_regs
+ MAC_IER
);
2538 /* Enable all counter interrupts */
2539 regval
= readl(pdata
->mac_regs
+ MMC_RIER
);
2540 regval
= XLGMAC_SET_REG_BITS(regval
, MMC_RIER_ALL_INTERRUPTS_POS
,
2541 MMC_RIER_ALL_INTERRUPTS_LEN
, 0xffffffff);
2542 writel(regval
, pdata
->mac_regs
+ MMC_RIER
);
2543 regval
= readl(pdata
->mac_regs
+ MMC_TIER
);
2544 regval
= XLGMAC_SET_REG_BITS(regval
, MMC_TIER_ALL_INTERRUPTS_POS
,
2545 MMC_TIER_ALL_INTERRUPTS_LEN
, 0xffffffff);
2546 writel(regval
, pdata
->mac_regs
+ MMC_TIER
);
2549 static int xlgmac_set_xlgmii_25000_speed(struct xlgmac_pdata
*pdata
)
2553 regval
= XLGMAC_GET_REG_BITS(readl(pdata
->mac_regs
+ MAC_TCR
),
2554 MAC_TCR_SS_POS
, MAC_TCR_SS_LEN
);
2558 regval
= readl(pdata
->mac_regs
+ MAC_TCR
);
2559 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_TCR_SS_POS
,
2560 MAC_TCR_SS_LEN
, 0x1);
2561 writel(regval
, pdata
->mac_regs
+ MAC_TCR
);
2566 static int xlgmac_set_xlgmii_40000_speed(struct xlgmac_pdata
*pdata
)
2570 regval
= XLGMAC_GET_REG_BITS(readl(pdata
->mac_regs
+ MAC_TCR
),
2571 MAC_TCR_SS_POS
, MAC_TCR_SS_LEN
);
2575 regval
= readl(pdata
->mac_regs
+ MAC_TCR
);
2576 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_TCR_SS_POS
,
2578 writel(regval
, pdata
->mac_regs
+ MAC_TCR
);
2583 static int xlgmac_set_xlgmii_50000_speed(struct xlgmac_pdata
*pdata
)
2587 regval
= XLGMAC_GET_REG_BITS(readl(pdata
->mac_regs
+ MAC_TCR
),
2588 MAC_TCR_SS_POS
, MAC_TCR_SS_LEN
);
2592 regval
= readl(pdata
->mac_regs
+ MAC_TCR
);
2593 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_TCR_SS_POS
,
2594 MAC_TCR_SS_LEN
, 0x2);
2595 writel(regval
, pdata
->mac_regs
+ MAC_TCR
);
2600 static int xlgmac_set_xlgmii_100000_speed(struct xlgmac_pdata
*pdata
)
2604 regval
= XLGMAC_GET_REG_BITS(readl(pdata
->mac_regs
+ MAC_TCR
),
2605 MAC_TCR_SS_POS
, MAC_TCR_SS_LEN
);
2609 regval
= readl(pdata
->mac_regs
+ MAC_TCR
);
2610 regval
= XLGMAC_SET_REG_BITS(regval
, MAC_TCR_SS_POS
,
2611 MAC_TCR_SS_LEN
, 0x3);
2612 writel(regval
, pdata
->mac_regs
+ MAC_TCR
);
2617 static void xlgmac_config_mac_speed(struct xlgmac_pdata
*pdata
)
2619 switch (pdata
->phy_speed
) {
2621 xlgmac_set_xlgmii_100000_speed(pdata
);
2625 xlgmac_set_xlgmii_50000_speed(pdata
);
2629 xlgmac_set_xlgmii_40000_speed(pdata
);
2633 xlgmac_set_xlgmii_25000_speed(pdata
);
2638 static int xlgmac_dev_read(struct xlgmac_channel
*channel
)
2640 struct xlgmac_pdata
*pdata
= channel
->pdata
;
2641 struct xlgmac_ring
*ring
= channel
->rx_ring
;
2642 struct net_device
*netdev
= pdata
->netdev
;
2643 struct xlgmac_desc_data
*desc_data
;
2644 struct xlgmac_dma_desc
*dma_desc
;
2645 struct xlgmac_pkt_info
*pkt_info
;
2646 unsigned int err
, etlt
, l34t
;
2648 desc_data
= XLGMAC_GET_DESC_DATA(ring
, ring
->cur
);
2649 dma_desc
= desc_data
->dma_desc
;
2650 pkt_info
= &ring
->pkt_info
;
2652 /* Check for data availability */
2653 if (XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2654 RX_NORMAL_DESC3_OWN_POS
,
2655 RX_NORMAL_DESC3_OWN_LEN
))
2658 /* Make sure descriptor fields are read after reading the OWN bit */
2661 if (netif_msg_rx_status(pdata
))
2662 xlgmac_dump_rx_desc(pdata
, ring
, ring
->cur
);
2664 if (XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2665 RX_NORMAL_DESC3_CTXT_POS
,
2666 RX_NORMAL_DESC3_CTXT_LEN
)) {
2667 /* Timestamp Context Descriptor */
2668 xlgmac_get_rx_tstamp(pkt_info
, dma_desc
);
2670 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2671 pkt_info
->attributes
,
2672 RX_PACKET_ATTRIBUTES_CONTEXT_POS
,
2673 RX_PACKET_ATTRIBUTES_CONTEXT_LEN
,
2675 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2676 pkt_info
->attributes
,
2677 RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_POS
,
2678 RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_LEN
,
2683 /* Normal Descriptor, be sure Context Descriptor bit is off */
2684 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2685 pkt_info
->attributes
,
2686 RX_PACKET_ATTRIBUTES_CONTEXT_POS
,
2687 RX_PACKET_ATTRIBUTES_CONTEXT_LEN
,
2690 /* Indicate if a Context Descriptor is next */
2691 if (XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2692 RX_NORMAL_DESC3_CDA_POS
,
2693 RX_NORMAL_DESC3_CDA_LEN
))
2694 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2695 pkt_info
->attributes
,
2696 RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_POS
,
2697 RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_LEN
,
2700 /* Get the header length */
2701 if (XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2702 RX_NORMAL_DESC3_FD_POS
,
2703 RX_NORMAL_DESC3_FD_LEN
)) {
2704 desc_data
->rx
.hdr_len
= XLGMAC_GET_REG_BITS_LE(dma_desc
->desc2
,
2705 RX_NORMAL_DESC2_HL_POS
,
2706 RX_NORMAL_DESC2_HL_LEN
);
2707 if (desc_data
->rx
.hdr_len
)
2708 pdata
->stats
.rx_split_header_packets
++;
2711 /* Get the RSS hash */
2712 if (XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2713 RX_NORMAL_DESC3_RSV_POS
,
2714 RX_NORMAL_DESC3_RSV_LEN
)) {
2715 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2716 pkt_info
->attributes
,
2717 RX_PACKET_ATTRIBUTES_RSS_HASH_POS
,
2718 RX_PACKET_ATTRIBUTES_RSS_HASH_LEN
,
2721 pkt_info
->rss_hash
= le32_to_cpu(dma_desc
->desc1
);
2723 l34t
= XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2724 RX_NORMAL_DESC3_L34T_POS
,
2725 RX_NORMAL_DESC3_L34T_LEN
);
2727 case RX_DESC3_L34T_IPV4_TCP
:
2728 case RX_DESC3_L34T_IPV4_UDP
:
2729 case RX_DESC3_L34T_IPV6_TCP
:
2730 case RX_DESC3_L34T_IPV6_UDP
:
2731 pkt_info
->rss_hash_type
= PKT_HASH_TYPE_L4
;
2734 pkt_info
->rss_hash_type
= PKT_HASH_TYPE_L3
;
2738 /* Get the pkt_info length */
2739 desc_data
->rx
.len
= XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2740 RX_NORMAL_DESC3_PL_POS
,
2741 RX_NORMAL_DESC3_PL_LEN
);
2743 if (!XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2744 RX_NORMAL_DESC3_LD_POS
,
2745 RX_NORMAL_DESC3_LD_LEN
)) {
2746 /* Not all the data has been transferred for this pkt_info */
2747 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2748 pkt_info
->attributes
,
2749 RX_PACKET_ATTRIBUTES_INCOMPLETE_POS
,
2750 RX_PACKET_ATTRIBUTES_INCOMPLETE_LEN
,
2755 /* This is the last of the data for this pkt_info */
2756 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2757 pkt_info
->attributes
,
2758 RX_PACKET_ATTRIBUTES_INCOMPLETE_POS
,
2759 RX_PACKET_ATTRIBUTES_INCOMPLETE_LEN
,
2762 /* Set checksum done indicator as appropriate */
2763 if (netdev
->features
& NETIF_F_RXCSUM
)
2764 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2765 pkt_info
->attributes
,
2766 RX_PACKET_ATTRIBUTES_CSUM_DONE_POS
,
2767 RX_PACKET_ATTRIBUTES_CSUM_DONE_LEN
,
2770 /* Check for errors (only valid in last descriptor) */
2771 err
= XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2772 RX_NORMAL_DESC3_ES_POS
,
2773 RX_NORMAL_DESC3_ES_LEN
);
2774 etlt
= XLGMAC_GET_REG_BITS_LE(dma_desc
->desc3
,
2775 RX_NORMAL_DESC3_ETLT_POS
,
2776 RX_NORMAL_DESC3_ETLT_LEN
);
2777 netif_dbg(pdata
, rx_status
, netdev
, "err=%u, etlt=%#x\n", err
, etlt
);
2779 if (!err
|| !etlt
) {
2780 /* No error if err is 0 or etlt is 0 */
2781 if ((etlt
== 0x09) &&
2782 (netdev
->features
& NETIF_F_HW_VLAN_CTAG_RX
)) {
2783 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2784 pkt_info
->attributes
,
2785 RX_PACKET_ATTRIBUTES_VLAN_CTAG_POS
,
2786 RX_PACKET_ATTRIBUTES_VLAN_CTAG_LEN
,
2788 pkt_info
->vlan_ctag
=
2789 XLGMAC_GET_REG_BITS_LE(dma_desc
->desc0
,
2790 RX_NORMAL_DESC0_OVT_POS
,
2791 RX_NORMAL_DESC0_OVT_LEN
);
2792 netif_dbg(pdata
, rx_status
, netdev
, "vlan-ctag=%#06x\n",
2793 pkt_info
->vlan_ctag
);
2796 if ((etlt
== 0x05) || (etlt
== 0x06))
2797 pkt_info
->attributes
= XLGMAC_SET_REG_BITS(
2798 pkt_info
->attributes
,
2799 RX_PACKET_ATTRIBUTES_CSUM_DONE_POS
,
2800 RX_PACKET_ATTRIBUTES_CSUM_DONE_LEN
,
2803 pkt_info
->errors
= XLGMAC_SET_REG_BITS(
2805 RX_PACKET_ERRORS_FRAME_POS
,
2806 RX_PACKET_ERRORS_FRAME_LEN
,
2810 XLGMAC_PR("%s - descriptor=%u (cur=%d)\n", channel
->name
,
2811 ring
->cur
& (ring
->dma_desc_count
- 1), ring
->cur
);
2816 static int xlgmac_enable_int(struct xlgmac_channel
*channel
,
2817 enum xlgmac_int int_id
)
2819 unsigned int dma_ch_ier
;
2821 dma_ch_ier
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_IER
));
2824 case XLGMAC_INT_DMA_CH_SR_TI
:
2825 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2826 dma_ch_ier
, DMA_CH_IER_TIE_POS
,
2827 DMA_CH_IER_TIE_LEN
, 1);
2829 case XLGMAC_INT_DMA_CH_SR_TPS
:
2830 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2831 dma_ch_ier
, DMA_CH_IER_TXSE_POS
,
2832 DMA_CH_IER_TXSE_LEN
, 1);
2834 case XLGMAC_INT_DMA_CH_SR_TBU
:
2835 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2836 dma_ch_ier
, DMA_CH_IER_TBUE_POS
,
2837 DMA_CH_IER_TBUE_LEN
, 1);
2839 case XLGMAC_INT_DMA_CH_SR_RI
:
2840 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2841 dma_ch_ier
, DMA_CH_IER_RIE_POS
,
2842 DMA_CH_IER_RIE_LEN
, 1);
2844 case XLGMAC_INT_DMA_CH_SR_RBU
:
2845 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2846 dma_ch_ier
, DMA_CH_IER_RBUE_POS
,
2847 DMA_CH_IER_RBUE_LEN
, 1);
2849 case XLGMAC_INT_DMA_CH_SR_RPS
:
2850 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2851 dma_ch_ier
, DMA_CH_IER_RSE_POS
,
2852 DMA_CH_IER_RSE_LEN
, 1);
2854 case XLGMAC_INT_DMA_CH_SR_TI_RI
:
2855 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2856 dma_ch_ier
, DMA_CH_IER_TIE_POS
,
2857 DMA_CH_IER_TIE_LEN
, 1);
2858 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2859 dma_ch_ier
, DMA_CH_IER_RIE_POS
,
2860 DMA_CH_IER_RIE_LEN
, 1);
2862 case XLGMAC_INT_DMA_CH_SR_FBE
:
2863 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2864 dma_ch_ier
, DMA_CH_IER_FBEE_POS
,
2865 DMA_CH_IER_FBEE_LEN
, 1);
2867 case XLGMAC_INT_DMA_ALL
:
2868 dma_ch_ier
|= channel
->saved_ier
;
2874 writel(dma_ch_ier
, XLGMAC_DMA_REG(channel
, DMA_CH_IER
));
2879 static int xlgmac_disable_int(struct xlgmac_channel
*channel
,
2880 enum xlgmac_int int_id
)
2882 unsigned int dma_ch_ier
;
2884 dma_ch_ier
= readl(XLGMAC_DMA_REG(channel
, DMA_CH_IER
));
2887 case XLGMAC_INT_DMA_CH_SR_TI
:
2888 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2889 dma_ch_ier
, DMA_CH_IER_TIE_POS
,
2890 DMA_CH_IER_TIE_LEN
, 0);
2892 case XLGMAC_INT_DMA_CH_SR_TPS
:
2893 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2894 dma_ch_ier
, DMA_CH_IER_TXSE_POS
,
2895 DMA_CH_IER_TXSE_LEN
, 0);
2897 case XLGMAC_INT_DMA_CH_SR_TBU
:
2898 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2899 dma_ch_ier
, DMA_CH_IER_TBUE_POS
,
2900 DMA_CH_IER_TBUE_LEN
, 0);
2902 case XLGMAC_INT_DMA_CH_SR_RI
:
2903 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2904 dma_ch_ier
, DMA_CH_IER_RIE_POS
,
2905 DMA_CH_IER_RIE_LEN
, 0);
2907 case XLGMAC_INT_DMA_CH_SR_RBU
:
2908 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2909 dma_ch_ier
, DMA_CH_IER_RBUE_POS
,
2910 DMA_CH_IER_RBUE_LEN
, 0);
2912 case XLGMAC_INT_DMA_CH_SR_RPS
:
2913 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2914 dma_ch_ier
, DMA_CH_IER_RSE_POS
,
2915 DMA_CH_IER_RSE_LEN
, 0);
2917 case XLGMAC_INT_DMA_CH_SR_TI_RI
:
2918 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2919 dma_ch_ier
, DMA_CH_IER_TIE_POS
,
2920 DMA_CH_IER_TIE_LEN
, 0);
2921 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2922 dma_ch_ier
, DMA_CH_IER_RIE_POS
,
2923 DMA_CH_IER_RIE_LEN
, 0);
2925 case XLGMAC_INT_DMA_CH_SR_FBE
:
2926 dma_ch_ier
= XLGMAC_SET_REG_BITS(
2927 dma_ch_ier
, DMA_CH_IER_FBEE_POS
,
2928 DMA_CH_IER_FBEE_LEN
, 0);
2930 case XLGMAC_INT_DMA_ALL
:
2931 channel
->saved_ier
= dma_ch_ier
& XLGMAC_DMA_INTERRUPT_MASK
;
2932 dma_ch_ier
&= ~XLGMAC_DMA_INTERRUPT_MASK
;
2938 writel(dma_ch_ier
, XLGMAC_DMA_REG(channel
, DMA_CH_IER
));
2943 static int xlgmac_flush_tx_queues(struct xlgmac_pdata
*pdata
)
2945 unsigned int i
, count
;
2948 for (i
= 0; i
< pdata
->tx_q_count
; i
++) {
2949 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
2950 regval
= XLGMAC_SET_REG_BITS(regval
, MTL_Q_TQOMR_FTQ_POS
,
2951 MTL_Q_TQOMR_FTQ_LEN
, 1);
2952 writel(regval
, XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
2955 /* Poll Until Poll Condition */
2956 for (i
= 0; i
< pdata
->tx_q_count
; i
++) {
2958 regval
= readl(XLGMAC_MTL_REG(pdata
, i
, MTL_Q_TQOMR
));
2959 regval
= XLGMAC_GET_REG_BITS(regval
, MTL_Q_TQOMR_FTQ_POS
,
2960 MTL_Q_TQOMR_FTQ_LEN
);
2961 while (--count
&& regval
)
2962 usleep_range(500, 600);
2971 static void xlgmac_config_dma_bus(struct xlgmac_pdata
*pdata
)
2975 regval
= readl(pdata
->mac_regs
+ DMA_SBMR
);
2976 /* Set enhanced addressing mode */
2977 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_SBMR_EAME_POS
,
2978 DMA_SBMR_EAME_LEN
, 1);
2979 /* Set the System Bus mode */
2980 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_SBMR_UNDEF_POS
,
2981 DMA_SBMR_UNDEF_LEN
, 1);
2982 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_SBMR_BLEN_256_POS
,
2983 DMA_SBMR_BLEN_256_LEN
, 1);
2984 writel(regval
, pdata
->mac_regs
+ DMA_SBMR
);
2987 static int xlgmac_hw_init(struct xlgmac_pdata
*pdata
)
2989 struct xlgmac_desc_ops
*desc_ops
= &pdata
->desc_ops
;
2992 /* Flush Tx queues */
2993 ret
= xlgmac_flush_tx_queues(pdata
);
2997 /* Initialize DMA related features */
2998 xlgmac_config_dma_bus(pdata
);
2999 xlgmac_config_osp_mode(pdata
);
3000 xlgmac_config_pblx8(pdata
);
3001 xlgmac_config_tx_pbl_val(pdata
);
3002 xlgmac_config_rx_pbl_val(pdata
);
3003 xlgmac_config_rx_coalesce(pdata
);
3004 xlgmac_config_tx_coalesce(pdata
);
3005 xlgmac_config_rx_buffer_size(pdata
);
3006 xlgmac_config_tso_mode(pdata
);
3007 xlgmac_config_sph_mode(pdata
);
3008 xlgmac_config_rss(pdata
);
3009 desc_ops
->tx_desc_init(pdata
);
3010 desc_ops
->rx_desc_init(pdata
);
3011 xlgmac_enable_dma_interrupts(pdata
);
3013 /* Initialize MTL related features */
3014 xlgmac_config_mtl_mode(pdata
);
3015 xlgmac_config_queue_mapping(pdata
);
3016 xlgmac_config_tsf_mode(pdata
, pdata
->tx_sf_mode
);
3017 xlgmac_config_rsf_mode(pdata
, pdata
->rx_sf_mode
);
3018 xlgmac_config_tx_threshold(pdata
, pdata
->tx_threshold
);
3019 xlgmac_config_rx_threshold(pdata
, pdata
->rx_threshold
);
3020 xlgmac_config_tx_fifo_size(pdata
);
3021 xlgmac_config_rx_fifo_size(pdata
);
3022 xlgmac_config_flow_control_threshold(pdata
);
3023 xlgmac_config_rx_fep_enable(pdata
);
3024 xlgmac_config_rx_fup_enable(pdata
);
3025 xlgmac_enable_mtl_interrupts(pdata
);
3027 /* Initialize MAC related features */
3028 xlgmac_config_mac_address(pdata
);
3029 xlgmac_config_rx_mode(pdata
);
3030 xlgmac_config_jumbo_enable(pdata
);
3031 xlgmac_config_flow_control(pdata
);
3032 xlgmac_config_mac_speed(pdata
);
3033 xlgmac_config_checksum_offload(pdata
);
3034 xlgmac_config_vlan_support(pdata
);
3035 xlgmac_config_mmc(pdata
);
3036 xlgmac_enable_mac_interrupts(pdata
);
3041 static int xlgmac_hw_exit(struct xlgmac_pdata
*pdata
)
3043 unsigned int count
= 2000;
3046 /* Issue a software reset */
3047 regval
= readl(pdata
->mac_regs
+ DMA_MR
);
3048 regval
= XLGMAC_SET_REG_BITS(regval
, DMA_MR_SWR_POS
,
3050 writel(regval
, pdata
->mac_regs
+ DMA_MR
);
3051 usleep_range(10, 15);
3053 /* Poll Until Poll Condition */
3055 XLGMAC_GET_REG_BITS(readl(pdata
->mac_regs
+ DMA_MR
),
3056 DMA_MR_SWR_POS
, DMA_MR_SWR_LEN
))
3057 usleep_range(500, 600);
3065 void xlgmac_init_hw_ops(struct xlgmac_hw_ops
*hw_ops
)
3067 hw_ops
->init
= xlgmac_hw_init
;
3068 hw_ops
->exit
= xlgmac_hw_exit
;
3070 hw_ops
->tx_complete
= xlgmac_tx_complete
;
3072 hw_ops
->enable_tx
= xlgmac_enable_tx
;
3073 hw_ops
->disable_tx
= xlgmac_disable_tx
;
3074 hw_ops
->enable_rx
= xlgmac_enable_rx
;
3075 hw_ops
->disable_rx
= xlgmac_disable_rx
;
3077 hw_ops
->dev_xmit
= xlgmac_dev_xmit
;
3078 hw_ops
->dev_read
= xlgmac_dev_read
;
3079 hw_ops
->enable_int
= xlgmac_enable_int
;
3080 hw_ops
->disable_int
= xlgmac_disable_int
;
3082 hw_ops
->set_mac_address
= xlgmac_set_mac_address
;
3083 hw_ops
->config_rx_mode
= xlgmac_config_rx_mode
;
3084 hw_ops
->enable_rx_csum
= xlgmac_enable_rx_csum
;
3085 hw_ops
->disable_rx_csum
= xlgmac_disable_rx_csum
;
3087 /* For MII speed configuration */
3088 hw_ops
->set_xlgmii_25000_speed
= xlgmac_set_xlgmii_25000_speed
;
3089 hw_ops
->set_xlgmii_40000_speed
= xlgmac_set_xlgmii_40000_speed
;
3090 hw_ops
->set_xlgmii_50000_speed
= xlgmac_set_xlgmii_50000_speed
;
3091 hw_ops
->set_xlgmii_100000_speed
= xlgmac_set_xlgmii_100000_speed
;
3093 /* For descriptor related operation */
3094 hw_ops
->tx_desc_init
= xlgmac_tx_desc_init
;
3095 hw_ops
->rx_desc_init
= xlgmac_rx_desc_init
;
3096 hw_ops
->tx_desc_reset
= xlgmac_tx_desc_reset
;
3097 hw_ops
->rx_desc_reset
= xlgmac_rx_desc_reset
;
3098 hw_ops
->is_last_desc
= xlgmac_is_last_desc
;
3099 hw_ops
->is_context_desc
= xlgmac_is_context_desc
;
3100 hw_ops
->tx_start_xmit
= xlgmac_tx_start_xmit
;
3102 /* For Flow Control */
3103 hw_ops
->config_tx_flow_control
= xlgmac_config_tx_flow_control
;
3104 hw_ops
->config_rx_flow_control
= xlgmac_config_rx_flow_control
;
3106 /* For Vlan related config */
3107 hw_ops
->enable_rx_vlan_stripping
= xlgmac_enable_rx_vlan_stripping
;
3108 hw_ops
->disable_rx_vlan_stripping
= xlgmac_disable_rx_vlan_stripping
;
3109 hw_ops
->enable_rx_vlan_filtering
= xlgmac_enable_rx_vlan_filtering
;
3110 hw_ops
->disable_rx_vlan_filtering
= xlgmac_disable_rx_vlan_filtering
;
3111 hw_ops
->update_vlan_hash_table
= xlgmac_update_vlan_hash_table
;
3113 /* For RX coalescing */
3114 hw_ops
->config_rx_coalesce
= xlgmac_config_rx_coalesce
;
3115 hw_ops
->config_tx_coalesce
= xlgmac_config_tx_coalesce
;
3116 hw_ops
->usec_to_riwt
= xlgmac_usec_to_riwt
;
3117 hw_ops
->riwt_to_usec
= xlgmac_riwt_to_usec
;
3119 /* For RX and TX threshold config */
3120 hw_ops
->config_rx_threshold
= xlgmac_config_rx_threshold
;
3121 hw_ops
->config_tx_threshold
= xlgmac_config_tx_threshold
;
3123 /* For RX and TX Store and Forward Mode config */
3124 hw_ops
->config_rsf_mode
= xlgmac_config_rsf_mode
;
3125 hw_ops
->config_tsf_mode
= xlgmac_config_tsf_mode
;
3127 /* For TX DMA Operating on Second Frame config */
3128 hw_ops
->config_osp_mode
= xlgmac_config_osp_mode
;
3130 /* For RX and TX PBL config */
3131 hw_ops
->config_rx_pbl_val
= xlgmac_config_rx_pbl_val
;
3132 hw_ops
->get_rx_pbl_val
= xlgmac_get_rx_pbl_val
;
3133 hw_ops
->config_tx_pbl_val
= xlgmac_config_tx_pbl_val
;
3134 hw_ops
->get_tx_pbl_val
= xlgmac_get_tx_pbl_val
;
3135 hw_ops
->config_pblx8
= xlgmac_config_pblx8
;
3137 /* For MMC statistics support */
3138 hw_ops
->tx_mmc_int
= xlgmac_tx_mmc_int
;
3139 hw_ops
->rx_mmc_int
= xlgmac_rx_mmc_int
;
3140 hw_ops
->read_mmc_stats
= xlgmac_read_mmc_stats
;
3142 /* For Receive Side Scaling */
3143 hw_ops
->enable_rss
= xlgmac_enable_rss
;
3144 hw_ops
->disable_rss
= xlgmac_disable_rss
;
3145 hw_ops
->set_rss_hash_key
= xlgmac_set_rss_hash_key
;
3146 hw_ops
->set_rss_lookup_table
= xlgmac_set_rss_lookup_table
;